Instantly share code, notes, and snippets.
Created
September 9, 2010 15:27
-
Star
1
(1)
You must be signed in to star a gist -
Fork
0
(0)
You must be signed in to fork a gist
-
Save btbytes/572014 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/perl -w | |
# vim:et:sw=4 ts=4 | |
# servermenu_pl - an server menu example client for LCDproc | |
# Displays some server stats: mem, cpu, local time | |
# and offers the possibility to shutdown the machine via | |
# the buttons. | |
# Copyright GPL 2005, Guido Socher | |
use IO::Socket; | |
use Getopt::Std; | |
use Fcntl; | |
use strict; | |
use vars qw($opt_h); | |
# | |
my $remote = IO::Socket::INET->new( | |
Proto => "tcp", | |
PeerAddr => "localhost", # this machine, 127.0.0.1 | |
PeerPort => 13666 | |
) || die "Cannot connect to LCDd\n"; | |
# | |
sub help(); | |
sub catch_sig(); | |
sub mem(); | |
sub cpu(); | |
sub date(); | |
# | |
getopts("h")||die "ERROR: No such option. -h for help.\n"; | |
help() if ($opt_h); | |
if ($> > 0){ | |
print "Warning: shutdown will not work if you do not start this script as root\n"; | |
} | |
# Make sure our messages get there right away | |
$remote->autoflush(1); | |
sleep 1; # Give server time to notice us... | |
# initialize | |
print $remote "hello\n"; | |
# you must always read the answer from LCDd even if you do not need it | |
# otherwise select will not work as expected: | |
my $lcdresponse = <$remote>; | |
# Set up some screen widgets... | |
print $remote "client_set name servermenu\n"; | |
$lcdresponse = <$remote>; # read and ignore response | |
print $remote "screen_add scr1\n"; | |
$lcdresponse = <$remote>; # read and ignore response | |
print $remote "widget_add scr1 str1 string\n"; | |
$lcdresponse = <$remote>; # read and ignore response | |
print $remote "widget_add scr1 str2 string\n"; | |
$lcdresponse = <$remote>; # read and ignore response | |
print $remote "client_add_key A\n"; | |
$lcdresponse = <$remote>; # read and ignore response | |
print $remote "client_add_key C\n"; | |
$lcdresponse = <$remote>; # read and ignore response | |
# | |
my $rin=''; | |
my $timeout=10; # seconds | |
my $timeleft; | |
my $rout; | |
my $nfound; | |
my $str1; # 2 line display, line 1 | |
my $str2; # 2 line display, line 2 | |
my $i=0; | |
my $keya=0; | |
my $keyc=0; | |
my $shutdownmenustate=0; | |
my $runshutdown=0; | |
my $timeoutmenu=0; | |
# | |
while($runshutdown==0) | |
{ | |
vec($rin,fileno($remote),1)=1; | |
($nfound,$timeleft) = select($rout=$rin, undef, undef, $timeout); | |
if ($nfound){ | |
# data is available | |
$lcdresponse = <$remote>; | |
$keya=0;$keyc=0; | |
$keya=1 if ($lcdresponse && $lcdresponse=~/key A/); | |
$keyc=1 if ($lcdresponse && $lcdresponse=~/key C/); | |
} | |
# the lower black key was pressed once, show shutdown menu: | |
if ($keyc && $shutdownmenustate==0){ | |
$shutdownmenustate=1; | |
$timeoutmenu=0; | |
$str1="shutdown? yes"; | |
$str2=" no"; | |
$keyc=0; | |
$keya=0; | |
} | |
if ($keya && $shutdownmenustate==1){ | |
# yes pressed, run shutdown | |
$shutdownmenustate=2; | |
$runshutdown=1; | |
$timeoutmenu=0; | |
$str1="shutdown ...."; | |
$str2=" "; | |
$keya=0; | |
} | |
if ($keyc && $shutdownmenustate==1){ | |
# no pressed, exit menu | |
$shutdownmenustate=0; | |
$timeoutmenu=0; | |
$keyc=0; | |
} | |
$timeoutmenu++ if ($shutdownmenustate); | |
# timeout: | |
if ($timeoutmenu>3){ | |
$shutdownmenustate=0; | |
$timeoutmenu=0; | |
} | |
if ($shutdownmenustate==0){ | |
# no shutdown menu, show system information | |
($str1,$str2)=date() if ($i==0); | |
($str1,$str2)=mem() if ($i==1); | |
($str1,$str2)=cpu() if ($i==2); | |
} | |
print $remote "widget_set scr1 str1 1 1 \"$str1\"\n"; | |
$lcdresponse = <$remote>; # read and ignore response | |
print $remote "widget_set scr1 str2 1 2 \"$str2\"\n"; | |
$lcdresponse = <$remote>; # read and ignore response | |
$i++; | |
# go from 0 to 2 all the time | |
$i=0 if ($i>2); | |
} | |
# run the "shutdown -h" command: | |
system("shutdown -h now"); | |
# -------- end of main prog | |
# | |
sub mem(){ | |
# return mem and swap | |
my $mem="mem: undef"; | |
my $swap="swp: undef"; | |
my ($tot,$used,$percentused); | |
# parse the following output: | |
# free | |
# total used free shared buffers cached | |
# Mem: 289196 172536 116660 0 8472 84684 | |
# -/+ buffers/cache: 79380 209816 | |
# Swap: 297160 0 297160 | |
open(PIPE,"free |")||die; | |
while(<PIPE>){ | |
if (/Mem:\s+(\d+)\s+(\d+)/){ | |
$tot=$1;$used=$2; | |
$percentused=int (($used/$tot) * 100); | |
$mem=sprintf("mem: %.1fMb %d%%",$used/1000,$percentused); | |
} | |
if (/Swap:\s+(\d+)\s+(\d+)/){ | |
$tot=$1;$used=$2; | |
$percentused=int (($used/$tot) * 100); | |
$swap=sprintf("swp: %.1fMb %d%%",$used/1000,$percentused); | |
} | |
} | |
return($mem,$swap); | |
} | |
# | |
sub cpu(){ | |
# return load averages = num of processes in run queue | |
my $load="undef"; | |
my $uptime=`uptime`; | |
if ($uptime=~/load average:\s?([\d\. ,]+)/){ | |
$load=$1; | |
} | |
return("load averages",$load); | |
} | |
# | |
sub date(){ | |
#return a date in yyyy-mm-dd hh:mm format | |
my $date; | |
my @ltime; | |
@ltime = localtime; | |
$date=sprintf("%04d-%02d-%02d %02d:%02d", | |
1900+$ltime[5],$ltime[4]+1,$ltime[3],$ltime[2],$ltime[1],$ltime[0]); | |
return(" time ",$date); | |
} | |
# | |
sub help(){ | |
print "servermenu_pl -- an LCDd client for the lcdproc software | |
USAGE: servermenu_pl [-h] | |
This program shows stats about mem, swap, localtime, load averages | |
and offers the possibility to shutdown the server from the buttons | |
on the pannel. | |
OPTIONS: -h this help | |
\n"; | |
exit(0); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment