# Файл конфигурации для программы 'vega_mt_server'.
# Программа читает этот файл в момент запуска.
# Кроме параметров, настраиваемых в этом файле, у программы есть ещё небольшое
# количество параметров, задаваемых в командной строке. Для получения справки
# про эти параметры запустите программу с опцией «--help».
# С помощью параметров командной строки можно, в частности, указать программе,
# который файл конфигурации надо использовать.
###############################################################################

# Наши IP-адреса и порты, через которые с нами соединяются устройства и
# конфигураторы. Формат:
#   первое_описание, второе_описание ... последнее_описание
# Должно быть не менее одного описания. Описания не должны конфликтовать друг с
# другом. Каждое описание имеет следующий формат:
#   (протокол) "адрес" : порт
# Здесь 'протокол' это либо IPv4 либо IPv6 (допускается написание ipv4 и ipv6),
# 'адрес' это IP-адрес протокола IPv4 (dotted notation) или IPv6 (в
# шестнадцатиричном виде, с разделением двоеточиями), 'порт' это номер порта (в
# диапазоне 0...65535). Либо протокол (вместе со скобками), либо адрес (вместе
# с кавычками и двоеточием) может быть не указан. Если адрес не указан, сервер
# будет принимать запросы со всех сетевых интерфейсов данного компьютера.
# Сервер никак не учитывает, с которого из адресов/портов пришёл запрос на
# установление соединения. В частности, конфигуратор, соединившийся с одним
# портом, будет иметь доступ к устройству, соединившемуся с другим портом.
listen_on=(IPv4)12345,(IPv6)12345

# Режим записи в файл журнала информации о соединениях TCP/IP с устройствами и
# конфигураторами. Допустимые значения:
#   off - не записывать ничего
#   err - записывать только сообщения об ошибках
#   bad_frames - записывать сообщения об ошибках, к которым, по возможности,
#      прикреплять фрагменты данных, в которых обнаружена ошибка (это значение
#      по умолчанию)
#   all - записывать весь трафик, проходящий через соединения (а также
#      сообщения об ошибках)
# Осторожно! Запись сообщения в файл журнала - трудоёмкая операция. При большой
# нагрузке на сервер включение подробных режимов трассировки может привести к
# тому, что сервер перестанет справляться с нагрузкой.
//trace_tcp=bad_frames

# Сколько надо создавать нитей для обслуживания соединений с устройствами и
# конфигураторами (каждая нить обслуживает много клиентов).
# Не учитываются нити, создаваемые сервером для других целей (их, как минимум,
# две).
# Делать этот параметр большим, чем количество ядер у процессора, обычно нет
# смысла.
# По умолчанию 1.
//threads=3

# По умолчанию, операционная система обычно ограничивает количество
# дескрипторов файлов, которые мы можем использовать (включая сюда дескрипторы
# сокетов для связи с клиентами) небольшим числом (обычно, под Linux'ом 1024,
# под Cygwin'ом 256). С помощью этого параметра мы можем попросить операционную
# систему установить для нас другой лимит.
# Обратите внимание, что операционная система может запрещать увеличивать этот
# лимит больше определённого максимального возможного значения. Если
# запрошенное нами значение окажется больше, лимит будет установлен в
# максимальное возможное значение, и в файл журнала будет занесена запись об
# этом. Под Linux'ом максимальное возможное значение можно увеличить путём
# изменения настроек ядра и/или процесса 'systemd'.
# Если после числа стоит плюс, это означает, что мы стараемся поднять
# количество дескрипторов до указанного числа, если оно исходно было меньше, но
# не пытаемся опустить до указанного числа, если оно было больше.
//nofile=4096+

#----- файл статистики

# Путь и имя файла, в который надо будет записывать статистику о работе
# программы когда пользователь это потребует (командой "stt" в консольном
# режиме или сигналом SIGUSR1 в режиме демона).
# По умолчанию "/var/vega_mt_server.stt" под Linux и "vega_mt_server.stt"
# под Cygwin.
//stt="/var/vega_mt_server.stt"

# Маска доступа, которую надо назначать файлу 'stt' при его создании.
# Этот параметр важен при запуске под Linux/Unix. При запуске под
# Windows/Cygwin этот параметр особого смысла не имеет.
# Формат такой же, как в юниксовой команде 'chmod': три цифры, из которых
# первая задаёт права доступа для пользователя, под именем которого работает
# наша программа, вторая - для пользователей, входящих в одну группу с этим
# пользователем, и третья - для всех остальных пользователей. Значение цифры 0
# означает "никакого доступа", 2 - "только запись", 4 - "только чтение" и 6 -
# "чтение и запись" (бит "исполнение" назначать нельзя, поскольку не
# предвидится его разумное использование).
# Для нашего пользователя необходим доступ по записи (первая цифра должна быть
# равна 2 или 6).
# По умолчанию маска доступа равна 644 (доступ по чтению и записи для нашего
# пользователя и только по чтению для всех остальных).
//stt_mode=644

# Записывать ли в начало файла статистики символ Unicode Byte Order Mark (BOM).
# Наличие этого символа может существенно помочь если мы собираемся
# просматривать файл средствами web-сервера и/или на компьютере с Windows (но
# помешать, если мы работаем с файлом только под Linux, особенно если с
# консоли).
//stt_bom=false

#----- файл статистики по отдельным устройствам

# Путь и имя файла, в который надо будет записывать статистику по отдельным
# устройствам когда пользователь это потребует (командой "stt dev" в консольном
# режиме или сигналом SIGUSR2 в режиме демона).
# Если этот параметр не определён, программа не будет реагировать на SIGUSR2 и
# не будет подсчитывать статистику по отдельным устройствам (за счёт чего
# сэкономит некоторое количество памяти и процессорного времени).
//dev_stt="/var/www/html/vega_mt_server.devices"

# Маска доступа, которую надо назначать файлу 'dev_stt' при его создании.
# Формат такой же, как у 'stt_mode' (см. выше).
# Если данный параметр определён, должен быть определён также параметр
# 'dev_stt'.
//dev_stt_mode=644

# Записывать ли в начало файла 'dev_stt' символ Unicode Byte Order Mark (BOM).
# Подробнее см. 'stt_bom'.
//dev_stt_bom=false

#----- PID-файл

# Путь и имя файла, в который сервер должен записывать свой идентификатор
# процесса. Сервер записывает этот файл при запуске (уничтожая старый файл с
# таким именем, если он существовал) и уничтожает при корректном завершении.
# Если этот параметр не задан, сервер не записывает свой идентификатор
# процесса.
pid="/var/vega_mt_server.pid"

# Маска доступа, которую надо назначать файлу 'pid' при его создании.
# Формат такой же, как у 'stt_mode' (см. выше).
# Если данный параметр определён, должен быть определён также параметр 'pid'.
pid_mode=644

#----- дальше идёт тонкая настройка (обычно эти параметры трогать не надо)

# Если сервер не успевает обслуживать запросы на установление TCP-соединений в
# том темпе, в котором они поступают, эти запросы ставятся в очередь. Если эта
# очередь становится слишком длинной, операционная система отвечает отказом на
# все вновь поступающие запросы, пока очередь не придёт в норму.
# С помощью этого параметра мы рекомендуем операционной системе установить в
# указанное значение максимальную длину очереди для каждого из портов, на
# которых "слушает" наш сервер (см. 'listen_on'). Операционная система не
# обязана выполнить нашу рекомендацию в точности - фактически установленный
# предел может быть как меньше, так и больше рекомендуемого.
# По умолчанию данный параметр установлен в значение 100 - этого достаточно для
# обычного режима работы (поскольку ни устройства, ни конфигураторы не имеют
# обыкновения "ломиться на сервер толпой"). Увеличение значения данного
# параметра может ускорить работу при массовой закачке прошивок на устройства с
# помощью программы 'vega_mt_upload'.
//tcp_backlog=100

# Если при работе программы происходит ошибка, делающая невозможным приём
# запросов на установление TCP-соединений с некоторым портом, программа
# закрывает этот порт, выжидает заданную этим параметром задержку и пытается
# снова открыть порт и запустить приём (если не получается, снова выжидает
# задержку и т.д.).
# Если ошибка происходит при первой же (после запуска программы) попытке
# открыть порт, действия зависят от того, в каком режиме запущена программа.
# Если программа запущена в режиме "демона", она действует так же, как и при
# ошбке в установившемся режиме (выжидает задержку и т.д.). В консольном режиме
# программа выдаёт сообщение на консоль и завершает свою работу (чтобы
# пользователь увидел и исправил ошибку).
//restore_delay=3s

# После того, как клиент устанавливает сеанс TCP, сервер выжидает эту задержку.
# Если клиент это конфигуратор, он сам пошлёт сообщение. Если устройство, то
# оно будет молчать, и сервер по истечении интервала пошлёт ping, чтобы в явном
# виде узнать у клиента, кто он (если послать ping без задержки, то
# конфигуратор сглючит).
//initial_delay=200ms

# Если с момента завершения приёма от клиента последнего сообщения прошёл
# данный интервал времени, сервер посылает клиенту ping чтобы убедиться, что
# клиент всё ещё на связи.
//ping_period=30s

# Если от клиента был принят первый байт сообщения, и после этого в течение
# данного интервала времени не пришёл последний байт, это считается ошибкой
# (сеанс TCP разрывается).
//receive_frame_timeout=10s

# Если сервер начал запись в сокет сообщения для передачи клиенту и в течение
# данного интервала времени не смог записать последний байт, это считается
# ошибкой (сеанс TCP разрывается).
//transmit_timeout=600s

# Если сервер послал клиенту ping и в течение данного интервала времени не
# получил ответ на него, это считается ошибкой (сеанс TCP разрывается).
//answer_timeout=20s

# То же что 'answer_timeout', но для запроса "файл целиком от хоста
# устройству".
//answer_upfile_timeout=300s

# Сервер отвергает полученную от конфигуратора команду 'файл целиком от хоста
# устройству' если в этой команде указан размер файла, превышающий данный
# параметр.
max_sz_upfile=1000000000

# Тайм-аут инициализации программы в консольном режиме. Под инициализацией
# понимается время между завершением разбора параметров командной строки и
# файла конфигурации и приходом в полностью готовое к работе состояние (в
# частности, после завершения инициализации у программы успешно открыт
# серверный сокет, и она готова принимать от устройств запросы на установление
# TCP-соединений).
# В режиме "демона" этот параметр не действует, поскольку в нём программа не
# завершает свою работу в случае неудачной инициализации, а повторяет попытки
# инициализации до бесконечности. Поэтому, инициализация может быть завершена
# даже через год после запуска сервера (например, если TCP-порт был занят
# другой программой, и через год эта другая программа была отключена).
//init_timeout=3s

# Тайм-аут корректного завершения работы программы.
//shutdown_timeout=5s

# Тайм-аут сбора статистики.
# После получения команды на запись статистики ('stt' в консольном режиме или
# SIGUSR1 в режиме "демона") главная нить программы запрашивает статистику у
# всех остальных нитей. На это может потребоваться некоторое время. После
# завершения запросов программа записывает в файл статистики ту информацию,
# которую удалось к этому моменту собрать.
//stt_timeout=3s
