Proste tworzenie run-configu w perlu dla maszyn linux, mikrotik i cisco do jednego pliku xml

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

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.