File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / tools / mrlg.cgi
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:26:11 2012 UTC (12 years, 4 months ago) by misho
Branches: quagga, MAIN
CVS tags: v0_99_22p0, v0_99_22, v0_99_21, v0_99_20_1, v0_99_20, HEAD
quagga

    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>