Java о Fido

    В данном посте речь пойдет об 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());

    Заключение


    Если вы дочитали до этого места, значит вам чем-то интересно современное Фидо.
    Попробуйте присоединиться к этой хоть и старой, но ещё вполне живой сети.
    Быть может, вы найдете там кое-что интересное для себя.
    Напомню, что доступ можно получить в том числе и у меня.
    Поделиться публикацией
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 19
    • +2
      Спасибо. Рад, что Fido живёт.
      • 0
        А с чего бы ему помирать? Оно, как видите, ещё и развивается!
        • 0
          Так уж прям развивается? Одно дело, что энтузиасты периодически новый софт пишут, а стандарты, то и т.п., наверно, как на камне высечены так и остались… Хотя, может это и к лучшему…
      • +1
        Фидо живее всех живых!
        • 0
          Фида — фидее всех фидых! ©mithgol
          • 0
            Пруфлинк или не было!
            • +1
              • 0
                Так-то лучше. А не то не люблю, когда цитаты мои расходятся без источника и контекста.
        • 0
          Эх, когда-то был 2:5030/389…
          Может возродиться? :)
          • +1
            А в 5030 скоро выборы! ;-)
          • 0
            А про 2:5012 что-нибудь слышно? Вроде закрывали, или всё-таки не закрыли? )
            • 0
              А в нодлист заглянуть :-)?
              Сеть есть, 3 ноды…
              • 0
                Неа, я уже давно вне сети — 2:5012/2 закрылась и всех своих поинтов закрыла :-)
                А кто выжил?
                • 0
                  Host,5012,Kurgan_Net,Kurgan_Russia,Mihail_Yakovlev,00-00-000000,300,MO,CM,IBN,INA:fido-kgn.ru
                  ,10,Epicentre,Kurgan,Yuri_Pesterev,00-00-000000,300,CM,IMI,IEM:pesterev_ep1@mail.ru
                  ,200,Kurgan_Net,Kurgan,Mihail_Yakovlev,00-00-000000,300,MO,CM,IBN,INA:fido-kgn.ru
                  ,666,QNet_Station,Kurgan,Denis_Telyakovski,00-00-000000,300,CM,IMI,IEM:fido_noda@mail.ru,U,NC
            • +1
              Два вопроса, народ:

              1. Остались ли ещё модемные ноды (просто интересно).

              2. Не облегчилась ли процедура получения нодового адреса?

              Много лет назад был пойнтом, а сейчас, особенно в свете появления софта на Java, закралась идея поднять себе ноду на каком-нибудь Amazon EC2.

              Далее бы думал о поднятии второй ноды-даунлинка с аплинком на первую через IP, модемными даунлинками just for fun (несколько курей ещё валяются) и e-mail-гейтом.
              • +2
                1. Да, есть их некоторое количество.
                2. Сейчас ноду дают достаточно быстро. Мой продукт уже живёт на трех узлах, один из низ как раз на Амазоне :)
              • 0
                > public static short revShort(short v) {
                > return (short) ((short) ((short) (v >> 8) & 0xff) | (short) (v }

                О ужос-ужос! Это же не си, а жава! Ну разве так можно на жаве?
                Чем вас не устроило return (short)(( v >>> 8 ) | ( v
                • 0
                  Парсер-лох. Скушал часть кода и текст. Пичалька.
                  В общем, приведение типов где надо и где не надо — не лучшее решение в жаве
                  • 0
                    Спасибо, учту. Ну и да, до Java я 7 лет писал на Си ;)

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.