Timothy Could it be that when you copy pasted the script the line wrap got messed up? It works fine for me.
Im using perl 5.12.3 Your comment about the open statement is OK. I guess it really comes down to style. I was trying to write something clear that Brandon could improve upon. Here is a pastebin of the same script : http://pastebin.com/h8cebCD7 - Jose from Mexico On Wed, Feb 1, 2012 at 1:11 PM, timothy adigun <2teezp...@gmail.com> wrote: > 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 > >