В данном посте речь пойдет об OpenSource проекте, призванном сделать жизнь фидошника лучше, а заодно дать возможность пользоваться Fido на мобильных устройствах с Java.
Как я уже писал, в 2010 году я получил узловой номер 2:5020/848. Не имея достаточного количества задач на работе, я испытывал «творческий голод», и искал, куда можно было-бы приложить свои силы. И нашел! Менее чем за месяц было написано некоторое количество ПО, которое давало различные дополнительные возможности пользователям моего узла — доступ к Fido через форум или NNTP, трансляция входящей и исходящей почты в email и многое другое.
К тому моменту, как весь этот зоопарк заработал стабильно, интерес к развитию узла я практически потерял и просматривал почту пару раз в месяц.
В 2011 году мне в голову пришла мысль переписать часть своего ПО на Java и запустить как отдельный узел, для чего я даже получил узловой номер 2:5020/849, но дальше проекта дело не пошло.
А буквально месяц назад один человек попросил меня прислать ему исходники ПО, управляющего пользователями на моем узле. Присылать их в сыром виде было бы некрасиво, поэтому код пришлось как следует почистить. И тогда, посматривая весь этот код, я решил что раз уж алгоритмы все придуманы, то почему-бы не переписать это все на Java, как я и планировал год назад? Ну вот и понеслась…
Для тех, кому не интересны технические подробности, сразу расскажу суть:
На текущий момент jNode представляет собой one-instance приложение, которое выполняет функции мейлера ( принимает и отправляет почту ), тоссера ( управляет сообщениями в эхоконференциях ) и трекера ( управляет netmail-сообщениями ).
Поставив jNode как узловую систему, оператору по большому счету больше ничего и не нужно — система будет автоматически принимать и передавать почту согласно настройкам.
В будущем планируется сделать веб-интерфейс для управления, а пока можно просто писать запросы в выбранную базу данных :)
В ближайшее время планируется сделать форк от проекта для end-user fido клиента.
Если есть желание — присоединяйтесь к разработке.
Ниже пойдут выборки из кода с кратким описанием что и зачем.
Интересно будет только тем, кто планирует близкое знакомство с FTN или с данным проектом.
Версия Java: 1.7
Библиотеки: ORMLite 4, JBDC-драйвер для выбранной СУБД.
Лицензия: Apache License 2.0
Где взять: github
0. В FTN используются LE-short поля. Переворачиваем:
1. FTN-адрес вида Z:N/F.P@D. Домен мы не используем, считаем стандартным «fidonet».
2. Пакет — это массив данных, содержащий в себе заголовок и N сообщений.
3. Сообщение — содержит from/to, атрибуты, тему и текст сообщения.
4. ORMLite — написал синглетон-менеджер для работы и получения Dao.
5. FtnTosser — тут собраны методы для преобразования пакет->база и база->пакет.
Все методы статические. Может быть это архитектурно неправильно, но я другого варианта не увидел.
Два основных метода:
6. ProtocolConnector — интерфейс для протокольного соединения. Пока реализован только binkp, но кто знает — вдруг в будущем появятся другие протоколы для Fido?
На вход получает только InputStream, про сокеты ничего не знает, может так-же читать из файла например.
7. Connector — занимается непосредственно сетью. На вход получает ProtocolConnector и адрес ( если мы клиент ) или сокет после accept'а ( если мы сервер ).
Делает reset init для ProtocolConnector ( далее PC ). Если canSend() то получает сообщения для линка (FtnTosser.getMessagesForLink(Link link)) и делает PC.send(); по окончанию сообщений делает PC.eob().
После того, как PC.closed() вернет true, вызывает обработку полученных сообщения ( FtnTosser.tossIncoming(PC.getReceived());
Если вы дочитали до этого места, значит вам чем-то интересно современное Фидо.
Попробуйте присоединиться к этой хоть и старой, но ещё вполне живой сети.
Быть может, вы найдете там кое-что интересное для себя.
Напомню, что доступ можно получить в том числе и у меня.
История
Как я уже писал, в 2010 году я получил узловой номер 2:5020/848. Не имея достаточного количества задач на работе, я испытывал «творческий голод», и искал, куда можно было-бы приложить свои силы. И нашел! Менее чем за месяц было написано некоторое количество ПО, которое давало различные дополнительные возможности пользователям моего узла — доступ к Fido через форум или NNTP, трансляция входящей и исходящей почты в email и многое другое.
К тому моменту, как весь этот зоопарк заработал стабильно, интерес к развитию узла я практически потерял и просматривал почту пару раз в месяц.
В 2011 году мне в голову пришла мысль переписать часть своего ПО на Java и запустить как отдельный узел, для чего я даже получил узловой номер 2:5020/849, но дальше проекта дело не пошло.
А буквально месяц назад один человек попросил меня прислать ему исходники ПО, управляющего пользователями на моем узле. Присылать их в сыром виде было бы некрасиво, поэтому код пришлось как следует почистить. И тогда, посматривая весь этот код, я решил что раз уж алгоритмы все придуманы, то почему-бы не переписать это все на Java, как я и планировал год назад? Ну вот и понеслась…
Для нетерпеливых
Для тех, кому не интересны технические подробности, сразу расскажу суть:
На текущий момент jNode представляет собой one-instance приложение, которое выполняет функции мейлера ( принимает и отправляет почту ), тоссера ( управляет сообщениями в эхоконференциях ) и трекера ( управляет netmail-сообщениями ).
Поставив jNode как узловую систему, оператору по большому счету больше ничего и не нужно — система будет автоматически принимать и передавать почту согласно настройкам.
В будущем планируется сделать веб-интерфейс для управления, а пока можно просто писать запросы в выбранную базу данных :)
В ближайшее время планируется сделать форк от проекта для end-user fido клиента.
Если есть желание — присоединяйтесь к разработке.
Технические подробности
Ниже пойдут выборки из кода с кратким описанием что и зачем.
Интересно будет только тем, кто планирует близкое знакомство с FTN или с данным проектом.
Версия Java: 1.7
Библиотеки: ORMLite 4, JBDC-драйвер для выбранной СУБД.
Лицензия: Apache License 2.0
Где взять: github
0. В FTN используются LE-short поля. Переворачиваем:
public static short revShort(short v) { return (short) ((short) ((short) (v >> 8) & 0xff) | (short) (v << 8)); }
1. FTN-адрес вида Z:N/F.P@D. Домен мы не используем, считаем стандартным «fidonet».
public class FtnAddress { private int zone; private int net; private int node; private int point; }
2. Пакет — это массив данных, содержащий в себе заголовок и N сообщений.
public class FtnPkt { private FtnAddress fromAddr; private FtnAddress toAddr; private String password; private List<FtnMessage> messages; private Date date; }
3. Сообщение — содержит from/to, атрибуты, тему и текст сообщения.
public class FtnMessage { private boolean isNetmail; private Date date; private String fromName; private String toName; private FtnAddress fromAddr; private FtnAddress toAddr; private String area; private String subject; private String text; private List<Ftn2D> seenby; private List<Ftn2D> path; }
4. ORMLite — написал синглетон-менеджер для работы и получения Dao.
public class ORMManager { private static ORMManager self = new ORMManager(); private boolean started = false; private Dao<X, ?> daoX; public static ORMManager getInstanse() { return self; } public void start(Hashtable<String, String> settings) throws SQLException { if (!started) { ConnectionSource source = new JdbcConnectionSource(JDBC_URL, JDBC_USER, JDBC_PASS); daoX = DaoManager.createDao(source, X.class); if (!daoX.isTableExists()) { TableUtils.createTable(source, X.class); } started = true; } } public static Dao<X, ?> x() { return getInstanse().daoX; } }
5. FtnTosser — тут собраны методы для преобразования пакет->база и база->пакет.
Все методы статические. Может быть это архитектурно неправильно, но я другого варианта не увидел.
Два основных метода:
public class FtnTosser { public static void tossIncoming(Message[] received) { // разбираем входящие сообщения } public static List<Message> getMessagesForLink(Link link) { // пакуем исходящие сообщения } }
6. ProtocolConnector — интерфейс для протокольного соединения. Пока реализован только binkp, но кто знает — вдруг в будущем появятся другие протоколы для Fido?
На вход получает только InputStream, про сокеты ничего не знает, может так-же читать из файла например.
public interface ProtocolConnector { // инициализация для исходящего соединения ( клиент ) public void initOutgoing(Connector connector); // инициализация для входящего соединения ( сервер ) public void initIncoming(Connector connector); // вызывается, когда есть данные для чтения public void avalible(InputStream is); // Frame - просто интерфейс с byte[] getBytes() // Получаем пакеты для отправки в сокет public Frame[] getFrames(); // true если соединения завершено public boolean closed(); // true если можно передавать данные public boolean canSend(); // делает сброс переменных коннектору public void reset(); // Преобразует message во Frame[] согласно протоколу public void send(Message message); // Вызывается, когда мы отправили все свои сообщения public void eob(); // Возвращает полученные сообщения public Message[] getReceived(); }
7. Connector — занимается непосредственно сетью. На вход получает ProtocolConnector и адрес ( если мы клиент ) или сокет после accept'а ( если мы сервер ).
Делает reset init для ProtocolConnector ( далее PC ). Если canSend() то получает сообщения для линка (FtnTosser.getMessagesForLink(Link link)) и делает PC.send(); по окончанию сообщений делает PC.eob().
После того, как PC.closed() вернет true, вызывает обработку полученных сообщения ( FtnTosser.tossIncoming(PC.getReceived());
Заключение
Если вы дочитали до этого места, значит вам чем-то интересно современное Фидо.
Попробуйте присоединиться к этой хоть и старой, но ещё вполне живой сети.
Быть может, вы найдете там кое-что интересное для себя.
Напомню, что доступ можно получить в том числе и у меня.
