/LTSP_auto

Primary LanguagePython

LTSP automation

Для проекта используемого как система дашбордов, возникла необходимость автоматизировать открытие нужных страниц, авторизации на них и восстановление их после сбоев\перезагрузок.

  1. "Экраны" дашбордов - это один сплошной экран с разрешением, сложенным из разрешений всех мониторов, и один запущенный 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) координатами, и размерами окон.

  1. Было проработано 2 варианта решений: на голом bash, и на python с использованием selenium.

Вариант 1: bash - наше всё.

  • для открытия страниц использовали 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).

Вариант 2: python + selenium

  • можно открывать что угодно и в каком угодно месте экрана (потому что 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 для открытия окон браузера.

Как добавить запуск моего скрипта в autostart?

Нужно создать директорию ~/.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 :)

Требования

  1. Установленные python3-модули:
  • selenium
  • PyYAML
  1. Установленные в системный $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

  1. Копируем скрипты:
# наш python-модуль для работы с дашбордами:
cp -a dashboards /usr/local/lib/python3.5/dist-packages/

# наш скрипт для запуска:
cp -vf ./dashik /usr/local/bin/dashik
  1. Кладём конфигурационный файл к себе в $HOME (желаемый путь можете выбрать самостоятельно):
cp -vf ./config.sample.yml $HOME/dashboards.yml
  1. Создаём файл автостарта:
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 При логине автоматически сворчивается боковая панель слева