В данном посте речь пойдет об 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 поля. Переворачиваем:
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());
Заключение
Если вы дочитали до этого места, значит вам чем-то интересно современное Фидо.
Попробуйте присоединиться к этой хоть и старой, но ещё вполне живой сети.
Быть может, вы найдете там кое-что интересное для себя.
Напомню, что доступ можно получить в том числе и у меня.
Автор: kreon