Jump to content
Калькуляторы

FTP-сервер с динамикой

Есть коммутатор, который умеет загружать/выгружать конфиги по FTP/TFTP.

На разных коммутаторах конфиги однотипны, но отличаются некоторые параметры: IP-адрес, имя хоста, snmp-строки, некоторые другие параметры.

Хочу сделать так:

- на коммутаторе выполняю команду upload configuration tftp 1.2.3.4 base_config.txt

- коммутатор подключается к TFTP-серверу 1.2.3.4 и запрашивает файл base_config.txt

- TFTP-сервер берет шаблонный файл base_config.tpl, подставляет в него часть параметров (ориентируясь на IP-адрес коммутатора) и возвращает в виде текстового файла

 

Есть ли такое готовое?

Или нужно писать TFTP-сервер на каком-нибудь ЯП (хоть на Perl)?

Share this post


Link to post
Share on other sites

tftp с хендлерами я не видел, но в принципе можно сделать такой вокэраунд без написания своего tftp-сервера:

- на коммутаторе выполняю команду upload configuration tftp 1.2.3.4 SWITCH_IP.txt

- коммутатор подключается к TFTP-серверу 1.2.3.4 и запрашивает файл SWITCH_IP.txt

- tftp-сервер отправляет сообщение в syslog

- syslog-ng ловит сообщение и запускает внешний скрипт для генерации конфига

- коммутатор подключается к TFTP-серверу 1.2.3.4 и запрашивает файл SWITCH_IP.txt второй раз

- TFTP-сервер отдаёт сгенерённый файл SWITCH_IP

- (опционально) syslog-ng ловит сообщение от tftp-сервера о том, что файл скачали и удаляет файл SWITCH_IP.txt

Share this post


Link to post
Share on other sites

Или нужно писать TFTP-сервер на каком-нибудь ЯП (хоть на Perl)?

Всё уже украденонаписано, до нас. ©

 

Там делов то на десяток строк.

#!/usr/bin/perl -w
use strict;
use Net::TFTPd;

 my $tftpdOBJ = Net::TFTPd->new('RootDir' => '/ololo') or die Net::TFTPd->error;
 my $has_incoming_msg = 0;
 while (1) {
   $has_incoming_msg = 1;
   my $tftpRQ = $tftpdOBJ->waitRQ(1) or $has_incoming_msg = 0;
   next if ($has_incoming_msg == 0);
   #IP кто запросил
   print $tftpRQ->getPeerAddr() . "\n";
   #Тут генерим конфиг и ложим его в /ololo/$tftpRQ->getFileName()
   $tftpRQ->processRQ();
 }

 

в принципе можно сделать такой вокэраунд

)))

Share this post


Link to post
Share on other sites

О, спасибо.

Net::TFTPd я смотрел, но не понял, как его использовать.

Share this post


Link to post
Share on other sites

pppoetest

Такой вариант же тупо однопоточный и обслуживает лишь одного клиента в момент времени. Надо либо к inet.d его прикручивать, делать потоки как минимум

Share this post


Link to post
Share on other sites

Я просто указал направление куда копать.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now