Перейти к публикации
Форум - ComputerCraft
Larban

OpenDNS

Рекомендованные сообщения

программа аналог DNS сервера (моя реализация работает не так как реальный DNS но выполняет туже функцию)
 
с коментариями для новичков (вроде меня) 

ServerList = {}
 
--endServerList
 
top_level_domain = "com"
 
function serialize() --сериализация массива сайтов
str = "ServerList = {}\n"
for k,v in pairs(ServerList) do
str = str.."ServerList[\""..k.."\"] = {Position = {X="..v.Position.X..",Y="..v.Position.Y..",Z="..v.Position.Z.."},PROXY=\""..v.PROXY.."\",Limit="..v.Limit..",Dist="..v.Dist.."}\n"
end
return str.."\n"
end
 
function save()
eeprom = component.proxy(component.list("eeprom")())
program = eeprom.get()
 
xx,yy = string.find(program,"--endServerList\n")
program = serialize().."--endServerList\n"..string.sub(program,yy+1,#program) --вырезаем старый массив сайтов и вставляем новый
if #program < 4096 then --если программа после замены массива помещается в eeprom сохраняем ее
eeprom.set(program)
end
end
 
function AddServer(x,y,z,proxy,address,dst)
ServerList[address] = {Position={X=x,Y=y,Z=z},PROXY=proxy,Limit=0,Dist=dst} --создаем новый сервер
save()
end
 
modem = component.proxy(component.list("modem")())
modem.open(16)
 
for k,v in pairs(ServerList) do --раззсылка "REQUEST"
v.Bool = false
modem.setStrength(v.Dist+1)
modem.send(v.PROXY,16,"REQUEST")
v.Limit = v.Limit+1
if v.Limit >= 840 then
ServerList[k] = nil
end
end
save()
 
while true do
name,_,sender,_,Dist,CMD,message,x,y,z = computer.pullSignal(2)
if name == "modem_message" then
if CMD == "GET_ADDRESS" then
if ServerList[message] ~= nil then --если есть запись
if ServerList[message].Position.X == nil then --если нет координат
modem.setStrength(Dist+1)
modem.send(sender,16,"ACCEPT",ServerList[message].PROXY) --просто посылаем прокси
else
modem.setStrength(Dist+1)
modem.send(sender,16,"ACCEPT",ServerList[message].PROXY,ServerList[message].Position.X,ServerList[message].Position.Y,ServerList[message].Position.Z) --посылаем прокси и координаты
end
else
modem.setStrength(Dist+1)
modem.send(sender,16,"ADDRESS_IS_NULL") --записей нет
end
end
if CMD == "CREATE_ADDRESS" then
if ServerList[message] == nil then --если такого сайта не зарегистрировано
if string.sub(message,#message-(#top_level_domain),#message) == "."..top_level_domain then --если главный домен подходит
if  x ~= nil and y ~= nil and z ~= nil then --если есть координаты
AddServer(x,y,z,sender,message,Dist) --новый сервер
modem.setStrength(Dist+1)
modem.send(sender,16,"SUCCESS") --говорим сайту что он зарегистрирован 
else
modem.setStrength(Dist+1)
modem.send(sender,16,"PLEASE_ENTER_SERVER_POSITION") --позцыя не введена
end
else
modem.setStrength(Dist+1)
modem.send(sender,16,"THIS_ADDRESS_DOES_NOT_FIT_DNS_SERVER",top_level_domain) --домен не подходит
end
else
modem.setStrength(Dist+1)
modem.send(sender,16,"SPECIFIED_ADDRESS_ALREADY_EXISTS") --такой сайт уже есть
end
end
if CMD == "DELETE_ADDRESS" then
if ServerList[message].PROXY == sender then --если сервер сам желает удалить себя из списка
ServerList[message] = nil --удаляем
modem.setStrength(Dist+1)
modem.send(sender,16,"REMOVAL_COMPLETED") --сообщаем
save()
end
end
if CMD == "TRUE" then --ответ на "REQUEST"
if ServerList[message].PROXY == sender and ServerList[message].Bool == false then --проверяем кто отправил и один ли раз на 12 минут отправляется мейседж
ServerList[message].Bool = true; 
ServerList[message].Limit = ServerList[message].Limit-0.1 --на один пропуск "REQUEST" нужно 10 раз не пропустить процедуру
if ServerList[message].Limit < 0 then
ServerList[message].Limit = 0
end
save()
end
end
end
if computer.uptime() >= 720 then --прошло 12 минут перезагружаем OpenDNS освободить память да и разсылку "REQUEST" запустить
save()
computer.shutdown(true)
end
end

 
960e25cee4c9.png
работает сие чудо на уровне eeprom в нем и хранит данные о сайтах
данные шлет и принимает по 16 порту

команды и аргументы для OpenDNS
"GET_ADDRESS","MySite.MyTop-level_Domain"
возможные ответы:
"ACCEPT",ServerProxy,x,y,z --прокси модема сервера и его координаты
"ADDRESS_IS_NULL" --записей о данном адресе нет
 
"CREATE_ADDRESS","MySite.MyTop-level_Domain",x,y,z
возможные ответы:
"SUCCESS" --сайт успешно зарегистрирован
 
"PLEASE_ENTER_SERVER_POSITION" --не введены координаты или введены не все
"THIS_ADDRESS_DOES_NOT_FIT_DNS_SERVER",top_level_domain --главный домен вашего адреса не подходит данному OpenDNS серверу (еще он присылает вам свой главный домен для регистрации)
"SPECIFIED_ADDRESS_ALREADY_EXISTS" --сайт с таким адресом уже существует
 
"DELETE_ADDRESS","MySite.MyTop-level_Domain"
возможные ответы:
"REMOVAL_COMPLETED" --удаление прошло успешно
 
 
если вам от OpenDNS сервера пришел запрос 
"REQUEST"
вы должны ответить на него:
"TRUE","MySite.MyTop-level_Domain"
если вы пропустите процедуру 840 раз сервер удалит данные о вашем сайте запрос посылается каждые 12 минут (сделано для очищения OpenDNS сервера от неработающих сайтов)
если я не так понял СТОРОНЯЯ ССЫЛКА: http://site.nic.ru/content/view/225/29 то обясните пожалуйста

да есть ошибка с отправкой ответа в случае успешного создания адреса сайта, исправлю пожже (не в час же ночи :D )

жду коментариев

Изменено пользователем Larban
  • Like 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

работает сие чудо на уровне eeprom в нем и хранит данные о сайтах

 

Сохранит ли данные о сайтах если грохнется сервак?

 

 

 

"ACCEPT",ServerProxy,x,y,z --прокси модема сервера и его координаты

 

"Прокси" наверное в данном случае некорректно говорить.  Лучше "адрес".

Т.к. "прокси" в контексте мода OpenComputers - это таблица с методами и полями, которая представляет функционал компонента. (И по сети ее передавать смысла особого нет =))

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если абстрагироваться от всего (все это  довольно сложно, как оно в реальности) и говорить простым языком, у тебя висит где-то таблица в сети, в которой я могу записаться под видом

www.alexccsite.com + геоинфа =>соответствие какому-то там IP (грубо говоря в домене первого уровня)   или не записаться, если алекс там уже какой-то валяется, а при желании удалиться?

 

Кроме как корневого DNS, нет никакой синхронизации, проверок обмена и прочего между другими серверами DNS, нет никакой иерархии, нет никакого использования по сути этих имен?  

 

Они просто есть в табле у тебя и все? Что с ними делать дальше?

 

Что дальше планируешь делать? Где использовать эту таблицу.

 

И почему решил использовать вместо распределенных серверов и огромных дисковых хранилищ bios eeprom. Какой объем данных туда можно записать? И не до конца понял, что значит 16 минут жизнь имени в базе DNS? Разве оно там не регистрируется в реальной жизни на конкретный календарный срок (год-три года и прочее)   Что я должен делать и кого пинговать каждые 16 минут или мой сайт кто должен пинговать, чтобы меня (www.alexccsite.com) не удалили из твоей таблички? Вот это самое большее,что меня напугало.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Зачем при регистрации DNS имени указывать координаты сервера?

Предлагаю сотрудничество в работе над сетью OpenNet

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Как-то ваш DNS совсем не DNS...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

работает сие чудо на уровне eeprom в нем и хранит данные о сайтах

 

Сохранит ли данные о сайтах если грохнется сервак?

 

если что-то случиться с eeprom то нет

 

AlexCC да по сути это так

планирую поисковик какой сделать или чего еще

вмещается примерно 23-25 адресов

не 16 минут а реальную неделю оффлайна сайта

 

Zer0Galaxy координаты нужны для вычисления дистанции дабы не тратить энергию просто-так

да конечно нужно прикрутить OpenNet

 

cyber01 

программа аналог DNS сервера (моя реализация работает не так как реальный DNS но выполняет туже функцию)

 

 

прикрутим OpenNet

добавим поддержку хранения данных в дисковых хранилищах (23 адреса это мало)

в общем сделаем из OpenDNS реальный DNS

Изменено пользователем Larban

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

если что-то случиться с eeprom то нет

 

Это я к тому, что EEPROM по сути хранит данные в оперативной памяти. На самом чипе постоянно хранится только программный код его. Следовательно - перезагрузка OC-компьютера -> оперативная память очищена -> данные потеряны.

Так что хранение данных на дисках - это срочный и важный апдейт.

Изменено пользователем Totoro

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Larban, лучше переделай, потому что тоторо уже матюкатся начал, ты представь, что он сделает, когда ещё хуже будет. Задумался.

 

Это я к тому, что EEPROM по сути хранит данные в оперативной памяти. На самом чипе постоянно хранится только программный код его. Следовательно - перезагрузка OC-компьютера -> оперативная память очищена -> данные похерены.

Так что хранение данных на дисках - это срочный и важный апдейт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Larban, лучше переделай, потому что тоторо уже матюкатся начал, ты представь, что он сделает, когда ещё хуже будет. Задумался.

Тебе показалось. На самом деле я белый и пушистый.  :P

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Тебе показалось. На самом деле я белый и пушистый.  :P

Все уже зафиксировано.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

нет нет Totoro данные никуда не деваются  ;)

повнимательнее посмотри на функцию save()

программа читает себя из eeprom заменяет массив ServerList новым и сохраняет себя обратно всякий раз при изменении массива ServerList следовательно перезагрузка не приводит к потере данных

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

нет нет Totoro данные никуда не деваются  ;)

повнимательнее посмотри на функцию save()

программа читает себя из eeprom заменяет массив ServerList новым и сохраняет себя обратно всякий раз при изменении массива ServerList следовательно перезагрузка не приводит к потере данных

Зачем хранить dns-таблицу в коде программы? Почему нельзя в отдельном файле?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

я хотел написать программу для микроконтролера и я это сделал а как известно в них нельзя запихнуть жесткий диск потому я писал данные в код программы

сейчас я понял что добавив в нее все желаемое она просто не поместится в eeprom по этому я переписываю ее под openos

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
я хотел написать программу для микроконтролера и я это сделал а как известно в них нельзя запихнуть жесткий диск потому я писал данные в код программы

сейчас я понял что добавив в нее все желаемое она просто не поместится в eeprom по этому я переписываю ее под openos

А зачем переписывать? Почему бы просто не вставить биос в комп с д.ж.?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А зачем переписывать? Почему бы просто не вставить биос в комп с д.ж.?

д.ж.? Возможно, ты имел в виду ж.д.?
  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×