Larban 15 Опубликовано: 13 мая, 2015 (изменено) программа аналог 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 работает сие чудо на уровне 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 то обясните пожалуйстада есть ошибка с отправкой ответа в случае успешного создания адреса сайта, исправлю пожже (не в час же ночи )жду коментариев Изменено 13 мая, 2015 пользователем Larban 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro 3 563 Опубликовано: 13 мая, 2015 работает сие чудо на уровне eeprom в нем и хранит данные о сайтах Сохранит ли данные о сайтах если грохнется сервак? "ACCEPT",ServerProxy,x,y,z --прокси модема сервера и его координаты "Прокси" наверное в данном случае некорректно говорить. Лучше "адрес". Т.к. "прокси" в контексте мода OpenComputers - это таблица с методами и полями, которая представляет функционал компонента. (И по сети ее передавать смысла особого нет =)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alex 4 683 Опубликовано: 13 мая, 2015 Если абстрагироваться от всего (все это довольно сложно, как оно в реальности) и говорить простым языком, у тебя висит где-то таблица в сети, в которой я могу записаться под видом www.alexccsite.com + геоинфа =>соответствие какому-то там IP (грубо говоря в домене первого уровня) или не записаться, если алекс там уже какой-то валяется, а при желании удалиться? Кроме как корневого DNS, нет никакой синхронизации, проверок обмена и прочего между другими серверами DNS, нет никакой иерархии, нет никакого использования по сути этих имен? Они просто есть в табле у тебя и все? Что с ними делать дальше? Что дальше планируешь делать? Где использовать эту таблицу. И почему решил использовать вместо распределенных серверов и огромных дисковых хранилищ bios eeprom. Какой объем данных туда можно записать? И не до конца понял, что значит 16 минут жизнь имени в базе DNS? Разве оно там не регистрируется в реальной жизни на конкретный календарный срок (год-три года и прочее) Что я должен делать и кого пинговать каждые 16 минут или мой сайт кто должен пинговать, чтобы меня (www.alexccsite.com) не удалили из твоей таблички? Вот это самое большее,что меня напугало. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 14 мая, 2015 Зачем при регистрации DNS имени указывать координаты сервера? Предлагаю сотрудничество в работе над сетью OpenNet Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
cyber01 1 704 Опубликовано: 14 мая, 2015 Как-то ваш DNS совсем не DNS... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Larban Автор темы 15 Опубликовано: 14 мая, 2015 (изменено) работает сие чудо на уровне eeprom в нем и хранит данные о сайтах Сохранит ли данные о сайтах если грохнется сервак? если что-то случиться с eeprom то нет AlexCC да по сути это так планирую поисковик какой сделать или чего еще вмещается примерно 23-25 адресов не 16 минут а реальную неделю оффлайна сайта Zer0Galaxy координаты нужны для вычисления дистанции дабы не тратить энергию просто-так да конечно нужно прикрутить OpenNet cyber01 программа аналог DNS сервера (моя реализация работает не так как реальный DNS но выполняет туже функцию) прикрутим OpenNet добавим поддержку хранения данных в дисковых хранилищах (23 адреса это мало) в общем сделаем из OpenDNS реальный DNS Изменено 14 мая, 2015 пользователем Larban Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro 3 563 Опубликовано: 14 мая, 2015 (изменено) если что-то случиться с eeprom то нет Это я к тому, что EEPROM по сути хранит данные в оперативной памяти. На самом чипе постоянно хранится только программный код его. Следовательно - перезагрузка OC-компьютера -> оперативная память очищена -> данные потеряны. Так что хранение данных на дисках - это срочный и важный апдейт. Изменено 14 мая, 2015 пользователем Totoro Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
NEO 541 Опубликовано: 14 мая, 2015 Larban, лучше переделай, потому что тоторо уже матюкатся начал, ты представь, что он сделает, когда ещё хуже будет. Задумался. Это я к тому, что EEPROM по сути хранит данные в оперативной памяти. На самом чипе постоянно хранится только программный код его. Следовательно - перезагрузка OC-компьютера -> оперативная память очищена -> данные похерены.Так что хранение данных на дисках - это срочный и важный апдейт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro 3 563 Опубликовано: 14 мая, 2015 Larban, лучше переделай, потому что тоторо уже матюкатся начал, ты представь, что он сделает, когда ещё хуже будет. Задумался. Тебе показалось. На самом деле я белый и пушистый. :P Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
NEO 541 Опубликовано: 14 мая, 2015 Тебе показалось. На самом деле я белый и пушистый. :P Все уже зафиксировано. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Larban Автор темы 15 Опубликовано: 14 мая, 2015 нет нет Totoro данные никуда не деваются повнимательнее посмотри на функцию save() программа читает себя из eeprom заменяет массив ServerList новым и сохраняет себя обратно всякий раз при изменении массива ServerList следовательно перезагрузка не приводит к потере данных 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 14 мая, 2015 нет нет Totoro данные никуда не деваются повнимательнее посмотри на функцию save() программа читает себя из eeprom заменяет массив ServerList новым и сохраняет себя обратно всякий раз при изменении массива ServerList следовательно перезагрузка не приводит к потере данных Зачем хранить dns-таблицу в коде программы? Почему нельзя в отдельном файле? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Larban Автор темы 15 Опубликовано: 14 мая, 2015 я хотел написать программу для микроконтролера и я это сделал а как известно в них нельзя запихнуть жесткий диск потому я писал данные в код программы сейчас я понял что добавив в нее все желаемое она просто не поместится в eeprom по этому я переписываю ее под openos Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Asummonster 592 Опубликовано: 10 июня, 2015 я хотел написать программу для микроконтролера и я это сделал а как известно в них нельзя запихнуть жесткий диск потому я писал данные в код программысейчас я понял что добавив в нее все желаемое она просто не поместится в eeprom по этому я переписываю ее под openos А зачем переписывать? Почему бы просто не вставить биос в комп с д.ж.? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Lgmrszd 390 Опубликовано: 10 июня, 2015 А зачем переписывать? Почему бы просто не вставить биос в комп с д.ж.?д.ж.? Возможно, ты имел в виду ж.д.? 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах