Annotation of embedaddon/quagga/tools/mrlg.cgi, revision 1.1.1.1

1.1       misho       1: #!/usr/bin/perl
                      2: ##
                      3: ## Zebra Looking Glass version 1.0
                      4: ## 01 FEB 2000
                      5: ## Copyright (C) 2000 John W. Fraizer III <john.fraizer@enterzone.net>
                      6: ## *All* copyright notices must remain in place to use this code.
                      7: ##
                      8: ## The latest version of this code is available at:
                      9: ## ftp://ftp.enterzone.net/looking-glass/
                     10: ##
                     11: ##
                     12: ## This file is part of GNU Zebra.
                     13: ##
                     14: ## GNU Zebra is free software; you can redistribute it and/or modify it
                     15: ## under the terms of the GNU General Public License as published by the
                     16: ## Free Software Foundation; either version 2, or (at your option) any
                     17: ## later version.
                     18: ##
                     19: ## GNU Zebra is distributed in the hope that it will be useful, but
                     20: ## WITHOUT ANY WARRANTY; without even the implied warranty of
                     21: ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
                     22: ## General Public License for more details.
                     23: ##
                     24: ## You should have received a copy of the GNU General Public License
                     25: ## along with GNU Zebra; see the file COPYING.  If not, write to the
                     26: ## Free Software Foundation, Inc., 59 Temple Place - Suite 330,
                     27: ## Boston, MA 02111-1307, USA.
                     28: 
                     29: require 5.002;
                     30: use POSIX;
                     31: use Net::Telnet ();
                     32: 
                     33: 
                     34: 
                     35: ## Set the URL for your site.
                     36: $url="http://www.sample.com/mrlg.cgi";
                     37: 
                     38: ## Set your router variables in sub set_router and modify the selections in Main to match.
                     39: 
                     40: 
                     41: ############################################################
                     42: #Main
                     43: ############################################################
                     44: {
                     45: 
                     46: ## Set the router default
                     47: @Form{'router'} = "router1";
                     48: 
                     49: ## Get the form results now so we can override the default router 
                     50: get_form();
                     51: 
                     52: print "Content-type: text/html\n\n";
                     53: 
                     54: print '
                     55: <html>
                     56: <head>
                     57: <title>Multi-Router Looking Glass for Zebra</title>
                     58: </head>
                     59: <body bgcolor=white>
                     60:        
                     61: <font face=arial size=3 color=blue>
                     62: <h1>Multi-Router Looking Glass for Zebra</h1>
                     63: Copyright 2000 - John Fraizer, EnterZone Inc.
                     64: <br>
                     65: ';
                     66: 
                     67: print '
                     68: <font color=black>
                     69: ';
                     70: print "<form METHOD=\"POST\" action=\"$url\">\n";
                     71: print "<B>Router:</B>  <SELECT Name=\"router\" Size=1>\n";
                     72: print "<OPTION Value=\"$Form{'router'}\">$Form{'router'}\n";
                     73: print '
                     74: <OPTION Value="router1">router1
                     75: <OPTION Value="router2">router2
                     76: <OPTION Value="router3">router3
                     77: <OPTION Value="router4">router4
                     78: </select>
                     79: <br><br>
                     80: <B>Query</B>:
                     81: <br>
                     82: <input type=radio name=query value=1>show ip bgp<br>
                     83: <input type=radio name=query value=2>show ip bgp summary<br>
                     84: <input type=radio name=query value=3>show ip route<br>
                     85: <input type=radio name=query value=4>show interface<br>
                     86: <input type=radio name=query value=5>show ipv6 bgp<br>
                     87: <input type=radio name=query value=6>show ipv6 bgp summary<br>
                     88: <input type=radio name=query value=7>show ipv6 route<br>
                     89: <br>
                     90: <B>Argument:</B> <input type=text name=arg length=20 maxlength=60>
                     91: <input type="submit" value="Execute"></form>   
                     92: ';
                     93: 
                     94: ## Set up the address, pw and ports, etc for the selected router.
                     95: set_router();
                     96: 
                     97: ## Set up which command is to be executed (and then execute it!)
                     98: set_command();
                     99: 
                    100: 
                    101: print '
                    102: <br><br>
                    103: </font>
                    104: <font color=blue face=arial size=2>
                    105: Multi-Router Looking Glass for Zebra version 1.0<br>
                    106: Written by: John Fraizer -
                    107: <a href="http://www.ez-hosting.net/">EnterZone, Inc</a><br>
                    108: Source code: <a href="ftp://ftp.enterzone.net/looking-glass/">ftp://ftp.enterzone.net/looking-glass/</a>
                    109: </body>
                    110: </html>
                    111: ';
                    112: 
                    113: ## All done!
                    114: 
                    115: exit (0); 
                    116: }
                    117: 
                    118: 
                    119: ############################################################
                    120: sub get_form
                    121: ############################################################
                    122: {
                    123:         
                    124:         #read STDIN
                    125:         read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
                    126: 
                    127:         # Split the name-value pairs
                    128:         @pairs = split(/&/, $buffer);
                    129:   
                    130:         # For each name-value pair:
                    131:         foreach $pair (@pairs)
                    132:                 {
                    133:                 
                    134:                 # Split the pair up into individual variables.
                    135:                 local($name, $value) = split(/=/, $pair);
                    136: 
                    137:                 # Decode the form encoding on the name and value variables.
                    138:                 $name =~ tr/+/ /;
                    139:                 $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
                    140:  
                    141:                 $value =~ tr/+/ /;
                    142:                 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
                    143: 
                    144:                 # If they try to include server side includes, erase them, so they
                    145:                 # aren't a security risk if the html gets returned.  Another
                    146:                 # security hole plugged up.
                    147:                 $value =~ s/<!--(.|\n)*-->//g;
                    148:         
                    149:                 @Form{$name} = $value ;
                    150:                  
                    151:                 }
                    152:         
                    153: }       
                    154: 
                    155: ############################################################
                    156: sub set_router
                    157: ############################################################
                    158: 
                    159: ## $server is the IP address of the router running zebra
                    160: ## $login_pass is the password of the router
                    161: ## $bgpd is the port that bgpd will answer on
                    162: ## $zebra is the port that zebra will answer on
                    163: ## if $zebra is "", it will disable sh ip route and sh int for that router.
                    164: ## if $full_tables is set to "1" for a router, full BGP and IP ROUTE table dumps will be allowed via the looking glass.
                    165: ## This is a BAD thing to do if you have multiple full views on a router.  That's why the option is there.
                    166: 
                    167: {
                    168: if ($Form{'router'} eq 'router1')
                    169:         {
                    170: $server = '10.1.1.1';
                    171: $login_pass = 'zebra';
                    172: $bgpd = "2605";
                    173: $zebra = "";
                    174: $full_tables=1;
                    175: 
                    176:         }
                    177: 
                    178: elsif ($Form{'router'} eq 'router2')
                    179:         {
                    180: $server = '10.1.1.2';
                    181: $login_pass = 'zebra';
                    182: $bgpd = "2605";
                    183: $zebra = "2601";
                    184:         }
                    185: 
                    186: elsif ($Form{'router'} eq 'router3')
                    187:         {
                    188: $server = '10.1.1.3';
                    189: $login_pass = 'zebra';
                    190: $bgpd = "2605";
                    191: $zebra = "2601";
                    192: $full_tables=1;
                    193:         }
                    194: 
                    195: elsif ($Form{'router'} eq 'router4')
                    196:         {
                    197: $server = '10.1.1.4';
                    198: $login_pass = 'zebra';
                    199: $bgpd = "2605";
                    200: $zebra = "2601";
                    201:         }
                    202: 
                    203: 
                    204: }
                    205: 
                    206: 
                    207: ############################################################
                    208: sub set_command
                    209: ############################################################
                    210: {
                    211: if ($Form{'query'} eq '1')
                    212:        {
                    213:        sh_ip_bgp('ip');
                    214:        }
                    215: 
                    216: elsif ($Form{'query'} eq '2')
                    217:        {
                    218:        sh_ip_bgp_sum('ip');
                    219:        }
                    220: 
                    221: if ($Form{'query'} eq '3')
                    222:        {
                    223:        sh_ip_route('ip');
                    224:        }
                    225: 
                    226: if ($Form{'query'} eq '4')
                    227:        {
                    228:        sh_int();
                    229:        }
                    230: if ($Form{'query'} eq '5')
                    231:        {
                    232:        sh_ip_bgp('ipv6');
                    233:        }
                    234: if ($Form{'query'} eq '6')
                    235:        {
                    236:        sh_ip_bgp_sum('ipv6');
                    237:        }
                    238: if ($Form{'query'} eq '7')
                    239:        {
                    240:        sh_ip_route('ipv6');
                    241:        }
                    242: }
                    243: ############################################################
                    244: sub sh_ip_bgp
                    245: ############################################################
                    246: {
                    247: my $protocol = shift(@_);
                    248: $port = $bgpd;
                    249: if ($protocol ne 'ip' && $protocol ne 'ipv6')
                    250:        {
                    251:        print "Invalid protocol: $protocol\n";
                    252:        print "protocol must be 'ip' or 'ipv6'\n\n";
                    253:        return;
                    254:        }
                    255: $command = "show $protocol bgp $Form{'arg'}";
                    256: if ($Form{'arg'} eq '')
                    257:        {
                    258:        if ($full_tables eq '1')
                    259:                {
                    260:                execute_command();
                    261:                }
                    262:        else
                    263:                {
                    264:                print "Sorry.  Displaying the FULL routing table would put too much load on the router!\n\n";
                    265:                }
                    266:        }
                    267: else
                    268:        {
                    269:        execute_command();
                    270:        }
                    271: }
                    272: 
                    273: ############################################################
                    274: sub sh_ip_bgp_sum
                    275: ############################################################
                    276: {
                    277:        my $protocol = shift(@_);
                    278:        $port = $bgpd;
                    279:        if ($protocol ne 'ip' && $protocol ne 'ipv6')
                    280:                {
                    281:                print "Invalid protocol: $protocol\n";
                    282:                print "protocol must be 'ip' or 'ipv6'\n\n";
                    283:                return;
                    284:                }
                    285:        $command = "show $protocol bgp summary";
                    286:        execute_command();
                    287: }
                    288: 
                    289: ############################################################
                    290: sub sh_ip_route
                    291: ############################################################
                    292: {
                    293: 
                    294: if ($zebra eq '')
                    295:        {
                    296:        print "Sorry. The <b>show ip route</b> command is disabled for this router."
                    297:        }
                    298: else
                    299:        {
                    300: 
                    301:        $port = $zebra;
                    302:        my $protocol = shift(@_);
                    303:        if ($protocol ne 'ip' && $protocol ne 'ipv6')
                    304:                {
                    305:                print "Invalid protocol: $protocol\n";
                    306:                print "protocol must be 'ip' or 'ipv6'\n\n";
                    307:                return;
                    308:                }
                    309:        $command = "show $protocol route $Form{'arg'}";
                    310:        if ($Form{'arg'} eq '')
                    311:                {
                    312:                if ($full_tables eq '1')
                    313:                        {
                    314:                        execute_command();
                    315:                        }
                    316:                else
                    317:                        {
                    318:                        print "Sorry.  Displaying the FULL routing table would put too much load on the router!\n\n";
                    319:                        }
                    320:                }
                    321:        else
                    322:                {
                    323:                execute_command();
                    324:                }
                    325:        }
                    326: }
                    327: 
                    328: ############################################################
                    329: sub sh_int
                    330: ############################################################
                    331: {
                    332: if ($zebra eq '')
                    333:        {
                    334:        print "Sorry. The <b>show interface</b> command is disabled for this router."
                    335:        }
                    336: else
                    337:        {
                    338:        $port = $zebra;
                    339:        $command = "show interface $Form{'arg'}";
                    340:        execute_command();
                    341:        }
                    342: }
                    343: 
                    344: 
                    345: 
                    346: ############################################################
                    347: sub execute_command
                    348: ############################################################
                    349: ## This code is based on:
                    350: ##
                    351: ## Zebra interactive console
                    352: ## Copyright (C) 2000 Vladimir B. Grebenschikov <vova@express.ru>
                    353: ##
                    354: 
                    355: 
                    356: {
                    357: 
                    358: print "Executing command = $command";
                    359: 
                    360: #  my $port = ($opt_z ? 'zebra' : 0) ||
                    361: #             ($opt_b ? 'bgpd' : 0) ||
                    362: #             ($opt_o ? 'ospfd' : 0) ||
                    363: #           ($opt_r ? 'ripd' : 0) || 'bgpd';
                    364: 
                    365: my $cmd = $command;
                    366: 
                    367: 
                    368:   my $t = new Net::Telnet (Timeout => 10,
                    369:                           Prompt  => '/[\>\#] $/',
                    370:                           Port    => $port);
                    371: 
                    372:   $t->open ($server);
                    373: 
                    374:   $t->cmd ($login_pass);
                    375: 
                    376:   if ($cmd)
                    377:     {
                    378:       docmd ($t, $cmd);
                    379:     }
                    380: 
                    381: }
                    382: 
                    383: ############################################################
                    384: sub docmd
                    385: ############################################################
                    386: {
                    387:   my ($t, $cmd) = @_;
                    388:   my @lines = $t->cmd ($cmd);
                    389:   print "<pre>\n";
                    390:   print join ('', grep (!/[\>\#] $/, @lines)), "\n";
                    391:   print "</pre>";
                    392: }
                    393: 
                    394: 
                    395: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>