Делаем GUI для Bash скрипта
Иногда для простоты или удобства использования некоторых скриптов необходимо сделать к ним графическую оболочку. Особенно это актуально, если в будущем скриптом придётся пользоваться человеку, плохо знакомому с консолью Linux. Для bash есть несколько альтернативных вариантов создания GUI. Я остановил свой выбор на zenity.
Ставится на ubuntu она стандартно, из репозиториев:
sudo apt-get install zenity
Дальше мы получаем довольно мощный инструмент для создания диалоговых окон. В данном примере, сделаем GUI скрипту для просмотра логов с различных серверов, находящихся одной локальной сети. Рассмотрим пример просмотра логов с 2х сереров: nginx и apache2.
Все основные моменты вроде бы прокомментировал в самом скрипте)
#!/bin/bash
# делаем форму размерами 320 на 300 # и запрашиваем через нее все необходимые нам параметры.
num=$(zenity --width=320 --height=300 --forms --title="History"\
--text="Введите последнюю цифру IP сервера" \
--add-entry="10.20.0." \
--add-list="Для какого сервиса смотрим логи? " --separator="|" --list-values="nginx|apache2" \
--add-calendar="Выберете дату:" --forms-date-format='%Y-%m-%d' ) # обрабатываем введенные параметры и присваиваем их переменным.
num_ip=$(echo $num | awk 'BEGIN {FS="|" } { print $1 }')
num_history=$(echo $num | awk 'BEGIN {FS="|" } { print $2 }')
num_date=$(echo $num | awk 'BEGIN {FS="|" } { print $3 }')
# проверяем параментр ip-адресс на корректность.
if [ -z "$num_ip" ]
then
zenity --error \
--text="Сервер с таким IP не найден!" \
--no-wrap ""
exit 1
fi
dir="$HOME/$num_ip"
mkdir -p $dir
# проверяем условия и выполняем действия исходя из результатов.
if [[ "$num_history" =~ "nginx" ]]; then
scp feanor184@10.20.0.$num_ip:/var/log/nginx/log_${num_date}* $dir
elif [[ "$num_history" =~ "apache2" ]]; then
scp feanor184@10.20.0.$num_ip:/var/log/apache2/log_${num_date}* $dir
else zenity --error \
--text="Не выбран сервис для которого будем смотреть логи" \
--no-wrap ""
exit 1
fi
# если лог был заархивировал логротейтом, разархивируем его перед чтением.
if [ -e $dir/*.gz ]; then
gunzip $dir/*
fi
# выводим содержимое лога на экран в удобной форме.
zenity --title Лог с сервера 10.20.0.$num_ip за $num_date --width 800 --height 600 \
--text-info --filename $dir/*
# удаляем временную директорию
rm -r $dir
Замечание! В данном виде скрипт будет работать только при условии правильной иерархии логирования в папках на серверах. В данном случае я сделал логирование по датам в виде log_$date.
Применение zenity на самом деле может быть очень широкое, тут остается огромное пространство для фантазии в зависимости от потребностей.
Всё же лучше не делать чистое GUI, а использовать, к примеру ncurses обёртку dialog.
Всё же это более распространённое в дистрибутивах решение.
Дизайн сайта реально крутой)
Интересная задумка
У меня не работает вот этот фрагмент:
—add-list=»Для какого сервиса смотрим логи? » —list-values=»nginx|apache2″
Может какие глобальные настройки должны быть включены?
версия зенита — 3.4.0
Pingback: Написание скриптов на Bash | Losst