tkBuilder – графический конструктор
Выходом могло бы быть написание на языке C/C++ GUI для утилиты p11conf, например, с использованием библиотеки Qt. Но тут в памяти всплыло, что есть скриптовый язык высокого яровня Tcl (Tool Command Language), который в связке с графической библиотекой Tk (Tool Kit) и позволяет быстро создавать графические интерфейсы для консольных программ или утилит командной строки. Впервые я познакомился с пакетом Tk/Tcl в далеком 1997 году, когда планировалось на нем написать графический интерфейс для системы контроля доступа (СКД). Тогда графические возможности пакета произвели сильное впечатление и, в частности, tetris:
Одной из причин, по которой отказались от использования Tk/Tcl, было отсутствие для него в то время конструктора (дизайнера) аналогичного сегодняшнему, скажем, QT-designer. Освежив в памяти возможности Tk/Tcl, а нас интересовало, помимо графических возможностей, организация взаимодействия с утилитами командной строки, и убедившись, что мы стоим на правильном пути, мы принялись за поиск конструктора. После проведенного анализа имеющихся конструкторов выбор пал на дизайнер tkBuilder_for_tcl8.4:
Дальнейшая разработка показала правильность выбора. Конструктор оказался не только с понятным интерфейсом, но обладает отличными функциональными возможностями. Он позволяет в ходе разработки отслеживать проект не только целиком:
но также контролировать его отдельные части:
Разработчик всегда может посмотреть код всего проекта или его части:
Взаимодействие с утилитой командой строки, для которой разрабатывается графическая оболочка, ведется по программному каналу:
Когда проект завершен, то необходимо его сохранить в итоговом tcl файле:
О ложках дегтя
Казалось бы все, бери и запускай утилиту. Но без ложки (на самом деле двух ложек) дегтя нельзя. Первая ложка связана с формированием у виджетов (в нашем случае у виджета 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
Теперь смело можно работать с токенами PKCS#11, в том числе и с облачным токеном LIBLS11CLOUD, например, просмотреть какие объекты хранятся на нем:
Файл проекта GUIP11CONF.tkb и утилиту GUIP11CONF.tcl скачать можно здесь. Утилиту p11conf для различных платформ можно скачать здесь. Маленькое замечание. В утилите GUIP11CONF.tcl прописан путь в утилите p11conf (см. выше):
global p11conf
…
set p11conf "/usr/local/bin64/p11conf"
Скорее всего, вам придется поправить путь к утилите p11conf с учетом вашей конфигурации.
Лиха беда начало
В заключение отмечу, что аппетит приходит во время еды и уже есть желание написать аналогичные графические оболочки для таких утилит командной строки как openssl/lirssl (ССЫЛКА ) или утилит NSS (Network Security Services). Как говорится, лиха беда начало.
Комментарии (27)
merlin-vrn
13.07.2017 10:368.4 в 2017 году? Ох и ох. А что не 8.6 и TTk? Он хотя бы выглядит не так убого.
Нет, я понимаю, что по одёжке встречают, я сам писал графические приложения на Tcl/Tk (лет пять тому назад), но даже тогда в моём распоряжении уже был 8.5…saipr
13.07.2017 10:57А с чего вы взяли, что 8.4? Из названия "tkBuilder_for_tcl8.4"?
Так это вы не правы. На компьютере стоит все что надо. А "tkBuilder_for_tcl8.4" просто указывает путь, где скачать конструктор.
svk28
13.07.2017 10:49+3В принципе, разобравшись с системой построения GUI в Tk, графический построитель особо не нужен, там в полне всё логично.
Lsh
13.07.2017 11:05Красотища какая!
saipr
13.07.2017 11:13+1Если без злой иронии, то спасибо. Как поется "то или еще будет".
Lsh
13.07.2017 12:13+1С иронией, конечно. Но не злой. Всё таки Tk выглядит достаточно аляповато.
Дело тут не в том, что вид не современный, а просто не хватает выравниваний, отступов, единообразия.
И весь софт, что мне попадался на Tk имеет эти проблемы.
Создаётся ощущение недопиленности.saipr
13.07.2017 12:39Насчет аляповатости, выше уже упоминался ТТК. И если посмотреть новые demos, то это ощущение и аляповатость отойдет. Я думаю просто вам попадался относительно устаревшие проекты, которые могли писаться в ручную, поэтому всегда есть проблемы выравниваний, отступов, единообразия. Именно поэтому в свое время мы отложили Tk. А вот сейчас попробовал cс tkBuilder-ом и вроде получается. А недопиленность не в самом Tk/Tcl, а в средствах проектирования. Спасибо за добрую иронию.
svk28
13.07.2017 13:15+2И выравнивания и отступы это все есть. Хотя, надо признать, что «голый» Tk выглядит… аскетично (в винде он выглядит как любое другое приложение), но тотже BWidget, вполне себе настраивается. На мой взгляд, по скорости и удобству разработки небольших переносимых графических приложений, мало что может поспорить со связкой tcl/tk (надеюсь поклонники python и Qt меня сейчас не запинают :) ).
mc2
17.07.2017 21:58+1Если использовать tile, то вы не заметите серьезных отличий от нативных приложений.
svk28
13.07.2017 11:56+1С позволения автора, вспомнил ещё один подобный продукт — Visual Tcl, проект вполне живой и рабочий (только что проверил). Т.е. если кому нужно для ознакомления с Tcl/Tk, то вполне подойдет http://vtcl.sourceforge.net
redmanmale
13.07.2017 17:28Я конечно извиняюсь, но это прекрасный пример того, как не надо делать интерфейсы.
Наверняка ведь в этом интерфейсе нажимаются все кнопки сразу и нет никакой защиты от дурака.
В консоли хоть думать надо перед тем, как жмакнуть что-то, а здесь можно навертеть дел и ничто не остановит.saipr
13.07.2017 18:01Наверняка ведь в этом интерфейсе нажимаются все кнопки сразу и нет никакой защиты от дурака.
Это просто голословное заявление. Кто или что вам мешает скачать утилиту и запустить. Вот тогда бы вы и убедились, что и все кнопки нажать одновременно нельзя, что есть защита от дурака. И здесь надо думать, что зачем нажимаешь и что и зачем вводишь. Более того, чтобы нажать, надо мышко подвигать или на клавиатуре поработать.
Ключевое слово в вашем комментарии "Наверное", а это несерьезно.
Должно быть так, я скачал и запустил и оказалося….
И еще здесь речь идет не об проектировании идеального интерфейса для той или иной задачи, а об инструментарии, с помощью которого можно спроектировать и реализовать.
Movimento5Litri
19.07.2017 22:19Я просто оставлю это здесь
https://lurkmore.to/TclS_A
20.07.2017 05:31+1Отчасти вы правы. Старое достаточно дело. Меня как-то миновала участь с Tcl/Tk, хотя на питоне (TKinter кажется?) когда пробовал, но быстро-быстро перелез на wxWindow. Не суть.
Нынче я заглядываюсь и пытаюсь найти время на пощупать Red. При том хочу собрать его сам, так как антивирусня на него жалуется зачем-то, хоть он и open source.
А задачу, которую решает автор, было бы неплохо попытаться поавтоматизировать — просто парсить --help, и пользуясь эвристиками, ну или пошаговыми подсказками запустившего пользователя… сгенерировать гуй для консольной утилиты.
Простые параметры показывать галками, составные (у которых должно быть значение) — полями ввода или выбора файла и так далее (вариантов не 100500). Это был бы номер :)saipr
20.07.2017 07:06Как не парадоксально, а вы рассказали как работает сама библиотека облачного токена libls11cloud.so (ls11cloud.dll и т.п.). Когда она инициализируется (в терминах PKCS#11 — C_INITIALIZE), то для доступа к облаку токена требуется ввести пароль (не путить с PIN-кодом токена), и вот тут как раз библиотека и генерирует гуй для ввода пароля на основе анализа какие графические средства установлены на компьютере пользователя.
Да, а сделать универсальное средство для консольных утилит — это неплохою
quarckster
22.07.2017 18:59В чём смысл использовать этого уродца и язык этот скриптовый маргинальный? Есть же pyqt.
saipr
22.07.2017 19:01Есть многое на свете, друг Горацио, что и не снилось нашим мудрецам
В. Шекспир, "Гамлет"
mc2
Дико извиняюсь, но язык называется Tcl/Tk
saipr
Вы правы. Но в контексте этого материала первично было Tk, так на автомате и отложилось "Тэ-ка Ти-си-эль" (я учил французский).