Тестируя облачный токен на различных платформах, меня не покидала мысль о некой несправедливости: почему утилиты конфигурирования токенов 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/lirssl (ССЫЛКА ) или утилит NSS (Network Security Services). Как говорится, лиха беда начало.
Поделиться с друзьями
-->

Комментарии (27)


  1. mc2
    12.07.2017 21:09

    Дико извиняюсь, но язык называется Tcl/Tk


    1. saipr
      12.07.2017 21:11

      Вы правы. Но в контексте этого материала первично было Tk, так на автомате и отложилось "Тэ-ка Ти-си-эль" (я учил французский).


  1. merlin-vrn
    13.07.2017 10:36

    8.4 в 2017 году? Ох и ох. А что не 8.6 и TTk? Он хотя бы выглядит не так убого.

    Нет, я понимаю, что по одёжке встречают, я сам писал графические приложения на Tcl/Tk (лет пять тому назад), но даже тогда в моём распоряжении уже был 8.5…


    1. saipr
      13.07.2017 10:57

      А с чего вы взяли, что 8.4? Из названия "tkBuilder_for_tcl8.4"?
      Так это вы не правы. На компьютере стоит все что надо. А "tkBuilder_for_tcl8.4" просто указывает путь, где скачать конструктор.


    1. saipr
      19.07.2017 20:30

  1. svk28
    13.07.2017 10:49
    +3

    В принципе, разобравшись с системой построения GUI в Tk, графический построитель особо не нужен, там в полне всё логично.


  1. saipr
    13.07.2017 10:49

    Это еще один плюс для Tk.


  1. Lsh
    13.07.2017 11:05

    Красотища какая!


    1. saipr
      13.07.2017 11:13
      +1

      Если без злой иронии, то спасибо. Как поется "то или еще будет".


      1. Lsh
        13.07.2017 12:13
        +1

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


        1. saipr
          13.07.2017 12:39

          Насчет аляповатости, выше уже упоминался ТТК. И если посмотреть новые demos, то это ощущение и аляповатость отойдет. Я думаю просто вам попадался относительно устаревшие проекты, которые могли писаться в ручную, поэтому всегда есть проблемы выравниваний, отступов, единообразия. Именно поэтому в свое время мы отложили Tk. А вот сейчас попробовал cс tkBuilder-ом и вроде получается. А недопиленность не в самом Tk/Tcl, а в средствах проектирования. Спасибо за добрую иронию.


        1. svk28
          13.07.2017 13:15
          +2

          И выравнивания и отступы это все есть. Хотя, надо признать, что «голый» Tk выглядит… аскетично (в винде он выглядит как любое другое приложение), но тотже BWidget, вполне себе настраивается. На мой взгляд, по скорости и удобству разработки небольших переносимых графических приложений, мало что может поспорить со связкой tcl/tk (надеюсь поклонники python и Qt меня сейчас не запинают :) ).


          1. saipr
            13.07.2017 14:34

            А что они (поклонники) должны пинать? Это реальность.


        1. mc2
          17.07.2017 21:58
          +1

          Если использовать tile, то вы не заметите серьезных отличий от нативных приложений.


  1. svk28
    13.07.2017 11:56
    +1

    С позволения автора, вспомнил ещё один подобный продукт — Visual Tcl, проект вполне живой и рабочий (только что проверил). Т.е. если кому нужно для ознакомления с Tcl/Tk, то вполне подойдет http://vtcl.sourceforge.net


    1. saipr
      13.07.2017 12:21

      Спасибо, ссылка работает. Я тоже проверил — рабочий, но надо набить руку!!! Кстати есть для версии 8.6


    1. saipr
      19.07.2017 20:29

      Посмотрите материал про Visual Tcl


  1. redmanmale
    13.07.2017 17:28

    Я конечно извиняюсь, но это прекрасный пример того, как не надо делать интерфейсы.


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


    1. saipr
      13.07.2017 18:01

      Наверняка ведь в этом интерфейсе нажимаются все кнопки сразу и нет никакой защиты от дурака.

      Это просто голословное заявление. Кто или что вам мешает скачать утилиту и запустить. Вот тогда бы вы и убедились, что и все кнопки нажать одновременно нельзя, что есть защита от дурака. И здесь надо думать, что зачем нажимаешь и что и зачем вводишь. Более того, чтобы нажать, надо мышко подвигать или на клавиатуре поработать.
      Ключевое слово в вашем комментарии "Наверное", а это несерьезно.
      Должно быть так, я скачал и запустил и оказалося….
      И еще здесь речь идет не об проектировании идеального интерфейса для той или иной задачи, а об инструментарии, с помощью которого можно спроектировать и реализовать.


  1. Movimento5Litri
    19.07.2017 22:19

    Я просто оставлю это здесь
    https://lurkmore.to/Tcl


    1. saipr
      19.07.2017 22:27

      Оставляйте. И это тоже.


    1. S_A
      20.07.2017 05:31
      +1

      Отчасти вы правы. Старое достаточно дело. Меня как-то миновала участь с Tcl/Tk, хотя на питоне (TKinter кажется?) когда пробовал, но быстро-быстро перелез на wxWindow. Не суть.

      Нынче я заглядываюсь и пытаюсь найти время на пощупать Red. При том хочу собрать его сам, так как антивирусня на него жалуется зачем-то, хоть он и open source.

      А задачу, которую решает автор, было бы неплохо попытаться поавтоматизировать — просто парсить --help, и пользуясь эвристиками, ну или пошаговыми подсказками запустившего пользователя… сгенерировать гуй для консольной утилиты.

      Простые параметры показывать галками, составные (у которых должно быть значение) — полями ввода или выбора файла и так далее (вариантов не 100500). Это был бы номер :)


      1. saipr
        20.07.2017 07:06

        Как не парадоксально, а вы рассказали как работает сама библиотека облачного токена libls11cloud.so (ls11cloud.dll и т.п.). Когда она инициализируется (в терминах PKCS#11 — C_INITIALIZE), то для доступа к облаку токена требуется ввести пароль (не путить с PIN-кодом токена), и вот тут как раз библиотека и генерирует гуй для ввода пароля на основе анализа какие графические средства установлены на компьютере пользователя.
        Да, а сделать универсальное средство для консольных утилит — это неплохою


        1. S_A
          20.07.2017 07:25

          Да, а сделать универсальное средство для консольных утилит — это неплохо

          Полагаю с помощью того же упомянутого Red — несложно.


          1. saipr
            20.07.2017 07:28
            +1

            Теперь попробуем.


  1. quarckster
    22.07.2017 18:59

    В чём смысл использовать этого уродца и язык этот скриптовый маргинальный? Есть же pyqt.


    1. saipr
      22.07.2017 19:01

      Есть многое на свете, друг Горацио, что и не снилось нашим мудрецам

      В. Шекспир, "Гамлет"