最近一直在看dancer,發現真心好用,以前在看mojo,搞了很久沒有搞懂.只能怪本身太挫了.css
做爲練手就寫了一套簡易的監控系統,主要是利用net::ssh2模塊監控AIX服務器的CPU,IO負載,還有磁盤空間.固然若是你是linux/unix做爲監控服務器簡易使用net::ssh:perl 或者使用SNMP來獲取服務器信息.html
在lib下添加linux
login.pmios
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(<$chan>){ # 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 (<$chan>) { if (/^\S+\s+([\d.]+)\s+([\d.]+)\s+(\d+)%\s+[^\/]+(\S+)$/) { # push @monArr, $3, $1, $2; if ( $3 > 80 ) { push @{ $monOut->{'disk'} }, $4, $1, $2, '<div class="jindu_r"><div style="width:' . $3 . '%">' . $3 . '%</div></div>'; ++$row; } #如下是根據本身須要,若是想監控全部硬盤就去掉註釋,我這塊只監控大於80%已用空間 #else{ # push @{$monOut->{'disk'}},$4,$1,$2, # '<div class="jindu_g"><div style="width:'.$3.'%">'.$3.'%</div></div>'; #} } } unless ( defined @{ $monOut->{'disk'} } ) { push @{ $monOut->{'disk'} }, 'normal', 'normal', 'normal', 'normal'; $row = 1; } # monitor cpu data print $chan "iostat\n"; while (<$chan>) { 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}->{$_}[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最後添加shell
.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%>
輸出頁面session
源碼在附件中,中間去除了敏感信息,可能運行會有問題,只給你們提供一個思路,有什麼問題能夠MAIL或Q討論less