Саша это я, да
Полгода назад у руководства на моей работе случилось внеплановое обострение ФГМ, которое в результате недлительного брожения приняло форму приказа "Об ограничении точек доступа в интернет сотрудников филиала". О причинах и предпосылках этого очередного рецидива упоминать я, пожалуй, не стану, т.к. некоторые пункты вышеозначенной бумажки и без того вызвали всеобщую печаль. Лично меня больше всего огорчил пассаж о запрете на использование на АРМ сотрудников Unix подобных ОСей.

Как бы то ни было, был я вынужден в итоге переползти на седьмой маздай. И, надо признать, он оказался не так плох. Мне удалось реализовать большую часть всех удобных фич, к которым я уже успел привыкнуть на своем любовно настраиваемом Awesome WM. Больше поразил своими возможностями боевой тандем PowerShell и ConEmu. Про PowerShell и широту его возможностей, я думаю, все в курсе. ConEmu - это лучший эмулятор терминала для винды. В нем есть практически все, что необходимо пользователю, который привык к таким штукам на Linux. В частности, это вкладки, возможность запуска любых консольных приложений в них (даже Putty!) и хоткеи всех раскрасок и мастей (в том числе глобальные - можно, например, назначить сочетание клавиш на сворачивание/разворачивание окна терминала). Да и вообще, там куча всевозможных настроек и фич.

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

Я работаю в телекоме в секторе IP телефонии, и за нашим отделом числится несколько сотен абонентских VoIP шлюзов. Закономерной в таких условиях ситуацией является периодическое возникновение потребности изменения одного или целого ряда параметров на всех устройствах. Никакой системы управления шлюзами у нас нет, поэтому вся настройка производится вручную через web или ssh серверы, запущенные на устройствах. Пока я сидел на Linux, панацеей были скрипты, написанные на Expect - расширении для языка TCL, которое реализует автоматизацию взаимодействия с консольными приложениями (например, клиентами ftp, telnet или ssh). Кроме VoIP шлюзов, в нашем зоопарке присутствует целое множество различных VoIP серверов, которые в совокупности представляют собой один большой Softswitch. Плюс несколько узкоспециализированных отдельных серверных машин. Держать в собственной памяти все IP адреса и пароли доступа к CLI интерфейсам, согласитесь, не очень удобно. Поэтому у подавляющей части сотрудников отдела на АРМ установлены эмуляторы терминалов, которые позволяют сохранять настройки отдельных подключений. Как правило, это SecureCRT, вариант который я лично отмел по трем причинам, а именно: а) этот продукт является платным, а наша контора его не покупала; б) у меня уже есть ConEmu и нет желания плодить несколько эмуляторов, каждый под отдельные нужды; в) я считаю интерфейс SecureCRT не самым удобным в использовании. С условием использования expect скриптов все функции SecureCRT, как мне изначально казалось, можно легко перенести на ConEmu. Вкратце, я представлял себе этот процесс следующим образом:
  1. На диске создается структура каталогов, подобная дереву SecureCRT. Каждый из листьев дерева будет представлять собой expect-скрипт для доступа к конкретному устройству.
  2. Каждый expect-скрипт выполняет следующие действия: подключается к устройству по telnet или ssh, вводит имя пользователя и пароль, после чего выполняет команду Interact, которая передает брозды управления устройством пользователю.
  3. Для автоматизации создания самих скриптов должен также быть написан специальный скрипт, который должен в качестве входящих данных принимать параметры соединения (протокол соединения, IP адрес, порт, имя пользователя, пароль, тип устройства). Удобства ради прописываем путь к скрипту в $PATH. В качестве языка программирования я предполагал использовать PowerShell (нужно, наверное, использовать мощношелл раз уж мы сидим на винде).
  4. В настройках ConEmu устанавливаем хоткей, который создает новую вкладку с оболочкой (cmd или powershell) в корне нашей структуры каталогов.

Expect TCL на Windows

Здесь начались неприятности. Большая часть запросов "expect scripts windows" в гугле указывала на сайт ActiveState и их продукт ActiveTcl с расширением Expect. Недолго думая, я скачал, установил и приступил к написанию тестовых скриптов. Практически сразу выяснилось, что команда interact по какой-то причине не работает. Help дал объяснения:

exp_interact [string1 body1] ... [stringn [bodyn]]
Not currently implemented on Windows. On Unix systems, this command gives control of the current process to the user, so that keystrokes are sent to the current process, and the stdout and stderr of the current process are returned.


Пришлось искать альтернативы:
  1. Использование PowerShell для автоматизации взаимодействия с устройствами. Самый удобоваримый с точки зрения нативности вариант.
  2. Использование Cygwin. Linux на Windows. Извращение, да, но работать должно, тем более это второе по популярности решение.
  3. Activestate Perl с модулем Expect - по всей видимости имеет те же проблемы, что и ActiveTcl.
  4. Lua с модулем Expect.
  5. Strawberry Perl с модулем Expect.
  6. Python с модулем pexpect.
Наиболее интересным сразу показался первый вариант, хоть он и подразумевал дичайшие пляски с бубном (и это оказалось правдой). В действительности, как выяснилось, это решение предполагает использование также .NET Framework и C#. Остальные варианты мной даже не рассматривались, их я оставил на крайний случай. К слову, следующим по привлекательности был Lua. Еще, наверное, следует заметить, что беглый гуглеж по оставшимся вариантам выявил факт, что большинство из них также обеспечат вас как бубном, так и танцами.
Наконец, я подошел к моменту, когда можно четко сформулировать задачу и таки приступить к её решению.

Постановка задачи

Сказ про Plink, Expect и PowerShell. Часть I: Простое решение
Сказ про Plink, Expect и PowerShell. Часть II: Нам нужен multithreading (Начало)
Сказ про Plink, Expect и PowerShell. Часть II: Нам нужен multithreading (Продолжение)
Сказ про Plink, Expect и PowerShell. Часть III: PowerShell!

@темы: Windows, Powershell, Expect, ConEmu, C#, .NET Framework