Для проекта используемого как система дашбордов, возникла необходимость автоматизировать открытие нужных страниц, авторизации на них и восстановление их после сбоев\перезагрузок.
- "Экраны" дашбордов - это один сплошной экран с разрешением, сложенным из разрешений всех мониторов, и один запущенный X11-сервер:
root@ltsp20:~# xrandr -q | egrep 'Screen| connected'
Screen 0: minimum 8 x 8, current 3240 x 1920, maximum 32767 x 32767
HDMI1 connected 1080x1920+2160+0 left (normal left inverted right x axis y axis) 160mm x 90mm
HDMI2 connected 1080x1920+1080+0 left (normal left inverted right x axis y axis) 160mm x 90mm
HDMI3 connected 1080x1920+0+0 left (normal left inverted right x axis y axis) 160mm x 90mm
Поэтому, манипулировать переменными $DISPLAY не выйдет: оперировать придется (x,y) координатами, и размерами окон.
- Было проработано 2 варианта решений: на голом bash, и на python с использованием selenium.
- для открытия страниц использовали uzbl-browser, т.к. он позволяет осуществлять управление через свой fifo-пайп;
- авторизация с помощью cookie-файла
- связка
bash + xrandr + uzbl-browser + txt-файл со ссылками
; - авто-релоад всех открытых окон по заданному интервалу
Минусы:
- парсить/расширять txt-файл с настройками на bash - не самое приятное занятие;
- нет возможности гибко расположить окна (скрипт берёт конфигурацию всех подключенных мониторов, и запускает окна браузера "по одному на каждый монитор");
- uzbl-browser не очень хорошо умеет в javascript (вертикальная агенда на графиках в графана, например, не отображалась);
- uzbl-browser не позволит ничего сделать незнакомому с ним пользователю (когда захочешь залогиниться в дашборд, и что-либо открыть/перенастроить);
- scale/resize окон браузера работает примерно так же "хорошо", как и javascript;
Для "гибкого" запуска приложения в нужном месте экрана с нужным размером, был доработан скрипт, но он требует дополнительной установки ещё wmctrl + xdotool
и в итоге - не пригодился (скрипт ver.1/launcher.py
).
- можно открывать что угодно и в каком угодно месте экрана (потому что selenium);
- вопрос с автологином/авторефрешем/etc не стоит (потому что selenium);
- т.к. реализация на python, txt-файл с настройками может быть, в принципе, любым;
- т.к. больше нет проблемы с логином, можно расширять скрипт нужными ссылками со своими формами авторизации/логина/etc;
Минусов особо нет, есть только пространство для доработки:
- добавить refresh-параметр в файл настроек (чтобы можно было переопределять для разных окон);
- done: аргумент "refresh::15"
- добавить scale-параметр в файле настроек (на случай, если хочется 150% масштаб, например);
- добавить возможность открывать окно в fullscreen-режиме;
- done: аргумент "fullscreen::true"
- добавить возможность логиниться не только в https://another_url.com, но и в https://yet_another_url.com (как минимум);
- done: аргумент "application::monitor"
- добавить возможность выбора драйвера (не только firefox, но и chrome) для открытия окна.
Скрипт использует firefox для открытия окон браузера.
Нужно создать директорию ~/.config/autostart/
и положить в неё файл с расширением .desktop
и следующим содержанием:
# cat ~/.config/autostart/dashboards.desktop
[Desktop Entry]
Type=Application
Name=Dashboards
Exec=sh -c "$HOME/bin/dashboards.sh"
X-GNOME-Autostart-enabled=true
- Есть поддержка chrome
- Есть zoom (работает только в chrome)
- Есть обработка ошибок, когда окно схлопнулось/резолв отвалился/сеть моргнула
появилсявыпилен к чертовой бабушке bash :)
- Установленные python3-модули:
- selenium
- PyYAML
- Установленные в системный $PATH
firefox
иchrome
драйвера для selenium (само собой, в системе должны быть установлены и сами firefox & chromium):
cd /usr/local/sbin
# geckodriver (firefox):
wget https://github.com/mozilla/geckodriver/releases/download/v0.24.0/geckodriver-v0.24.0-linux64.tar.gz -O- | tar -xzvf -
# chromedriver (download & unpack .zip file):
https://chromedriver.storage.googleapis.com/index.html
# проверяем, что они есть и исполняемые:
root@ltsp20:~# ls -lahtr /usr/local/bin/
total 20M
-rwxrwxr-x 1 root root 8.4M Jan 29 01:49 geckodriver
-rwxr-xr-x 1 root root 12M Feb 1 11:22 chromedriver
- Копируем скрипты:
# наш python-модуль для работы с дашбордами:
cp -a dashboards /usr/local/lib/python3.5/dist-packages/
# наш скрипт для запуска:
cp -vf ./dashik /usr/local/bin/dashik
- Кладём конфигурационный файл к себе в $HOME (желаемый путь можете выбрать самостоятельно):
cp -vf ./config.sample.yml $HOME/dashboards.yml
- Создаём файл автостарта:
cat > ~/.config/autostart/dashboards.desktop <<EOF
[Desktop Entry]
Type=Application
Name=Dashboards
Exec=sh -c "dashik -c $HOME/dashboards.yml"
X-GNOME-Autostart-enabled=true
EOF
В настоящий момент все, описанное выше в пунктах 1-3, уже сделано в образе, с которого загружаются дашики. Поэтому вся настройка сводится к редактированию файла конфигурации в формате yaml.
Параметр | Тип значения | Описание |
---|---|---|
x |
int | X-координата верхней левой точки открываемого окна |
y |
int | Y-координата верхней левой точки открываемого окна |
width |
int | Ширина открываемого окна |
height |
int | Высота открываемого окна |
url |
string | Полный адрес страницы для отображения |
tab |
string | Адрес страницы которую необходимо открыть в новой вкладке (в дополнение к основной странице указанной в url ) |
user |
string | Имя пользователя для авторизации в поддерживаемых приложениях |
password |
string | Пароль пользователя для авторизации в поддерживаемых приложениях |
refresh |
int | Необязательный параметр, указывающий период (в секундах) обновления страницы. Значение по умолчанию - 600 |
fullscreen |
bool | Необязательный флаг, указывающий необходимость разевернуть окно на весь экран. Значение по умолчанию - False . |
zoom |
int | Необязательный параметр, указывающий масштаб (в процентах) открываемой страницы. Работает только для драйвера "chrome". Значение по умолчанию - 100 |
driver |
string | Обязательный параметр, выбор браузера (в настоящий момент поддерживаются "firefox" и "chrome") |
application |
string | Обязательный параметр, тип запускаемого приложения. Влияет на способность скрипта произвести авторизацию на открываемой странице. Указанный для страницы тип должен точно соответствовать одному из списка ниже. По умолчанию используется "default" (без авторизации). |
Приложение | Тип для указания в файле конфигурации | Примечание |
---|---|---|
No auth | default |
Выбирается в случае отсутствия директивы application или для любого типа приложения, не указанного в списке. Игнорирует заданные user/password. |
Grafana | grafana |
Если у вас grafana без авторизации, используйте "default". |
Jenkins | jenkins |
При входе в Allure Report автоматически сворчивается боковая панель слева |
Monitoring | monitor |
При логине в мониторинг автоматически происходит переключение на тёмную тему оформления |
Hosting dashboard | hdb |
|
Bareos Web UI | bareos-dir |
|
TargetProcess | targetprocess |
При логине автоматически сворчивается боковая панель слева |