From 703384d5d5e9373aacb9c4625793940de8e8bab9 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Sat, 4 Feb 2012 23:31:46 +0100 Subject: initial config file support --- CHANGELOG | 3 ++ loadbars | 111 ++++++++++++++++++++++++++++++++++++++++++++------------------ 2 files changed, 82 insertions(+), 32 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 5c4a36c..e31ab51 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,5 @@ +* Add config file support (~/.loadbarsrc) + Sat Feb 4 10:56:27 CET 2012 * Release v0.5.0 * Add stats for rudimentary memory and swap usage (--showmem option or m hotkey) @@ -9,6 +11,7 @@ Sat Feb 4 10:56:27 CET 2012 * Key right increases window width by 100px and left decreases by 100px * Key down increases window height by 100px and up decreases by 100px * Set 'samples' default values from 1000 down to 500. +* Displays a text warning on stdout if computer may be too slow * No sporadic crashes on shutdown anymore * Some internal tweaks, no separate event thread needed anymore. This fixes some sporadic bugs. diff --git a/loadbars b/loadbars index c24ba64..1312968 100755 --- a/loadbars +++ b/loadbars @@ -26,8 +26,9 @@ use threads; use threads::shared; use constant { - VERSION => 'loadbars v0.5.0', + VERSION => 'loadbars v0.5.1-devel', Copyright => '2010-2012 (c) Paul Buetow ', + CONFFILE => $ENV{HOME} . '/.loadbarsrc', CSSH_CONFFILE => '/etc/clusters', CSSH_MAX_RECURSION => 10, COLOR_DEPTH => 8, @@ -62,24 +63,28 @@ my %MEMSTATS_HAS : shared; # Global configuration hash my %C : shared; +# Global configuration hash for internal settings (not configurable) +my %I : shared; # Setting defaults %C = ( - title => Loadbars::VERSION . ' (press h for help on stdout)', - average => 15, - showcores => 0, - showmem => 0, - cpuregexp => 'cpu', - factor => 1, - extended => 0, - displaytxt => 1, - displaytxtoff => 0, - displaytxthost => 0, - samples => 500, - sshopts => '', - barwidth => 35, - maxwidth => 1280, - height => 230, + average => 15, + showcores => 0, + showmem => 0, + factor => 1, + extended => 0, + showtext => 1, + showtexthost => 0, + samples => 500, + sshopts => '', + barwidth => 35, + maxwidth => 1280, + height => 230, +); + +%I = ( + cpuregexp => 'cpu ', + showtextoff => 0, ); # Quick n dirty helpers @@ -89,9 +94,19 @@ sub debugsay (@) { say "Loadbars::DEBUG: $_" for @_; return undef } sub sum (@) { my $sum = 0; $sum += $_ for @_; return $sum } sub null ($) { defined $_[0] ? $_[0] : 0 } sub notnull ($) { $_[0] != 0 ? $_[0] : 1 } -sub set_showcores_regexp () { $C{cpuregexp} = $C{showcores} ? 'cpu' : 'cpu ' } +sub set_showcores_regexp () { $I{cpuregexp} = $I{showcores} ? 'cpu' : 'cpu ' } sub error ($) { die shift, "\n" } sub display_info ($) { say "==> " . shift } +sub display_warn ($) { say "!!! " . shift } + +sub trim (\$) { + my $str = shift; + + $$str =~ s/^[\s\t]+//; + $$str =~ s/[\s\t]+$//; + + return undef; +} sub percentage ($$) { my ($total, $part) = @_; @@ -113,6 +128,7 @@ sub parse_cpu_line ($) { ( $name, @load{qw(user nice system idle iowait irq softirq steal guest)} ) = split ' ', $line; + # Not all kernels support this $load{steal} = 0 unless defined $load{steal}; $load{guest} = 0 unless defined $load{guest}; @@ -122,6 +138,35 @@ sub parse_cpu_line ($) { return ( $name, \%load ); } +sub read_config () { + return unless -f CONFFILE; + + display_info "Reading configuration from " . CONFFILE; + open my $conffile, CONFFILE or die "$!: " . CONFFILE . "\n"; + + while (<$conffile>) { + chomp; + next if /^[\t\s]*#/; + s/[\t\s]*#.*//; + + my ($key, $val) = split /=/, $_; + trim $key; trim $val; + + unless (defined $val) { + display_warn "Could not parse config line: $_"; + + } elsif (not exists $C{$key}) { + display_warn "There is no such config key: $key, ignoring"; + + } else { + display_info "Setting $key=$val, it might be overwritten by command line params."; + $C{$key} = $val; + } + } + + close $conffile; +} + sub thread_get_stats ($;$) { my ( $host, $user ) = @_; $user = defined $user ? "-l $user" : ''; @@ -168,7 +213,7 @@ BASH # Toggle CPUs $SIG{USR1} = sub { $sigusr1 = 1 }; - my $cpuregexp = qr/$C{cpuregexp}/; + my $cpuregexp = qr/$I{cpuregexp}/; # 1=cpu, 2=mem, 3=net my $mode = 0; @@ -203,7 +248,7 @@ BASH } if ($sigusr1) { - $cpuregexp = qr/$C{cpuregexp}/; + $cpuregexp = qr/$I{cpuregexp}/; $sigusr1 = 0; } } @@ -278,15 +323,15 @@ sub create_threads (@) { sub auto_off_text ($) { my ($barwidth) = @_; - if ($barwidth < $C{barwidth} - 1 && $C{displaytxtoff} == 0) { - display_info 'Disabling text display, text does not fit into window. Use \'t\' to re-enable.'; - $C{displaytxtoff} = 1; - $C{displaytxt} = 0; + if ($barwidth < $C{barwidth} - 1 && $I{showtextoff} == 0) { + display_warn 'Disabling text display, text does not fit into window. Use \'t\' to re-enable.'; + $I{showtextoff} = 1; + $C{showtext} = 0; - } elsif ($C{displaytxtoff} && $barwidth >= $C{barwidth} - 1) { + } elsif ($I{showtextoff} && $barwidth >= $C{barwidth} - 1) { display_info 'Re-enabling text display, text fits into window now.'; - $C{displaytxt} = 1; - $C{displaytxtoff} = 0; + $C{showtext} = 1; + $I{showtextoff} = 0; } } @@ -319,7 +364,7 @@ sub main_loop ($@) { $C{width} = $C{barwidth}; my $app = SDL::App->new( - -title => $C{title}, + -title => Loadbars::VERSION . ' (press h for help on stdout)', -icon_title => $C{title}, -width => $C{width}, -height => $C{height}, @@ -375,12 +420,12 @@ sub main_loop ($@) { } elsif ( $key_name eq 't' ) { - $C{displaytxt} = !$C{displaytxt}; + $C{showtext} = !$C{showtext}; display_info 'Toggled text display'; } elsif ( $key_name eq 'u' ) { - $C{displaytxthost} = !$C{displaytxthost}; + $C{showtexthost} = !$C{showtexthost}; display_info 'Toggled number/hostname display'; } @@ -660,7 +705,7 @@ sub main_loop ($@) { my @loadavg = split ';', $AVGSTATS{$host}; - if ( $C{displaytxt} ) { + if ( $C{showtext} ) { if ( $C{showmem} && $is_host_summary ) { my $y_ = $y; $app->print( $x+$add_x, $y_, 'Ram:'); @@ -668,7 +713,7 @@ sub main_loop ($@) { $app->print( $x+$add_x, $y_ += $space, 'Swp:'); $app->print( $x+$add_x, $y_ += $space, sprintf '%02d', (100-$meminfo{swap_per})); } - if ( $C{displaytxthost} && $is_host_summary ) { + if ( $C{showtexthost} && $is_host_summary ) { # If hostname is printed don't use FQDN # because of its length. $host =~ /([^\.]*)/; @@ -731,7 +776,7 @@ sub main_loop ($@) { goto TIMEKEEPER; } elsif ( INTERVAL_WARN < $t_diff ) { - display_info "WARN: Loop is behind $t_diff seconds, your computer may be too slow"; + display_warn "WARN: Loop is behind $t_diff seconds, your computer may be too slow"; } $t1 = $t2; @@ -1143,6 +1188,8 @@ sub main () { my ( $hosts, $dispatch ) = dispatch_table; my $usage; + read_config; + GetOptions( 'help|?' => \$usage, $dispatch->('options') ); if ( defined $usage ) { -- cgit v1.2.3 From ae3119fcbad12751dd1fee051dd965a6893e79df Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Sat, 4 Feb 2012 23:32:42 +0100 Subject: fix showcores option --- loadbars | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/loadbars b/loadbars index 1312968..c33d016 100755 --- a/loadbars +++ b/loadbars @@ -83,7 +83,7 @@ my %I : shared; ); %I = ( - cpuregexp => 'cpu ', + cpuregexp => 'cpu', showtextoff => 0, ); @@ -94,7 +94,7 @@ sub debugsay (@) { say "Loadbars::DEBUG: $_" for @_; return undef } sub sum (@) { my $sum = 0; $sum += $_ for @_; return $sum } sub null ($) { defined $_[0] ? $_[0] : 0 } sub notnull ($) { $_[0] != 0 ? $_[0] : 1 } -sub set_showcores_regexp () { $I{cpuregexp} = $I{showcores} ? 'cpu' : 'cpu ' } +sub set_showcores_regexp () { $I{cpuregexp} = $C{showcores} ? 'cpu' : 'cpu ' } sub error ($) { die shift, "\n" } sub display_info ($) { say "==> " . shift } sub display_warn ($) { say "!!! " . shift } -- cgit v1.2.3 From 30a69d43ffe9e72ef52b6886514cebbcca678c8c Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Sat, 4 Feb 2012 23:42:21 +0100 Subject: fix auto off text --- loadbars | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/loadbars b/loadbars index c33d016..15af568 100755 --- a/loadbars +++ b/loadbars @@ -310,29 +310,27 @@ sub draw_background ($$) { } sub create_threads (@) { - return map { - $_->detach(); - $_; - - } map { - threads->create( 'thread_get_stats', split /:/ ); - - } @_; + return + map { $_->detach(); $_ } + map { threads->create( 'thread_get_stats', split ':' ) } @_; } sub auto_off_text ($) { my ($barwidth) = @_; if ($barwidth < $C{barwidth} - 1 && $I{showtextoff} == 0) { + return if $C{showtext} == 0; display_warn 'Disabling text display, text does not fit into window. Use \'t\' to re-enable.'; $I{showtextoff} = 1; $C{showtext} = 0; - } elsif ($I{showtextoff} && $barwidth >= $C{barwidth} - 1) { + } elsif ($I{showtextoff} == 1 && $barwidth >= $C{barwidth} - 1) { display_info 'Re-enabling text display, text fits into window now.'; $C{showtext} = 1; $I{showtextoff} = 0; } + + return undef; } sub set_dimensions ($$) { -- cgit v1.2.3 From 137f59ebdec343f41fb295f9186a41880be25e4c Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Sat, 4 Feb 2012 23:42:51 +0100 Subject: fix auto off text --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index e31ab51..7c432de 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,5 @@ * Add config file support (~/.loadbarsrc) +* Some bugfixes Sat Feb 4 10:56:27 CET 2012 * Release v0.5.0 -- cgit v1.2.3 From 4f5840f4a9d10bbd87436635e21d9fb8de850bc2 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Sat, 4 Feb 2012 23:44:35 +0100 Subject: remove --title --- loadbars | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/loadbars b/loadbars index 15af568..b0d814f 100755 --- a/loadbars +++ b/loadbars @@ -363,7 +363,7 @@ sub main_loop ($@) { my $app = SDL::App->new( -title => Loadbars::VERSION . ' (press h for help on stdout)', - -icon_title => $C{title}, + -icon_title => Loadbars::VERSION, -width => $C{width}, -height => $C{height}, -depth => Loadbars::COLOR_DEPTH, @@ -1040,14 +1040,6 @@ END sshopts => { menupos => 20, help => 'Set SSH options', mode => 6, type => 's' }, - title => { - menupos => 21, - help => 'Set the window title', - var => \$C{title}, - mode => 6, - type => 's' - }, - ); my %d_by_short = map { -- cgit v1.2.3 From facb0b6d69095458fd4389cfb83fbbb5dd3d011c Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Sat, 4 Feb 2012 23:56:03 +0100 Subject: Add docu for config file support and fix auto text bugs --- CHANGELOG | 1 + loadbars | 24 +++++++++++++++++------- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 7c432de..78743dd 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,5 @@ * Add config file support (~/.loadbarsrc) +* Remove --title option (no need anyway) * Some bugfixes Sat Feb 4 10:56:27 CET 2012 diff --git a/loadbars b/loadbars index b0d814f..c842ecd 100755 --- a/loadbars +++ b/loadbars @@ -69,17 +69,17 @@ my %I : shared; # Setting defaults %C = ( average => 15, + barwidth => 35, + extended => 0, + factor => 1, + height => 230, + maxwidth => 1280, + samples => 500, showcores => 0, showmem => 0, - factor => 1, - extended => 0, showtext => 1, showtexthost => 0, - samples => 500, sshopts => '', - barwidth => 35, - maxwidth => 1280, - height => 230, ); %I = ( @@ -149,6 +149,8 @@ sub read_config () { next if /^[\t\s]*#/; s/[\t\s]*#.*//; + next unless length; + my ($key, $val) = split /=/, $_; trim $key; trim $val; @@ -319,7 +321,7 @@ sub auto_off_text ($) { my ($barwidth) = @_; if ($barwidth < $C{barwidth} - 1 && $I{showtextoff} == 0) { - return if $C{showtext} == 0; + return unless $C{showtext}; display_warn 'Disabling text display, text does not fit into window. Use \'t\' to re-enable.'; $I{showtextoff} = 1; $C{showtext} = 0; @@ -847,6 +849,14 @@ Memory stuff: Color: Dark grey Swp: System swap usage in % Color: Grey +Config file support: + Loadbars tries to read ~/.loadbarsrc and it's possible to configure any + option you find in --help but without leading '--'. For comments just use + the '#' sign. Sample config: + showcores=1 # Always show cores on startup + showtext=0 # Always don't display text on startup + extended=1 # Always use extended mode on startup + will always show all CPU cores in extended mode but no text display. Examples: loadbars --extended 1 --showcores 1 --height 300 --hosts localhost loadbars --hosts localhost,server1.example.com,server2.example.com -- cgit v1.2.3 From 9f524ea8c188cbcd6d9880468d4442aa9ad2dde5 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Sat, 4 Feb 2012 23:56:35 +0100 Subject: not on list anymore --- WISHLIST | 1 - 1 file changed, 1 deletion(-) diff --git a/WISHLIST b/WISHLIST index a38f493..66f81df 100644 --- a/WISHLIST +++ b/WISHLIST @@ -1,4 +1,3 @@ -* Local configuration file for default values * More stats for memory * Stats for network * .deb for Debian and Ubuntu -- cgit v1.2.3 From df78a4694c9bb215f27c22f5f3b325462665e968 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Sun, 5 Feb 2012 00:07:34 +0100 Subject: More docu stuff --- CHANGELOG | 6 +++++- HELP | 15 +++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 78743dd..ffaed11 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,8 @@ -* Add config file support (~/.loadbarsrc) +* Add config file support (~/.loadbarsrc) and it's possible to configure + any option you find in --help but without leading '--'. For comments + just use the '#' sign. Sample config: + showcores=1 # Always show cores on startup + showtext=0 # Always don't display text on startup * Remove --title option (no need anyway) * Some bugfixes diff --git a/HELP b/HELP index 62205c9..e077c51 100644 --- a/HELP +++ b/HELP @@ -1,3 +1,8 @@ +==> Reading configuration from /home/pb/.loadbarsrc +==> Setting showcores=1, it might be overwritten by command line params. +==> Setting showtext=0, it might be overwritten by command line params. +==> Setting extended=1, it might be overwritten by command line params. +==> Setting showmem=1, it might be overwritten by command line params. CPU stuff: st = Steal in % [see man proc] (extended) Color: Red @@ -27,6 +32,14 @@ Memory stuff: Color: Dark grey Swp: System swap usage in % Color: Grey +Config file support: + Loadbars tries to read ~/.loadbarsrc and it's possible to configure any + option you find in --help but without leading '--'. For comments just use + the '#' sign. Sample config: + showcores=1 # Always show cores on startup + showtext=0 # Always don't display text on startup + extended=1 # Always use extended mode on startup + will always show all CPU cores in extended mode but no text display. Examples: loadbars --extended 1 --showcores 1 --height 300 --hosts localhost loadbars --hosts localhost,server1.example.com,server2.example.com @@ -38,7 +51,6 @@ Examples: --factor - Set graph scale factor (1.0 means 100%) --height - Set windows height --hosts - Comma sep. list of hosts; optional: user@ in front to each host ---inter - Set update interval in seconds (default 0.1) --maxwidth - Set max width --samples - Set number of samples until ssh reconnects --showcores - Toggle core display (0 or 1) @@ -46,4 +58,3 @@ Examples: --showtexthost - Toggle hostname/num text display (0 or 1) --showtext - Toggle text display (0 or 1) --sshopts - Set SSH options ---title - Set the window title -- cgit v1.2.3 From 7c48c5216f13fe80dd5c0a44e96da95d8162e684 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Sun, 5 Feb 2012 00:15:15 +0100 Subject: Some read_config bugs fixed --- loadbars | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/loadbars b/loadbars index c842ecd..228da73 100755 --- a/loadbars +++ b/loadbars @@ -146,18 +146,20 @@ sub read_config () { while (<$conffile>) { chomp; - next if /^[\t\s]*#/; - s/[\t\s]*#.*//; + s/[\t\s]*?#.*//; next unless length; - my ($key, $val) = split /=/, $_; - trim $key; trim $val; + my ($key, $val) = split '='; unless (defined $val) { display_warn "Could not parse config line: $_"; + next; + } + + trim $key; trim $val; - } elsif (not exists $C{$key}) { + if (not exists $C{$key}) { display_warn "There is no such config key: $key, ignoring"; } else { -- cgit v1.2.3 From 8a40955d3234bf29c01ea29b223be9a63eb5074f Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Sun, 5 Feb 2012 00:16:13 +0100 Subject: Rename thread sub --- loadbars | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/loadbars b/loadbars index 228da73..9e9e527 100755 --- a/loadbars +++ b/loadbars @@ -171,7 +171,7 @@ sub read_config () { close $conffile; } -sub thread_get_stats ($;$) { +sub stats_thread ($;$) { my ( $host, $user ) = @_; $user = defined $user ? "-l $user" : ''; @@ -316,7 +316,7 @@ sub draw_background ($$) { sub create_threads (@) { return map { $_->detach(); $_ } - map { threads->create( 'thread_get_stats', split ':' ) } @_; + map { threads->create( 'stats_thread', split ':' ) } @_; } sub auto_off_text ($) { -- cgit v1.2.3 From aba899910b050958646d0447f599416b49ff12f0 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Sun, 5 Feb 2012 00:18:16 +0100 Subject: Some code formatting and comments stuff --- loadbars | 45 +++++++++++++++++---------------------------- 1 file changed, 17 insertions(+), 28 deletions(-) diff --git a/loadbars b/loadbars index 9e9e527..6a22684 100755 --- a/loadbars +++ b/loadbars @@ -391,7 +391,9 @@ sub main_loop ($@) { my ( $t1, $t2 ) = ( Time::HiRes::time(), undef ); + # Closure for event handling my $event_handler = sub { + # While there are events to poll, poll them all! while ($event->poll() == 1) { next if $event->type() != 2; my $key_name = $event->key_name(); @@ -404,74 +406,61 @@ sub main_loop ($@) { %CPUSTATS = (); display_info 'Toggled CPUs'; - } - elsif ( $key_name eq 'e' ) { + } elsif ( $key_name eq 'e' ) { $C{extended} = !$C{extended}; display_info 'Toggled extended display'; - } - elsif ( $key_name eq 'h' ) { + } elsif ( $key_name eq 'h' ) { say '=> Hotkeys to use in the SDL interface'; say $dispatch->('hotkeys'); display_info 'Hotkeys help printed on terminal stdout'; - } - elsif ( $key_name eq 'm' ) { + } elsif ( $key_name eq 'm' ) { $C{showmem} = !$C{showmem}; display_info 'Toggled show mem'; - } - elsif ( $key_name eq 't' ) { + } elsif ( $key_name eq 't' ) { $C{showtext} = !$C{showtext}; display_info 'Toggled text display'; - } - elsif ( $key_name eq 'u' ) { + } elsif ( $key_name eq 'u' ) { $C{showtexthost} = !$C{showtexthost}; display_info 'Toggled number/hostname display'; - } - elsif ( $key_name eq 'q' ) { + } elsif ( $key_name eq 'q' ) { $quit = 1; return; - } - elsif ( $key_name eq 'a' ) { + } elsif ( $key_name eq 'a' ) { ++$C{average}; display_info "Set sample average to $C{average}"; - } - elsif ( $key_name eq 'y' or $key_name eq 'z' ) { + } elsif ( $key_name eq 'y' or $key_name eq 'z' ) { my $avg = $C{average}; --$avg; $C{average} = $avg > 1 ? $avg : 2; display_info "Set sample average to $C{average}"; - } - elsif ( $key_name eq 's' ) { + } elsif ( $key_name eq 's' ) { $C{factor} += 0.1; display_info "Set scale factor to $C{factor}"; - } - elsif ( $key_name eq 'x' or $key_name eq 'z' ) { + } elsif ( $key_name eq 'x' or $key_name eq 'z' ) { $C{factor} -= 0.1; display_info "Set scale factor to $C{factor}"; - } - elsif ( $key_name eq 'left') { + } elsif ( $key_name eq 'left') { $newsize{width} = $C{width} - 100; $newsize{height} = $C{height}; $resize_window = 1; - } - elsif ( $key_name eq 'right' ) { + } elsif ( $key_name eq 'right' ) { $newsize{width} = $C{width} + 100; $newsize{height} = $C{height}; $resize_window = 1; - } - elsif ( $key_name eq 'up' ) { + + } elsif ( $key_name eq 'up' ) { $newsize{width} = $C{width}; $newsize{height} = $C{height} - 100; $resize_window = 1; - } - elsif ( $key_name eq 'down' ) { + } elsif ( $key_name eq 'down' ) { $newsize{width} = $C{width}; $newsize{height} = $C{height} + 100; $resize_window = 1; -- cgit v1.2.3 From 1855e911bc52258e0ed92ff58f8e4a537f87ee74 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Sun, 5 Feb 2012 00:24:51 +0100 Subject: Some code formatting, also add copyright info on stdout --- loadbars | 82 ++++++++++++++++++++++++++++++++++------------------------------ 1 file changed, 43 insertions(+), 39 deletions(-) diff --git a/loadbars b/loadbars index 6a22684..9edd0c1 100755 --- a/loadbars +++ b/loadbars @@ -26,30 +26,30 @@ use threads; use threads::shared; use constant { - VERSION => 'loadbars v0.5.1-devel', - Copyright => '2010-2012 (c) Paul Buetow ', - CONFFILE => $ENV{HOME} . '/.loadbarsrc', - CSSH_CONFFILE => '/etc/clusters', + VERSION => 'loadbars v0.5.1-devel', + COPYRIGHT => '2010-2012 (c) Paul Buetow ', + CONFFILE => $ENV{HOME} . '/.loadbarsrc', + CSSH_CONFFILE => '/etc/clusters', CSSH_MAX_RECURSION => 10, - COLOR_DEPTH => 8, - BLACK => SDL::Color->new( -r => 0x00, -g => 0x00, -b => 0x00 ), - BLUE0 => SDL::Color->new( -r => 0x00, -g => 0x00, -b => 0xff ), - BLUE => SDL::Color->new( -r => 0x00, -g => 0x00, -b => 0x88 ), - GREEN => SDL::Color->new( -r => 0x00, -g => 0x90, -b => 0x00 ), - ORANGE => SDL::Color->new( -r => 0xff, -g => 0x70, -b => 0x00 ), - PURPLE => SDL::Color->new( -r => 0xa0, -g => 0x20, -b => 0xf0 ), - RED => SDL::Color->new( -r => 0xff, -g => 0x00, -b => 0x00 ), - WHITE => SDL::Color->new( -r => 0xff, -g => 0xff, -b => 0xff ), - GREY0 => SDL::Color->new( -r => 0x11, -g => 0x11, -b => 0x11 ), - GREY => SDL::Color->new( -r => 0xaa, -g => 0xaa, -b => 0xaa ), - DARK_GREY => SDL::Color->new( -r => 0x15, -g => 0x15, -b => 0x15 ), - YELLOW0 => SDL::Color->new( -r => 0xff, -g => 0xa0, -b => 0x00 ), - YELLOW => SDL::Color->new( -r => 0xff, -g => 0xc0, -b => 0x00 ), - SYSTEM_BLUE0 => 30, - USER_ORANGE => 70, - USER_YELLOW0 => 50, - INTERVAL => 0.1, - INTERVAL_WARN => 1.0, + COLOR_DEPTH => 8, + BLACK => SDL::Color->new( -r => 0x00, -g => 0x00, -b => 0x00 ), + BLUE0 => SDL::Color->new( -r => 0x00, -g => 0x00, -b => 0xff ), + BLUE => SDL::Color->new( -r => 0x00, -g => 0x00, -b => 0x88 ), + GREEN => SDL::Color->new( -r => 0x00, -g => 0x90, -b => 0x00 ), + ORANGE => SDL::Color->new( -r => 0xff, -g => 0x70, -b => 0x00 ), + PURPLE => SDL::Color->new( -r => 0xa0, -g => 0x20, -b => 0xf0 ), + RED => SDL::Color->new( -r => 0xff, -g => 0x00, -b => 0x00 ), + WHITE => SDL::Color->new( -r => 0xff, -g => 0xff, -b => 0xff ), + GREY0 => SDL::Color->new( -r => 0x11, -g => 0x11, -b => 0x11 ), + GREY => SDL::Color->new( -r => 0xaa, -g => 0xaa, -b => 0xaa ), + DARK_GREY => SDL::Color->new( -r => 0x15, -g => 0x15, -b => 0x15 ), + YELLOW0 => SDL::Color->new( -r => 0xff, -g => 0xa0, -b => 0x00 ), + YELLOW => SDL::Color->new( -r => 0xff, -g => 0xc0, -b => 0x00 ), + SYSTEM_BLUE0 => 30, + USER_ORANGE => 70, + USER_YELLOW0 => 50, + INTERVAL => 0.1, + INTERVAL_WARN => 1.0, }; $| = 1; @@ -111,7 +111,7 @@ sub trim (\$) { sub percentage ($$) { my ($total, $part) = @_; - return int (null($part) / notnull ( null($total) / 100 )); + return int (null($part) / notnull ( null($total) / 100)); } sub norm ($) { @@ -123,7 +123,7 @@ sub norm ($) { sub parse_cpu_line ($) { my $line = shift; - my ( $name, %load ); + my ($name, %load); ( $name, @load{qw(user nice system idle iowait irq softirq steal guest)} ) = split ' ', $line; @@ -135,7 +135,7 @@ sub parse_cpu_line ($) { $load{TOTAL} = sum @load{qw(user nice system idle iowait irq softirq steal guest)}; - return ( $name, \%load ); + return ($name, \%load); } sub read_config () { @@ -175,11 +175,11 @@ sub stats_thread ($;$) { my ( $host, $user ) = @_; $user = defined $user ? "-l $user" : ''; - my ( $sigusr1, $quit ) = ( 0, 0 ); + my ($sigusr1, $quit) = (0,0); my $loadavgexp = qr/(\d+\.\d{2}) (\d+\.\d{2}) (\d+\.\d{2})/; my $inter = INTERVAL; - for ( ; ; ) { + for (;;) { my $bash = <<"BASH"; if [ -e /proc/stat ]; then loadavg=/proc/loadavg @@ -243,6 +243,7 @@ BASH } else { for my $meminfo (qw(MemTotal MemFree Buffers Cached SwapTotal SwapFree)) { + # TODO: Precompile regexp if (/^$meminfo: *(\d+)/) { $MEMSTATS_HAS{$host} = 1; $MEMSTATS{"$host;$meminfo"} = $1; @@ -252,6 +253,7 @@ BASH } if ($sigusr1) { + # TODO: Use index instead of regexp for cpuregexp $cpuregexp = qr/$I{cpuregexp}/; $sigusr1 = 0; } @@ -274,15 +276,15 @@ sub normalize_loads (%) { return %loads unless exists $loads{TOTAL}; my $total = $loads{TOTAL} == 0 ? 1 : $loads{TOTAL}; - return map { $_ => $loads{$_} / ( $total / 100 ) } keys %loads; + return map { $_ => $loads{$_} / ($total / 100) } keys %loads; } sub get_cpuaverage ($@) { - my ( $factor, @loads ) = @_; - my ( %cpumax, %cpuaverage ); + my ($factor, @loads) = @_; + my (%cpumax, %cpuaverage); for my $l (@loads) { - for ( keys %$l ) { + for (keys %$l) { $cpuaverage{$_} += $l->{$_}; $cpumax{$_} = $l->{$_} @@ -293,21 +295,21 @@ sub get_cpuaverage ($@) { my $div = @loads / $factor; - for ( keys %cpuaverage ) { + for (keys %cpuaverage) { $cpuaverage{$_} /= $div; - $cpumax{$_} /= $factor; + $cpumax{$_} /= $factor; } - return ( \%cpumax, \%cpuaverage ); + return (\%cpumax, \%cpuaverage); } sub draw_background ($$) { - my ( $app, $rects ) = @_; + my ($app, $rects) = @_; my $rect = get_rect $rects, 'background'; - $rect->width( $C{width} ); - $rect->height( $C{height} ); - $app->fill( $rect, Loadbars::BLACK ); + $rect->width($C{width}); + $rect->height($C{height}); + $app->fill($rect, Loadbars::BLACK); $app->update($rect); return undef; @@ -1179,6 +1181,8 @@ sub main () { my ( $hosts, $dispatch ) = dispatch_table; my $usage; + say VERSION . ' ' . COPYRIGHT; + read_config; GetOptions( 'help|?' => \$usage, $dispatch->('options') ); -- cgit v1.2.3 From cf9b6889ae250ad70a3d55fffd9b4e25d2cce3aa Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Sun, 5 Feb 2012 10:44:19 +0100 Subject: new wish --- WISHLIST | 1 + 1 file changed, 1 insertion(+) diff --git a/WISHLIST b/WISHLIST index 66f81df..c494f6c 100644 --- a/WISHLIST +++ b/WISHLIST @@ -1,3 +1,4 @@ * More stats for memory * Stats for network * .deb for Debian and Ubuntu +* Auto detect single core boxes -- cgit v1.2.3 From e7c79b0dc016ab9b8df9d748009cf752c14de9cd Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Thu, 9 Feb 2012 09:46:05 +0100 Subject: some minor stuff --- WISHLIST | 2 ++ loadbars | 28 ++++++++++++++-------------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/WISHLIST b/WISHLIST index c494f6c..ea234ff 100644 --- a/WISHLIST +++ b/WISHLIST @@ -2,3 +2,5 @@ * Stats for network * .deb for Debian and Ubuntu * Auto detect single core boxes +* Make code modular (script is growing...) +* Optimize code (too much cpu usage if there are too many hosts involved) diff --git a/loadbars b/loadbars index 9edd0c1..14e5a0d 100755 --- a/loadbars +++ b/loadbars @@ -522,15 +522,15 @@ sub main_loop ($@) { my $rect_separator = undef; - my $rect_idle = get_rect $rects, "$key;idle"; - my $rect_steal = get_rect $rects, "$key;steal"; - my $rect_guest = get_rect $rects, "$key;guest"; - my $rect_irq = get_rect $rects, "$key;irq"; + my $rect_idle = get_rect $rects, "$key;idle"; + my $rect_steal = get_rect $rects, "$key;steal"; + my $rect_guest = get_rect $rects, "$key;guest"; + my $rect_irq = get_rect $rects, "$key;irq"; my $rect_softirq = get_rect $rects, "$key;softirq"; - my $rect_nice = get_rect $rects, "$key;nice"; - my $rect_iowait = get_rect $rects, "$key;iowait"; - my $rect_user = get_rect $rects, "$key;user"; - my $rect_system = get_rect $rects, "$key;system"; + my $rect_nice = get_rect $rects, "$key;nice"; + my $rect_iowait = get_rect $rects, "$key;iowait"; + my $rect_user = get_rect $rects, "$key;user"; + my $rect_system = get_rect $rects, "$key;system"; my $rect_peak; @@ -765,14 +765,14 @@ sub main_loop ($@) { if ( INTERVAL > $t_diff ) { usleep 10000; - # Goto is OK if you don't produce spaghetti code + # Goto is OK as long you don't produce spaghetti code goto TIMEKEEPER; } elsif ( INTERVAL_WARN < $t_diff ) { display_warn "WARN: Loop is behind $t_diff seconds, your computer may be too slow"; } - $t1 = $t2; + $t1 = $t2; $event_handler->(); my $new_num_stats = keys %CPUSTATS; @@ -856,10 +856,10 @@ Examples: loadbars --cluster foocluster (foocluster is in /etc/clusters [ClusterSSH]) END - # mode 1: Option is shown in the online help menu (stdout not sdl) - # mode 2: Option is shown in the 'usage' screen from the command line - # mode 4: Option is used to generate the GetOptions parameters for Getopt::Long - # Combinations: Like chmod(1) + # mode 1: Option is shown in the online help menu (stdout not sdl) + # mode 2: Option is shown in the 'usage' screen from the command line + # mode 4: Option is used to generate the GetOptions parameters for Getopt::Long + # Combinations: Like chmod(1) my %d = ( average => { -- cgit v1.2.3 From 7e01fbd0789a0da22314fca7c2c9476c4d294fef Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Thu, 9 Feb 2012 09:54:07 +0100 Subject: added E_ errorcodes --- CHANGELOG | 1 + loadbars | 14 ++++++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index ffaed11..f1d3054 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -4,6 +4,7 @@ showcores=1 # Always show cores on startup showtext=0 # Always don't display text on startup * Remove --title option (no need anyway) +* Some code cleanups * Some bugfixes Sat Feb 4 10:56:27 CET 2012 diff --git a/loadbars b/loadbars index 14e5a0d..817d163 100755 --- a/loadbars +++ b/loadbars @@ -50,6 +50,9 @@ use constant { USER_YELLOW0 => 50, INTERVAL => 0.1, INTERVAL_WARN => 1.0, + E_OK => 0, + E_UNKNOWN => 1, + E_NOHOST => 2, }; $| = 1; @@ -806,7 +809,7 @@ sub main_loop ($@) { say "Good bye"; - exit 0; + exit E_OK; } sub dispatch_table () { @@ -1147,7 +1150,7 @@ sub get_cluster_hosts ($;$) { $recursion = 1; } - elsif ( $recursion > CSSH_MAX_RECURSION ) { + elsif ( $recursion > CSSH_MAX_RECURSION ) { error "CSSH_MAX_RECURSION reached. Infinite circle loop in " . CSSH_CONFFILE . "?"; } @@ -1174,6 +1177,7 @@ sub get_cluster_hosts ($;$) { my @hosts; push @hosts, get_cluster_hosts $_, ( $recursion + 1 ) for ( split /\s+/, $hosts ); + return @hosts; } @@ -1189,7 +1193,7 @@ sub main () { if ( defined $usage ) { say $dispatch->('usage'); - exit 1; + exit E_OK; } set_showcores_regexp; @@ -1206,11 +1210,13 @@ sub main () { } else { say $dispatch->('usage'); - exit 1; + exit E_NOHOST; } my @threads = create_threads @hosts; main_loop $dispatch, @threads; + + exit E_OK; } main; -- cgit v1.2.3 From cafe0d509eeb356c5478e109f5344c6a27300907 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Thu, 9 Feb 2012 10:06:45 +0100 Subject: write config support --- CHANGELOG | 1 + loadbars | 567 ++++++++++++++++++++++++++++++++------------------------------ 2 files changed, 292 insertions(+), 276 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index f1d3054..8e51310 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -3,6 +3,7 @@ just use the '#' sign. Sample config: showcores=1 # Always show cores on startup showtext=0 # Always don't display text on startup +* Add hotkey 'w' which writes current settings to the configfile * Remove --title option (no need anyway) * Some code cleanups * Some bugfixes diff --git a/loadbars b/loadbars index 817d163..2abfdf3 100755 --- a/loadbars +++ b/loadbars @@ -174,6 +174,17 @@ sub read_config () { close $conffile; } +sub write_config () { + display_warn "Overwriting config file " . CONFFILE if -f CONFFILE; + open my $conffile, '>', CONFFILE or die "$!: " . CONFFILE . "\n"; + + for (keys %C) { + print $conffile "$_=$C{$_}\n"; + } + + close $conffile; +} + sub stats_thread ($;$) { my ( $host, $user ) = @_; $user = defined $user ? "-l $user" : ''; @@ -436,309 +447,312 @@ sub main_loop ($@) { $quit = 1; return; - } elsif ( $key_name eq 'a' ) { - ++$C{average}; - display_info "Set sample average to $C{average}"; - } elsif ( $key_name eq 'y' or $key_name eq 'z' ) { - my $avg = $C{average}; - --$avg; - $C{average} = $avg > 1 ? $avg : 2; - display_info "Set sample average to $C{average}"; - - } elsif ( $key_name eq 's' ) { - $C{factor} += 0.1; - display_info "Set scale factor to $C{factor}"; - } elsif ( $key_name eq 'x' or $key_name eq 'z' ) { - $C{factor} -= 0.1; - display_info "Set scale factor to $C{factor}"; - - } elsif ( $key_name eq 'left') { - $newsize{width} = $C{width} - 100; - $newsize{height} = $C{height}; - $resize_window = 1; - } elsif ( $key_name eq 'right' ) { - $newsize{width} = $C{width} + 100; - $newsize{height} = $C{height}; - $resize_window = 1; - - } elsif ( $key_name eq 'up' ) { - $newsize{width} = $C{width}; - $newsize{height} = $C{height} - 100; - $resize_window = 1; - } elsif ( $key_name eq 'down' ) { - $newsize{width} = $C{width}; - $newsize{height} = $C{height} + 100; - $resize_window = 1; + } elsif ( $key_name eq 'w' ) { + write_config; + + } elsif ( $key_name eq 'a' ) { + ++$C{average}; + display_info "Set sample average to $C{average}"; + } elsif ( $key_name eq 'y' or $key_name eq 'z' ) { + my $avg = $C{average}; + --$avg; + $C{average} = $avg > 1 ? $avg : 2; + display_info "Set sample average to $C{average}"; + + } elsif ( $key_name eq 's' ) { + $C{factor} += 0.1; + display_info "Set scale factor to $C{factor}"; + } elsif ( $key_name eq 'x' or $key_name eq 'z' ) { + $C{factor} -= 0.1; + display_info "Set scale factor to $C{factor}"; + + } elsif ( $key_name eq 'left') { + $newsize{width} = $C{width} - 100; + $newsize{height} = $C{height}; + $resize_window = 1; + } elsif ( $key_name eq 'right' ) { + $newsize{width} = $C{width} + 100; + $newsize{height} = $C{height}; + $resize_window = 1; + + } elsif ( $key_name eq 'up' ) { + $newsize{width} = $C{width}; + $newsize{height} = $C{height} - 100; + $resize_window = 1; + } elsif ( $key_name eq 'down' ) { + $newsize{width} = $C{width}; + $newsize{height} = $C{height} + 100; + $resize_window = 1; + } } - } - }; + }; - do { - my ( $x, $y ) = ( 0, 0 ); + do { + my ( $x, $y ) = ( 0, 0 ); - # Also substract 1 (each bar is followed by an 1px separator bar) - my $width = $C{width} / notnull($num_stats) - 1; + # Also substract 1 (each bar is followed by an 1px separator bar) + my $width = $C{width} / notnull($num_stats) - 1; - my ( $current_barnum, $current_corenum ) = ( -1, -1 ); + my ( $current_barnum, $current_corenum ) = ( -1, -1 ); - for my $key ( sort keys %CPUSTATS ) { - last if (++$current_barnum > $num_stats); - ++$current_corenum; - my ( $host, $name ) = split ';', $key; + for my $key ( sort keys %CPUSTATS ) { + last if (++$current_barnum > $num_stats); + ++$current_corenum; + my ( $host, $name ) = split ';', $key; - next unless defined $CPUSTATS{$key}; + next unless defined $CPUSTATS{$key}; - my %stat = map { - my ( $k, $v ) = split '='; - $k => $v + my %stat = map { + my ( $k, $v ) = split '='; + $k => $v - } split ';', $CPUSTATS{$key}; + } split ';', $CPUSTATS{$key}; + + unless ( exists $prev_stats{$key} ) { + $prev_stats{$key} = \%stat; + next; + } + + my $prev_stat = $prev_stats{$key}; + my %loads = + null $stat{TOTAL} == null $prev_stat->{TOTAL} + ? %stat + : map { $_ => $stat{$_} - $prev_stat->{$_} } keys %stat; - unless ( exists $prev_stats{$key} ) { $prev_stats{$key} = \%stat; - next; - } - my $prev_stat = $prev_stats{$key}; - my %loads = - null $stat{TOTAL} == null $prev_stat->{TOTAL} - ? %stat - : map { $_ => $stat{$_} - $prev_stat->{$_} } keys %stat; - - $prev_stats{$key} = \%stat; - - %loads = normalize_loads %loads; - push @{ $last_loads{$key} }, \%loads; - shift @{ $last_loads{$key} } - while @{ $last_loads{$key} } >= $C{average}; - - my ( $cpumax, $cpuaverage ) = get_cpuaverage $C{factor}, - @{ $last_loads{$key} }; - - my %heights = map { - $_ => defined $cpuaverage->{$_} - ? $cpuaverage->{$_} * ( $C{height} / 100 ) - : 1 - } keys %$cpuaverage; - - my $is_host_summary = $name eq 'cpu' ? 1 : 0; - - my $rect_separator = undef; - - my $rect_idle = get_rect $rects, "$key;idle"; - my $rect_steal = get_rect $rects, "$key;steal"; - my $rect_guest = get_rect $rects, "$key;guest"; - my $rect_irq = get_rect $rects, "$key;irq"; - my $rect_softirq = get_rect $rects, "$key;softirq"; - my $rect_nice = get_rect $rects, "$key;nice"; - my $rect_iowait = get_rect $rects, "$key;iowait"; - my $rect_user = get_rect $rects, "$key;user"; - my $rect_system = get_rect $rects, "$key;system"; - - my $rect_peak; - - $y = $C{height} - $heights{system}; - $rect_system->width($width); - $rect_system->height( $heights{system} ); - $rect_system->x($x); - $rect_system->y($y); - - $y -= $heights{user}; - $rect_user->width($width); - $rect_user->height( $heights{user} ); - $rect_user->x($x); - $rect_user->y($y); - - $y -= $heights{nice}; - $rect_nice->width($width); - $rect_nice->height( $heights{nice} ); - $rect_nice->x($x); - $rect_nice->y($y); - - $y -= $heights{idle}; - $rect_idle->width($width); - $rect_idle->height( $heights{idle} ); - $rect_idle->x($x); - $rect_idle->y($y); - - $y -= $heights{iowait}; - $rect_iowait->width($width); - $rect_iowait->height( $heights{iowait} ); - $rect_iowait->x($x); - $rect_iowait->y($y); - - $y -= $heights{irq}; - $rect_irq->width($width); - $rect_irq->height( $heights{irq} ); - $rect_irq->x($x); - $rect_irq->y($y); - - $y -= $heights{softirq}; - $rect_softirq->width($width); - $rect_softirq->height( $heights{softirq} ); - $rect_softirq->x($x); - $rect_softirq->y($y); - - $y -= $heights{guest}; - $rect_guest->width($width); - $rect_guest->height( $heights{guest} ); - $rect_guest->x($x); - $rect_guest->y($y); - - $y -= $heights{steal}; - $rect_steal->width($width); - $rect_steal->height( $heights{steal} ); - $rect_steal->x($x); - $rect_steal->y($y); - - my $all = 100 - $cpuaverage->{idle}; - my $max_all = 0; - - $app->fill( $rect_idle, Loadbars::BLACK ); - $app->fill( $rect_steal, Loadbars::RED ); - $app->fill( $rect_guest, Loadbars::RED ); - $app->fill( $rect_irq, Loadbars::WHITE ); - $app->fill( $rect_softirq, Loadbars::WHITE ); - $app->fill( $rect_nice, Loadbars::GREEN ); - $app->fill( $rect_iowait, Loadbars::PURPLE ); - - my $add_x = 0; - my $rect_memused = get_rect $rects, "$host;memused"; - my $rect_memfree = get_rect $rects, "$host;memfree"; - my $rect_buffers = get_rect $rects, "$host;buffers"; - my $rect_cached = get_rect $rects, "$host;cached"; - my $rect_swapused = get_rect $rects, "$host;swapused"; - my $rect_swapfree = get_rect $rects, "$host;swapfree"; - - my %meminfo; - if ( $is_host_summary ) { - if ( $C{showmem} ) { - $add_x = $width + 1; - - my $ram_per = percentage $MEMSTATS{"$host;MemTotal"}, $MEMSTATS{"$host;MemFree"}; - my $swap_per = percentage $MEMSTATS{"$host;SwapTotal"}, $MEMSTATS{"$host;SwapFree"}; - - %meminfo = ( - ram_per => $ram_per, - swap_per => $swap_per, - ); - - my %heights = ( - MemFree => $ram_per * ( $C{height} / 100 ), - MemUsed => (100 - $ram_per) * ( $C{height} / 100 ), - SwapFree => $swap_per * ( $C{height} / 100 ), - SwapUsed => (100 - $swap_per) * ( $C{height} / 100 ), - ); - - my $half_width = $width / 2; - $y = $C{height} - $heights{MemUsed}; - $rect_memused->width($half_width); - $rect_memused->height( $heights{MemUsed} ); - $rect_memused->x($x+$add_x); - $rect_memused->y($y); - - $y -= $heights{MemFree}; - $rect_memfree->width($half_width); - $rect_memfree->height( $heights{MemFree} ); - $rect_memfree->x($x+$add_x); - $rect_memfree->y($y); - - $y = $C{height} - $heights{SwapUsed}; - $rect_swapused->width($half_width); - $rect_swapused->height( $heights{SwapUsed} ); - $rect_swapused->x($x+$add_x+$half_width); - $rect_swapused->y($y); - - $y -= $heights{SwapFree}; - $rect_swapfree->width($half_width); - $rect_swapfree->height( $heights{SwapFree} ); - $rect_swapfree->x($x+$add_x+$half_width); - $rect_swapfree->y($y); - - $app->fill( $rect_memused, Loadbars::DARK_GREY ); - $app->fill( $rect_memfree, Loadbars::BLACK ); - - $app->fill( $rect_swapused, Loadbars::GREY ); - $app->fill( $rect_swapfree, Loadbars::BLACK ); - } + %loads = normalize_loads %loads; + push @{ $last_loads{$key} }, \%loads; + shift @{ $last_loads{$key} } + while @{ $last_loads{$key} } >= $C{average}; - if ( $C{showcores} ) { - $current_corenum = 0; - $rect_separator = get_rect $rects, "$key;separator"; - $rect_separator->width(1); - $rect_separator->height( $C{height} ); - $rect_separator->x( $x - 1 ); - $rect_separator->y(0); - $app->fill( $rect_separator, Loadbars::GREY ); - } - } + my ( $cpumax, $cpuaverage ) = get_cpuaverage $C{factor}, + @{ $last_loads{$key} }; - if ( $C{extended} ) { - my %maxheights = map { - $_ => defined $cpumax->{$_} - ? $cpumax->{$_} * ( $C{height} / 100 ) + my %heights = map { + $_ => defined $cpuaverage->{$_} + ? $cpuaverage->{$_} * ( $C{height} / 100 ) : 1 - } keys %$cpumax; - - $rect_peak = get_rect $rects, "$key;max"; - $rect_peak->width($width); - $rect_peak->height(1); - $rect_peak->x($x); - $rect_peak->y( $C{height} - $maxheights{system} - $maxheights{user} ); + } keys %$cpuaverage; + + my $is_host_summary = $name eq 'cpu' ? 1 : 0; + + my $rect_separator = undef; + + my $rect_idle = get_rect $rects, "$key;idle"; + my $rect_steal = get_rect $rects, "$key;steal"; + my $rect_guest = get_rect $rects, "$key;guest"; + my $rect_irq = get_rect $rects, "$key;irq"; + my $rect_softirq = get_rect $rects, "$key;softirq"; + my $rect_nice = get_rect $rects, "$key;nice"; + my $rect_iowait = get_rect $rects, "$key;iowait"; + my $rect_user = get_rect $rects, "$key;user"; + my $rect_system = get_rect $rects, "$key;system"; + + my $rect_peak; + + $y = $C{height} - $heights{system}; + $rect_system->width($width); + $rect_system->height( $heights{system} ); + $rect_system->x($x); + $rect_system->y($y); + + $y -= $heights{user}; + $rect_user->width($width); + $rect_user->height( $heights{user} ); + $rect_user->x($x); + $rect_user->y($y); + + $y -= $heights{nice}; + $rect_nice->width($width); + $rect_nice->height( $heights{nice} ); + $rect_nice->x($x); + $rect_nice->y($y); + + $y -= $heights{idle}; + $rect_idle->width($width); + $rect_idle->height( $heights{idle} ); + $rect_idle->x($x); + $rect_idle->y($y); + + $y -= $heights{iowait}; + $rect_iowait->width($width); + $rect_iowait->height( $heights{iowait} ); + $rect_iowait->x($x); + $rect_iowait->y($y); + + $y -= $heights{irq}; + $rect_irq->width($width); + $rect_irq->height( $heights{irq} ); + $rect_irq->x($x); + $rect_irq->y($y); + + $y -= $heights{softirq}; + $rect_softirq->width($width); + $rect_softirq->height( $heights{softirq} ); + $rect_softirq->x($x); + $rect_softirq->y($y); + + $y -= $heights{guest}; + $rect_guest->width($width); + $rect_guest->height( $heights{guest} ); + $rect_guest->x($x); + $rect_guest->y($y); + + $y -= $heights{steal}; + $rect_steal->width($width); + $rect_steal->height( $heights{steal} ); + $rect_steal->x($x); + $rect_steal->y($y); + + my $all = 100 - $cpuaverage->{idle}; + my $max_all = 0; + + $app->fill( $rect_idle, Loadbars::BLACK ); + $app->fill( $rect_steal, Loadbars::RED ); + $app->fill( $rect_guest, Loadbars::RED ); + $app->fill( $rect_irq, Loadbars::WHITE ); + $app->fill( $rect_softirq, Loadbars::WHITE ); + $app->fill( $rect_nice, Loadbars::GREEN ); + $app->fill( $rect_iowait, Loadbars::PURPLE ); + + my $add_x = 0; + my $rect_memused = get_rect $rects, "$host;memused"; + my $rect_memfree = get_rect $rects, "$host;memfree"; + my $rect_buffers = get_rect $rects, "$host;buffers"; + my $rect_cached = get_rect $rects, "$host;cached"; + my $rect_swapused = get_rect $rects, "$host;swapused"; + my $rect_swapfree = get_rect $rects, "$host;swapfree"; + + my %meminfo; + if ( $is_host_summary ) { + if ( $C{showmem} ) { + $add_x = $width + 1; + + my $ram_per = percentage $MEMSTATS{"$host;MemTotal"}, $MEMSTATS{"$host;MemFree"}; + my $swap_per = percentage $MEMSTATS{"$host;SwapTotal"}, $MEMSTATS{"$host;SwapFree"}; + + %meminfo = ( + ram_per => $ram_per, + swap_per => $swap_per, + ); + + my %heights = ( + MemFree => $ram_per * ( $C{height} / 100 ), + MemUsed => (100 - $ram_per) * ( $C{height} / 100 ), + SwapFree => $swap_per * ( $C{height} / 100 ), + SwapUsed => (100 - $swap_per) * ( $C{height} / 100 ), + ); + + my $half_width = $width / 2; + $y = $C{height} - $heights{MemUsed}; + $rect_memused->width($half_width); + $rect_memused->height( $heights{MemUsed} ); + $rect_memused->x($x+$add_x); + $rect_memused->y($y); + + $y -= $heights{MemFree}; + $rect_memfree->width($half_width); + $rect_memfree->height( $heights{MemFree} ); + $rect_memfree->x($x+$add_x); + $rect_memfree->y($y); + + $y = $C{height} - $heights{SwapUsed}; + $rect_swapused->width($half_width); + $rect_swapused->height( $heights{SwapUsed} ); + $rect_swapused->x($x+$add_x+$half_width); + $rect_swapused->y($y); + + $y -= $heights{SwapFree}; + $rect_swapfree->width($half_width); + $rect_swapfree->height( $heights{SwapFree} ); + $rect_swapfree->x($x+$add_x+$half_width); + $rect_swapfree->y($y); + + $app->fill( $rect_memused, Loadbars::DARK_GREY ); + $app->fill( $rect_memfree, Loadbars::BLACK ); + + $app->fill( $rect_swapused, Loadbars::GREY ); + $app->fill( $rect_swapfree, Loadbars::BLACK ); + } - $max_all = sum @{$cpumax} {qw(user system iowait irq softirq steal guest)}; + if ( $C{showcores} ) { + $current_corenum = 0; + $rect_separator = get_rect $rects, "$key;separator"; + $rect_separator->width(1); + $rect_separator->height( $C{height} ); + $rect_separator->x( $x - 1 ); + $rect_separator->y(0); + $app->fill( $rect_separator, Loadbars::GREY ); + } + } - $app->fill( $rect_peak, $max_all > Loadbars::USER_ORANGE ? Loadbars::ORANGE - : ( $max_all > Loadbars::USER_YELLOW0 ? Loadbars::YELLOW0 : (Loadbars::YELLOW))); - } + if ( $C{extended} ) { + my %maxheights = map { + $_ => defined $cpumax->{$_} + ? $cpumax->{$_} * ( $C{height} / 100 ) + : 1 + } keys %$cpumax; + + $rect_peak = get_rect $rects, "$key;max"; + $rect_peak->width($width); + $rect_peak->height(1); + $rect_peak->x($x); + $rect_peak->y( $C{height} - $maxheights{system} - $maxheights{user} ); + + $max_all = sum @{$cpumax} {qw(user system iowait irq softirq steal guest)}; + + $app->fill( $rect_peak, $max_all > Loadbars::USER_ORANGE ? Loadbars::ORANGE + : ( $max_all > Loadbars::USER_YELLOW0 ? Loadbars::YELLOW0 : (Loadbars::YELLOW))); + } - $app->fill( $rect_user, $all > Loadbars::USER_ORANGE ? Loadbars::ORANGE - : ( $all > Loadbars::USER_YELLOW0 ? Loadbars::YELLOW0 : (Loadbars::YELLOW))); - $app->fill( $rect_system, $cpuaverage->{system} > Loadbars::SYSTEM_BLUE0 - ? Loadbars::BLUE0 : Loadbars::BLUE ); + $app->fill( $rect_user, $all > Loadbars::USER_ORANGE ? Loadbars::ORANGE + : ( $all > Loadbars::USER_YELLOW0 ? Loadbars::YELLOW0 : (Loadbars::YELLOW))); + $app->fill( $rect_system, $cpuaverage->{system} > Loadbars::SYSTEM_BLUE0 + ? Loadbars::BLUE0 : Loadbars::BLUE ); - my ( $y, $space ) = ( 5, $font_height ); + my ( $y, $space ) = ( 5, $font_height ); - my @loadavg = split ';', $AVGSTATS{$host}; + my @loadavg = split ';', $AVGSTATS{$host}; - if ( $C{showtext} ) { - if ( $C{showmem} && $is_host_summary ) { - my $y_ = $y; - $app->print( $x+$add_x, $y_, 'Ram:'); - $app->print( $x+$add_x, $y_ += $space, sprintf '%02d', (100-$meminfo{ram_per})); - $app->print( $x+$add_x, $y_ += $space, 'Swp:'); - $app->print( $x+$add_x, $y_ += $space, sprintf '%02d', (100-$meminfo{swap_per})); - } - if ( $C{showtexthost} && $is_host_summary ) { - # If hostname is printed don't use FQDN - # because of its length. - $host =~ /([^\.]*)/; - $app->print( $x, $y, sprintf '%s:', $1 ); + if ( $C{showtext} ) { + if ( $C{showmem} && $is_host_summary ) { + my $y_ = $y; + $app->print( $x+$add_x, $y_, 'Ram:'); + $app->print( $x+$add_x, $y_ += $space, sprintf '%02d', (100-$meminfo{ram_per})); + $app->print( $x+$add_x, $y_ += $space, 'Swp:'); + $app->print( $x+$add_x, $y_ += $space, sprintf '%02d', (100-$meminfo{swap_per})); + } + if ( $C{showtexthost} && $is_host_summary ) { + # If hostname is printed don't use FQDN + # because of its length. + $host =~ /([^\.]*)/; + $app->print( $x, $y, sprintf '%s:', $1 ); - } - else { - $app->print( $x, $y, sprintf '%i:', $C{showcores} ? $current_corenum : $current_barnum + 1 ); - } + } + else { + $app->print( $x, $y, sprintf '%i:', $C{showcores} ? $current_corenum : $current_barnum + 1 ); + } - if ( $C{extended} ) { - $app->print( $x, $y += $space, sprintf '%02d%s', norm $cpuaverage->{steal}, 'st'); - $app->print( $x, $y += $space, sprintf '%02d%s', norm $cpuaverage->{guest}, 'gt'); - $app->print( $x, $y += $space, sprintf '%02d%s', norm $cpuaverage->{softirq}, 'sr'); - $app->print( $x, $y += $space, sprintf '%02d%s', norm $cpuaverage->{irq}, 'ir'); - } + if ( $C{extended} ) { + $app->print( $x, $y += $space, sprintf '%02d%s', norm $cpuaverage->{steal}, 'st'); + $app->print( $x, $y += $space, sprintf '%02d%s', norm $cpuaverage->{guest}, 'gt'); + $app->print( $x, $y += $space, sprintf '%02d%s', norm $cpuaverage->{softirq}, 'sr'); + $app->print( $x, $y += $space, sprintf '%02d%s', norm $cpuaverage->{irq}, 'ir'); + } - $app->print( $x, $y += $space, sprintf '%02d%s', norm $cpuaverage->{iowait}, 'io'); + $app->print( $x, $y += $space, sprintf '%02d%s', norm $cpuaverage->{iowait}, 'io'); - $app->print( $x, $y += $space, sprintf '%02d%s', norm $cpuaverage->{idle}, 'id') if $C{extended}; + $app->print( $x, $y += $space, sprintf '%02d%s', norm $cpuaverage->{idle}, 'id') if $C{extended}; - $app->print( $x, $y += $space, sprintf '%02d%s', norm $cpuaverage->{nice}, 'ni'); - $app->print( $x, $y += $space, sprintf '%02d%s', norm $cpuaverage->{user}, 'us'); - $app->print( $x, $y += $space, sprintf '%02d%s', norm $cpuaverage->{system}, 'sy'); - $app->print( $x, $y += $space, sprintf '%02d%s', norm $all, 'to'); + $app->print( $x, $y += $space, sprintf '%02d%s', norm $cpuaverage->{nice}, 'ni'); + $app->print( $x, $y += $space, sprintf '%02d%s', norm $cpuaverage->{user}, 'us'); + $app->print( $x, $y += $space, sprintf '%02d%s', norm $cpuaverage->{system}, 'sy'); + $app->print( $x, $y += $space, sprintf '%02d%s', norm $all, 'to'); - $app->print( $x, $y += $space, sprintf '%02d%s', norm $max_all, 'pk') if $C{extended}; + $app->print( $x, $y += $space, sprintf '%02d%s', norm $max_all, 'pk') if $C{extended}; - if ($is_host_summary) { + if ($is_host_summary) { if ( defined $loadavg[0] ) { $app->print( $x, $y += $space, 'Avg:' ); $app->print( $x, $y += $space, sprintf "%.2f", $loadavg[0]); @@ -992,6 +1006,7 @@ END }, quit_hot => { menupos => 16, cmd => 'q', help => 'Quits', mode => 1 }, + writeconfig_hot => { menupos => 16, cmd => 'w', help => 'Write config to config file', mode => 1 }, samples => { menupos => 17, -- cgit v1.2.3 From b7c58f16d1e1bff13ce5700aed836506568ca67e Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Fri, 10 Feb 2012 07:46:51 +0100 Subject: E_OK is now SUCCESS --- loadbars | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/loadbars b/loadbars index 2abfdf3..035c1a4 100755 --- a/loadbars +++ b/loadbars @@ -50,7 +50,7 @@ use constant { USER_YELLOW0 => 50, INTERVAL => 0.1, INTERVAL_WARN => 1.0, - E_OK => 0, + SUCCESS => 0, E_UNKNOWN => 1, E_NOHOST => 2, }; @@ -823,7 +823,7 @@ sub main_loop ($@) { say "Good bye"; - exit E_OK; + exit SUCCESS; } sub dispatch_table () { @@ -1208,7 +1208,7 @@ sub main () { if ( defined $usage ) { say $dispatch->('usage'); - exit E_OK; + exit SUCCESS; } set_showcores_regexp; @@ -1231,7 +1231,7 @@ sub main () { my @threads = create_threads @hosts; main_loop $dispatch, @threads; - exit E_OK; + exit SUCCESS; } main; -- cgit v1.2.3 From 1440e0d2e5065221cee0e4c6565842ee3dac7431 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Sat, 25 Feb 2012 20:10:19 +0100 Subject: Prepare vor v0.5.1 --- CHANGELOG | 2 ++ loadbars | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 8e51310..3733304 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,5 @@ +Sat Feb 25 20:09:02 CET 2012 +* Release v0.5.1 * Add config file support (~/.loadbarsrc) and it's possible to configure any option you find in --help but without leading '--'. For comments just use the '#' sign. Sample config: diff --git a/loadbars b/loadbars index 035c1a4..5015664 100755 --- a/loadbars +++ b/loadbars @@ -26,7 +26,7 @@ use threads; use threads::shared; use constant { - VERSION => 'loadbars v0.5.1-devel', + VERSION => 'loadbars v0.5.1', COPYRIGHT => '2010-2012 (c) Paul Buetow ', CONFFILE => $ENV{HOME} . '/.loadbarsrc', CSSH_CONFFILE => '/etc/clusters', -- cgit v1.2.3