Jak to w życiu bywa, często coś dodajemy w biegu do działania naszych ukochanych maszyn, nie rzadko zapominając o zapisaniu tych ustawień na stale. A wiec zeby pewnego dnia po padzie zasilania, nie obudzić sie przysłowiowa ręką w nocniku, przydałby sie zatrudnic takiego krasnoludka, który co jakiś czas przeszedł sie po serwerowni i napisał książkę o tym co piszczy w tranzystorach 🙂
A wiec zaczynamy 🙂 Krasnal w tej bajce będzie godol perlem 🙂 do szczęścia będzie potrzebował dodatkowych bibliotek takich jak Switch, Net::OpenSSH, Net::Telnet::Cisco 🙂 Jeśli ich nie mamy, instalujemy je przez menadżera cpan ( wszechstronna siec perlowych archiwów ) :
sudo cpan install Net::OpenSSH sudo cpan install Net::Telnet::Cisco
Tworzymy plik dla naszego skryptu ( np: run-config.pl )
touch run-config.pl chmod +x run-config.pl
i zaczynamy od przedstawienia naszych zamiarów, używanych bibliotek i zmiennych potrzebnych do działania skryptu:
#!/usr/bin/perl -w use Switch; use warnings; use Net::OpenSSH; use Net::Telnet::Cisco; my $timeout = 5;
Tablica z serwerami:
my @servers = ( ["linuxdhcp","linux", "10.10.10.1:2244", "root","bardzotrudnehaslo"], ["stary switch w serwerowni", "cisco-switch-telnet", "10.10.10.2", "cisco","bardzotrudnehaslo"], ["biurowy mikrotik","mikrotik", "10.10.10.3", "admin","bardzotrudnehaslo"] ); my $serL = scalar @servers; # ilość elemetow w tablicy
Tablica z komendami do linuxa:
my @cmdLinux = ( ['linux','ls','ls / -lah'], ['linux','df','df -h'], ['linux','ps','ps auxw'], ['linux','ifconfig','ifconfig'], ['linux','ip route','route'], ['linux','arp','arp -a'], ['linux','netstat','netstat -tulpn'], ['linux','iptables-save','iptables-save'], ['linux','proc ipv4 ','tail -n 100 /proc/sys/net/ipv4/*'] );
Tablica z komendami dla mikrotika:
my @cmdMirkrotik =( ['mikrotik','export','export'], ['mikrotik','version','system resource print'], ['mikrotik','arp','ip arp print'], );
Tablica z komendami dla cisco:
my @cmdCS =( ['cisco-switch','version','show version'], ['cisco-switch','running-config','show running-config'], ['cisco-switch','startup-config','show startup-config'], ['cisco-switch','interfaces','show interfaces'], ['cisco-switch','interfaces','show interfaces summary'], ['cisco-switch','interfaces','show interfaces status'], ['cisco-switch','arp','show arp'], ['cisco-switch','mtu','show system mtu'], ['cisco-switch','log','show log'] );
Pilk XML :
open ($fh,'>','/home/jotubyl/backup/run_config.xml') or die "to sie wal"; print $fh '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'; print $fh "\n"; print $fh "<!-- copy serwerownia 1.0 -->"; print $fh "\n";
Main:
for ($serRow =0; $serRow < $serL; $serRow++) { print $fh '<server name="'.$servers[$serRow][0].'-'.$servers[$serRow] [1].'-'.$servers[$serRow][2].'">'; print $fh "\n"; switch($servers[$serRow][1]) { case "linux" { my $ssh = Net::OpenSSH->new( $servers[$serRow][2], user=> $servers[$serRow][3], password=> $servers[$serRow][4], master_opts=> [ -o => "StrictHostKeyChecking=no"]); $ssh->error and print "blad polaczenia ssh\n"; my $cmdL= scalar @cmdLinux; for (my $cmdRow= 0; $cmdRow < $cmdL; $cmdRow++) { print $fh "<cmd>\n"; print $fh "<cmd_type>$cmdLinux[$cmdRow][0]-$cmdLinux[$cmdRow][1]</cmd_type>\n"; print $fh "<![CDATA["; print $fh $ssh->capture($cmdLinux[$cmdRow][2]); print $fh "]]></cmd>\n"; } } case "cisco-switch-telnet" { my $session = Net::Telnet::Cisco -> new ( Host => $servers[$serRow][2]); $session -> login ( $servers[$serRow][3],$servers[$serRow][4]); my $cmdL= scalar @cmdCS; for (my $cmdRow= 0; $cmdRow < $cmdL; $cmdRow++) { print $fh "<cmd>\n"; print $fh "<cmd_type>$cmdCS[$cmdRow][0]-$cmdCS[$cmdRow][1]</cmd_type>\n"; print $fh "<![CDATA["; print $fh $session ->cmd($cmdCS[$cmdRow][2]); print $fh "]]></cmd>\n"; } $session -> close; } case "mikrotik" { my $ssh = Net::OpenSSH->new( $servers[$serRow][2], user=> $servers[$serRow][3], password=> $servers[$serRow][4], master_opts=> [ -o => "HostKeyAlgorithms=+ssh-dss"]); $ssh->error and print "blad polaczenia ssh\n"; my $cmdL= scalar @cmdMirkrotik; for (my $cmdRow= 0; $cmdRow < $cmdL; $cmdRow++) { print $fh "<cmd>\n"; print $fh "<cmd_type>$cmdMirkrotik[$cmdRow][0]- $cmdMirkrotik[$cmdRow][1]</cmd_type>\n"; print $fh "<![CDATA["; print $fh $ssh- >capture($cmdMirkrotik[$cmdRow][2]); print $fh "]]></cmd>\n"; } } } print $fh "</server>\n" } close $fh;
no i na tyle 🙂 skrypt wykonujemy
./run-config.pl lub perl -w run-config.pl