IT enthusiast
0,1
рейтинг
16 сентября 2012 в 20:56

Администрирование → 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());

Заключение


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

Подробнее
Спецпроект

Самое читаемое Администрирование

Комментарии (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 лет писал на Си ;)

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