Nagios Parser
=============

[![Build Status](https://secure.travis-ci.org/bernd/nagios_parser.png)](http://travis-ci.org/bernd/nagios\_parser])

# Description

The `nagios_parser` gem provides a parser for the Nagios `status.dat`
files and a parser for the Nagios object definition files.

* NagiosParser::Status::Parser
* NagiosParser::Object::Parser
* NagiosParser::Config::Parser
* NagiosParser::Resource::Parser

Both parsers return plain hashes and arrays. There are no special
Nagios objects or something like that. That means you can create
your own wrapping objects or use the simple data structure
directly.

# Installation

    # gem install nagios_parser

# Usage

## Status Parser

    require 'nagios_parser/status/parser'
    require 'pp'

    status = <<-STATUS
      info {
              created=1291408262
              version=3.2.0
              last_update_check=1291201457
              update_available=1
              last_version=3.2.0
              new_version=3.2.3
              }
      hoststatus {
              host_name=server1
              modified_attributes=0
              check_command=check-ping
              check_period=24x7
              notification_period=24x7
              check_interval=5.000000
              retry_interval=1.000000
              event_handler=
              has_been_checked=1
              }
    STATUS

    data = NagiosParser::Status::Parser.parse(status)
    pp data

This will print a data structure that looks like this.

    {"info"=>
      [{"last_version"=>"3.2.0",
        "version"=>"3.2.0",
        "last_update_check"=>1291201457,
        "new_version"=>"3.2.3",
        "update_available"=>1,
        "created"=>1291408262}],
     "hoststatus"=>
      [{"check_command"=>"check-ping",
        "host_name"=>"server1",
        "notification_period"=>"24x7",
        "check_period"=>"24x7",
        "modified_attributes"=>0,
        "retry_interval"=>"1.000000",
        "has_been_checked"=>1,
        "event_handler"=>nil,
        "check_interval"=>"5.000000"}]}

## Object Parser

    require 'nagios_parser/object/parser'
    require 'pp'

    object = <<-OBJECT
      define command {
              command_name check-http
              command_line $USER1$/check_http -I $HOSTADDRESS$ -w 420 -c 840
      }
      define host {
        host_name server1
        alias     server1.example.com
        address   10.0.0.1
      }
    OBJECT

    data = NagiosParser::Object::Parser.parse(object)
    pp data

This will print a data structure that looks like this.

    {"command"=>
      [{"command_name"=>"check-http",
        "command_line"=>"$USER1$/check_http -I $HOSTADDRESS$ -w 420 -c 840"}],
     "host"=>
      [{"address"=>"10.0.0.1",
        "host_name"=>"server1",
        "alias"=>"server1.example.com"}]}

## Config Parser

    require 'nagios_parser/config/parser'
    require 'pp'

    config = <<-CONFIG
      log_file=/var/log/nagios3/nagios.log
      status_update_interval=10
    CONFIG

    data = NagiosParser::Config::Parser.parse(config)
    pp data

This will print a data structure that looks like this.

    {"log_file"=>"/var/log/nagios3/nagios.log",
     "status_update_interval"=>10}

## Resource macro parser

    require 'nagios_parser/resource/parser'
    require 'pp'

    resource = <<-RESOURCE
      $USER1$=/usr/lib/nagios/plugins
      $USER10$=mysqluser
    RESOURCE

    data = NagiosParser::Resource::Parser.parse(resource)
    pp data

This will print a data structure that looks like this.

    {"$USER10$"=>"mysqluser",
     "$USER1$"=>"/usr/lib/nagios/plugins"}

# Development

The parsers are based on the racc parser generator. racc is needed
at runtime, but that should be no problem since it's included in the
Ruby standard library.

To modify the parsers you have to modify the `.y` files and regenerate
the Ruby files afterwards. There are two rake tasks to help with that.

* `rake parser::status`
* `rake parser::object`
* `rake parser::config`
* `rake parser::resource`

The bundler gem is used to handle the development dependencies.
Run `bundle install` to install them.

Please let me know if you have any questions or if you run into any
problems.

# Contribute

* Fork the project.
* Make your feature addition or bug fix.
* Add tests for it. This is important so I don't break it in a
  future version unintentionally.
* Commit, do not mess with Rakefile, version, or history.
  (if you want to have your own version, that is fine but bump version
  in a commit by itself I can ignore when I pull)
* Send me a pull request. Bonus points for topic branches.

# Copyright

Copyright (c) 2010 Bernd Ahlers. See LICENSE for details.