Version 0.20.1
==============
- Bug fixes for build issues on BSD. Added proper header files, removed 
  linux-specific error.h from dnxTimer, used a more portable method of 
  accessing in6_addr fields in dnxStats.c.

Version 0.20
============
- Fixed client-side clock skew issue caused by ntsd moving real-time clock
  backward. Especially prevalent on VMWare and other virtual systems.
- Replaced filesystem based results processing with faster in-memory 
  results processing.
- Added new split plugin/server model code.
- Removed cruft from Nagios config.h include file to avoid unnecessary 
  build environment requirements.
- Streamlined server-side node-centric statistics for efficiency.
- Fixed descriptor leaks in pfopen code on clients.
- Updated INSTALL document to provide DNX-specific installation instructions.
- Added option to logging subsystem to log to file or to syslog.
- Added code to allow transports to track messages in/out. (Haven't surfaced
  this code yet in the interface.)
- Replaced configure's --with-nagios3x command-line option with a new
  Nagios 2.x-specific --with-nagios2x option. The default configuration
  now targets Nagios 3.x.

Version 0.19.1
==============
- Because of problems with the previous dnx-0.19 release we have decided to 
  revert some sections of code and just fix the bugs in the previous release.
- This is a point release and we have..
- Temporarily removed compression
- Temporarily removed job acknowledgments.
- Fixed an issue with ntop that was causing it to leak.
- Fixed some more leaks identified by valgrind.
- Fixed a bug whereby the system could segfault if it could not get an IP 
  address for a packet that was received.

Version 0.19
============
- Fixed numerous memory leaks.
- Made a lot of cosmetic changes to make source code easier to read and 
  understand.
- Added stats to common and server, via new global objects gTopDCS and 
  gTopNode respectively.
- Changed syntax of stats on client to add underscore seperators to ease 
  readability. These readbility changes will likely break any scripts you
  may have that query stats. Specifically the following:

    "jobsok","jobsfailed","thcreated","thdestroyed","thexist","thactive",
    "reqsent","jobsrcvd","minexectm","avgexectm","maxexectm","avgthexist",
    "avgthactive","threadtm","jobtm"

  have become

	 "jobs_ok","jobs_failed","th_created","th_destroyed",
	 "th_exist","th_active","req_sent","jobs_rcvd","min_exec_tm","avg_exec_tm",
	 "max_exec_tm","avg_th_exist","avg_th_active","thread_tm","job_tm"

- Additionally we have added "packets_out","packets_in","packets_failed",
  "jobs_handled" to both client and server.
- We have modified several messages for readability for instance the 
  ubiquitious (Service Check Timed Out) message has been replaced with much 
  more user friendly messages like (DNX: Plugin Timed Out) when a worker node 
  times out.
- Made some minor changes to begin transition to IPV6 compatibility, these 
  include the use of inet_ntop instead of inet_ntoa in numerous places.
- Increased log verbage so Debug lvl 3 now logs things such as packets sent 
  and received.
- Added an acknowledgement mechanism to jobs so that when a worker node 
  receives a new job from the server it sends a quick ack to the server.  
  This ack is used if the job times out. The server will log that it timed 
  out and was or was not acknowledged. This is to ensure that a job got 
  through and helps to rule out packet loss. Those messages are as follows:

    (DNX: Service Check [%lu,%lu] Timed Out - Node: %s - 
       Failed to return job response in time allowed)

    (DNX: Service Check [%lu,%lu] Timed Out - Node: %s - 
       Failed to acknowledge job receipt)

Version 0.18:
=============
- Fixed problem where dnxClient would stop processing jobs after a while,
  thread pool bug - all threads would terminate - thanks to Alessandro Ren,
  Jesse Caldwell and William Leibzon!
- Added code to fix TIME_WAIT state issues on restart (doesn't always work).
- Added code to display same version information from dnxstats as from CL.
- Added code to have server return human-readable "OK" message on dnxstats
  commands that didn't previously have reply text.

Version 0.17:
=============
- Fixed race condition and deadlock in worker cleanup code in client.
- Added --enable-debug-heap option to configure script.
- Added --enable-debug-locks option to configure script.
- Added additional text to configure output to explain build process.
- Added official support for Nagios 3.x through 3.0.1.
- Added detailed DNX build and installation information to the 
  INSTALL document.

Version 0.16:
=============
- Fixed install bugs - mostly related to improper file system rights.
- Debug output is now realistic - not pumping out droves of useless info.
- Added new configure options for specifying log directory.
- Fixed miscellaneous build system problems.
- Fixed rpm build issue - getaddrinfo failing under OBS.
- Fixed doxygen generation issues related to incorrect exclude dir list.
- Added new unit test for dnxClient - tests proper client daemonization.
- Added generic init script for non-SUSE platforms - thanks to 
  Alberto Villegas!

Version 0.15.1:
===============
- Bug fixes - mostly related to daemon startup, shutdown and timing.

Version 0.15:
=============
- We're in SVN on sourceforge now!
- Added autotools build system.
- Completely rewritten configuration system.
- Completely updated thread pool.
- New configuration parameters added.
- New command-line options added.
- Ability to reconfigure most parameters with SIGHUP.
- Unit test infrastructure added; several unit tests added.
- Debug memory manager added; fixed several memory leaks.
- Added node address to dnx error strings passed from failed checks.
- Doxygen documentation added.
- Init script updated to LSB.
- Several install and doc targets added.
- Added support for Nagios versions 2.8, 2.9, 2.10, 3.0rc2
- dnxstats utility added to manage and retrieve stats from dnx client nodes.
- Configuration and build system allow installation of client and server
  separately.
- Support added to configure script for RPM packages managed through 
  the OpenSUSE build service.

Version 0.13:
=============
- Added out-of-memory condition checking for all strdup(3) calls.
- Fixed DNX communications channel exhaustion bug. This bug occurred when
  a Client worker thread exited: Although the dispatch and collector channels
  were properly closed, they weren't released from the DNX Channel Map pool.
  Since this pool has a finite number of slots, we ran out of slots eventually.
  Running out of slots then prevented the creation of any additional worker
  threads.
- Fixed memory leak in the Client, related to the above problem.
- Fixed the same DNX communications channel exhaustion bug in the NEB Server
  module as well. Although, this was not likely to occur very often.
- Added some additional error and debug logging.
- Added some graceful handling of NULL strings in the XML protocol messaging.

Version 0.12:
=============
- Implemented the auditWorkerJobs directive in the server's configuration
  file. This feature allows you to track which worker nodes are executing
  which service checks.
- Fixed negative job counter issue in client.
- Added debugging level support for the server. Setting the debug flag in
  the server config file to any positive integer enables debugging. The
  higher the integer, the more verbose the debugging output.
- The server module no longer writes messages to nagios.log. All server
  modules messages are now written to the syslog.
- Cleaned-up memory leaks in both server and client.
- Fixed nasty corner-case where a job might be expired and collected at
  the same time, causing a heap corruption due to the job structure memory
  being freed twice. Even though this race-condition was properly semaphore-
  protected, the expiration thread didn't properly mark the expired job
  as removed from the global job queue. Hence, the collection thread might
  acquire the semaphore right after the expiration thread released it, and
  therefore still see the expired job as active. The job would then be
  "collected", even though it was already "expired".

Version 0.11:
=============
- Implemented the localCheckPattern directive in the server's configuration
  file. This permits you to specify an extended regular expression string which
  will be used to see if a check command job should execute locally (instead
  of being sent to a DNX client.)

Version 0.10:
=============
- Fixed improper XML parsing of command or response values, where the
  command/response contains embedded XML tags (or even just embedded
  angle-brackets).  This fix affects both the server and the client,
  since they share the common XML parsing routines contained in dnxXml.c

Version 0.09:
=============
- Fixed the killing of plugin-child processes in dnxClient
- Fixed plugin path directive to work properly
- Fixed dnxinit script to start up in a more logical order
- Added missing include statements to dnxClientMain.h to help
  compilation on FreeBSD

Version 0.08:
=============
- Removed the use of the internal NRPE module from the DNX Client.
  The NRPE module is still experimental and will be added back into
  the DNX distribution once I have fully implemented in-core checks
  to the DNX Client.

Version 0.07:
=============
- Fixed re-entrancy problem in dnxUdp.c and dnxTcp.c which manifested itself
  under heavy thread creation on the DNX Client.  The problem occurred when
  newly created worker threads sumultaneously invoked gethostbyname(3) - which
  isn't re-entrant-safe.  I ought to move the name resolution logic for the
  Dispatcher/Collector names out of the thread creation and into the main
  configuration validation modules at some point.

  NOTE: Recommend that all users specify IP addresses in the Client config
  file (instead of host names requiring DNS lookup,) just in case your DNS
  server fails; which might cause thread creation to suspend for 30 seconds
  or more.

Version 0.06:
=============
- Modified the DNX Client to allow worker threads a "shutdown grace period".
  This is set by the user via the wlmShutdownGracePeriod option in dnxClient.cfg.

  In prior versions, when the DNX Client received the shutdown signal (i.e.,
  SIGTERM) it immediately cancelled all worker threads, which caused two
  problems:

    1. If a worker thread had already submitted a job request and was awaiting
       a reply from the DNX Server when it exited, then the DNX Server might
       send a job to the (now) non-existent worker thread. The service check
       would then be "lost" and would eventually show up as a DNX Service Timeout
       in Nagios.

    2. If a worker thread was in the middle of executing a job it would often
       be interrupted while awaiting the plugin output.  This also caused the
       service check to be "lost" and eventually show up as a DNX Service Timeout
       in Nagios.

  With this modification, upon receipt of the shutdown signal, the DNX Client first
  issues an "advisory" termination request to all worker threads.  If the worker
  thread is in a state where can it safely exit without dropping a service check,
  then it will do so.

  Otherwise, the worker thread will continue executing until it arrives at a safe
  state to exit.

  However, if any threads have still not exited after wlmShutdownGracePeriod seconds
  since the advisory shutdown, then those threads will be cancelled according to standard
  POSIX threads semantics.

- Placed conditional compilation directives around the following non-portable mutex
  initialization statements in both the DNX Client and Server:

    pthread_mutexattr_settype(&MutexAttr, PTHREAD_MUTEX_ERRORCHECK_NP);

  Apparently, the PTHREAD_MUTEX_ERRORCHECK_NP constant in not supported in all
  pthreads implementations.  I use this initialization, where available, to allow
  pthreads to auto-detect potential mutex deadlock situations, if they ever occur.

- Tweaked some of the default parameters in the dnxClient.cfg file.

Version 0.05:
=============
- Improved how the DNX NEB Module decides whether or not it should accept a service
  check from Nagios.  It now guarantees that an active worker thread request will be
  available to execute the service check by "marrying" the service check and the worker
  thread request *before* it returns control to Nagios.

  This eliminates certain race conditions wherein a service check seemed available but
  is taken by the dispatcher for some prior job.

- Added a Time-To-Live variable to each worker thread request, which allows the DNX
  Server to eliminate stale worker thread requests.
