给我自己的学习计划做个开头,从html::template开始试用。 首先利用上上篇的nmap.pl脚本,提取一些数据,然后展示在页面上。 cgi脚本如下: perl#!/usr/bin/perl -w use HTML::Template; use XML::Simple; use Net::MySQL; #定期执行这个 #system("nmap -n -p 22,5666 10.168.168.0/23 10.168.170.0/24 -oX output.xml"); my $text = XMLin("output.xml"); #读取html模版 my $temp = HTML::Template->new(filename => '../template/html/server.tmpl'); my $localhost = '127.0.0.1'; my @array = (); my $i = 0; my $hash = {}; while ( $text->{host}->[$i] ) { #因为新增了ssh端口扫描,所以xml解析和前例稍有不同 my $ssh_state = $text->{host}->[$i]->{ports}->{port}->[0]->{state}->{state}; my $nrpe_state = $text->{host}->[$i]->{ports}->{port}->[1]->{state}->{state}; my $ip = ref($text->{host}->[$i]->{address}) eq 'ARRAY' ? $text->{host}->[$i]->{address}->[0]->{addr} : $text->{host}->[$i]->{address}->{addr}; my $mac = ref($text->{host}->[$i]->{address}) eq 'ARRAY' ? $text->{host}->[$i]->{address}->[1]->{addr} : '00:1E:C9:E6:E1:7C'; $i++; my $channel = &mysql_query($mac); #将ip按照频道排成列表,每个ip存有ssh和nrpe状态 if ( exists $hash->{$channel} ) { push @{$hash->{$channel}}, { 'IP' => $ip, 'SSH' => $ssh_state, 'NRPE' => $nrpe_state, }; } else { $hash->{$channel}->[0] = { 'IP' => $ip, 'SSH' => $ssh_state, 'NRPE' => $nrpe_state, }; } } #将上面while生成的hash转成HTML::Template认可的array,不过array的单个元素可以是hash foreach my $key( keys %{$hash} ) { my $onechannel = {}; $onechannel->{"CHANNEL"} = $key; my $j = 0; foreach my $ip( @{$hash->{$key}} ) { $onechannel->{"IP_LOOP"}->[$j] = $ip; $j++; } push @array, $onechannel; } #将array传递给之前定义的html模版 #注意:不管是param还是@array里,所有的key必须都在tmpl里使用,冗余也会报错 $temp->param(CHANNEL_LOOP => \@array); #输出成html格式 print "Content-Type: text/html\n\n", $temp->output; #这段没什么说的,根据mac获取频道 sub mysql_query { my $mac = shift; my $mysql = Net::MySQL->new( hostname => $localhost, database => 'myops', user => 'myops', password => 'myops', ); $mysql->query("select channel from myhost where mac='$mac'"); &alert("New server") unless $mysql->has_selected_record; my $a_record_iterator = $mysql->create_record_iterator(); while (my $record = $a_record_iterator->each) { return $record->[0]; }; } #留着后续继续处理 sub alert { print @_,"\n"; } 然后是template文件server.tmpl:

<html>
<head>
<title>Server Plate</title>
</head>
<body>
<table width="100%" cellspacing="0" cellpadding="0" border="1">
<!--TMPL_LOOP循环格式,使用的是array里channel_loop的每个元素-->
<TMPL_LOOP NAME="CHANNEL_LOOP">
<tr>
<!--根据本层loop中的某个元素的channel的value开始表格的一行-->
<th><center><TMPL_VAR NAME="CHANNEL"></center></th>
<!--本层loop中另一个元素ip_loop,也是array格式,所以继续循环,每个元素使用一列-->
<TMPL_LOOP NAME="IP_LOOP">
<td valign=top><center>
//根据本层loop的ssh情况选择显示哪个图标;TMPL_IF只能判断key的真假,所以用js
<script type="text/javascript">
if ('<TMPL_VAR NAME="SSH">' == 'open') {
    document.write("<img src='../template/images/unlock_server.png'>");
} else {
    document.write("<img src='../template/images/desable_server.png'>");
}
</script>
<!--显示第二层loop里元素的几个value-->
<hr>nrpe:<TMPL_VAR NAME="NRPE"><hr>ssh :<TMPL_VAR NAME="SSH"><hr><TMPL_VAR NAME="IP">
</center></td>
<!--结束里层loop,即完成一行表格-->
</TMPL_LOOP>
</tr>
<!--结束顶层loop,即完成表格-->
</TMPL_LOOP>
</table></center><br><br><br><center>
</body>
</html>

用apache分别发布cgi目录和静态目录。然后访问一下;OK。