diff options
-rw-r--r-- | Build.PL | 3 | ||||
-rw-r--r-- | Changelog | 6 | ||||
-rwxr-xr-x | bin/icli | 56 |
3 files changed, 60 insertions, 5 deletions
@@ -6,7 +6,7 @@ use Module::Build; my $build = Module::Build->subclass( code => q( - sub ACTION_testauthor { shift->generic_tast(type => 'author') } + sub ACTION_testauthor { shift->generic_task(type => 'author') } ) )->new( build_requires => { @@ -24,6 +24,7 @@ my $build = Module::Build->subclass( 'Carp' => 0, 'Date::Format' => 0, 'Getopt::Long' => 0, + 'List::MoreUtils' => 0, 'Term::ANSIColor' => 0, 'Term::Size' => 0, }, @@ -1,3 +1,9 @@ +git HEAD + + * Add -U / --as-contact option to only operate on services visible to a + certain contact + * New dependency List::MoreUtils + icli 0.41 - Sun Apr 15 2012 * Add "icli host/service" as "icli -h host -s service" shortcut @@ -10,6 +10,7 @@ use 5.010; use Carp qw(croak); use Date::Format; use Getopt::Long qw/:config bundling/; +use List::MoreUtils qw(any firstval); use Term::ANSIColor; use Term::Size; @@ -26,6 +27,7 @@ my $verbosity = 1; my $recheck = 0; my $force_recheck = 0; my $acknowledge = undef; +my $as_contact = undef; my $term_width = Term::Size::chars(); my $cut_mode = 'b'; my ( @for_hosts, @for_groups, @for_services, @list_hosts, @list_services ); @@ -118,7 +120,7 @@ sub split_by_words { my @words = split( / /, $str ); my @ret; - while ( grep { length($_) > $max_w } @words ) { + while ( any { length($_) > $max_w } @words ) { for my $i ( 0 .. $#words ) { my $word = $words[$i]; @@ -261,16 +263,29 @@ sub filter_service { return 0; } + if ($as_contact and not has_contact($s, $as_contact)) { + return 0; + } + return 1; } +sub has_contact { + my ($s, $contact) = @_; + + my $conf_s = firstval { $_->{service_description} eq $s->{service_description } } + @{ $config->{services}{$s->{host_name}}}; + + return any { $_ eq $contact } @{$conf_s->{contacts}}; +} + sub read_objects_line { my ( $line, $ref ) = @_; if ( $line =~ / ^ (?:define \s )? (?<context> \w+) \s+ { /x ) { $context = $+{context}; } - elsif ( $line =~ / ^ \t (?<key> [^=\t]+ ) [=\t] (?<value> .*) $ /x ) { + elsif ( $line =~ / ^ \t (?<key> [^=\t]+ ) [=\t] \s* (?<value> .*) $ /x ) { $cache->{ $+{key} } = $+{value}; } elsif ( $line =~ / ^ \t } $ /x ) { @@ -311,6 +326,19 @@ sub read_objects_line { # TODO } + when ('host') { + ${$ref}->{hosts}->{ $cache->{host_name} } = $cache; + } + when ('service') { + push( + @{ ${$ref}->{services}->{ $cache->{host_name} } }, + $cache + ); + } + when ('contactgroup') { + ${$ref}->{contactgroups}->{ $cache->{contactgroup_name} } + = [split(m{, *}, $cache->{members})]; + } when ( [ qw[ @@ -351,6 +379,17 @@ sub enhance_status { } } } + HOST: for my $h ( keys %{ $config->{services} } ) { + for my $s ( @{ $config->{services}->{$h} } ) { + if ($s->{contacts}) { + $s->{contacts} =~ s{^ *}{}o; + $s->{contacts} = [split(m{, *}, $s->{contacts})]; + } + for my $group (split(m{, *}, $s->{contact_groups})) { + push(@{$s->{contacts}}, @{$config->{contactgroups}{$group}}); + } + } + } } sub service_state { @@ -773,6 +812,7 @@ GetOptions( 'r|recheck' => sub { $recheck = 1; $list_type = q{} }, 's|service=s' => sub { push( @for_services, split( /,/, $_[1] ) ) }, 'u|force-recheck' => sub { $force_recheck = 1; $list_type = q{} }, + 'U|as-contact=s' => \$as_contact, 'v|verbose+' => \$verbosity, 'V|version' => sub { say "icli version $VERSION"; exit 0 }, 'x|cut-mode=s' => sub { $cut_mode = substr( $_[1], 0, 1 ) }, @@ -786,7 +826,7 @@ enhance_status(); for my $arg (@ARGV) { my ( $host, $service ) = split( qr{/}, $arg ); - if ( not grep { $host } @for_hosts ) { + if ( not any { $host } @for_hosts ) { push( @for_hosts, $host ); } if ($service) { @@ -810,7 +850,7 @@ foreach my $group (@for_groups) { foreach my $host ( split /,/, $config->{'hostgroups'}->{$group}->{'members'} ) { - if ( not grep { $_ eq $host } @list_hosts ) { + if ( not any { $_ eq $host } @list_hosts ) { push( @list_hosts, $host ); } } @@ -944,6 +984,14 @@ Schedule an immediate recheck of all selected services Schedule a forced, immediate recheck of all selected services +=item B<-U>|B<--as-contact> I<name> + +Only operate on service visible to I<name>. Doesn't work for B<-lh> yet, +most useful for B<-ls>. + +NOTE: This is meant to help find out which services a user has access to. It is +NOT intended as a way to restrict access and should never be used that way. + =item B<-s>|B<--service> I<services> Limit selection to I<services> (comma separated lists). Can be combined with |