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, 10 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

#!/usr/bin/perl
##
## Zebra Looking Glass version 1.0
## 01 FEB 2000
## Copyright (C) 2000 John W. Fraizer III <john.fraizer@enterzone.net>
## *All* copyright notices must remain in place to use this code.
##
## The latest version of this code is available at:
## ftp://ftp.enterzone.net/looking-glass/
##
##
## This file is part of GNU Zebra.
##
## GNU Zebra is free software; you can redistribute it and/or modify it
## under the terms of the GNU General Public License as published by the
## Free Software Foundation; either version 2, or (at your option) any
## later version.
##
## GNU Zebra is distributed in the hope that it will be useful, but
## WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
## General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with GNU Zebra; see the file COPYING.  If not, write to the
## Free Software Foundation, Inc., 59 Temple Place - Suite 330,
## Boston, MA 02111-1307, USA.

require 5.002;
use POSIX;
use Net::Telnet ();



## Set the URL for your site.
$url="http://www.sample.com/mrlg.cgi";

## Set your router variables in sub set_router and modify the selections in Main to match.


############################################################
#Main
############################################################
{

## Set the router default
@Form{'router'} = "router1";

## Get the form results now so we can override the default router 
get_form();

print "Content-type: text/html\n\n";

print '
<html>
<head>
<title>Multi-Router Looking Glass for Zebra</title>
</head>
<body bgcolor=white>
	
<font face=arial size=3 color=blue>
<h1>Multi-Router Looking Glass for Zebra</h1>
Copyright 2000 - John Fraizer, EnterZone Inc.
<br>
';

print '
<font color=black>
';
print "<form METHOD=\"POST\" action=\"$url\">\n";
print "<B>Router:</B>  <SELECT Name=\"router\" Size=1>\n";
print "<OPTION Value=\"$Form{'router'}\">$Form{'router'}\n";
print '
<OPTION Value="router1">router1
<OPTION Value="router2">router2
<OPTION Value="router3">router3
<OPTION Value="router4">router4
</select>
<br><br>
<B>Query</B>:
<br>
<input type=radio name=query value=1>show ip bgp<br>
<input type=radio name=query value=2>show ip bgp summary<br>
<input type=radio name=query value=3>show ip route<br>
<input type=radio name=query value=4>show interface<br>
<input type=radio name=query value=5>show ipv6 bgp<br>
<input type=radio name=query value=6>show ipv6 bgp summary<br>
<input type=radio name=query value=7>show ipv6 route<br>
<br>
<B>Argument:</B> <input type=text name=arg length=20 maxlength=60>
<input type="submit" value="Execute"></form>	
';

## Set up the address, pw and ports, etc for the selected router.
set_router();

## Set up which command is to be executed (and then execute it!)
set_command();


print '
<br><br>
</font>
<font color=blue face=arial size=2>
Multi-Router Looking Glass for Zebra version 1.0<br>
Written by: John Fraizer -
<a href="http://www.ez-hosting.net/">EnterZone, Inc</a><br>
Source code: <a href="ftp://ftp.enterzone.net/looking-glass/">ftp://ftp.enterzone.net/looking-glass/</a>
</body>
</html>
';

## All done!

exit (0); 
}


############################################################
sub get_form
############################################################
{
        
        #read STDIN
        read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});

        # Split the name-value pairs
        @pairs = split(/&/, $buffer);
  
        # For each name-value pair:
        foreach $pair (@pairs)
                {
                
                # Split the pair up into individual variables.
                local($name, $value) = split(/=/, $pair);

                # Decode the form encoding on the name and value variables.
                $name =~ tr/+/ /;
                $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
 
                $value =~ tr/+/ /;
                $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

                # If they try to include server side includes, erase them, so they
                # aren't a security risk if the html gets returned.  Another
                # security hole plugged up.
                $value =~ s/<!--(.|\n)*-->//g;
        
                @Form{$name} = $value ;
                 
                }
        
}       

############################################################
sub set_router
############################################################

## $server is the IP address of the router running zebra
## $login_pass is the password of the router
## $bgpd is the port that bgpd will answer on
## $zebra is the port that zebra will answer on
## if $zebra is "", it will disable sh ip route and sh int for that router.
## if $full_tables is set to "1" for a router, full BGP and IP ROUTE table dumps will be allowed via the looking glass.
## This is a BAD thing to do if you have multiple full views on a router.  That's why the option is there.

{
if ($Form{'router'} eq 'router1')
        {
$server = '10.1.1.1';
$login_pass = 'zebra';
$bgpd = "2605";
$zebra = "";
$full_tables=1;

        }

elsif ($Form{'router'} eq 'router2')
        {
$server = '10.1.1.2';
$login_pass = 'zebra';
$bgpd = "2605";
$zebra = "2601";
        }

elsif ($Form{'router'} eq 'router3')
        {
$server = '10.1.1.3';
$login_pass = 'zebra';
$bgpd = "2605";
$zebra = "2601";
$full_tables=1;
        }

elsif ($Form{'router'} eq 'router4')
        {
$server = '10.1.1.4';
$login_pass = 'zebra';
$bgpd = "2605";
$zebra = "2601";
        }


}


############################################################
sub set_command
############################################################
{
if ($Form{'query'} eq '1')
	{
	sh_ip_bgp('ip');
	}

elsif ($Form{'query'} eq '2')
	{
	sh_ip_bgp_sum('ip');
	}

if ($Form{'query'} eq '3')
	{
	sh_ip_route('ip');
	}

if ($Form{'query'} eq '4')
	{
	sh_int();
	}
if ($Form{'query'} eq '5')
	{
	sh_ip_bgp('ipv6');
	}
if ($Form{'query'} eq '6')
	{
	sh_ip_bgp_sum('ipv6');
	}
if ($Form{'query'} eq '7')
	{
	sh_ip_route('ipv6');
	}
}
############################################################
sub sh_ip_bgp
############################################################
{
my $protocol = shift(@_);
$port = $bgpd;
if ($protocol ne 'ip' && $protocol ne 'ipv6')
	{
	print "Invalid protocol: $protocol\n";
	print "protocol must be 'ip' or 'ipv6'\n\n";
	return;
	}
$command = "show $protocol bgp $Form{'arg'}";
if ($Form{'arg'} eq '')
	{
	if ($full_tables eq '1')
		{
		execute_command();
		}
	else
		{
		print "Sorry.  Displaying the FULL routing table would put too much load on the router!\n\n";
		}
	}
else
	{
	execute_command();
	}
}

############################################################
sub sh_ip_bgp_sum
############################################################
{
	my $protocol = shift(@_);
	$port = $bgpd;
	if ($protocol ne 'ip' && $protocol ne 'ipv6')
		{
		print "Invalid protocol: $protocol\n";
		print "protocol must be 'ip' or 'ipv6'\n\n";
		return;
		}
	$command = "show $protocol bgp summary";
	execute_command();
}

############################################################
sub sh_ip_route
############################################################
{

if ($zebra eq '')
	{
	print "Sorry. The <b>show ip route</b> command is disabled for this router."
	}
else
	{

	$port = $zebra;
	my $protocol = shift(@_);
	if ($protocol ne 'ip' && $protocol ne 'ipv6')
		{
		print "Invalid protocol: $protocol\n";
		print "protocol must be 'ip' or 'ipv6'\n\n";
		return;
		}
	$command = "show $protocol route $Form{'arg'}";
	if ($Form{'arg'} eq '')
		{
		if ($full_tables eq '1')
			{
			execute_command();
			}
		else
			{
			print "Sorry.  Displaying the FULL routing table would put too much load on the router!\n\n";
			}
		}
	else
		{
		execute_command();
		}
	}
}

############################################################
sub sh_int
############################################################
{
if ($zebra eq '')
	{
	print "Sorry. The <b>show interface</b> command is disabled for this router."
	}
else
	{
	$port = $zebra;
	$command = "show interface $Form{'arg'}";
	execute_command();
	}
}



############################################################
sub execute_command
############################################################
## This code is based on:
##
## Zebra interactive console
## Copyright (C) 2000 Vladimir B. Grebenschikov <vova@express.ru>
##


{

print "Executing command = $command";

#  my $port = ($opt_z ? 'zebra' : 0) ||
#             ($opt_b ? 'bgpd' : 0) ||
#             ($opt_o ? 'ospfd' : 0) ||
#	     ($opt_r ? 'ripd' : 0) || 'bgpd';

my $cmd = $command;


  my $t = new Net::Telnet (Timeout => 10,
			   Prompt  => '/[\>\#] $/',
			   Port    => $port);

  $t->open ($server);

  $t->cmd ($login_pass);

  if ($cmd)
    {
      docmd ($t, $cmd);
    }

}

############################################################
sub docmd
############################################################
{
  my ($t, $cmd) = @_;
  my @lines = $t->cmd ($cmd);
  print "<pre>\n";
  print join ('', grep (!/[\>\#] $/, @lines)), "\n";
  print "</pre>";
}




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