Разработка программы в Multimedia Builder на примере утилиты для удаленной работы с кассовым ПО




    Как вы все уже поняли, я просто обычный инженер, но я всегда стремлюсь к тому, чтобы сделать свою работу и коллег намного удобнее.

    Думаю каждому ИТ-шнику знакома такая задача, как автоматизация выполнения процессов. Так вот, в процессе своей работы с кассовым ПО мне пришлось столкнуться со множеством повседневных процедур, касающихся удаленного доступа и управлением кассой, а также автоматизацией многих процедур.

    Сам я не программист. Несмотря на то, что изучал VB, VBA, JavaScript и PHP, но все это осталось на студенческой скамье.
    Так вот, мне как инженеру надоело каждый раз делать одно и тоже и тратить на это время. И я задался вопросом, а можно ли при минимальных знаниях программирования создать какое-нибудь средство по автоматизации поддержки кассового ПО для выполнения повседневных задач?



    Обратился к поиску…

    Итак, что нашлось?

    1. MediaChance Multimedia Builder – это программа для создания приложений автозапуска компакт-дисков. К сожалению, выпуск её новых версий прекратился уже в далеком 2007 году, но некоторые энтузиасты продолжают на ней делать различные фишки. Таких программ полно, но что мне понравилось в этой среде, так это то, что у неё есть свой скриптовый язык, который на мой взгляд достаточно прост в освоении и также есть еще куча плагинов.

    2. Batch-script – это скриптовый язык командной строки Windows, проще говоря позволяет автоматизировать действия в bat-файл. Также добавлю от себя, не знаю как для других, а мне оказалось тоже не сложно его освоить и совместить с MultimediaBuilder.

    3. Ну еще в придачу PuTTy и PLink. — думаю все знают, что это утилиты для удаленного доступа по SSH-протколу к *nix-системам.

    Итак, у нас в компании есть серверное ПО и кассовые программы для работы магазина. Но как вы все понимаете в процессе работы возникают ситуации, когда нужно подключиться удаленно к магазину.

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

    Задача: нужно очень часто удаленно перезагружать кассу, которая работает под ОС Linux.

    Создаем проект в Multimedia Builder и внедряем в него так называемый встроенный объект «Embedded»:




    А на кнопку просто вешаем событие, которое будет запускать bat-файл, который будет дергать plink.exe с параметрами. Получилась вот такая простейшая программа:




    Стоит отметить, что когда делаешь Embedded Files в Multimedia Builder, то при открытии проги, все внедренные файлы автоматически распаковываются во временную директорию и именно оттуда будут запускаться.




    Нажав на кнопку, просто появляется строка, которая из bat-файла выполняет простейший код.

    SET /p ipcash=Enter CashIP:
    plink.exe tc@%ipcash% -pw "12345" "sudo /sbin/reboot" 
    





    Знаю, что возможно для многих рассказываю вещи достаточно банальные, но для меня, как человека постигавшего азы автоматизации, это все было и остается интересным по сей день.

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

    И что вы думаете? – Народ начал пользоваться, а соответственно и появились хотелки.

    Еще раз отмечу, что создавая такую, штуку, я постигал все просто с нуля о том, как писать batch-скрипты до bash-скриптов и.т.п.

    Ну и дальше вышла уже следующая версия. То есть уже появились две кнопочки.




    И потом пошло поехало. Причем стоит отметить, чем дальше я углублялся в процесс изучения автоматизации процессов по работе с удаленным подключением, тем больше у меня у самого появлялись идеи, как что-то сделать, лучше чтобы нашему саппорту было удобнее.

    Появилась опять следующая версия:




    И следующая версия:




    И еще следующая версия:




    И так версия за версией, рост интереса и моих знаний.

    Потом я изучил как делать инсталляционные пакеты и программа получила свой инсталлер:




    Ну и функционала добавилось:




    И сейчас, спустя два года это выглядит так:








    Сейчас можно сказать, что это хороший инструмент по управлению серверами и кассами. Даже сам бы не подумал, что смог такое написать.

    Чтобы про неё рассказать не хватит уже к сожалению сил у пальцев руки, так как начиналась она всего лишь с моего простого увлечения или вопроса самому к себе: А как перезагрузить удаленно комп на Линуксе (у нас кассовое по на Линуксе)?

    Во что оно превратилось за 4 года вы видели выше.

    Но и давайте теперь поделюсь тем, как, например я там все реализую.

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

    1. Пинг
    Я сразу захотел в моих фантазиях, чтобы кликая на кнопочку, можно было бы пинговать кассу и при этом, чтобы она подсвечивалась определенным цветом.




    Накодил вот такую вещь:

    srok1$=cs1$
    File1$='cashes/01c.txt'
    Rv1=StrToFile(File1$,srok1$,FALSE,FALSE)
    clear$=''
    srok1$='For /F "Delims=" %%I In (01c.txt) Do Set c01=%%~I'
    srok2$='Ping -n 1 -w 1 %c01% >nul'
    srok3$='If %ErrorLevel%==0 ('
    srok4$='  <nul set /p strTemp=a>c01ping.txt'
    srok5$=') Else ('
    srok6$='  <nul set /p strTemp=n>c01ping.txt'
    srok7$=')'
    File3$='cashes/c01ping_mmb.bat'
    Rv=StrToFile(File3$,clear$,FALSE,FALSE)
    Rv=StrToFile(File3$,srok1$,TRUE,TRUE)
    Rv=StrToFile(File3$,srok2$,TRUE,TRUE)
    Rv=StrToFile(File3$,srok3$,TRUE,TRUE)
    Rv=StrToFile(File3$,srok4$,TRUE,TRUE)
    Rv=StrToFile(File3$,srok5$,TRUE,TRUE)
    Rv=StrToFile(File3$,srok6$,TRUE,TRUE)
    Rv=StrToFile(File3$,srok7$,TRUE,TRUE)
    Run("<SrcDir>\cashes\c01ping_mmb.bat","HIDE")
    Pause("1000")
    path1$ = 'cashes/c01ping.txt'
    col1$='0,255,0'
    col2$='255,0,0'
    LoadText("r1$","FILE:path1$")
    If (r1$='a') Then
      SetObjectParam("bt1","BGCOLOR=col1$")
    Else
      If (r1$='n') Then
        SetObjectParam("bt1","BGCOLOR=col2$")
      End
    End
    


    Суть в том, что сразу при нажатии на кнопку «пинг», ip-адрес записывается в файл для этого поля где адрес. Далее генерим код для батника, который будет читать ip-адрес из текстового файла и запускаем его. По результату батника генерится файл ответ «n» или «a» и в зависимости от этого уже читая результат красим кнопку. Да конечно по-любительски, но работает.

    2. Запуск putty.exe без ввода логина и пароля.




    Все из вас знают, что если подключаться PuTTy стандартным способом, то нужно ввести логин и пароль. Зачастую у нас в сервисе требуется быстро подключаться к кассе и, в принципе, логин и пароль в большинстве случаев на них по умолчанию.

    Если запустить PuTTy, то будет примерно следующее:




    Но я подумал, почему бы не сделать, так: клацнул по кнопочке и у тебя сразу открылась командная строка SSH.

    Родился вот такой вот любительский код:

    srok1$=cs1$
    File1$='cashes/01c.txt'
    Rv1=StrToFile(File1$,srok1$,FALSE,FALSE)
    clear$=''
    srok01$='For /F "Delims=" %%I In (cashes/01c.txt) Do Set c01=%%~I'
    srok02$='REG ADD HKCU\Software\SimonTatham\PuTTY\Sessions\%c01% /f'
    srok03$='REG ADD "HKCU\Software\SimonTatham\PuTTY\Sessions\%c01%" /f /v HostName /t REG_SZ /d %c01%'
    srok04$='REG ADD "HKCU\Software\SimonTatham\PuTTY\Sessions\%c01%" /f /v LineCodePage /t REG_SZ /d UTF-8'
    srok05$='echo y | plink.exe tc@%c01% -pw "12345" exit'
    srok06$='putty.exe -load %c01% tc@%c01% -pw "12345"'
    File3$='run_putty.bat'
    Rv=StrToFile(File3$,clear$,FALSE,FALSE)
    Rv=StrToFile(File3$,srok01$,TRUE,TRUE)
    Rv=StrToFile(File3$,srok02$,TRUE,TRUE)
    Rv=StrToFile(File3$,srok03$,TRUE,TRUE)
    Rv=StrToFile(File3$,srok04$,TRUE,TRUE)
    Rv=StrToFile(File3$,srok05$,TRUE,TRUE)
    Rv=StrToFile(File3$,srok06$,TRUE,TRUE)
    Run("run_putty.bat","HIDE")
    RunScript("ssh_log_1")
    


    Логика:
    1. Записываем ip-адрес в текстовый файл.
    2. Далее генерим батник.
    3. При запуске в переменные батника подставляется ip-адрес.
    4. Сессия добавляется в реестр.
    5. PuTTy.exe открывает ссесию.

    И вуаля:




    3. Удаленный VNC-сервер.
    Также у нас на кассах есть возможность удаленного подключения по протоколу VNC-сервера, для того, чтобы можно было смотреть, что там кассиры делают.

    Для этого я взял Real VNC Viewer.

    Далее получился вот такой код:

    srok1$=cs1$
    File1$='cashes/01c.txt'
    Rv1=StrToFile(File1$,srok1$,FALSE,FALSE)
    clear$=''
    srok01$='For /F "Delims=" %%I In (cashes/01c.txt) Do Set c01=%%~I'
    srok02$='rem SET /p ipcash=Enter CashIP for run remote DeskTop:'
    srok03$='echo n | plink.exe -v -ssh tc@%c01% -pw "12345" -m rdp_vnc_cmd.txt'
    srok04$='vncviewer.exe %c01%'
    File3$='rn_vnc_mmb.bat'
    Rv=StrToFile(File3$,clear$,FALSE,FALSE)
    Rv=StrToFile(File3$,srok01$,TRUE,TRUE)
    Rv=StrToFile(File3$,srok02$,TRUE,TRUE)
    Rv=StrToFile(File3$,srok03$,TRUE,TRUE)
    Rv=StrToFile(File3$,srok04$,TRUE,TRUE)
    Message("Сейчас будет запущен сеанс удаленной связи. Нажмите ОК и подождите несколько секунд.","")
    Run("rn_vnc_mmb.bat","HIDE")
    RunScript("vnc_log_1")
    


    Логика:
    1. Записываем ip-адрес в текстовый файл.
    2. Генерим батник, который из этого текстового файла читает ip-адрес.
    3. Далее запускается vncviewer.exe, который читает сессию.

    Ну и собственно открывается сеанс:




    Вот как-то так.

    На самом деле есть еще куча всяких примочек.




    А выглядит теперь все это уже так спустя 2 года, как я начал все изучать:




    И конечно, не обошлось без пасхалок. Сделал одну недавно: если случайно кое-где кликнуть мышкой, то попадаешь в секретный раздел, где много всяких фишек, ну так, чтобы коллег повеселить!

    Crystal Service Integration

    39,00

    Компания

    Поделиться публикацией
    Комментарии 12
      +13
      Инженерный дизайн во всей красе еще и от первоисточника!
        +1
        Сам, еще будучи в школе, начинал с подобной программы (Autoplay Media Studio). Там тоже был удобный скриптовый язык (Lua), чего я только не делал. А потом, когда возможности этой программы начали подпирать, попробовал пересесть на Delphi. Меня сразу поразило количество вещей, которые можно было сделать без танцев с бубном, да и дискомфорта никакого не испытывал. И вот так я в итоге стал программистом
          0
          Это правда. Эту утилу я до сих пор пока на билдере и пишу, но конечно уже вижу, что кой-чего стесняет мои движения, но тем не менее, самое главное, правильно вы говорите это просто дало толчок к развитию, и когда потребовалось написать отправку сообщений на кассы с помощью Java, я как-то с легкостью на FAQ-ам Oracle это написал. Кстати Autoplay Media Studio тоже вещь, на ней тоже кой чего делал.
          0
          прочитайте про авторизацию ssh по ключу, пртгодится
            0
            Да спс. Про это уже думал. Вещь весьма полезная.
            0
            Синяя изолента и WD-40 использовались?
              0
              Куда ж без них родимых :) На самом деле в рюкзаке сяняя всегда лежит, выручает как никогда.
            +2
            Святые черные дыры, какая милота.

            При чтении испытал чувство глубокого одобрения. И хотя это все очень-очень по-любительски, а удовольствие от знакомства с программированием и изучением нового автор испытал сполна. Чувствуется.
              0
              Можно сказать кайфанул :)

              Святые черные дыры
              — Лайк :)
              +1
              Да, но для чего постоянное напоминание о своей половой принадлежности, напечатанное на тумбочке стола?
                0
                Это всего лишь моя фамилия.

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое