[htmltmpl] using H::T from within mod_perl handler
Brought to you by:
samtregar
From: Raful Mr M. H <RA...@us...> - 2008-01-11 21:37:38
|
My HTML::Template output appears in the browser like so when in a = mod_perl sub handler subroutine. The other three modules work fine. = This also works fine as a CGI. Content-Type: text/html <?xml version=3D"1.0" encoding=3D"UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" = "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns=3D"http://www.w3.org/1999/xhtml" xml:lang=3D"en" = lang=3D"en"> <head> <title>Management App</title> <LINK rel=3D"stylesheet" href=3D"../css/yanmastyles.css" = type=3D"text/css"> <script type=3D"text/javascript" > function addLoadEvent(func) { var oldonload =3D window.onload; if (typeof window.onload !=3D 'function' ) { window.onload =3D func; } else { window.onload =3D function() { oldonload(); func(); } } } function highlightRows() { if( !document.getElementsByTagName ) return false; var rows =3D document.getElementsByTagName( "tr" ); for( var i=3D0; i<rows.length; i++ ) { rows[i].onmouseover =3D function() { this.style.backgroundColor =3D "#d3d3d3"; } rows[i].onmouseout =3D function() { this.style.backgroundColor =3D "#fff"; } } } addLoadEvent(highlightRows); </script> </head> <body> <div id=3D"top"> <div id=3D"banner"> <a href=3D"index.html"><img = src=3D"../images/yanma-banner.jpg" alt=3D"Yanma" width=3D"900" height=3D"172" border=3D"0" /></a> </div> <div id=3D"menubar"> <ul id=3D"navigation"> <li><a = href=3D"/perl/choosemodel.pl"><span>Query</span></a></li> <li><a = href=3D"http://yanmadev.usmc-mccs.org/administration/update.html"><span>U= pdate</span></a></li> <li><a href=3D"#"><span>Add</span></a></li> <li><a href=3D"choose_router.html"><span>NBAR = Stats</span></a></li> <li><a = href=3D"choosebase.pl"><span>Portmapper</span></a></li> <li><a = href=3D"http://yanmadev.usmc-mccs.org"><span>Home</span></a></li> </ul> </div> <div id=3D"border"></div> </div> <div id=3D"content"> <h2>albasw02</h2> <h3>Cisco Catalyst 3550 24 10/100 baseT ports + 2 Gig uplinks fixed = configuration Layer 2/3 Ethernet Switch</h3> <h3>Fri Jan 11 16:16:52 2008</h3> =20 <table > <thead> <th>Interface</th> <th>Mac Address</th> <th>IP Address</th> <th>Device</th> <th>Controller/Printer</th> </thead> <tbody>=20 =20 <tr> <td>Fa0/13</td> <td>001d0909cd0d</td> <td>10.129.20.38</td> <td>albxp02006.windows.usmc-mccs.org</td> <td></td> </tr> =20 <tr> <td>Fa0/13</td> <td>001d0909cd0d</td> <td>10.129.20.38</td> <td>albxp02006.windows.usmc-mccs.org</td> <td></td> </tr> =20 <tr> <td>Fa0/13</td> <td>001d0909cd0d</td> <td>10.129.20.38</td> <td>albxp02006.windows.usmc-mccs.org</td> <td></td> </tr> =20 </tbody> </table> =20 All the info is there and is correct, just not rendered. All other = modules within the app work great, just not this one. Below is my Perl = module. #!/usr/bin/perl -w package Handlers::PortMapper; use warnings; use strict; use HTML::Template; use DBI; use Socket qw(:DEFAULT :crlf); use dec_hex; use snmpSession; use SNMP; use Net::NBName; use Net::Ping; use Apache2::Request (); use Apache2::Const -compile=3D>'OK'; =20 # %seen_vlans --tracks those vlans which are seen as each ports vlan = membership is looked at=20 # %device --all results for each device found on a switch are placed = here for dispatching to a web page # @answer; my @switch_row; #--hold results of db query for switch my @router_row; #--hold results of db query for router whose arp cache = you want my %devices_ref; my %hash; my $time; # --gets time query began my $chosen_switch; #--switch passed via http form data my $chosen_router; #--switch passed via http form data my $switch_ip; #--result one for initial query my $switch_model; #--result two for initial query my $devices_ref; my $router_ip; # --result for query of router address my $dbh; #--database handle my $sql; #--database query my @loop_data; #--hold hashes for my template # $i =3D 0 --counters # $j =3D 0 --counters sub handler { my $r =3D shift; my $req =3D Apache2::Request->new( $r ); $r->content_type('text/plain');=20 my %mac_data; my @mac_array; #hold individual hex digits returned by = ipNetToMediaPhysAddress my @loop_data =3D (); #array of anonymous hashes which is dispatched to = web page for display my $template =3D HTML::Template->new( filename =3D> = '/home/mitch/www-dev/mod_perl/templates/portmapper.tmpl', debug =3D> 1, die_on_bad_params =3D> 0 ); my $time =3D localtime(); $chosen_switch =3D $req->param('chosen_switch'); $chosen_switch =3D~ s/(\s.*)//g; $chosen_router =3D $req->param( 'chosen_router' ); $dbh =3D DBI->connect( 'dbi:ODBC:MRIServer2k', 'mriinventory', = 'Wysiwyg@3044', { PrintError =3D> 1, RaiseError =3D> 0, AutoCommit =3D> 1 } ); $sql =3D "SELECT address, chassis_description FROM tblLiveCisco WHERE = name=3D'$chosen_switch'"; @switch_row =3D $dbh->selectrow_array( $sql ); $switch_ip =3D $switch_row[0]; $switch_model =3D $switch_row[1]; @router_row =3D $dbh->selectrow_array("SELECT address FROM tblLiveCisco = WHERE name=3D'$chosen_router'" ); $router_ip =3D $router_row[0]; $devices_ref =3D getDevices( $router_ip, $switch_ip, 'public'); foreach $_ (@{$devices_ref}) { %hash =3D %$_; push @loop_data, \%hash ; } $template->param(CHOSEN_SWITCH =3D> $chosen_switch ); $template->param(MODEL =3D> $switch_model ); $template->param(TIME =3D> $time ); $template->param(LOOP_DATA =3D> \@loop_data ); print "Content-Type: text/html\n\n"; print $template->output; return Apache2::Const::OK; } sub getDevices { my $router =3D shift; my $switch =3D shift; my $community =3D shift; my @mac_array =3D (); my %seen_vlans =3D (); my %ifnames; #holds the ifIndex number and names of ports my %trunk; #holds all ports on a switch that are trunking my %arpCache; my @data; my @vlans; #all vlans found using vmVlan object my $arp_mib =3D 'ipNetToMediaPhysAddress'; my ( $mac_address,$ip, $dns_name, $device_type ); my $arp_session =3D snmpSession::openSession( $router , $community, 1 ); my $vb_arp =3D new SNMP::Varbind( [$arp_mib] ); for(my $var =3D $arp_session->getnext( $vb_arp ); ( $vb_arp->tag eq $arp_mib ) and not ( $arp_session->{ErrorNum} ); $var =3D $arp_session->getnext( $vb_arp ) ) { my $ip_addr =3D ( $vb_arp->tag . $vb_arp->iid ); $ip_addr =3D~ s/$arp_mib\d+\.//g; my @vars =3D split(/:/, $var ); for( my $x =3D 0; $x < scalar( @vars ); $x++ ) { if( length( $vars[$x] ) < 2 ) { $vars[$x] =3D "0"."$vars[$x]"; } push( @mac_array, $vars[$x] ); } my $arp_mac_address =3D join( "", @mac_array ); push( @{$arpCache{$arp_mac_address}}, $ip_addr ); @mac_array =3D (); } if( $arp_session->{ErrorNum} ){ print "Got $arp_session->{ErrorStr} for = $router\n"; } my $vlan_session =3D snmpSession::openSession ( $switch, $community, 1 = ); my $vb_vlan =3D new SNMP::VarList( ['vmVlan'], ['ifName'], = ['vlanTrunkPortDynamicStatus'] ); my @answers1 =3D $vlan_session->bulkwalk(0, 100, $vb_vlan ); if( $vlan_session->{ErrorNum} ) { print "Got ", $vlan_session->{ErrorStr}, "on", = $vlan_session->{DestHost}, " during Bulkwalk\n"; } my $vlan_answer =3D $answers1[0]; my $ifName_answer =3D $answers1[1]; my $trunk_ports =3D $answers1[2]; for( my $i =3D 0; $i < scalar(@$vlan_answer); $i++ ) { my $vlan =3D $vlan_answer->[$i]->[ 2]; if ( !exists ($seen_vlans{$vlan} ) ) { push( @vlans, $vlan ); $seen_vlans{$vlan} =3D 1; } } for( my $j =3D 0; $j < scalar(@$ifName_answer); $j++ ) { my $index =3D $ifName_answer->[$j]->[1]; my $interface_name =3D $ifName_answer->[$j]->[2]; push @{$ifnames{$index}}, $interface_name; } for ( my $p =3D 0; $p < scalar( @$trunk_ports ); $p++ ) { my $port_index =3D $trunk_ports->[$p]->[1]; if( $trunk_ports->[$p]->[2] eq 'trunking' ) { $trunk{$port_index} =3D 1; } } my $vb_cam =3D new SNMP::VarList( ['dot1dTpFdbPort'], = ['dot1dBasePortIfIndex'] ); foreach $_ ( @vlans ) { $community =3D "public@"."$_"; my $cam_session =3D snmpSession::openSession ( $switch, $community, 1 ); my @answers2 =3D $cam_session->bulkwalk(0, 1000, $vb_cam ); my $fdbPorts =3D $answers2[0]; my $portIndexes =3D $answers2[1]; for ( my $q =3D 0; $q < scalar( @$fdbPorts ); $q++ ) { for( my $r =3D 0; $r < scalar( @$portIndexes ); $r++ ) { if( $fdbPorts->[$q]->[2] =3D=3D $portIndexes->[$r]->[1] && !exists( = $trunk{ $portIndexes->[$r]->[2] } ) ) { $mac_address =3D lc(dec_hex::dec_to_hex( $fdbPorts->[$q]->[1] ) ); if( exists($arpCache{$mac_address} ) ) { $ip =3D $arpCache{$mac_address}->[0]; $dns_name =3D getName( $ip ); $device_type =3D getDeviceType( $ip ); } else { $ip =3D undef; } if( !defined( $ip ) ) { if( $mac_address =3D~ /000255/o ) { $device_type =3D 'Register'; } elsif( $mac_address =3D~ /000ff8/o ) { $device_type =3D 'PSC handheld'; } elsif( $mac_address =3D~ /00a0f8/g ) { $device_type =3D 'Symbol RF device'; } elsif( $mac_address =3D~ /001795/g ) { $device_type =3D 'Cisco Systems AP'; } } my %device =3D ();=20 $device{PORT} =3D "@{$ifnames{ $portIndexes->[$r]->[2]} }"; $device{MAC} =3D $mac_address; $device{IP} =3D $ip; $device{DEVICE} =3D $dns_name; $device{TYPE} =3D $device_type; push( @data, \%device ); } } } } return \@data; } sub getName { my $ip_address =3D shift(@_); my( $nbQuery, $nbStatus, $DNS, $packed_binary_address ); $packed_binary_address =3D inet_aton( $ip_address); $DNS =3D gethostbyaddr( $packed_binary_address, AF_INET ); if( !$DNS ) { $nbQuery =3D Net::NBName->new; $nbStatus =3D $nbQuery->node_status( $ip_address ); if( defined $nbStatus ) { $DNS =3D $nbStatus->{names}->[0]->{name}; } if( !$DNS ) { $DNS =3D 'unknown' } } return $DNS; } sub getDeviceType { my $address =3D shift( @_ ); my ( $type, $rtt, $tcp_print, $addr, $host); $tcp_print =3D Net::Ping->new("syn"); $tcp_print->{port_num} =3D "9100"; $tcp_print->service_check( 1 ); $tcp_print->ping( $address ); if( ( $host, $rtt, $addr ) =3D $tcp_print->ack ) { $type =3D "Printer"; } else{ $tcp_print =3D Net::Ping->new("syn"); $tcp_print->{port_num} =3D "4500"; $tcp_print->service_check( 1 ); $tcp_print->ping( $address ); if( ( $host, $rtt, $addr ) =3D $tcp_print->ack ) { $type =3D "Controller" } } return $type; } 1; Thanks, =20 Mitch Mitchell Raful MCSE CCNP=20 MCB Quantico=20 Personal and Family Readiness (MRI)=20 3044 Catlin Avenue=20 Quantico, VA 22134=20 Com: 703-784-5991=20 DSN: 278-5991=20 Cell: 804-363-0731=20 =20 |