Создаём GUI к скриптам лёгким движением руки или GTK на bash

CORPSE аватар

Доброго времени суток всем. Чистая консоль - это конечно же, очень хорошо и практически не требует вычислительных ресурсов, но часто мы жертвуем оными ради некоторой доли удобства. Чем я вчера и занялся. Поставил себе задачу частично автоматизировать и собрать в одну кучку средства решения некоторых задач, связанных с сетью, с которыми мне приходится сталкиваться на работе. В идеале это будет некая панель управления на GTK, работающая по принципу "нажми на кнопку - получишь результат". Начать решил со следующей задачи: периодически нужно сканировать подсети на предмет находждения свободных и занятых ip адресов, а у живых хостов проверять на открытость определённые порты, получать их мак и dns адреса и т.п.. Итак, нужен инструмент, быстро пингующий хосты сети по маске или диапазону и строящий наглядный список. Можно конечно, написать скрипт, но зачем изобретать велосипед, когда его уже изобрели. Я нашёл утилитку под названием "fping". Краткое описание из репозитория debian:

Description-ru: отправляет на сетевые устройства пакеты ICMP ECHO_REQUEST
 fping -- это программа, похожая на ping, она использует echo-запрос
 протокола управляющих сообщений Internet (ICMP), чтобы определить --
 отвечает ли целевое устройство. fping отличается от ping тем, что вы можете
 указать любое количество целей в командной строке, либо задать их через
 файл. Вместо того, чтобы отправлять запрос на одну цель, и
 дожидаться ответа или истечения времени, fping отправляет ping-пакет и
 переходит к следующей цели и так по кругу.

Теперь нужно озадачиться созданием графического интерфейса. Лучше всего для этой цели подходит gtkdialog (http://linux.pte.hu/~pipas/gtkdialog/), хотя и содержит в себе изрядную долю досадных ошибок. Например, мне так и не удалось на лету добавлять элементы в таблицу. Я промучался два часа, пока не наткнулся на багрепорт: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=520707
Здесь содержится масса примеров (часть из которых, как уже говорилось, не работает): http://xpt.sourceforge.net/techdocs/language/gtkdialog/gtkde02-Gtkdialog...
Не смотря на то, что в большинстве современных дистрибутивов содержится версия 7.20 этого чуда, существует ещё масса пропатченных вариаций. Например, gtkdialog2 и gtkdialog3 - то же самое, только с несколькими десятками исправленных ошибок.

Для реализации моих задач, я надеюсь, что хватит той версии, которая идёт в дистрибутиве debian-lenny.

Сначала установим то, что нам понадобится:

apt-get install gtkdialog fping

Объясню в двух словах общий принцип работы gtkdialog. Сначала создаётся на языке xml описание формы, расположение и наименование компонент, вызов различных действий при работе с этими компонентами (например, нажатие кнопки), источники данных (наполнение таблиц, иконки пунктов и т.п..). Потом полученное описание скармливается интерпретатору - собственно, бинарному файлу gtkdialog, который уже создаёт формы, кнопки и прочие объекты соотвественно описанию. А реакцию на них уже обрабатывает скрипт.

Возможности не очень широки, если честно. Например, я так и не смог понять, можно ли в качестве источника данных для editor использовать не файл, а переменную или другой скрипт, как это сделано с entry, можно ли сделать группу из radiobutton, если они не идут подряд, а расположены в разных местах на форме и т.п.. В общем, вопросов масса, а ответить на них некому и даже гугл меня не спас. В общем, работать пришлось большей частью по наитию. Не смотря на это, получилось даже что-то живое. Ниже я просто выложу ссылку на скрипт (ибо из-за куска на xml тут он просто отображается некорректно), думаю, с его восприятием проблем не возникнет. А если будут какие-то вопросы, я отвечу.

http://shumilov.org/blog/wp-content/uploads/2009/12/fpinggui

Полученный фронт энд позволяет быстро просканировать диапазон адресов и вывести их список в левой части окна. В правой я со временем добавлю кнопки, запускающие nmap например или host на выделенный в левой части ip адрес, но об этом в следующей нашей передаче. :)

Кстати, только сегодня открыл для себя возможность при помощи sort корректно упорядочить ip адреса. Т.е. чтобы сначала шёл 192.168.1.9, а за ним 192.168.1.10, а не 192.168.1.1, 192.168.1.10 и т.п.. Т.е., не по алфавиту, а по числовому значению сегмента. Это довольно легко делается, если указать sort'у сортировать числовым методом, в качестве разделителя поставить точку, а потом указать по какому сегменту производить сортировку: sort -u -t "." -k 4 -n

Итог: на чистом баше в несколько десятков строк мы получили почти что графическое приложение. :)

P.S.: В аттаче скриншот в действии.

Grifon аватар

Для решения твоей проблемы смотри тут:
http://ru.wikipedia.org/wiki/Zeroconf
http://ru.wikipedia.org/wiki/Avahi

А по поводу написания диалогов, раскрывай тему и дальше. Познавательно

CORPSE аватар

За наводку спасибо. :) avahi - действительно интересная вещь. Но мне она не совсем подходит. Скажем, искать от какого порта подключен человек, она не будет.

Fellah аватар

Я и предположить не мог, что консольное приложение можно так изящно обернуть в оконный интерфейс.
Очень познавательно :)

CORPSE аватар

Спасибо! Я gtkdialog для себя открыл, когда делал свою сборку паппи. Там довольно много всего написано с его использованием, потому что критичен размер приложений. Сначала долго удивлялся - как это в дистрибутив размеров 125 мегабайт входит столько всего и куча визардов сверху, пока случайно не открыл текстовым редактором то, что считал бинарным файлом. Это было откровением. :) Потом я пару часов сидел на попе ровно и постигал дзен, вороша скрипты. :) Аналогов по оффтопик не видел.

dinya аватар

Можно еще поглядеть в строну zenity. Тоже штука для создания диалоговых окошек на gtk+ из командной строки. Если не ошибаюсь, то с его применением написан один из gui для арчевского пакетного менеджера packman

CORPSE аватар

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

CORPSE аватар

Вот пример:
http://useunix.ru/napisanie-scriptov-s-graficheskim-interfeisom-2/

Сделать тот же фронтэнд для fping на этом у меня бы не получилось. :)

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".