123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395 |
- #!/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>";
- }
|