Loading ...
Sorry, an error occurred while loading the content.

1st PERL script up for review

Expand Messages
  • Bruce Henderson
    Hello, I ve just finished my first PERL script, one of many to come I hope, and was hoping that someone could look at it and give me some feedback on its
    Message 1 of 4 , Nov 29, 2007
    • 0 Attachment
      Hello,



      I've just finished my first PERL script, one of many to come I hope, and
      was hoping that someone could look at it and give me some feedback on
      its structure. This script is used to backup our Cisco switch and
      router configs. I obtained most of the code from the documentation of
      Net::Telnet::Cisco and Text::CSV modules. Anyways the script works
      which was my first goal now I would love to learn a bit more about it.



      Any info would be great. Thanks.



      Switch-configs.pl



      #!/usr/bin/perl

      #

      # ./switch-configs.pl 'tftp server address' 'CSV file'

      #



      use Net::Telnet::Cisco;

      use Text::CSV;



      my @locations;

      my $csv = Text::CSV->new();

      my $backup_host = $ARGV[0];



      open (FILE, $ARGV[1]) or die "Couldn't open location file: $!";

      while (<FILE>) {

      $csv->parse($_);

      push(@locations, [$csv->fields]);

      }

      close FILE;



      my $total = @locations;



      for ($count = 1; $count <= $total; $count++) {



      my $session = Net::Telnet::Cisco->new(Host => $locations[$count][0]);

      $session->login('login', 'password');



      #Coping the config via TFTP

      if ($session->enable("password") ) {

      $session->cmd("copy system:/running-config " .
      "tftp://$backup_host/$locations[$count][1]\n\n\n");

      } else {

      warn "Can't enable: " . $session->errmsg;

      }

      $session->close;



      }



      Sample CSV data



      address,hostname

      10.24.1.10,CUF

      10.24.1.11,L122-3

      10.24.1.13,SS

      10.24.1.14,ITS-PBX

      10.24.1.15,EAST-TS

      10.24.1.16,LIZ-B





      _____________________________

      Bruce Henderson

      Network Administrator

      Concordia University - Portland

      (503) 493-6481





      [Non-text portions of this message have been removed]
    • Jenda Krynicky
      From: Bruce Henderson ... use strict; use warnings; # no warnings uninitialized ; # I personaly find this particular warning
      Message 2 of 4 , Nov 29, 2007
      • 0 Attachment
        From: "Bruce Henderson" <BHenderson@...>
        > I've just finished my first PERL script, one of many to come I hope, and
        > was hoping that someone could look at it and give me some feedback on
        > its structure. This script is used to backup our Cisco switch and
        > router configs. I obtained most of the code from the documentation of
        > Net::Telnet::Cisco and Text::CSV modules. Anyways the script works
        > which was my first goal now I would love to learn a bit more about it.
        >
        >
        >
        > Any info would be great. Thanks.
        >
        >
        >
        > Switch-configs.pl
        >
        > #!/usr/bin/perl
        > #
        > # ./switch-configs.pl 'tftp server address' 'CSV file'
        > #
        >

        use strict;
        use warnings;
        # no warnings 'uninitialized';
        # I personaly find this particular warning bothersome.
        # Other than that it's good to have warnings turned on.

        Some people only use strict and warnining in dev and remove them from
        their scripts in production. While this may give them a usually
        totally unmeasurable speed increase, it's not a good idea. You want
        to have them always on. You never know when will you have to make
        some changes, forget to put them back and waste several hours because
        of a typo that would be caught immediately by use strict. Or, if the
        data change slightly and the script no longer works correctly
        sometimes the warning can give you an early, well, warning :-)

        > use Net::Telnet::Cisco;
        > use Text::CSV;
        >
        > my @locations;
        > my $csv = Text::CSV->new();
        >
        > my $backup_host = $ARGV[0];

        You should test whether you did receive the right number of paraments
        and whether they look reasonable.

        > open (FILE, $ARGV[1]) or die "Couldn't open location file: $!";

        I think it's better to include the name of the file you are trying to
        open in the error message.

        > while (<FILE>) {
        > $csv->parse($_);
        > push(@locations, [$csv->fields]);
        > }
        >
        > close FILE;
        >
        >
        >
        > my $total = @locations;
        >
        > for ($count = 1; $count <= $total; $count++) {
        > my $session = Net::Telnet::Cisco->new(Host => $locations[$count][0]);

        It's better to use the foreach style loop like this:

        foreach my $location (@locations) {
        my $session = Net::Telnet::Cisco->new(Host => $location->[0]);


        It was pretty good for the first script :-)

        HTH, Jenda
        ===== Jenda@... === http://Jenda.Krynicky.cz =====
        When it comes to wine, women and song, wizards are allowed
        to get drunk and croon as much as they like.
        -- Terry Pratchett in Sourcery
      • merlyn@stonehenge.com
        ... Bruce I ve just finished my first PERL script, By the way, there s no such thing as PERL , unless you re talking about Protecting Escarpment Rural
        Message 3 of 4 , Nov 29, 2007
        • 0 Attachment
          >>>>> "Bruce" == Bruce Henderson <BHenderson@...> writes:

          Bruce> I've just finished my first PERL script,

          By the way, there's no such thing as "PERL", unless you're talking about
          "Protecting Escarpment Rural Lands", as displayed on
          http://www.perlofburlington.org/.

          If you're talking about the programming language, it's "Perl".
          If you're talking about the command-line utility, it's "perl".

          And no, we're not just being nitpicky. Consider it a secret handshake, so
          that you can quickly tell who is clued-in, and who is just being a poser.

          --
          Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095
          <merlyn@...> <URL:http://www.stonehenge.com/merlyn/>
          Perl/Unix/security consulting, Technical writing, Comedy, etc. etc.
          See PerlTraining.Stonehenge.com for onsite and open-enrollment Perl training!
        • JC
          Hi Bruce, Congrats on taking the first step One of the important things that we ve found is also check for the errmsg. The TFTP server Might not always be
          Message 4 of 4 , Nov 29, 2007
          • 0 Attachment
            Hi Bruce,

            Congrats on taking the first step

            One of the important things that we've found is also check for the errmsg. The TFTP server Might not always be available or the file copy might fail or myriad of other things.You can read more about errmsg in the Net::Telnet docs. But I've seen code that essentially just does

            if($session->errmsg) {
            # Do your error handling here like
            print LOG "Error: " . $session->lastline;
            }

            Best,

            JC




            ----- Original Message ----
            From: Bruce Henderson <BHenderson@...>
            To: perl-beginner@yahoogroups.com
            Sent: Thursday, November 29, 2007 8:57:38 AM
            Subject: [PBML] 1st PERL script up for review














            Hello,



            I've just finished my first PERL script, one of many to come I hope, and

            was hoping that someone could look at it and give me some feedback on

            its structure. This script is used to backup our Cisco switch and

            router configs. I obtained most of the code from the documentation of

            Net::Telnet: :Cisco and Text::CSV modules. Anyways the script works

            which was my first goal now I would love to learn a bit more about it.



            Any info would be great. Thanks.



            Switch-configs. pl



            #!/usr/bin/perl



            #



            # ./switch-configs. pl 'tftp server address' 'CSV file'



            #



            use Net::Telnet: :Cisco;



            use Text::CSV;



            my @locations;



            my $csv = Text::CSV->new( );



            my $backup_host = $ARGV[0];



            open (FILE, $ARGV[1]) or die "Couldn't open location file: $!";



            while (<FILE>) {



            $csv->parse( $_);



            push(@locations, [$csv->fields] );



            }



            close FILE;



            my $total = @locations;



            for ($count = 1; $count <= $total; $count++) {



            my $session = Net::Telnet: :Cisco->new( Host => $locations[$ count][0] );



            $session->login( 'login', 'password');



            #Coping the config via TFTP



            if ($session->enable( "password" ) ) {



            $session->cmd( "copy system:/running- config " .

            "tftp://$backup_ host/$locations[$count][1]\ n\n\n");



            } else {



            warn "Can't enable: " . $session->errmsg;



            }



            $session->close;



            }



            Sample CSV data



            address,hostname



            10.24.1.10,CUF



            10.24.1.11,L122- 3



            10.24.1.13,SS



            10.24.1.14,ITS- PBX



            10.24.1.15,EAST- TS



            10.24.1.16,LIZ- B



            ____________ _________ ________



            Bruce Henderson



            Network Administrator



            Concordia University - Portland



            (503) 493-6481



            [Non-text portions of this message have been removed]














            <!--

            #ygrp-mkp{
            border:1px solid #d8d8d8;font-family:Arial;margin:14px 0px;padding:0px 14px;}
            #ygrp-mkp hr{
            border:1px solid #d8d8d8;}
            #ygrp-mkp #hd{
            color:#628c2a;font-size:85%;font-weight:bold;line-height:122%;margin:10px 0px;}
            #ygrp-mkp #ads{
            margin-bottom:10px;}
            #ygrp-mkp .ad{
            padding:0 0;}
            #ygrp-mkp .ad a{
            color:#0000ff;text-decoration:none;}
            -->



            <!--

            #ygrp-sponsor #ygrp-lc{
            font-family:Arial;}
            #ygrp-sponsor #ygrp-lc #hd{
            margin:10px 0px;font-weight:bold;font-size:78%;line-height:122%;}
            #ygrp-sponsor #ygrp-lc .ad{
            margin-bottom:10px;padding:0 0;}
            -->



            <!--

            #ygrp-mlmsg {font-size:13px;font-family:arial, helvetica, clean, sans-serif;}
            #ygrp-mlmsg table {font-size:inherit;font:100%;}
            #ygrp-mlmsg select, input, textarea {font:99% arial, helvetica, clean, sans-serif;}
            #ygrp-mlmsg pre, code {font:115% monospace;}
            #ygrp-mlmsg * {line-height:1.22em;}
            #ygrp-text{
            font-family:Georgia;
            }
            #ygrp-text p{
            margin:0 0 1em 0;}
            #ygrp-tpmsgs{
            font-family:Arial;
            clear:both;}
            #ygrp-vitnav{
            padding-top:10px;font-family:Verdana;font-size:77%;margin:0;}
            #ygrp-vitnav a{
            padding:0 1px;}
            #ygrp-actbar{
            clear:both;margin:25px 0;white-space:nowrap;color:#666;text-align:right;}
            #ygrp-actbar .left{
            float:left;white-space:nowrap;}
            .bld{font-weight:bold;}
            #ygrp-grft{
            font-family:Verdana;font-size:77%;padding:15px 0;}
            #ygrp-ft{
            font-family:verdana;font-size:77%;border-top:1px solid #666;
            padding:5px 0;
            }
            #ygrp-mlmsg #logo{
            padding-bottom:10px;}

            #ygrp-vital{
            background-color:#e0ecee;margin-bottom:20px;padding:2px 0 8px 8px;}
            #ygrp-vital #vithd{
            font-size:77%;font-family:Verdana;font-weight:bold;color:#333;text-transform:uppercase;}
            #ygrp-vital ul{
            padding:0;margin:2px 0;}
            #ygrp-vital ul li{
            list-style-type:none;clear:both;border:1px solid #e0ecee;
            }
            #ygrp-vital ul li .ct{
            font-weight:bold;color:#ff7900;float:right;width:2em;text-align:right;padding-right:.5em;}
            #ygrp-vital ul li .cat{
            font-weight:bold;}
            #ygrp-vital a{
            text-decoration:none;}

            #ygrp-vital a:hover{
            text-decoration:underline;}

            #ygrp-sponsor #hd{
            color:#999;font-size:77%;}
            #ygrp-sponsor #ov{
            padding:6px 13px;background-color:#e0ecee;margin-bottom:20px;}
            #ygrp-sponsor #ov ul{
            padding:0 0 0 8px;margin:0;}
            #ygrp-sponsor #ov li{
            list-style-type:square;padding:6px 0;font-size:77%;}
            #ygrp-sponsor #ov li a{
            text-decoration:none;font-size:130%;}
            #ygrp-sponsor #nc{
            background-color:#eee;margin-bottom:20px;padding:0 8px;}
            #ygrp-sponsor .ad{
            padding:8px 0;}
            #ygrp-sponsor .ad #hd1{
            font-family:Arial;font-weight:bold;color:#628c2a;font-size:100%;line-height:122%;}
            #ygrp-sponsor .ad a{
            text-decoration:none;}
            #ygrp-sponsor .ad a:hover{
            text-decoration:underline;}
            #ygrp-sponsor .ad p{
            margin:0;}
            o{font-size:0;}
            .MsoNormal{
            margin:0 0 0 0;}
            #ygrp-text tt{
            font-size:120%;}
            blockquote{margin:0 0 0 4px;}
            .replbq{margin:4;}
            -->








            ____________________________________________________________________________________
            Be a better pen pal.
            Text or chat with friends inside Yahoo! Mail. See how. http://overview.mail.yahoo.com/

            [Non-text portions of this message have been removed]
          Your message has been successfully submitted and would be delivered to recipients shortly.