Пишем заглушку для Telnet/CLI.

Сейчас работаю на контору, которая занимается мониторингом сетей передачи данных и сетевого оборудования. Одному из студентов на полставки было получено разработать компонент, получающий характеристики с одного устройства по CLI(Command-line interface) через Telnet. Все вроде как шло хорошо, пока не дошло дело до тестирования.

Студенту сразу же захотелось протестировать свой код на боевом сервере, видите ли ему нужна реальная железка. Естественно он был послан в песочницу, где он должен сделать заглушку.
Естественно я не могу требовать от других то, что не могу сделать сам. Привожу пример такой заглушки без всяких сокетов!
Будем использовать мощь UNIX-way в GNU/Linux.

Есть такой крутой man Daniel J. Bernstein, который помимо всего прочего написал пакет ucspi-tcp, это набор утилит с интерфейсом командной строки, для разработки клиент-серверных приложений.

Чувствуете мощь *nix систем ? Клиент-серверное приложение на bash’e !

Будем использовать программу tcpserver, а вместо баша любимый Perl, вот так выглядит её интерфейс:

tcpserver opts host port prog

opts опции запуска, host хост на котором будет висеть сервер, port порт на котором будет висеть сервер, prog наш скрипт или программа.

Как это все работает? tcpserver вешается на выбранный хост и порт, и начинает принимать входящие соединения. Когда кто-то к нему подключается, то он переключает дескриптор сокета на дескриптор 0 для чтения, и дескриптор 1 для записи и запускает программу prog. Для тех, кто не в курсе:

  • 0 — это дескриптор стандартного входа(stdin);
  • 1 — это дескриптор стандартного выхода(stdout).

Нам остается только лишь написать скрипт/программу которая читает строку их stdin, в зависимости от команды генерируем ответ в том виде, в каком отвечает железяка. В качестве примера привожу простой скрипт на Perl, считывает команду, если это quit, то выходим, иначе запускает команду и выводим результат на экран:

use 5.010;
 
$|=1;
 
while(<>)
{
    chomp;
    if(/quit/)
    {
        say "bye";
        exit(0);
    }
    
    print `$_`;
}

Запуск сервера:

tcpserver localhost 23023 ./cli.pl

Проверяем, подключаемся по telnet и получаем информацию о процессоре:

$ telnet localhost 23023 
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
cat /proc/cpuinfo