воскресенье, 30 марта 2008 г.

Скрипты с интерфейсом

Администрируя потихоньку сервера с Linux, периодически приходится изобретать разного рода скриптики для выполнения ряда узких задач. Иногда эти задачи требуют взаимодействие скриптов с пользователем. Причём, зная уже свою родную систему вдоль и поперёк, изучив десятки команд и сотни их ключей, хочется дать отдыха своему мозгу, сделать для скрипта Интерфейс.
Пример диалогового окна вопроса

Для работы с удалёнными машинами я давно уже пользовался утилитой dialog, позволяющей создавать человеческого вида интерфейсы в скриптах. Как это выглядит знают все, кто устанавливал FreeBSD. Кому интересно: краткое описние dialog на русском и на английском, с большими картинками.

Автоматизируя работу на своём домашнем/рабочем компьютере с GNOME я обнаружил новое, ещё более увлекательное средство для создания интерфейсов в скриптах:

Zenity (Русскоязычное руководство в GNOME Documentation Library)

Освоив этот инструмент, правильный администратор/разработчик может облегчить жизнь себе любимому, своим близким, вынужденным терпеть Linux на домашнем компьютере, сотрудникам в офисе, куда стремительно рвутся всё более удобоваримые дистрибутивы свободной ОС. Удобство скриптования в unix-системах эта программа легко подружит с удобством использования. Не берусь даже обрисовать все возможные применения.

Пример номер 1:
Пропишем себе в crontab:
*/15 0-3 * * * DISPLAY=:0.0 /usr/bin/zenity --warning --title="Пора спать" --text="Завтра на работу"
И система заботливо и настойчиво будет нас клонить ко сну каждые 15 минут с 0 до 3 ночи.

Пример номер 2:
Статус ppp соединения плюс статистика в трее от Злого Ананаса.

Пример номер 3:
Сканируем тучи документов и выполняем обработку изображений офисных документов в пару кликов. Секретарша будет на вас молится. Конечный документ А4 в 200dpi обычного вида (типа счёта с синей печатью и подписью) имеет типичный вес от 60 до 200 килобайт и формат png. Нужны установленные sane-utils и ImageMagic.

#!/bin/sh

TMP="image$$"

while true; do

scanimage \
-p \
--format tiff \
--resolution 200 \
-x 215 -y 297 \
2> ~/$TMP.tiff \
3>&1 1>&2 2>&3 \
| perl -e '$/="\r";$|=1;while(<>){s/^\D+(\d+)\D.*$/$1\n/g;print;}' \
| zenity \
--progress \
--title="Сканирование" \
--text="Сканирую изображение. Пожалуйста, подождите..."

if [ $? -eq 0 ]; then
FILE=""
while [ -z "$FILE" ]; do
FILE=`zenity \
--entry \
--title="Обработка" \
--text="Укажите имя файла для сохранения"`
done
convert $TMP.tiff -level 20%,80%,0.4 -format PNG8 -colors 8 $FILE.png
else
killall scanimage
fi

rm -f $TMP.tiff

zenity \
--question \
--title="Продолжим?" \
--text="Вы желаете продолжить сканирование? Не забудьте положить в сканер новый лист." \
|| return

done

Комментариев нет: