Changes in 3.0 (October 26th 2018)
Bug Fixes:
    - First pass of Python 3.0 compatibility

Changes in 1.1.1 (unreleased)
Bug Fixes:
    - Fix recursive delete of host
    - Multiple fixes for macro resolving
    - Fix issues when finding command file fails
    - Multiple fixes to daemon class and sudo
    - Fix crash when archives directory contains directories
    - Python 2.6 compatibility
    - Fix comment_id being used instead of downtime_id in pynag.Model

New Features:
    - New class: livestatus.LivestatusQuery
    - New methods: Livestatus.write() and livestatus.raw_query()
    - Livestatus now retries on socket errors
    - New module Utils.state
    - New module Parsers.main

Refactor:
    - Perfdata moved to Utils.metrics
    - GitRepo moved to Utils.git
    - PynagError moved to pynag.errors
    - send_nsca moved to Utils.nsca
    - synchronized moved to Utils.decorators
    - cache_only moved to Utils.decorators
    - reconsile_threshold moved to Utils.metrics
    - check_threshold moved to Plugins.classic_threshold_syntax
    - check_range moved to Plugins.classic_threshold_syntax
    - Livestatus moved to Parsers.livestatus
    - Config moved to Parsers.config_parser
    - SshConfig moved to Parsers.ssh_config
    - StatusDat moved to Parsers.status_dat
    - RetentionDat moved to Parsers.retention_dat 
    - ObjectCache moved to Parsers.object_cache
    - ExtraOptsParser moved to Parsers.extra_opts
    - LogFiles moved to Parsers.logs

Changes in 0.9.1 (August 5 2014)
Bug Fixes:
    - Fixes file_time bug in Utils.CheckResult

Changes in 0.9.0 (July 23 2014)
New Features:
    - new method: Model.*.rename()
    - new class: Utils.CheckResult, add checkresults
      http://docs.pynag.org/en/latest/pynag.Utils.html#pynag.Utils.CheckResult
    - new importer module, currently supports csv files
      http://docs.pynag.org/en/latest/pynag.Utils.html#module-pynag.Utils.importer
    - better docstrings, reflected on http://docs.pynag.org

Bug Fixes:
    - Bug fixes in Model.*.get_current_status()
    - Fix Parsers.Livestatus.test() traceback
    - Fix Parsers line continuation
    - Fix contactgroup/service and contactgroup/host relationships

Changes in 0.8.9 (Apr 15 2014)
Bug Fixes:
    - Deploy gzipped version of manpage with setup.py

Changes in 0.8.8 (Apr 15 2014)
Bug Fixes:
    - MANIFEST fixes in the build process
New Features:
    - Utils.misc.FakeNagiosEnvironment()
    - Parsers.MultiSite now has backend aware get_host, get_contact, etc
    - Incremental updates to unit tests

Changes in 0.8.7 (Apr 14 2014)
Bug Fixes:
    - Ship a gzipped version of manpage with release

Changes in 0.8.6 (Apr 14 2014)
Bug Fixes:
    - manpage is now delivered with the tarball (not generated on build itme)
    - Docstring updates
New Features:
    - Support for systemd init scripts
    - New Module Parsers.MultiSite
    - All classes in Parsers are now new-style

Changes in 0.8.5 (Apr 8 2014)
Bug Fixes:
    - Fix broken build due to manpage requirements

Changes in 0.8.4 (Apr 8 2014)
New Features:
    - get_effective_* is now faster
    - New decorator Utils.cache_only()
    - New method Service.merge_with_host()

Bug Fixes:
    - Fix hostgroup/service relationships

Changes in 0.8.3 (Mar 24 2014)
New Features:
    - Utils.runCommand() supports new env parameter
Bug Fixes:
    - Parsers.LogFiles() now orders archivelogs by last modified time

Changes in 0.8.2 (Mar 21 2014)
New Features:
    - Utils.AttributeList() - now aware of "null" values
    - Notable performance tweaks in parsing
    - Experimental Config Parser over ssh
    - New EventHandler: NagiosReloadHandler
    - Better shinken compatiblity
    - New method: guess_nagios_binary()
    - Major improvements in grep_to_livestatus
Bug Fixes:
    - Code is more python3 compatible
    - Performance tweaks in external commands
    - Fixed Macro resolving for hosts
    - Bugfixes in "Pynag livestatus" subcommand

Changes in 0.8.1 (Feb 19 2014)
New Features:
    - Support setting of custom host variables
    - Allow Model.*.acknowledge() with a timestamp
Bug Fixes:
    - Better support for weird mk-livestatus configs
    - Fix unintilized variables in pynag.Parsers.config

Changes in 0.8.0 (Jan 15 2014)
New Features:
    - Auto guess config locations for icinga and naemon
    - Performance improvements in Model 
    - send_nsca moved to pynag.Utils 
    - Model.filter() now uses Utils.grep() internally
    - Utils.runCommand() now supports shell=False
    
Bug Fixes:
    - fix host.delete() not deleting services 
    - Fixes for __in __notin and __contains in Utils.grep() 
    - Bug fixes in send_nsca 

Changes in 0.7.0 (Oct 14 2013)
New Features:
    - All plugins now have a --timeout=58 seconds
    - New option to plugins: --extra-opts
    - More thread safety in Model
    - New method: ObjectDefinition.move() to move definition to a new file
    - Plugins new threshold syntax can now fail back on the old syntax

Bug Fixes:
    - python 2.4 compatibility in unittests
    - Removed deprecated overload of Contact.get_description()

Changes in 0.6.1 (Aug 30 2013)
Bug Fixes:
    - Disable unittesting on rhel5 (stops build because of unittest2)

Changes in 0.6.0 (Aug 28 2013)
New Features:
    - Support line continuations with \ at end of line in config files
    - Fix traceback in ParserError initilization
    - Better error messages when invalid livestatus syntax has been used
    - Utils.grep() new keywords __notstartswith and __notendswith
    - Model.ObjectDefinition now supports "in" operator
    - Multiple performance tweaks for parsing 
    - Plugins.PluginHelper.add_option() wrapper created 
    - Performance tweaks in Utils.grep()
    - Thread-safety in  Parsing/Saving methods in Model and Parser
    - "in" operator implemented for Object Definitions
    - delete() methods now more clever for {host,service,contact}s and groups
    - Incremental performance updates on parsing
    - New method: ObjectDefinition.attribute_is_empty()
    - Massive refactor/rewrites in parsing logic

Bug Fixes:
    - Fix traceback on search when searching for shortname in invalid configs
    - pynag.Utils.GitRepo better handles file renames now
    - pynag.Plugins.PluginHelper - no more crashing if parse_arguments was not called
    - Fix parsing when multiple objects have conflicting names
    - Support relative paths for cfg_dir and cfg_file


Changes in 0.5.0 (Jun 26 2013)
New Features:
    - pynag cli - new action "unset" to remove attributes when updating
    - PluginHelper - New option --pnp-compatible-perfdata
    - TCP Support for mk-livestatus
    - ObjectDefinitions now have new method: set_macro()
    - Vast improvements to unit testing
    - Fix unhandled tracebacks if invalid templates are defined
    - Utils.GitRepo has new method: show()
    - Vast performance improvement in parsing
    - ObjectDefinition now iterable
    - New Utility Class pynag.Utils.PluginOutput
    - ObjectDefinition: magic fields like shortname are now part of keys()
    - mk_livestatus new utility methods: get_servicegroups,hostgroups,etc

Noteworthy bug fixes:
    - tracis-ci and coveralls.io support
    - Macroresolving when ARG1 contains other macros
    - get_suggested_filename() no longer returns filenames with invalid characters
    - check_range(): Always return True on invalid range_format
    - check_range(): raise exception on invalid input thresholds


Changes in 0.4.9 (Apr 30 2013)

New Features:
    - pynag cli now has livestatus subcommand
    - pynag cli multiple changes to make it more friendly to bash scripts
    - --quiet option
    - --seperator option
    - pynag cli has acknowledge and downtime subcommands
    - pynag.Model.*.delete() now are more context aware and remove references
      from other objects
    - More features in pynag.Utils.GitRepo
    - Parser for retention.dat created
    - pynag.utils.grep_to_livestatus() to convert from pynag style filters to
      livestatus style filters
    - add_to_contactgroup() created for pynag.Model.Services, Hosts, and
      Contacts
    - New functions pynag.Utils.grep(). Model filter() will use this in the
      future.
    - pynag.Model - object definitions now implement sort()
    - pynag.Parsers.Logfiles added to parse nagios log files
    
Bugfixes:
    - Multiple doctest and unittest fixes and improvements to code quality
    - send_nsca - revert back to tabs instead of spaces
    - Fix unhandled traceback with pynag copy
    - Fix bug where directories with ending .cfg were parsed as files
    - PluginHelper fixed in accordance to 
      http://nagiosplugins.org/rfc/new_threshold_syntax


Changes in 0.4.8 (Dec 10 2012)

New Features:
    - MK Livestatus integration in pynag.Parsers.mk_livestatus
    - Testing framework for plugins in scripts/plugintest
    - Control.Command now uses livestatus if available.
    - pynag.Plugins.PluginHelper() prototype
    - Support for Nagios plugins new threshold format

Bugfixes:
    - New Service() objects with no host_name are not saved in None/service_description anymore.
    - GitEventHandler could not list files with spaces
    - pynag.Plugins.simple.check_range was very broken, fixed and added testing framework
      for pynag.Plugins
    - Fix for correctly returning exit codes in Control.daemon()
    - Static file parser now skips line not in format of key=value
    - pynag.Parsers.status.get_hoststatus() and pynag.Parsers.status.get_servicestatus() should raise a ValueError rather than return it.
    - timeperiod_name and alias were incorrectly saved 
    - Unhandled exception in contact.get_effective_services()

Changes in 0.4.7 (Oct 26 2012)

New Features:
    - pynag cli: new parameter --debug
    - pynag cli: new parameter --version
    - Parsers.config.get_cfg_value() implemented
    - Parsers.config.get_pid() implemented
    - New Module: pynag.Control.Command for interactions with command_pipe
    - Parsers.config.get_pid() implemented

Bugfixes:
    - Discrepancy in CLI where filters between list and delete
    - CLI now prints nice error message instead of stacktrace on errors
    - ObjectFetcher.filter(): parameters ending in __isnot were always treated as an OR condition.
    - "pynag execute" now works with services that define hostgroups instead of host_name
    - Fixed macro resolving issues for services with hostgroups defined instead of host_name
    - Fixed Default initilization of ObjectRelations.hostgroup_subgroups
    - Bugfix: Nagios needs_reload() always returns false
    - Bugfix: pynag.Parsers.config.needs_reload() always returns false
    - Bugfix: Inverted conditions on pynag.Plugins.simple.check_range()
    - Bugfix: Unhandled exception in pynag.Plugins.simple where must_thresholds=False


Changes in 0.4.6 (Sep 16 2012)

New Features:
    - CLI Improvements
    - manpage for pynag CLI updated
    - New module Utils created
    - Experimental new get_status() for ObjectDefinition
    - Reworked GitEventHandler
    - new function, Control.daemon.status()
    - Experimental Perfdata analysis support

Bugfixes:
    - Various bugfixes for get_effective_*groups()
    - Various bugfixes in Parsers.config._edit_static_file()
    - needs_reload() now compares timestamps with object_cache_file instead of lockfile
    - Removed unneeded error handling from Control.daemon class
    - Model filter, bugfix in __isnot= parameter

Changes in 0.4.5 (Aug 21 2012)

Bugfixes:
    - popen2 import moved to send_nsca() to hide deprecationwarning
    - pynag.Model no longer depends on defaultdict to work (for python 2.4)
    - Removed dependency on defaultdict (does not exist on python 2.4)
    - When permission problems occur for reading status.dat, exception is
      now thrown in parse() rather than init()
    - Version number is now correct
    - debian subdir moved to debian.upstream for packaging



Changes in 0.4.4 (Aug 20 2012)

New Features:
    - Host.copy(recursive=True) now recursively copies services
    - README moved to markdown format (palli@opensource.is)
    - Parsers.status class reworked. Now support get_servicestatus()
    - filter() now supports __exists suffix for as a search condition
    - Major rework og object relations and object cache (palli@opensource.is)
Bugfixes:
    - get_all_macros returns empty hash map on non-existant check_command
    - New get_effective_* functions i.e. Host.get_effective_contacts()
    - ObjectDefinition.get_id() changed from md5sum to built-in __hash__()
    - Fixes to get_effective_command_line() where macro within another macro was
      not properly solved. (palli@opensource.is)
    - GitEventHandler changed to use subprocess module instead of GitPython

    - Support for nagios's ambigious Timeperiod format.
    - check_thresholds() added (Issue 22) (palli@opensource.is)
    - check_range() conditions now inverted (Fixes issue 22)
    - /usr/local/nagios/etc/ added to paths where nagios.cfg might be found (Thanks
      Abhinav Upadhyay)
    - pycharm code inspection cleanup (palli@opensource.is)

Changes in 0.4.3 (Jul 13 2012)

Bugfixes:
    - Model: Objectdefinition.delete() cascade parameter renamed to recursive.
    Recursive implemented for host.

    - Various fixes where nagios.cfg is not located in /etc/nagios/
    
    - Improvements to build process 

    - Parsers: Exception handling loosened to not catch kill signals

    - Model: calling filter() with __has_field now works on items seperated by ", "      

Changes in 0.4.2

New features:
    - new command-line tool pynag introduced (deprecated pynag-maincfg, etc).
    pynag utility offers an easy way to create/update/delete configuration
    objects from the command line. (palli@opensource.is)

    - Model: ObjectDefinition.attributes are now defined according to
    documentation, no longer dynamically created in order to ensure consistency
    (palli@opensource.is)

    - Model: run_check_command() available for hosts and services
    (palli@opensource.is)

    - Parsers: Working with comma seperated attribute values now easier
    via new AttributeList class (palli@opensource.is)

    - Model: copy() feature added to ObjectDefinitions.
    (palli@opensource.is)

Bugs fixed:
    - Model, ObjectDefinition.copy() now returns a copy of the newly created object

    - Parsers, Appending cfg_dir to nagios maincfg and pathnames dont match
    exactly what is in config before (for example double slashes would cause a
    duplicate)

    - Parsers: Cache is no longer reloaded as often (improves performance)
    (palli@opensource.is)

    - Parsers: Properly raise ParserError if unexpected '}' is encountered
    while Parsing (palli@opensource.is)

    - Parsers: ParserError class now has cleaner more detailed output
    (palli@opensource.is)

    - Model: get_all_macros() now returns custom macros (palli@opensource.is)

    - Fixed key errors where data is not present (tommi@tommi.org)

    - Parsers: improvements to reload_cache() to fix memory leak in save()

    - Code cleanup ala Eclipse python analyser. Unused variables etc removed.

Changes in 0.4.1

    Plugins
    Fix to check_range which now support multiple status lines
    Modifications for python-2.3 support

    Scripts
    Added pynag-maincfg which allows for editing nagios.cfg
    Added pynag-addservice for easy addition of services

    Model
    Ability to set filename for new objects
    save() now works on when changing 'use'
    Modifications for python-2.3 support

    Parsers
    typo fixed in edit_service 
    Memory leak fix
    Added servicedependency and hostdependency support

    EventHandlers
    Added GitEventHandler which automaticly commits to git



Changes in 0.4.0

Features added:
        - Model, New module that turns configuration into python objects
        - Parsers, major refactoring


Changes in 0.3.1

Bugs Fixed:
        - Plugin, Fixed joinallstr, wasn't being added between severity levels.

Features added:
        - Plugin, Add must_threshold variable for programs that do not need classic -w or -c
        - Plugin, allow add_arg to be specified multiple times if multiple=True specified
        - Plugin, removed space character between severity and colon, "OK:" instead of "OK :"




Changes in 0.3

Bugs Fixed:


Features added:
        - Plugin add_messages() and check_messages()
        - new build system for easier RPM creation


Misc Changes:


New Contributors:

    Tomas Ewdardsson, Pall Sigurdsson
