30 ноября 2010 г.

Диалог с bash'ем: использование kdesu и kdialog в скриптах

Bash - замечательная штука! В подавляющем большинстве случаев намного удобнее произвести настройки системы в командной строке, чем тыкать по кнопочкам и путешествовать по множеству окон, а самое приятное то, что любые настройки можно автоматизировать написав скрипт. Но иногда возникают такие ситуации, что к вашим замечательным скриптам необходимо дать доступ людям, которые не имеют навыков использования командной строки. В таком случае возникает необходимость создания простого примитивного подобия графического интерфейса, причем обычно достаточно функционала диалоговых окон.

В KDE можно легко создавать диалоговые окна в bash-скриптах, используя программу Kdialog. Причем окна могут быть самые разнообразные от обычных yes-no-cancel, до диалогов открытия/сохранения файла и отображения полосы прогресса. Использование продемонстрирую на своем реальном примере.

У меня на домашнем компьютере возможны две конфигурации сети: первая - это настройка по умолчанию на использование Интернета от провайдера и вторая - виртуальное соединение vtund  с работой и использование рабочего Интернет-соединения. Между этими конфигурациями мне периодически надо переключаться. Для всего этого у меня, конечно же, есть различные скрипты. На эти скрипты я и навесил немного гуйчика.

Итак, у меня есть 5 скриптов:
  1. enetconf - служит для запуска net_conf_choise.sh с правами пользователя root
  2. net_conf_choise.sh - скрипт отвечающий за выбор конфигурации
  3. network_default.sh - настраивает сеть по умолчанию
  4. vtund.run - поднимает vtund-соединение и запускает set_local_routes.sh
  5. set_local_routes.sh - устанавливает прямые маршруты для локальных сетей провайдера, чтобы не ходить на эти ресурсы через рабочее Интернет-соединение.
Скрипт enetconf содержит следующие строки:
#!/bin/bash
NET_CONF_DIR="/opt/scripts/enetconf"
cd $NET_CONF_DIR
kdesu -t -c "bash ./net_conf_choise.sh"

Первые две строки понятны - это переход в каталог со скриптами, а вот последняя строка выводит диалоговое окно для ввода пароля root и в случае правильного пароля выполняет команду, указанную после параметра "-c" с правами суперпользователя, которые необходимы для выполнения команд содержащихся в других скриптах.


Скрипт net_conf_choise.sh:
#!/bin/bash
CHOISE=`kdialog --menu "Выбор конфигурации сети:" a "vtund" b "default"`

# если нажата кнопка OK
if [ $? == 0 ]
then
    case $CHOISE in
    a) ./vtund.run
    ;;
    b) ./network_default.sh
    ;;
    esac
fi

В скрипте net_conf_choise.sh показан пример использования окна выбора. В переменную CHOISE будет сохранен символ "a", если будет выбран пункт "vtund" и "b", если выбран "default". В зависимости от выбора будет запущен соответствующий скрипт настройки сети.


При выборе в окне пункта default будет запущен скрипт network_default.sh:

#!/bin/bash

IFACE=wlan0

# запускаем программу kdialog, отображающую полосу прогресса,
# полоса прогресса состоит из 3-х пунктов
# сохраняем ссылку на kdialog в переменной для использования в qdbus
# (если можно так выразиться:))
dbusRef=`kdialog --progressbar "Подготовка" 3`

# устанавливаем положение полосы на первый пункт
qdbus $dbusRef Set "" value 1 
# устанавливаем отображаемое сообщение
qdbus $dbusRef setLabelText "Уничтожение vtund..."
# убиваем vtund если есть 
killall vtund
sleep 1

qdbus $dbusRef Set "" value 2
qdbus $dbusRef setLabelText "Удаление маршрутов..." 
ip route flush all
sleep 1

qdbus $dbusRef Set "" value 3
qdbus $dbusRef setLabelText "Установка стандартных маршрутов..."
ip route add 192.168.1.0/24 dev $IFACE
ip route add default via 192.168.1.1

# закрываем диалог
qdbus $dbusRef close

В этом скрипте показано использование окна с полосой прогресса. Сначала запускается сама программа kdialog, которая отображает окно. Для взаимодействия скрипта с программой kdialog используется программа qdbus. qdbus - это консольная программа, которая позволяет "общаться" с приложениями через систему D-Bus.


Другие два скрипта я описывать не буду, потому что в vtund.run программа kdialog используется таким же образом, как и в network_default.sh, а set_local_routes.sh вообще не содержит вызовов окон.

Приведенные примеры демонстрируют, как можно украсить или сделать более доступными ваши скрипты, не прибегая по сути к настоящему программированию. Больше примеров использования kdialog можно посмотреть тут, а здесь есть примеры использования других графических программ в bash-скриптах. Маленькие интересные примеры использования qdbus можно глянуть тут.

Замечание! В KDE3 вместо qdbus надо использовать dcop.

Если у вас не работает kdesu в KDE 4, то посмотрите мое сообщение о баге, на который я наткнулся в openSUSE 11.4, вдруг поможет.

2 комментария: