Ставим FRN-сервер на Raspberry Pi
FRN - Free Radio Network (сеть свободной радиосвязи) ошибочно ассоциируется только со шлюзами CB или PMR.
Исходный веб-сайт проекта — https://www.freeradionetwork.eu/, где вы найдете приложения для Windows.
На сайте http://alterfrn.ucoz.ru/ вы найдете как серверную программу, так и клиентскую программу данной сети FRN для различных операционных систем. На его основе были созданы другие продукты и дополнительные графические наложения, например PiCQ или Java FRN с сайта freeradionetwork.de.
Но нынешнее бьющееся сердце – российское производство AlterFRN.
Устанавливаем сервер следующим образом...
wget https://odradio.link/frn/FRNServerConsole.Linux-armhf.7348r.tgz
sudo tar -zxvf FRNServerConsole.Linux-armhf.7348r.tgz
sudo rm FRNServerConsole.Linux-armhf.7348r.tgz
sudo mv FRNServerConsole.Linux-armhf.7348r FRNserver
cd FRNserver
sudo mv FRNServerConsole.Linux-armhf.7348r FRNserver
Результатом всех этих операций будет каталог и исполняемый файл под названием FRNserver.
pi@raspberrypi:/opt/FRNserver $ ls
FRNserver networks.cfg intflags.cfg server.ini
Конфигурация включает в себя редактирование файлов network.cfg и server.in.
Запускаем и останавливаем программу с помощью значков в меню или команд.
/opt/FRNserver/FRNserver daemon /opt/FRNserver/server.ini
/opt/FRNserver/FRNserver stop /opt/FRNserver/server.ini
Попытка запустить сервер заканчивается сообщением об ошибке
Error: Parameter [Server].ServerCharsetName is empty
Который обычно сообщает нам о необходимости настройки сервера, прежде чем мы захотим его запустить.
Настройка сервера происходит в два этапа. Первый — отредактировать файл server.ini, содержащий основные настройки сервера, и файл network.cfg, содержащий информацию о количестве каналов и функциях отдельных каналов.
Для редактирования файла server.ini вводим команду sudo nano /opt/FRNserver/server.ini и видим содержимое файла, в котором нам необходимо внести изменения для персонализации настроек сервера.
# AlterFRN server
# National names MUST be UTF-8
# Revision 7348
# 2021-01-22
# http://alterfrn.ucoz.ru/index/server_config/0-27#s_1
[Server]
# ServerCharsetName
# RU: Обазятельно для UNIX/Linux, необязательно для Windows
# Имя ANSI кодировки FRN это печальное "наследие" оригинального FRN: только MSWindows, только ANSI.
# Корректной ANSI кодировкой для FRN является текущая ANSI кодировка для вашего языка на Microsoft Windows.
# Выяснить текущую ANSI кодировку поможет команда "ansi" для AlterFRN-Server-Win32
# Просто запустите на MS Windows команду "C:\FRN\FRNServerConsole.Win32.exe ansi"
# Для Германии: ISO-8859-1
# Для России: WINDOWS-1251
# EN: Mandatory for UNIX/Linux, optional for Windows
# Name of ANSI charset for FRN is very sad "heritage" of the original FRN: only MSWindows, only ANSI.
# Correct FRN ANSI charset is default ANSI charset on MS Windows for your language.
# Command "ansi" for AlterFRN-Win32-server will show it for you.
# Just run on command console of your MSWindows with your language: "C:\FRN\FRNServerConsole.Win32.exe ansi"
# For Germany: ISO-8859-1
# For Russia: WINDOWS-1251
ServerCharsetName=
PresentServerAddress=your.main.server.address
PresentServerPort=10024
ServerOwnerEMail=server.owner@mail.com
BackupServerAddress=your.backup.server.address
BackupServerPort=10024
ClientHandshakeTimeout=4
ClientActivityTimeout=8
ListenServerPorts=10024
DefaultNetworkName=Test
DefaultCountry=
IPVersion=46
ManagerInvalidPasswordScript=
ClientSessionMaxTime=1y
# ManagerMode
# Ru: режим всего сервера для взаимодействия с FRNSysMan
# - Standalone/S/0 - нет взаимодействия с FRNSysMan, по умолчанию
# - Notify/N/1 - только уведомлять FRNSysMan о подключающихся клиентах
# - Light/L/2 - мягкий режим: использовать авторизацию клиентов от FRNSysMan,
# но разрешать подключения при неработающем FRNSysMan
# - FRN/F/3 - жесткий режим: использовать авторизацию клиентов от FRNSysMan,
# но запрещать подключения при неработающем FRNSysMan
# En: the mode of interaction with FRNSysMan for the whole server
# - Standalone/S/0 - no interaction with FRNSysMan, default
# - Notify/N/1 - just notify the FRNSysMan about connected clients
# - Light/L/2 - soft mode: use FRNSysMan authentification,
# but allow client connections if FRNSysMans does not work(answer)
# - FRN/F/3 - hard mode: use FRNSysMan authentification,
# but disallow client connections if FRNSysMans does not work(answer)
ManagerMode=Standalone
Информацию об отдельных функциях можно найти на сайте http://alterfrn.ucoz.ru, но я попробую объяснить чуть подробнее.
Как правило, нас чаще всего будет интересовать изменение базовых функций.
ServerCharsetName=
Настройки клавиатуры
PresentServerAddress=your.main.server.address
Адрес, под которым будет представляться сервер
PresentServerPort=10024
Порт, на котором будет представлен сервер
ServerOwnerEMail=server.owner@mail.com
Учетная запись супер администратора сервера
BackupServerAddress=your.backup.server.address
Адрес резервного сервера
BackupServerPort=10024
Порт резервного сервера
ListenServerPorts=10024
Порт или порты, по которым сервер должен принимать клиентов (их может быть несколько)
DefaultNetworkName=Test
Канал по умолчанию на сервере
ManagerMode=Standalone
Режим работы сервера (автономный или сотрудничество с SysManager Нидерланды или Германия)
После первоначальной настройки вы можете запустить сервер и попробовать авторизоваться на нем. Для этого мы даем команду
sudo /opt/FRNserver/FRNserver daemon /opt/FRNserver/server.ini
И мы должны увидеть в ответ на терминале аналогичное сообщение
pi@raspberrypi:~ $ sudo /opt/FRNserver/FRNserver daemon /opt/FRNserver/server.ini
AlterFRN-Server-r7348-Linux-armhf [/opt/FRNserver/server.ini] started as daemon with PID=4299 [/var/run/frnserver.pid]
pi@raspberrypi:~ $
После подключения клиент Windows FRN должен показать что-то вроде этого
Итак, сервер запустился, но нам нужно заменить эти странные каналы на те, которые мы хотели бы иметь на нашем сервере. Поэтому теперь шаг номер два — настройка каналов на сервере.
Для этого редактируем файл network.cfg, введя команду
sudo nano /opt/FRNserver/networks.cfg
и мы видим конфигурацию канала, которую можем свободно изменить.
# National names MUST be UTF-8
Test | ParrotEnable=yes ; ParrotStartStopEnable=no
Parrot5|ParrotEnable=yes;ParrotRepeatCount=5
Parrot15|ParrotEnable=yes;ParrotRepeatCount=15
Room
Debug
Mäßüöen(CP1252)|CharsetName=CP1252
Привет(Serv CP1251)
Привет(Net CP1251)|CharsetName=CP1251
Привет(CP866)|CharsetName=CP866
Привет(ISO-8859-5)|CharsetName=ISO-8859-5
Привет(KOI8R)|CharsetName=KOI8-R
ПРИВЕТ(KOI7)|CharsetName=KOI-7
Привет(UTF8)|CharsetName=UTF-8;MaxSpeechTime=60
Длинное имя комнаты в UTF-8|CharsetName=UTF-8
HiddenNet|Hidden=yes;ManagerMode=S
У меня файл выглядит так:
# National names MUST be UTF-8 ORLink Speek Chat Test | ParrotEnable=yes ; ParrotStartStopEnable=no
#Parrot5|ParrotEnable=yes;ParrotRepeatCount=5 #Parrot15|ParrotEnable=yes;ParrotRepeatCount=15 #Room #Debug #Mäßüöen(CP1252)|CharsetName=CP1252 #Привет(Serv CP1251) #Привет(Net CP1251)|CharsetName=CP1251 #Привет(CP866)|CharsetName=CP866 #Привет(ISO-8859-5)|CharsetName=ISO-8859-5 #Привет(KOI8R)|CharsetName=KOI8-R #ПРИВЕТ(KOI7)|CharsetName=KOI-7 #Привет(UTF8)|CharsetName=UTF-8;MaxSpeechTime=60 #Длинное имя комнаты в UTF-8|CharsetName=UTF-8 #HiddenNet|Hidden=yes;ManagerMode=S
Об атрибутах в этом файле смотрите в конце статьи.
После внесения этих изменений мы можем перезагрузить сервер FRN с помощью команд.
sudo /opt/FRNserver/FRNserver stop /opt/FRNserver/server.ini
sudo /opt/FRNserver/FRNserver daemon /opt/FRNserver/server.ini
Стоит еще раз отредактировать файл server.ini и включить опцию журналов сервера и возможность выполнения сервером команд, выдаваемых с терминала. Стоит прочитать описание на сайте http://alterfrn.ucoz.ru/.
Чтобы активировать эти опции в редактируемом файле, найдите такие функции в самом низу
[System]
PidFile=frnserver.pid
LogFile=frnserver.log
DataDir=
LogClientLevel=2
LogExec=yes
DataChangeScript=
SystemCharsetName=
[Command]
CommandEnabled=no
CommandPort=10023
CommandIPVersion=4
CommandPreferIPv4=yes
И замените записи на
[System]
PidFile=frnserver.pid
LogFile=/var/log/frnserver.log
DataDir=
LogClientLevel=5
LogExec=yes
DataChangeScript=
SystemCharsetName=UTF-8
[Command]
CommandEnabled=yes
CommandPort=10023
CommandIPVersion=4
CommandPreferIPv4=yes
Благодаря этой процедуре вы сможете дать команду
tail -f /var/log/frnserver.log
и в консоли мы увидим живой лог
pi@raspberrypi:~ $ tail -f /var/log/frnserver.log
2021-02-06 14:05:59.757: ERROR: Read blocks: /opt/FRNserver/blocks.dat: error [2] of opening file "/opt/FRNserver/blocks.dat": No such file or directory
2021-02-06 14:05:59.758: ERROR: Read modes: /opt/FRNserver/modes.dat: error [2] of opening file "/opt/FRNserver/modes.dat": No such file or directory
2021-02-06 14:05:59.758: ERROR: Read rights: /opt/FRNserver/rights.dat: error [2] of opening file "/opt/FRNserver/rights.dat": No such file or directory
2021-02-06 14:05:59.758: ERROR: Read notices: /opt/FRNserver/notices.dat: error [2] of opening file "/opt/FRNserver/notices.dat": No such file or directory
2021-02-06 14:05:59.759: Start listening: Command: 127.0.0.1:10023
2021-02-06 14:05:59.759: Start listening: Client: [::]:10024
2021-02-06 14:05:59.759: Start listening: Client: 0.0.0.0:10024
2021-02-06 14:06:02.135: Client: 192.168.1.160 35495 CONNECT
2021-02-06 14:06:02.260: Client: 192.168.1.160 35495 HANDSHAKE_STR_OK CT:<VX>2014003</VX><EA>digit4all@gmail.com</EA><PW>AFHMWGW</PW><ON>M0IQF, Marcin</ON><CL>2</CL><BC>PC Only</BC><DS></DS><NN>Poland</NN><CT>- - -</CT><NT>Test</NT>
2021-02-06 14:06:02.759: Client: 192.168.1.160 35495 LOGIN EMail=`digit4all@gmail.com` Call=`M0IQF, Marcin` Net=`Test` SID=`ra2BrFqjwxv6Niy1sXW2MgCK` City=`- - -` Band=`PC Only` Country=`Poland`
2021-02-06 14:06:13.148: Client: 192.168.1.160 35495 DISCONNECT_BY_CLIENT EMail=`digit4all@gmail.com` Call=`M0IQF, Marcin` Net=`Test` SID=`ra2BrFqjwxv6Niy1sXW2MgCK` City=`- - -` Band=`PC Only` Country=`Poland`
Дополнительно вы сможете давать команды серверу, например
sudo /opt/FRNserver/FRNserver list /opt/FRNserver/server.ini
sudo /opt/FRNserver/FRNserver -f list /opt/FRNserver/server
И многие другие команды, описанные на сайте http://alterfrn.ucoz.ru/ - телепортация, временное отключение звука, временная блокировка и т.д. и т.п.
В статье я намеренно не описываю интеграцию с серверами SysManager (авторизацию). Для меня сотрудничество с ними — пустая трата времени и нервов, а единственные плюсы такого сотрудничества — это СПИСОК, где может быть виден наш сервер.
Что касается соображений безопасности, я могу сам защитить сервер без необходимости скачивать логины и пароли и таким образом быть САМОДОСТАТОЧНЫМ и независимым.
Процесс создания ИКОН в МЕНЮ представлен на видео https://youtu.be/7-n7AYSmIpE
Атрибуты для файла networks.cfg:
Список и конфигурация сетей (комнат). Находится в файле networks.cfg. Одна строка - одна сеть(комната). Дополнительные атрибуты для сети(комнаты) дописываются после собственно имени сети(комнаты) через символ '|' (десятичный код 124), атрибуты отделяются друг от друга точкой с запятой:
n.1. Атрибут OwnerEMail - адрес электронной почты владельца сети(комнаты) при наличии; версия r5195+ - может быть указано несколько владельцев сети(комнаты) через запятую;
n.2. Атрибут MaxClients - максимальное количество корреспондентов, которые могут подключиться в комнату одновременно, по умолчанию 65535;
n.3. Атрибут MaxSpeechTime - максимальное время в секундах, которое может непрерывно говорить корреспондент, после чего клиенту будет послана команда прервать трансляцию сигнала в комнату; минимальное - 10 секунд; максимальное - 1800 секунд (30 минут); по умолчанию - 300 секунд (5 минут);
n.4. Атрибут ParrotEnable - разрешить работу попугая в сети(комнате); допустимые значения: No, Yes; по умолчанию: No - попугай не работает;
n.5. Атрибут ParrotStartStopEnable - разрешить включение/выключение попугая через сообщения start и stop; допустимые значения: No, Yes; по умолчанию: No - включение/выключение запрещено;
n.6. Атрибут ParrotMuteEnable - разрешить блокировку самого попугая; допустимые значения: No, Yes; по умолчанию: No заглушение попугая запрещено;
n.7. Атрибут ParrotMaxRecordTime - максимальное время звука в секундах, которое может записать попугай для последующего повтора; по умолчанию: 600 секунд (5 минут);
n.8. Атрибут ParrotPause - время в миллисекундах перед началом воспроизведения попугаем записанного звука; по умолчанию: 2000 мс (2 секунды);
n.9. Атрибут ParrotRepeatCount - количество повторов попугаем записанного звука; по умолчанию: 1 (один);
n.10. Атрибут CharsetName -- [ревизия 4210+] -- имя ANSI кодировки символов для сети(комнаты), если кодировка отличается от кодировки всего сервера в серверном параметре ServerCharsetName (s.1.4) в секции [Server] (s.1); В эту кодировку будет перекодировано имя этой конкретной сети(комнаты) при передаче списка сетей(комнат) FRN-клиентам без поддержки Unicode(UTF-8); также используется для перекодирования информации о клиенте без поддержки Unicode(UTF-8) для записи в журнале сервера AlterFRN и для исполнения команд list (s.0.16) и listnet (s.0.17);
n.11. Атрибут ManagerMode - [ревизия 4210+] режим взаимодействия с FRN-System-Manager для этой конкретной сети(комнаты), если режим отличается от режима всего сервера; допустимые значения как у серверного параметра ManagerMode (s.1.10);
n.12. Атрибут ManagersMask - [ревизия 4690+] битовая маска, разрешающая или запрещающая работу сети(комнаты) с конкретным FRN-System-Manager; используются биты 0-2; по умолчанию значение 7 - разрешены все;
n.13. Атрибут SpeechPause - [ревизия 4690+] - принудительная пауза между включениями корреспондентов для этой конкретной сети(комнаты) в миллисекундах; минимальная и по умолчанию - 0 мс; максимальная - 10000 мс (10 сек);
n.14. Атрибут AccessInfoMode - [ревизия 4690+] - режим выдачи информации доступа при подключении клиента:
n.14.1. - Значение Original или O или 0: информация доступа выдается сервером AlterFRN как в оригинальном сервере FRN только при активированном списке доступа для сети(комнаты); по умолчанию;
n.14.2. - Значение Always или A или 1: информация доступа выдается сервером AlterFRN всегда;
n.14.3. - Значение Never или N или 2: информация доступа никогда не выдается сервером AlterFRN;
n.15. Атрибут ClientSessionMaxTime управляет ограничением длительности подключения одного клиента к конкретно этой сети(комнате), если отличается от значения в серверном параметре ClientSessionMaxTime (s.1.16) в секции [Server] (s.1);
n.16. Атрибут SpeechLimit управляет ограничением длительности разговора в конкретно этой сети(комнате), если отличается от значения в серверном параметре SpeechLimit (s.1.19) в секции [Server] (s.1);
n.17. Атрибут ShortFrames управляет поддержкой коротких (40мс) звуковых пакетов в конкретно этой сети(комнате), если отличается от значения в серверном параметре ShortFrames (s.1.20) в секции [Server] (s.1);
n.18. Атрибут QuarantineTime управляет временем карантина клиентских подключений к конкретно этой сети(комнате), если это время отличается от значения серверного параметра QuarantineTime (s.1.21) в секции [Server] (s.1);
n.19. Атрибут Hidden позволяет исключить конкретно эту сеть(комнату) из списка сетей(комнат); допустимые значения: No, Yes; по умолчанию: No - сеть(комната) присутствует в списке сетей(комнат); для подключения к такой скрытой сети(комнате) необходимо точно знать имя этой сети(комнаты); чтобы сеть(комната) также не показывалась в списке серверов на FRN-System-Manager, то необходимо для этой сети(комнаты) включить автономный режим атрибутом ManagerMode=Standalone;