diff options
-rwxr-xr-x | bin/icli | 68 |
1 files changed, 68 insertions, 0 deletions
@@ -2,6 +2,74 @@ use strict; use warnings; use 5.010; +use autodie; + +my ($data, $cache); +my $status_file = '/var/lib/icinga/status.dat'; +my $context; + +sub read_status_line { + my ($line) = @_; + + if ($line =~ / ^ (?<context> \w+) \s+ { /x) { + $context = $+{context}; + } + elsif ($line =~ / ^ \t* (?<key> [^=]+ ) = (?<value> .*) $ /x) { + $cache->{$+{key}} = $+{value}; + } + elsif ($line =~ / ^ \t* } \s* $ /x) { + given($context) { + when(['info', 'programstatus']) { + $data->{$context} = $cache; + } + when('hoststatus') { + push(@{$data->{hosts}}, $cache); + } + when('servicestatus') { + push(@{$data->{services}}, $cache); + } + when('contactstatus') { + push(@{$data->{contacts}}, $cache); + } + default { + warn("Unknown field in $status_file: $context\n"); + } + } + $cache = undef; + } +} + +sub read_status { + open(my $fh, '<', $status_file); + while (my $line = <$fh>) { + chomp($line); + read_status_line($line); + } + close($fh); +} + +sub state_to_string { + my ($digit) = @_; + given ($digit) { + when(0) { return 'OK' } + when(1) { return 'WARNING' } + when(2) { return 'CRITICAL' } + when(3) { return 'UNKNOWN' } + default { return '???' } + } +} + +read_status(); + +foreach my $s (@{$data->{services}}) { + printf( + "%24s/%-20s %s: %s\n", + $s->{host_name}, + $s->{service_description}, + state_to_string($s->{current_state}), + $s->{plugin_output}, + ); +} __END__ |