Skip to content
propush edited this page Jan 29, 2017 · 9 revisions

О проекте

jNode - это серверная платформа, написанная на Java и предназначенная для работы в любых FTN-сетях. Основная задача, которая ставилась при разработке этого продукта - это работа узла Фидонет в автоматическом режиме в течение долгого времени и легкая доработка необходимых утилит.

Команда

  • Иван Агарков - ведущий разработчик, менеджер проекта.
  • Кирилл Темненков - разработчик

Список узлов, работающих на jNode

  • 2:5020/848 - 1.4
  • 2:5020/849 - 1.4
  • 2:5020/828 - 1.4
  • 2:5020/570 - 1.4
  • 2:5055/182 - 0.5.6beta1
  • 2:5020/2141 - 1.5 stable (jre 1.6 compatible)

Протестированные окружения

  • Slackware Linux 2.6 i686, PostgreSQL9, JRE1.7
  • Arch Linux 3.12 x86_64, PostgreSQL9, JRE1.7
  • Arch Linux 3.12 x86_64, MySQL5, JRE1.7
  • QNAP TS459 ( СХД ) i586, MySQL5, JRE1.7
  • FreeBSD 8.x, i386, MySQL5, OpenJDK 1.6
  • ?? Linux ??, H2 1.3.??, JRE1.7
  • OS/2 WSeB (Warp Server for e-Buisness) ACP2, H2 1.3.XX, JRE1.6

Описание работы

Прием и получение сообщений

В момент, когда соединение с удаленным компьютером установлено, вызывается функция FtnTosser.getMessagesForLink(link), которая сканирует таблицы netmail, echomailawait, filemailawait, filesforlink в поисках сообщений для узла, с которым установлено соединение. Найденные сообщения пакуются в соответствии с флагами packnetmail и packechomail из таблицы linkoptions, а затем кладутся в папку binkp.inbound под именами out_$ID.XX, где $ID - id узла в таблице links. Дескрипторы созданных файлов передаются внутри класса Message. Коннектор текущего протокола отправляет данные, и, после подтверждения принимающей стороной, удаляет созданные файлы. Полученные файлы кладутся в память или на жесткий диск в папку binkp.tmp, а затем вызывается функция FtnTosser.tossIncoming(message), которая распаковывает данные в папку binkp.inbound следующим образом:

  • .pkt - (u|s)inb.pkt - где первый байт - флаг парольного или непарольного соединения
  • .(mo|tu|we|th|fr|sa|su)[0-9a-z] - распаковываются *.pkt внутри и так-же кладутся в виде (u|s)inb.pkt
  • .tic - кладутся как есть
  • другие файлы - кладутся в том случае, если получены по парольному соединению
  • все остальное - удаляется

После получения файлов отправляется запрос тоссеру TosserQueue.getInstanse().toss(), который будит спящий поток тоссера и заставляет его разобрать полученные файлы.

Тоссинг сообщений

Основная функция, которая тоссит сообщения - FtnTosser.tossInboundDirectory(). Работает следующим образом:

  • Нетмейл для роботов отправляет роботам через IRobot.execute(message)
  • Нетмейл для остальных прогоняет через нодлист, реврайт и роутинг и пишет в базу с флагом send=false и lastupdate=now()
  • При наличии флага ARQ - отправляется сообщение на узел-отправитель.
  • При наличии фрага FILEATT - следом за нетмейлом отправляется файл, который к нему приаттачен.
  • Эхомейл из непарольных пакетов уничтожается
  • Эхомейл из парольных пакетов - проверяется существование арии в таблице echoarea ( если ее нету, то в случае наличия опции areaautocreate в таблице linkoptions она создается и создавший ее узел к ней подписывается ), проверяется подписка узла на арию, проверяются дюпы по таблице dupes. Если все хорошо - этомейл записывается в таблицу echomail, а в таблицу echomailawait добавляется запись для всех подписчиков вида $link_id,$new_echomail_id, где link_id - id линка из таблицы links, а new_echomail_id - id нового сообщения из таблицы echomail
  • .TIC-файлы проверяются аналогичным образом, только таблицы filearea, filemail, filemailawait и флаг fileautocreate соответственно.
  • Остальные файлы хранятся до ручного разбора