perl dancer + net::ssh2监控服务器性能
发布时间:2020-12-15 23:57:35 所属栏目:大数据 来源:网络整理
导读:? ? 最近一直在看dancer,发现真心好用,之前在看mojo,搞了好久没有搞懂.只能怪自己太挫了. 作为练手就写了一套简易的监控系统,主要是利用net::ssh2模块监控AIX服务器的CPU,IO负载,还有磁盘空间.当然如果你是linux/unix作为监控服务器简易使用net::ssh:perl 或
|
? ? 最近一直在看dancer,发现真心好用,之前在看mojo,搞了好久没有搞懂.只能怪自己太挫了.
作为练手就写了一套简易的监控系统,主要是利用net::ssh2模块监控AIX服务器的CPU,IO负载,还有磁盘空间.当然如果你是linux/unix作为监控服务器简易使用net::ssh:perl 或者使用SNMP来获取服务器信息.
在lib下添加
login.pm
package login;
use Dancer ':syntax';
use Net::SSH2;
use Data::Dumper;
$| = 1;
prefix '/monitor';
my $envMon = {
NST => {
'192.168.1.100' => [ 'user','passwd' ],'192.168.1.101' => [ 'user','192.168.1.102' => [ 'user',},UAT => {
'192.168.1.103' => [ 'user','192.168.1.104' => [ 'user',}
};
sub mon {
my ( $host,$user,$passwd,$env ) = @_;
my @monArr;
my $monOut;
my $ssh2 = Net::SSH2->new();
my $row;
$ssh2->connect("$host") or die "$!";
if ( $ssh2->auth_password( "$user","$passwd" ) ) {
my $chan = $ssh2->channel();
# $chan->blocking(1);
$chan->shell();
#monitor memory useage
这款是监控内存,因为linux/unix内存机制都是有多少用多少,所以就去掉了
# print $chan "svmon -Gn";
#
# while(<$chan>){
# if(/^memorys+([d.]+)s+([d.]+)s+([d.]+)/){
# push @{$monOut->{'memory'}},sprintf"%0.2f",$2/$1*100;
# }
#}
#monitor disk data
print $chan "df -gn";
while (<$chan>) {
if (/^S+s+([d.]+)s+([d.]+)s+(d+)%s+[^/]+(S+)$/) {
# push @monArr,$3,$1,$2;
if ( $3 > 80 ) {
push @{ $monOut->{'disk'} },$4,$2,'<div class="jindu_r"><div style="width:'
. $3 . '%">'
. $3
. '%</div></div>';
++$row;
}
#以下是根据自己需要,如果想监控所有硬盘就去掉注释,我这块只监控大于80%已用空间
#else{
# push @{$monOut->{'disk'}},# '<div class="jindu_g"><div style="width:'.$3.'%">'.$3.'%</div></div>';
#}
}
}
unless ( defined @{ $monOut->{'disk'} } ) {
push @{ $monOut->{'disk'} },'normal','normal';
$row = 1;
}
# monitor cpu data
print $chan "iostatn";
while (<$chan>) {
if (/^s+S+s+S+s+(S+)s+(S+)s+(S+)s+([d.]+)/) {
push @{ $monOut->{'cpu'} },$4;
}
}
$monOut->{'ip'} = $host;
$monOut->{'env'} = $env;
$monOut->{'row'} = $row;
}
$monOut;
}
get '/login' => sub {
template 'login' => { table => 'login' };
};
#登陆页面,这里直接用明文了,根据自己需要可以加密为md5,当然也可以保存在数据库中
post '/login' => sub {
if ( params->{username} eq 'test' && params->{password} eq 'test' ) {
session user => params->{username};
redirect params->{path};
}
else {
redirect '/monitor/login';
}
};
get '/logout' => sub {
session->destroy;
redirect '/monitor/login';
};
get '/:env' => sub {
if ( session('user') ) {
my $monitorOut;
my $env = params->{env};
$env = uc($env);
if ( defined $envMon->{$env} ) {
for ( keys %{ $envMon->{$env} } ) {
push @$monitorOut,mon(
$_,$envMon->{$env}->{$_}[0],$envMon->{$env}->{$_}[1],$env
);
}
template 'monitor' => { table => $monitorOut };
#template 'monitor' => {table => '2'};
}
}
else {
template 'monitor' => { table =>
'<a href="/monitor/login" style="color: #fff">Please Login!</a>'
};
}
};
get '/',sub {
if ( session('user') ) {
template 'monitor' => {};
}
else {
template 'monitor' => { table =>
'<a href="monitor/login" style="color: #fff">Please Login!</a>' };
}
};
1;
在public/css/style.css最后添加 .jindu_g{position: relative;width:200px;border: 1px solid #B1D632;padding: 1px;}
.jindu_g div{display: block;position: relative;
background: green; color: #333333;
height: 20px;line-height: 20px;
}
.jindu_g div span{position: absolute;width: 200px;
text-align: center;font-weight: bold;
}
.jindu_r{position: relative;width:200px;border: 1px solid #B1D632;padding: 1px;}
.jindu_r div{display: block;position: relative;
background: red; color: #333333;
height: 20px;line-height: 20px;
}
.jindu_r div span{position: absolute;width: 200px;
text-align: center;font-weight: bold;
}
呈现的效果为磁盘使用的进度条. views/monitor.tt <head>
<script>
function mm(){
var i=document.frm1.select1.selectedIndex;
var address=document.frm1.select1.options[i].value;
document.location.href=address;
}
</script>
</head>
<% IF session.user%>
<center>
<form name="frm1">
<select name="select1" onchange="mm()">
<option selected>请选择环境</option>
<option value="<% request.uri_base %>/monitor/nst">NST环境</option>
<option value="<% request.uri_base %>/monitor/uat">UAT环境</option>
</select>
</form>
<table class = "mytable" > <tr>
<th scope="col" width="5%" rowspan="2">环境</th>
<th scope="col" width="8%" rowspan="2" >IP</th>
<th scope="col" width="10%" colspan="4" >CPU监控</th>
<th scope="col" width="15%" colspan="4" >磁盘空间</th>
</tr>
<tr>
<th scope="col" width="4%">user</th>
<th scope="col" width="4%">sys</th>
<th scope="col" width="2%">idle</th>
<th scope="col" width="2%">iowait</th>
<th scope="col" width="15%" >挂载目录</th>
<th scope="col" width="5%">totle</th>
<th scope="col" width="5%">Free</th>
<th scope="col" width="5%">%Used</th>
</tr>
<tbody>
<% FOREACH k IN table %>
<tr>
<td rowspan="<%k.row%>">
<%k.env%>
</td>
<td rowspan="<%k.row%>" >
<%k.ip%>
</td>
<% FOREACH memory IN k.memory%>
<td rowspan="<%k.row%>">
<%memory%>%
</td>
<%END%>
<% FOREACH cpu IN k.cpu%>
<td rowspan="<%k.row%>">
<%cpu%>
</td>
<%END%>
<% FOREACH fdisk IN k.disk%>
<td >
<%fdisk%>
</td>
<% IF loop.count % 4 == 0 %>
</tr>
<%END%>
<%END%>
<%END%>
</tbody>
</table>
</center>
<%ELSE%>
<center>
<%table%>
</center>
<%END%>
输出页面
? ? 源码在附件中,中间去除了敏感信息,可能运行会有问题,只给大家提供一个思路,有什么问题可以MAIL或Q讨论 myapp (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

