summaryrefslogtreecommitdiff
path: root/tools/mrlg.cgi
diff options
context:
space:
mode:
authorpaul <paul>2002-12-13 20:15:29 +0000
committerpaul <paul>2002-12-13 20:15:29 +0000
commit718e3744195351130f4ce7dbe0613f4b3e23df93 (patch)
treebac2ad39971cd43f31241ef123bd4e470f695ac9 /tools/mrlg.cgi
Initial revision
Diffstat (limited to 'tools/mrlg.cgi')
-rwxr-xr-xtools/mrlg.cgi395
1 files changed, 395 insertions, 0 deletions
diff --git a/tools/mrlg.cgi b/tools/mrlg.cgi
new file mode 100755
index 00000000..ac468eef
--- /dev/null
+++ b/tools/mrlg.cgi
@@ -0,0 +1,395 @@
+#!/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>";
+}
+
+
+