develooper Front page | perl.beginners | Postings from January 2012

Re: Parsing Question

Thread Previous | Thread Next
From:
Brandon Phelps
Date:
January 31, 2012 17:32
Subject:
Re: Parsing Question
Message ID:
4F289619.1040809@gls.com
Thanks a ton David,

This will definitely help!  Not able to try it now but I'll give it a 
shot first thing tomorrow.

-Brandon

On 1/31/2012 8:15 PM, Kronheim, David (Contr) wrote:
> Brandon,
>
> I took most of your comments and sample data and put it in the following program. Taking the data out of the program and parsing it from files and directories, might be a good exercise for you. Generally variables are best declared close to where they are first used. Since the scope of where $host is first used, is a different scope (using my) from where $state is first used. I declared them together, in an outer scope for consistency and flexibility (of the code). I had better whitespace in the program editor than in the email editor, that again is something you can adjust with blank lines and tabs. Let us know if any questions.
>
> #!/usr/bin/perl
> use strict;
> use warnings;
> use 5.012; # this script requires Perl 5.12 or greater
> # parse_nagios.pl
> =begin comment
> I am attempting to parse a Nagios status.dat 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.
> =end comment
> =cut
> local $/ = "hoststatus {";   # change input record separator, start where interested in.
> my ($host,$state);
> while(<DATA>  ) {
>      # stop at end of section at "}"
>      my $end = index($_, "}") ;
>      my $section = substr($_, 0, $end) ; # section loses "}" ;
>      # split section up by lines.
>      my @lines=split /\n/, $section ;
>      for my $line (@lines) {
>          given ($line) {
>              when (/host_name=(.*)/) {
>                  $host = $1 ;
>              }
>              when (/current_state=(.*)/) {
>                  $state = $1 ;
>                  say "$host:$state" ;
>              }
>          }
>      }
> }
> __DATA__
> 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...)
>           }
>
>
> Sincerely,
> David Kronheim
> Production Support Tier II
> Gateway Error Correction, VZ450 EDI, EDI Billing,&  Metakey/LIA
> 484-213-1315
>
> This communication is confidential.  Frontier only sends and receives email on the basis of the terms set out at http://www.frontier.com/email_disclaimer.

Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About