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