mrlg.cgi
上传用户:xiaozhuqw
上传日期:2009-11-15
资源大小:1338k
文件大小:9k
源码类别:

网络

开发平台:

Unix_Linux

  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. require 5.002;
  29. use POSIX;
  30. use Net::Telnet ();
  31. ## Set the URL for your site.
  32. $url="http://www.sample.com/mrlg.cgi";
  33. ## Set your router variables in sub set_router and modify the selections in Main to match.
  34. ############################################################
  35. #Main
  36. ############################################################
  37. {
  38. ## Set the router default
  39. @Form{'router'} = "router1";
  40. ## Get the form results now so we can override the default router 
  41. get_form();
  42. print "Content-type: text/htmlnn";
  43. print '
  44. <html>
  45. <head>
  46. <title>Multi-Router Looking Glass for Zebra</title>
  47. </head>
  48. <body bgcolor=white>
  49. <font face=arial size=3 color=blue>
  50. <h1>Multi-Router Looking Glass for Zebra</h1>
  51. Copyright 2000 - John Fraizer, EnterZone Inc.
  52. <br>
  53. ';
  54. print '
  55. <font color=black>
  56. ';
  57. print "<form METHOD="POST" action="$url">n";
  58. print "<B>Router:</B>  <SELECT Name="router" Size=1>n";
  59. print "<OPTION Value="$Form{'router'}">$Form{'router'}n";
  60. print '
  61. <OPTION Value="router1">router1
  62. <OPTION Value="router2">router2
  63. <OPTION Value="router3">router3
  64. <OPTION Value="router4">router4
  65. </select>
  66. <br><br>
  67. <B>Query</B>:
  68. <br>
  69. <input type=radio name=query value=1>show ip bgp<br>
  70. <input type=radio name=query value=2>show ip bgp summary<br>
  71. <input type=radio name=query value=3>show ip route<br>
  72. <input type=radio name=query value=4>show interface<br>
  73. <input type=radio name=query value=5>show ipv6 bgp<br>
  74. <input type=radio name=query value=6>show ipv6 bgp summary<br>
  75. <input type=radio name=query value=7>show ipv6 route<br>
  76. <br>
  77. <B>Argument:</B> <input type=text name=arg length=20 maxlength=60>
  78. <input type="submit" value="Execute"></form>
  79. ';
  80. ## Set up the address, pw and ports, etc for the selected router.
  81. set_router();
  82. ## Set up which command is to be executed (and then execute it!)
  83. set_command();
  84. print '
  85. <br><br>
  86. </font>
  87. <font color=blue face=arial size=2>
  88. Multi-Router Looking Glass for Zebra version 1.0<br>
  89. Written by: John Fraizer -
  90. <a href="http://www.ez-hosting.net/">EnterZone, Inc</a><br>
  91. Source code: <a href="ftp://ftp.enterzone.net/looking-glass/">ftp://ftp.enterzone.net/looking-glass/</a>
  92. </body>
  93. </html>
  94. ';
  95. ## All done!
  96. exit (0); 
  97. }
  98. ############################################################
  99. sub get_form
  100. ############################################################
  101. {
  102.         
  103.         #read STDIN
  104.         read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
  105.         # Split the name-value pairs
  106.         @pairs = split(/&/, $buffer);
  107.   
  108.         # For each name-value pair:
  109.         foreach $pair (@pairs)
  110.                 {
  111.                 
  112.                 # Split the pair up into individual variables.
  113.                 local($name, $value) = split(/=/, $pair);
  114.                 # Decode the form encoding on the name and value variables.
  115.                 $name =~ tr/+/ /;
  116.                 $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
  117.  
  118.                 $value =~ tr/+/ /;
  119.                 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
  120.                 # If they try to include server side includes, erase them, so they
  121.                 # aren't a security risk if the html gets returned.  Another
  122.                 # security hole plugged up.
  123.                 $value =~ s/<!--(.|n)*-->//g;
  124.         
  125.                 @Form{$name} = $value ;
  126.                  
  127.                 }
  128.         
  129. }       
  130. ############################################################
  131. sub set_router
  132. ############################################################
  133. ## $server is the IP address of the router running zebra
  134. ## $login_pass is the password of the router
  135. ## $bgpd is the port that bgpd will answer on
  136. ## $zebra is the port that zebra will answer on
  137. ## if $zebra is "", it will disable sh ip route and sh int for that router.
  138. ## if $full_tables is set to "1" for a router, full BGP and IP ROUTE table dumps will be allowed via the looking glass.
  139. ## This is a BAD thing to do if you have multiple full views on a router.  That's why the option is there.
  140. {
  141. if ($Form{'router'} eq 'router1')
  142.         {
  143. $server = '10.1.1.1';
  144. $login_pass = 'zebra';
  145. $bgpd = "2605";
  146. $zebra = "";
  147. $full_tables=1;
  148.         }
  149. elsif ($Form{'router'} eq 'router2')
  150.         {
  151. $server = '10.1.1.2';
  152. $login_pass = 'zebra';
  153. $bgpd = "2605";
  154. $zebra = "2601";
  155.         }
  156. elsif ($Form{'router'} eq 'router3')
  157.         {
  158. $server = '10.1.1.3';
  159. $login_pass = 'zebra';
  160. $bgpd = "2605";
  161. $zebra = "2601";
  162. $full_tables=1;
  163.         }
  164. elsif ($Form{'router'} eq 'router4')
  165.         {
  166. $server = '10.1.1.4';
  167. $login_pass = 'zebra';
  168. $bgpd = "2605";
  169. $zebra = "2601";
  170.         }
  171. }
  172. ############################################################
  173. sub set_command
  174. ############################################################
  175. {
  176. if ($Form{'query'} eq '1')
  177. {
  178. sh_ip_bgp('ip');
  179. }
  180. elsif ($Form{'query'} eq '2')
  181. {
  182. sh_ip_bgp_sum('ip');
  183. }
  184. if ($Form{'query'} eq '3')
  185. {
  186. sh_ip_route('ip');
  187. }
  188. if ($Form{'query'} eq '4')
  189. {
  190. sh_int();
  191. }
  192. if ($Form{'query'} eq '5')
  193. {
  194. sh_ip_bgp('ipv6');
  195. }
  196. if ($Form{'query'} eq '6')
  197. {
  198. sh_ip_bgp_sum('ipv6');
  199. }
  200. if ($Form{'query'} eq '7')
  201. {
  202. sh_ip_route('ipv6');
  203. }
  204. }
  205. ############################################################
  206. sub sh_ip_bgp
  207. ############################################################
  208. {
  209. my $protocol = shift(@_);
  210. $port = $bgpd;
  211. if ($protocol ne 'ip' && $protocol ne 'ipv6')
  212. {
  213. print "Invalid protocol: $protocoln";
  214. print "protocol must be 'ip' or 'ipv6'nn";
  215. return;
  216. }
  217. $command = "show $protocol bgp $Form{'arg'}";
  218. if ($Form{'arg'} eq '')
  219. {
  220. if ($full_tables eq '1')
  221. {
  222. execute_command();
  223. }
  224. else
  225. {
  226. print "Sorry.  Displaying the FULL routing table would put too much load on the router!nn";
  227. }
  228. }
  229. else
  230. {
  231. execute_command();
  232. }
  233. }
  234. ############################################################
  235. sub sh_ip_bgp_sum
  236. ############################################################
  237. {
  238. my $protocol = shift(@_);
  239. $port = $bgpd;
  240. if ($protocol ne 'ip' && $protocol ne 'ipv6')
  241. {
  242. print "Invalid protocol: $protocoln";
  243. print "protocol must be 'ip' or 'ipv6'nn";
  244. return;
  245. }
  246. $command = "show $protocol bgp summary";
  247. execute_command();
  248. }
  249. ############################################################
  250. sub sh_ip_route
  251. ############################################################
  252. {
  253. if ($zebra eq '')
  254. {
  255. print "Sorry. The <b>show ip route</b> command is disabled for this router."
  256. }
  257. else
  258. {
  259. $port = $zebra;
  260. my $protocol = shift(@_);
  261. if ($protocol ne 'ip' && $protocol ne 'ipv6')
  262. {
  263. print "Invalid protocol: $protocoln";
  264. print "protocol must be 'ip' or 'ipv6'nn";
  265. return;
  266. }
  267. $command = "show $protocol route $Form{'arg'}";
  268. if ($Form{'arg'} eq '')
  269. {
  270. if ($full_tables eq '1')
  271. {
  272. execute_command();
  273. }
  274. else
  275. {
  276. print "Sorry.  Displaying the FULL routing table would put too much load on the router!nn";
  277. }
  278. }
  279. else
  280. {
  281. execute_command();
  282. }
  283. }
  284. }
  285. ############################################################
  286. sub sh_int
  287. ############################################################
  288. {
  289. if ($zebra eq '')
  290. {
  291. print "Sorry. The <b>show interface</b> command is disabled for this router."
  292. }
  293. else
  294. {
  295. $port = $zebra;
  296. $command = "show interface $Form{'arg'}";
  297. execute_command();
  298. }
  299. }
  300. ############################################################
  301. sub execute_command
  302. ############################################################
  303. ## This code is based on:
  304. ##
  305. ## Zebra interactive console
  306. ## Copyright (C) 2000 Vladimir B. Grebenschikov <vova@express.ru>
  307. ##
  308. {
  309. print "Executing command = $command";
  310. #  my $port = ($opt_z ? 'zebra' : 0) ||
  311. #             ($opt_b ? 'bgpd' : 0) ||
  312. #             ($opt_o ? 'ospfd' : 0) ||
  313. #      ($opt_r ? 'ripd' : 0) || 'bgpd';
  314. my $cmd = $command;
  315.   my $t = new Net::Telnet (Timeout => 10,
  316.    Prompt  => '/[>#] $/',
  317.    Port    => $port);
  318.   $t->open ($server);
  319.   $t->cmd ($login_pass);
  320.   if ($cmd)
  321.     {
  322.       docmd ($t, $cmd);
  323.     }
  324. }
  325. ############################################################
  326. sub docmd
  327. ############################################################
  328. {
  329.   my ($t, $cmd) = @_;
  330.   my @lines = $t->cmd ($cmd);
  331.   print "<pre>n";
  332.   print join ('', grep (!/[>#] $/, @lines)), "n";
  333.   print "</pre>";
  334. }