Плагин панели xfce4: показывает число, принятое из unix-сокета, и по наведению мыши — список переданных строк.
make
sudo make install
xfce4-panel -r
Установка вручную:
sudo cp libovpn-widget.so /usr/lib/xfce4/panel/plugins/
sudo cp ovpn-widget.desktop /usr/share/xfce4/panel/plugins/
xfce4-panel -r
Затем: правой кнопкой по панели → «Панель» → «Добавить новые элементы» → «Счётчик OpenVPN».
Зависимости: libxfce4panel-2.0-dev, libgtk-3-dev, gcc, make.
Собран и проверен на libxfce4panel 4.18 и GTK 3.24.
Их два.
- Главный — только GTK: метка, подсказка, диалог настроек. Не делает ни одного блокирующего вызова.
- Поток чтения (
src/reader.c) — единолично владеет сокетом: создаёт файл, слушает, принимает клиента, разбирает передачу, закрывает соединение. Чтение блокирующее, с таймаутом черезpoll().
Обмен между потоками — два однонаправленных канала и очередь GAsyncQueue.
Общих изменяемых данных нет, поэтому нет и мьютексов. Сообщение передаётся
главному потоку как готовый объект, владение переходит вместе с указателем.
X-XFCE-Internal=false в .desktop — панель запускает плагин в отдельном
процессе через свою обёртку. Падение виджета не роняет панель. Именно этот
способ рекомендован начиная с xfce4-panel 4.8 вместо старых исполняемых
плагинов 4.6.
FF начало передачи
NN количество строк, 0..15
LL <байты> длина строки в байтах и сама строка UTF-8
... ровно NN раз
00 00 конец передачи
<клиент закрывает соединение>
Ограничения: строк не больше 25; строка — не больше 60 символов, то есть не
больше 240 байт (символ UTF-8 занимает до 4 байт); длина в байте LL, число
символов проверяется после проверки UTF-8.
Ошибкой считается: не тот стартовый байт, счётчик больше 25, длина строки больше 240 байт, невалидный UTF-8, больше 60 символов, неверный терминатор, лишние данные после терминатора, обрыв соединения посреди передачи, пауза дольше таймаута.
При любой ошибке принятые данные выбрасываются, соединение и слушающий сокет закрываются, файл сокета удаляется, после чего всё создаётся заново.
Сообщение попадает на экран только целиком и только после того, как клиент корректно закрыл соединение.
Ошибка пишется в сислог.
-1— с момента запуска по сокету не пришло ни одного корректного сообщения.- На время передачи число становится тёмным серо-зелёным, подсказка отключается, левая и средняя кнопки мыши не работают. Правая кнопка остаётся панели — иначе во время передачи было бы не добраться до настроек.
- После ошибочной передачи на экране остаётся последнее корректно принятое значение.
./ovpn-send /run/user/1000/ovpn-widget.sock "первая строка" "вторая"
./ovpn-send /run/user/1000/ovpn-widget.sock # пустой список, покажет 0
Правой кнопкой по виджету → «Свойства». Диалог: путь к сокету, таймаут чтения,
шрифт (стандартный GtkFontButton). После сохранения поток чтения
перезапускается с новым сокетом, перезагрузка панели не нужна.
Файл ~/.config/ovpn-widget/config:
- строка, начинающаяся с
;,#или%— комментарий; - пустые строки пропускаются;
- первая значащая строка — путь к сокету;
- вторая — таймаут чтения, мс (50..60000, иначе берётся 500);
- третья — шрифт в формате Pango, например
Sans Bold 11.
Конфиг общий для всех экземпляров плагина, поэтому два виджета на два разных сокета одновременно работать не будут.
Если не удаётся создать или привязать сокет, разобрать шрифт или построить виджеты — сообщение по-русски уходит в syslog и процесс завершается:
journalctl -t ovpn-widget
Панель предложит перезапустить плагин. Неверный путь в конфиге правится руками
в ~/.config/ovpn-widget/config.
Парсер лога openvpn тут: https://github.com/deemytch/ovpn_stats