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

Reply via email to