diff options
-rw-r--r-- | Build.PL | 1 | ||||
-rwxr-xr-x | bin/icli | 73 | ||||
-rw-r--r-- | t/50-icli.t | 2 |
3 files changed, 71 insertions, 5 deletions
@@ -20,6 +20,7 @@ my $build = Module::Build->new( 'Date::Format' => 0, 'Getopt::Long' => 0, 'Term::ANSIColor' => 0, + 'Term::Size' => 0, }, script_files => 'bin/', ); @@ -10,6 +10,7 @@ use 5.010; use Date::Format; use Getopt::Long qw/:config bundling/; use Term::ANSIColor; +use Term::Size; my $VERSION = '0.3'; @@ -23,6 +24,8 @@ my $list_type = 's'; my $verbosity = 1; my $recheck = 0; my $acknowledge = undef; +my $term_width = Term::Size::chars(); +my $cut_mode = 'c'; my (@for_hosts, @for_groups, @for_services, @list_hosts, @list_services); my @filters; @@ -108,6 +111,49 @@ sub pretty_yesno { ); } +sub split_by_words { + my ($str, $padding, $max_w) = @_; + my @words = split(/ /, $str); + my @ret; + + foreach my $word (@words) { + if (length($word) > $max_w) { + # FIXME we can do better + $word = substr($word, 0, $max_w); + } + } + + while (@words) { + my $cur_str = q{}; + while (@words and ((length($cur_str) + length($words[0])) < $max_w)) { + if (length($cur_str)) { + $cur_str .= ' '; + } + $cur_str .= shift(@words); + } + if (@ret) { + $cur_str = (' ' x $padding) . $cur_str; + } + push(@ret, $cur_str); + } + return @ret; +} + +sub break_str { + my ($text, $waste) = @_; + my $cut = $term_width - $waste; + + if ($cut_mode eq 'c') { + return(substr($text, 0, $cut)); + } + elsif ($cut_mode eq 'b') { + return(join("\n", split_by_words($text, $waste, $cut))); + } + else { + return($text); + } +} + sub check_is_soft { my ($x) = @_; @@ -399,7 +445,7 @@ sub display_x_verbose { printf( $format, 'Plugin Output', - $x->{'plugin_output'}, + break_str($x->{'plugin_output'}, 19), ); printf( $format, @@ -504,17 +550,25 @@ sub display_x_verbose { } sub display_service { - my ($s) = @_; + my ($s, $tab) = @_; my $v = $verbosity; my $flags = q{}; my $format = "%-16s : %s\n"; + my $n_width; if ($v < 3) { + $n_width = 20 + 8 + 2; + if ($tab) { + $n_width += 8; + } + printf("%-20.20s", $s->{service_description}); if ($v >= 2) { + $n_width += 5; + if ($s->{'problem_has_been_acknowledged'}) { $flags .= 'A'; } @@ -540,9 +594,12 @@ sub display_service { if ($v >= 2) { printf(' %d/%d', $s->{'current_attempt'}, $s->{'max_attempts'}); + $n_width += 4; } - printf(" %s", $s->{'plugin_output'}); + print ' '; + + print break_str($s->{'plugin_output'}, $n_width); } else { @@ -585,7 +642,7 @@ sub display_host_services { print "\n"; } - display_service($service); + display_service($service, $all); } } @@ -696,6 +753,7 @@ GetOptions( 's|service=s' => sub { push(@for_services, split(/,/, $_[1])) }, 'v|verbose+' => \$verbosity, 'V|version' => sub { say "icli version $VERSION"; exit 0 }, + 'x|cut-mode=s' => sub { $cut_mode = substr($_[1], 0, 1) }, 'z|filter=s' => sub { push(@filters, split(/,/, $_[1])) }, ) or die("Please see perldoc -F $0 for help\n"); @@ -852,6 +910,11 @@ Increase output verbosity. Can be combined up to B<-vvv> Show version information +=item B<-x>|B<--cut-mode> I<mode> + +What to do with lines which are too long for the terminal: B<n>othing, B<c>ut +off, line B<b>reak (with proper indentation). + =item B<-z>|B<--filter> I<expression> Limit selection to hosts/services passing the filter. I<expression> is a comma @@ -990,6 +1053,8 @@ None. =item * Date::Format +=item * Term::Size + =back =head1 BUGS AND LIMITATIONS diff --git a/t/50-icli.t b/t/50-icli.t index a5fc8a6..7c48b4f 100644 --- a/t/50-icli.t +++ b/t/50-icli.t @@ -8,7 +8,7 @@ no warnings 'qw'; use Test::Command tests => (38*3); -my $icli = 'bin/icli -f t/in/status.dat -c t/in/objects.cache'; +my $icli = 'bin/icli -f t/in/status.dat -c t/in/objects.cache -xn'; my $EMPTY = q{}; |