Hi jbiskofski, This script will not work WHY? -- Scalar found where operator expected at ..... [ Please Check ] line 72, near "$we_are_inside_hoststatus_block" ..........
On Wed, Feb 1, 2012 at 6:38 PM, jbiskofski <jbiskof...@gmail.com> wrote: > Hey Brandon > > Here is a solution to this problem. It is purposely really long. It takes > the simplest most understandable solution. > > If you have questions about it let me know. > > > #!/usr/local/bin/perl > > # always a good idea, forces scope to if/for/foreach/while blocks > use strict; > > # open the file, into a file handle called $RR - die with sad face if > unable > # to open file > ######## NOTE HERE ########### > open my $RR, '<', 'nagios.dat' || die 'unable to open nagios.dat :('; > Please check => I think the line above would be better as: open (my $RR, '<', 'nagios.dat') || die 'unable to open nagios.dat :('; OR open my $RR, '<', 'nagios.dat' or die 'unable to open nagios.dat :('; > > # we need to know if were inside a 'hoststatus' block or not > # this variable keeps track of that > my $we_are_inside_hoststatus_block = 0; > > # the logic is to set $we_are_inside_hoststatus_block to 1 ( true ) > # when we see the hoststatus block begins and then set it to 0 ( false ) > # when the block is done > > # once were inside a hoststatus block were going to save the actual > hostname > # in this variable > my $current_block_hostname; > > # read file line by line > while (<$RR>) { > > # each line coming into this block of code is automatically > # called $_ by perl, were going to rename it to $line > # to make the example clearer > my $line = $_; > > # each line thats coming in has a \n ( carriage return - new line) > # at the end - we dont need that. chomp() removes it > chomp $line; > > # theres two possible scenarios > # 1 . were outside a hoststatus block > # 2 . were inside a hoststatus block > > if ($we_are_inside_hoststatus_block) { > > # theres two possible scenarios inside of here > # 1 . we already know the hostname of this hoststatus block > # 2 . we do not > > if ($current_block_hostname) { > > # case 1 > > # were inside a hoststatus block > # and we know what host_name it is for > # all we need is the current_state > > # read the big comment in the else{} > # block below to know what this is doing > # \d+ means one or more numbers > next unless $line =~ /\s+current_state=(\d+)/; > > my $current_state = $1; > > # we have everything we need > # host_name and current_state and were in a > # host status block - all we need to do is > # print this information to the screen > print "$current_block_hostname:$current_state\n"; > ****I think the print function should also have > $we_are_inside_hoststatus_block covered. Therefore, the ";" should have > been after $we_are_inside_hoststatus_block. > # since were finished with this hoststatus > # block we can reset our > $we_are_inside_hoststatus_block <== HERE ################ Please check > # and $current_block_hostname variables > # so the script starts looking for a new > # hoststatus block to process > > $we_are_inside_hoststatus_block = undef; > $current_block_hostname = undef; > next; > > } > else { > > # case 2 > > # were inside a hostsatus block but we still > # dont know what hostname its for > # > # we dont care about any line unless > # it matches the regular expression : > # one or more spaces > # 'host_name=' > # \S+ means : something thats not whitespace > # the parentheses mean we want to capture > # the value between them > # perl will automatically call the first > # captured value $1, the second one $2 > # so on and so forth > next unless $line =~ /\s+host_name=(\S+)/; > > # cool we have the hostname of this hoststatus > # block > $current_block_hostname = $1; > > # go to the next line of the file > next; > > } > > } > else { > > # we are not inside a hoststatus block > # in this case we dont care about any of these lines > # unless its a line that STARTS a hoststatus block > > # does the line match the regular expression that > # informs us we are starting a hoststatus block ? > # ^ means beginning of line > # \s+ means one or more spaces > # so were looking for a line that begins with > # 'hoststatus' has one or more spaces and then has a '{' > if ( $line =~ /^hoststatus\s+{/ ) { > > # were inside a new hoststatus block > $we_are_inside_hoststatus_block = 1; > > } > > } > > } > > close $RR; > > > ========== > > Peace it in, peace it out & peace it inside out. > > - Jose from Mexico. > > > > On Tue, Jan 31, 2012 at 4:43 PM, Brandon Phelps <bphe...@gls.com> wrote: > > > Hello all, > > > > I am attempting to parse a Nagios status.dat file and am curious about > > what the most efficient way to do this would be. I'm sure I could come > up > > with something but it would be very convoluted and I'm sure there is a > > better way. Below is a sample of the file. The sections I am interested > > in are the "hoststatus" sections. Any other section I want to simply > > ignore. Within the hoststatus sections are a few lines I am looking for: > > host_name=<whatever> and current_state=<whatever>, I'd simply like to > > perform a task based on these "whatever"'s. For example, output lines > such > > as: > > > > some_host:1 > > another_host:0 > > > > Where some_host and another_host are host_name's from the file, and 1 and > > 0 are current_state's for the corresponding host. > > > > Any pointers or examples would be appreciated! > > > > Here is a sample of the file: > > > > info { > > created=1328049467 > > version=3.2.3 > > last_update_check=1328014790 > > update_available=1 > > last_version=3.2.3 > > new_version=3.3.1 > > } > > > > programstatus { > > modified_host_attributes=0 > > modified_service_attributes=0 > > nagios_pid=1370 > > daemon_mode=1 > > (lots of stuff) > > } > > > > hoststatus { > > host_name=some_host > > modified_attributes=0 > > check_command=check-host-alive > > check_period= > > notification_period=24x7 > > check_interval=5.000000 > > retry_interval=1.000000 > > event_handler= > > has_been_checked=1 > > should_be_scheduled=1 > > check_execution_time=0.012 > > check_latency=0.246 > > check_type=0 > > current_state=1 > > last_hard_state=0 > > last_event_id=0 > > current_event_id=0 > > current_problem_id=0 > > last_problem_id=0 > > plugin_output=OK - 10.1.1.1.1: rta 1.822ms, lost 0% > > long_plugin_output= > > performance_data=rta=1.822ms;**3000.000;5000.000;0; pl=0%;80;100;; > > rtmax=1.822ms;;;; rtmin=1.822ms;;;; > > last_check=1328049317 > > next_check=1328049627 > > check_options=0 > > current_attempt=1 > > max_attempts=10 > > state_type=1 > > last_state_change=1328047050 > > last_hard_state_change=**1328047050 > > last_time_up=1328049327 > > last_time_down=0 > > last_time_unreachable=0 > > last_notification=0 > > next_notification=0 > > no_more_notifications=0 > > current_notification_number=0 > > current_notification_id=0 > > notifications_enabled=1 > > problem_has_been_acknowledged=**0 > > acknowledgement_type=0 > > active_checks_enabled=1 > > passive_checks_enabled=1 > > event_handler_enabled=1 > > flap_detection_enabled=1 > > failure_prediction_enabled=1 > > process_performance_data=1 > > obsess_over_host=1 > > last_update=1328049467 > > is_flapping=0 > > percent_state_change=0.00 > > scheduled_downtime_depth=0 > > } > > > > hoststatus { > > host_name=another_host > > modified_attributes=0 > > check_command=check-host-alive > > check_period= > > notification_period=24x7 > > check_interval=5.000000 > > retry_interval=1.000000 > > event_handler= > > has_been_checked=1 > > should_be_scheduled=1 > > check_execution_time=10.011 > > check_latency=0.268 > > check_type=0 > > current_state=0 > > last_hard_state=0 > > last_event_id=7 > > current_event_id=8 > > current_problem_id=3 > > last_problem_id=1 > > plugin_output=CRITICAL - 10.1.1.2: rta nan, lost 100% > > long_plugin_output= > > performance_data=rta=0.000ms;**3000.000;5000.000;0; > > pl=100%;80;100;; rtmax=0.000ms;;;; rtmin=0.000ms;;;; > > last_check=1328049417 > > next_check=1328049497 > > check_options=0 > > current_attempt=3 > > max_attempts=10 > > state_type=0 > > last_state_change=1328049437 > > last_hard_state_change=**1328049057 > > last_time_up=1328049057 > > last_time_down=1328049437 > > last_time_unreachable=0 > > last_notification=0 > > next_notification=0 > > no_more_notifications=0 > > current_notification_number=0 > > current_notification_id=0 > > notifications_enabled=1 > > problem_has_been_acknowledged=**0 > > acknowledgement_type=0 > > active_checks_enabled=1 > > passive_checks_enabled=1 > > event_handler_enabled=1 > > flap_detection_enabled=1 > > failure_prediction_enabled=1 > > process_performance_data=1 > > obsess_over_host=1 > > last_update=1328049467 > > is_flapping=0 > > percent_state_change=17.30 > > scheduled_downtime_depth=0 > > } > > > > servicestatus { > > host_name=some_host > > service_description=PING > > modified_attributes=0 > > check_command=check_ping!7000.**0,40%!9000.0,70% > > check_period=24x7 > > notification_period=24x7 > > check_interval=5.000000 > > (lots more stuff...) > > } > > (file has lots more, but excluded here for brevity) > > > > Thanks, > > Brandon > > > > -- > > To unsubscribe, e-mail: beginners-unsubscr...@perl.org > > For additional commands, e-mail: beginners-h...@perl.org > > http://learn.perl.org/ > > > > > > > -- Tim