perl dancer + net::ssh2监控服务器性能
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', 'passwd' ],
'192.168.1.102' => [ 'user', 'passwd' ],
},
UAT => {
'192.168.1.103' => [ 'user', 'passwd' ],
'192.168.1.104' => [ 'user', 'passwd' ],
}
};
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 -G\n";
#
# while(){
# if(/^memory\s+([\d.]+)\s+([\d.]+)\s+([\d.]+)/){
# push @{$monOut->{'memory'}},sprintf"%0.2f",$2/$1*100;
# }
#}
#monitor disk data
print $chan "df -g\n";
while () {
if (/^\S+\s+([\d.]+)\s+([\d.]+)\s+(\d+)%\s+[^\/]+(\S+)$/) {
# push @monArr, $3, $1, $2;
if ( $3 > 80 ) {
push @{ $monOut->{'disk'} }, $4, $1, $2,
''
. $3
. '%';
++$row;
}
#以下是根据自己需要,如果想监控所有硬盘就去掉注释,我这块只监控大于80%已用空间
#else{
# push @{$monOut->{'disk'}},$4,$1,$2,
# ''.$3.'%';
#}
}
}
unless ( defined @{ $monOut->{'disk'} } ) {
push @{ $monOut->{'disk'} }, 'normal', 'normal', 'normal', 'normal';
$row = 1;
}
# monitor cpu data
print $chan "iostat\n";
while () {
if (/^\s+\S+\s+\S+\s+(\S+)\s+(\S+)\s+(\S+)\s+([\d.]+)/) {
push @{ $monOut->{'cpu'} }, $1, $2, $3, $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}->{$_},
$envMon->{$env}->{$_}, $env
);
}
template 'monitor' => { table => $monitorOut };
#template 'monitor' => {table => '2'};
}
}
else {
template 'monitor' => { table =>
'Please Login!'
};
}
};
get '/', sub {
if ( session('user') ) {
template 'monitor' => {};
}
else {
template 'monitor' => { table =>
'Please Login!' };
}
};
1;
页:
[1]