Pull to refresh

Tcl/Tk. Разработка графического пользовательского интерфейса для утилит командной строки

Reading time 4 min
Views 27K
Тестируя облачный токен на различных платформах, меня не покидала мысль о некой несправедливости: почему утилиты конфигурирования токенов PKCS#11 на платформе MS Windows имеют графический интерфейс, а для других платформ его нет. И в первую очередь это касается базовой утилиты p11conf, которая доступна для свободного использования и является утилитой командной строки, взаимодействие с которой осуществляется через стандартный ввод/вывод.

tkBuilder – графический конструктор


Выходом могло бы быть написание на языке C/C++ GUI для утилиты p11conf, например, с использованием библиотеки Qt. Но тут в памяти всплыло, что есть скриптовый язык высокого яровня Tcl (Tool Command Language), который в связке с графической библиотекой Tk (Tool Kit) и позволяет быстро создавать графические интерфейсы для консольных программ или утилит командной строки. Впервые я познакомился с пакетом Tk/Tcl в далеком 1997 году, когда планировалось на нем написать графический интерфейс для системы контроля доступа (СКД). Тогда графические возможности пакета произвели сильное впечатление и, в частности, tetris:

image

Одной из причин, по которой отказались от использования Tk/Tcl, было отсутствие для него в то время конструктора (дизайнера) аналогичного сегодняшнему, скажем, QT-designer. Освежив в памяти возможности Tk/Tcl, а нас интересовало, помимо графических возможностей, организация взаимодействия с утилитами командной строки, и убедившись, что мы стоим на правильном пути, мы принялись за поиск конструктора. После проведенного анализа имеющихся конструкторов выбор пал на дизайнер tkBuilder_for_tcl8.4:

image

Дальнейшая разработка показала правильность выбора. Конструктор оказался не только с понятным интерфейсом, но обладает отличными функциональными возможностями. Он позволяет в ходе разработки отслеживать проект не только целиком:

image

но также контролировать его отдельные части:

image

Разработчик всегда может посмотреть код всего проекта или его части:

image

Взаимодействие с утилитой командой строки, для которой разрабатывается графическая оболочка, ведется по программному каналу:

image

Когда проект завершен, то необходимо его сохранить в итоговом tcl файле:

image

О ложках дегтя


Казалось бы все, бери и запускай утилиту. Но без ложки (на самом деле двух ложек) дегтя нельзя. Первая ложка связана с формированием у виджетов (в нашем случае у виджета text) команд xScrollCommand и yScrollComand., а именно:

text .fr1.fr2_list -background #ffffff \
   -yscrollcommand [list .fr1.ysc set] -xscrollcommand [list .fr1.scx set]

Не хотят они попадать в итоговый файл. В итоге их пришлось прописывать ручками. Ну и вторая ложка дегтя классическая. Дизайнер tkBuilder_for_tcl8.4 отказывается работать с русскими буквами (можеть я чего не доглядел). Подчеркиваю, это касается только дизайнера и не касается Tcl/Tk, для которого русский язык как дом родной. Здесь тоже пришлось поработать ручками:

#!/bin/sh
# the next line restarts using wish \
exec wish8.5 "$0" ${1+"$@"}
wm title . "GUI P11CONF"
global p11conf
global libpkcs11
set res ""
set libpkcs11 ""
set p11conf "/usr/local/bin64/p11conf"
. configure  -background #18f1d7
frame .fr1 -background #18f1d7
grid .fr1 -column 0 -row 0
button .fr1.b1 -command  {InitTok . .fr1.fr2_list;} -padx 1 -text "Инициализировать" -width 24
grid .fr1.b1 -column 0 -row 0
button .fr1.b2 -command {ChangeUserPin . .fr1.fr2_list; } -padx 1 -text "Сменить USER PIN" -width 24
grid .fr1.b2 -column 0 -row 1
button .fr1.b6_3 -command {ChangeSOPin . .fr1.fr2_list "SO"; } -padx 1 -text "Сменить SO PIN" -width 24
grid .fr1.b6_3 -column 0 -row 2
button .fr1.b7 -command {InfoObj . .fr1.fr2_list "Obj"; } -padx 1 -text "Просмотреть объекты" -width 24
grid .fr1.b7 -column 0 -row 3
button .fr1.b8 -command {InfoObj . .fr1.fr2_list "Clear";} -padx 1 -text "Удалить все объекты" -width 24
grid .fr1.b8 -column 0 -row 4
button .fr1.b9_6 -command {InfoToken . .fr1.fr2_list; } -padx 1 -text "Информация о токене" -width 24
grid .fr1.b9_6 -column 0 -row 5
button .fr1.b0 -command  {InfoMech . .fr1.fr2_list;} -padx 1 -text "Поддерживаемые механизмы" -width 24
grid .fr1.b0 -column 0 -row 6
button .fr1.b3_8 -command {ChangeSOPin . .fr1.fr2_list "Deblock"; } -padx 1 -text "Разблоктровать USER PIN" -width 24
grid .fr1.b3_8 -column 0 -row 7
button .fr1.b4_9 -command {InfoDump . .fr1.fr2_list; } -padx 1 -text "DUMP всех объектов" -width 24
grid .fr1.b4_9 -column 0 -row 8
button .fr1.b5_10 -command {exit} -text "Выход" -width 10

В итоге мы получили поддержку графического интерфейса для утилиты командной строки p11conf через утилиту GUITKP11Conf.tcl:

bash-4.3$ ./GUITKP11Conf.tcl

image
Теперь смело можно работать с токенами PKCS#11, в том числе и с облачным токеном LIBLS11CLOUD, например, просмотреть какие объекты хранятся на нем:

image
Файл проекта GUIP11CONF.tkb и утилиту GUIP11CONF.tcl скачать можно здесь. Утилиту p11conf для различных платформ можно скачать здесь. Маленькое замечание. В утилите GUIP11CONF.tcl прописан путь в утилите p11conf (см. выше):

global p11conf
…
set p11conf "/usr/local/bin64/p11conf"

Скорее всего, вам придется поправить путь к утилите p11conf с учетом вашей конфигурации.

Лиха беда начало


В заключение отмечу, что аппетит приходит во время еды и уже есть желание написать аналогичные графические оболочки для таких утилит командной строки как openssl или утилит NSS (Network Security Services). Как говорится, лиха беда начало.
Tags:
Hubs:
+17
Comments 32
Comments Comments 32

Articles