Цели которые преследовались архитектурно:
1) Работать на всем моем зверопарке(Win\Linux\MacOS x).
2) Обособить ядро сервера от логики работы с обработкой запросов.
3) Система плагинов для логики обработки запросов.
3.1) API для удобной разработки плагинов.
Что выбрал:
1) Java, т.к. работает везде и всюду и кроме того довольно часто приходится на ней решать мелкие задачи.
2) Для альфа версии уже есть черновик
3) Движек JS интегрированный в саму яву под названием Nashorn, уже внедрил как альфу.
3.1) Пока только заготовка с 1 функцией.
Возможно проект будет интересен кому то еще кроме меня, так же появился человек который возможно заинтересуется в коммерческом применении.
Цели и идеи которые появились во время написания, все будет по максимуму реализовано через плагины, 1 пункт=1 плагин:
1) Многопоточный опрос множества днс серверов и ответ клиенту с первого ответившего. На данный момент не реализовано но будет точно.
2) Ведение своих записей DNS, т.е. статичных. По сути основное что нужно было лично мне. Как минимум склоняюсь к использованию универсального драйвера для доступа к максимальному числу баз. В планах mysql, sqlite а остальные будут поддерживаться побочно. Сильно вероятно что будет удобный API в JS для хранения сторонних данных в базе.
3) "Динамические DNS" записи для домашней локалки. Как идею продумал примерно так: каждый новый IP обратившийся к серверу падает в следующую логику. Сервер смотрит IP, смотрит имеется ли запись для такого IP, если нет то создает "временную" запись с именем компа который делал запрос. Фишка в том что можно будет скажем обращаться к своему смарту по имени вместо его динамичного IP. Все это к условию что таких записей не было задано статично если у вас дома все IP адреса статичные.
4) Блокировка\редирект некоторых доменов. Вероятно можно будет привязать для индивидуальных записей, к примеру комп ходит куда угодно а вот ноутбук не может ходить на яндекс.
5) Частичное решение проблем с блокировкой сайтов от операторов. Многие провайдеры режут доступ к сайтам именно по DNS, тут же можно глянуть что пришло в ответе и если IP ведет на сервер со страничкой блокировки то ждать ответа от других DNS серверов.
6) Вырезка некоторой надоедливой рекламы на всем домашнем хозяйстве.
Отдельно плагины к ядру:
1) Плагин мини веб сервера для админки программы.
2) Нативный GUI для админки программы(на swing'е)
3) Косвенные службы (Возможно простейшая реализация сервер WINS или нечто другое).
4) Возможно помощник пробития NAT'а на роутере пользователя. Такое полезно тем кто не знает\не умеет открывать порты для игр\софта и т.д.
Зачем это лично мне?:
1) Хочу свой локальный DNS сервер в котором будут доменные имена всех моих железок(IP телефон, комп, 3 ноутбука+ 2 смартфона + 2 телека).
2) Хочу свой асинхронный DNS сервер который сам будет решать какой внешний DNS сервер самый резкий да еще и будет помогать обходить блокировки провайдера.
3) Хочу универсальный резчик рекламы. Все не вырежет но как минимум половину точно убъет.
На данный момент есть тестовая версия с минимум функционала, самая ранняя альфа написанная за вечер. Есть ядро, есть плагин, есть зачаток API.
Сам плагин представляет из себя внутри минимально 2 функции, "init" с аргументом всего запроса который пришел от клиента и getResult без аргументов которым выдергивается готовое сообщение которое и будет отправлено клиенту.
Плагин выглядит так(реально рабочий вариант)
var question = Java.type('org.xbill.DNS.Record');
var Message = Java.type('org.xbill.DNS.Message');
var Flags = Java.type('org.xbill.DNS.Flags');
var Section = Java.type('org.xbill.DNS.Section');
var PluginAPI = Java.type('org.jamakasi.PluginAPI');
var RecArray = Java.type("org.xbill.DNS.Record[]");
var result = new Message();
var writeNormalMessage = function(qHeader,dnsRecordsArr){
response = new Message(qHeader.getID());
response.getHeader().setFlag(Flags.QR);
if (qHeader.getFlag(Flags.RD)) {
response.getHeader().setFlag(Flags.RD);
}
for (var i = 0; i < dnsRecordsArr.length; ++i) {
//System.out.println("Answer: " + dnsRecordsArr[i]);
response.addRecord(dnsRecordsArr[i], Section.ANSWER);
}
return response;
}
var init = function(questMessage) {
question = questMessage.getQuestion();
print('Plugin querry: ' + question);
var api = new PluginAPI();
RecArray = api.lookUp(question.getName(),question.getType());
if (RecArray != null) {
result = writeNormalMessage(questMessage.getHeader(),RecArray);
}else{
//System.out.println("Answer: no internet or no records found");
}
};
var getResult = function () {
//print('Plugin result: ' + result);
return result;
};
var Message = Java.type('org.xbill.DNS.Message');
var Flags = Java.type('org.xbill.DNS.Flags');
var Section = Java.type('org.xbill.DNS.Section');
var PluginAPI = Java.type('org.jamakasi.PluginAPI');
var RecArray = Java.type("org.xbill.DNS.Record[]");
var result = new Message();
var writeNormalMessage = function(qHeader,dnsRecordsArr){
response = new Message(qHeader.getID());
response.getHeader().setFlag(Flags.QR);
if (qHeader.getFlag(Flags.RD)) {
response.getHeader().setFlag(Flags.RD);
}
for (var i = 0; i < dnsRecordsArr.length; ++i) {
//System.out.println("Answer: " + dnsRecordsArr[i]);
response.addRecord(dnsRecordsArr[i], Section.ANSWER);
}
return response;
}
var init = function(questMessage) {
question = questMessage.getQuestion();
print('Plugin querry: ' + question);
var api = new PluginAPI();
RecArray = api.lookUp(question.getName(),question.getType());
if (RecArray != null) {
result = writeNormalMessage(questMessage.getHeader(),RecArray);
}else{
//System.out.println("Answer: no internet or no records found");
}
};
var getResult = function () {
//print('Plugin result: ' + result);
return result;
};
Что хочется узнать у постояльцев форума:
1) Кому либо интересно это?
2) Интересна ли сама система что можно будет плагинами собрать только то что надо лично Вам?
3) Нужна ли вообще система плагинов?
4) Ваши предложения по API, добавить и упростить можно все что угодно.
5) Возможно у Вас есть какие-то дополнительные интересные идеи?
6) Будет ли кому-то интересно попробовать пописать плагины?
7) Готовы ли Вы поддержать программу копейкой?