paul | 718e374 | 2002-12-13 20:15:29 +0000 | [diff] [blame] | 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 | |