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>