
Changes from v0.4.5 to v0.4.6
=============================

* Thu Oct 17 22:02:12 2013 +0200 - Pieter Hollants <pieter@hollants.com>

  Advertise support for alternative AgentX transports more explicitly

  We did already support alternative transports for the AgentX
  communication between subagents and master snmpd instances, that is, not
  just UNIX domain sockets but eg. also TCP ports. These are specified
  through transport specifications that follow the format described in the
  "LISTENING ADDRESSES" section in the snmpd(8) manpage.

  This change modifies wording that would suggest we supported alternative 
  UNIX domain socket paths only. It also adds a new script to run
  simple_agent.py against a snmpd instance over a TCP port, surprisingly
  named
  "run_simple_agent_over_tcpsocket.sh".

  (Git commit 1cc011ee12ba78dab6eeec25890e15767c55ea07)

* Thu Oct 17 21:43:50 2013 +0200 - Pieter Hollants <pieter@hollants.com>

  Move documentation on examples into own README in the examples directory

  To put the information closer to where you would be looking for it.

  (Git commit 3da5411e9cf7e9233d4ca0443dc1c529c94c0d7e)

* Tue Oct 8 17:55:31 2013 +0200 - Pieter Hollants <pieter@hollants.com>

  Update README with new credits

  (Git commit 3a0bd17d0934dd6620f30f177a286d821bfd51fc)

* Tue Oct 8 17:53:52 2013 +0200 - Pieter Hollants <pieter@hollants.com>

  Update README with net-snmp compatibility remarks

  (Git commit 9b4f81efc05c23f11f7689fcb7e71c39a9fcb4a9)

* Tue Oct 8 17:42:05 2013 +0200 - Pieter Hollants <pieter@hollants.com>

  Use WATCHER_MAX_SIZE instead of WATCHER_SIZE_STRLEN for 5.4.x
  compatibility

  We used to rely on net-snmp >= 5.5 behavior by setting a
  WATCHER_SIZE_STRLEN flag that didn't exist in net-snmp 5.4.x yet. For
  backwards compatibility we now use WATCHER_MAX_SIZE and update the used
  netsnmp_watcher_info structure's
  "data_size" field ourselves.

  Reported by Max "mk23" Kalika <max.kalika+projects@gmail.com>.

  (Git commit b15066fb9cd481c24ece736a68b2e22c2e483a67)

* Tue Oct 8 17:27:35 2013 +0200 - Pieter Hollants <pieter@hollants.com>

  Fix comment added in 60d51c93

  (Git commit 06fa1ded69269d5cc5798ec7f4057aacfa6c58b4)

* Tue Oct 8 17:24:22 2013 +0200 - Pieter Hollants <pieter@hollants.com>

  Deref watcher before trying to its max_size property

  The netsnmp_watcher_info structure returned by
  netsnmp_create_watcher_info is a pointer, so it must be de-referenced
  with ctypes' "contents" attribute before any of its properties can be
  set.

  Reported by Max "mk23" Kalika <max.kalika+projects@gmail.com>.

  (Git commit f2078fdabb022aeac48fd676433a0e381047c004)

* Tue Oct 8 16:30:17 2013 +0200 - Pieter Hollants <pieter@hollants.com>

  Add missing netsnmp_watcher_info fields definition to netsnmpapi

  Basically we do not need fields definitions for net-snmp structures that
  we never modify ourselves. However in this case we actually tried
  setting netsnmp_watcher_info's "max_size" field which resulted in a
  no-op.

  Reported by Max "mk23" Kalika <max.kalika+projects@gmail.com>.

  (Git commit 464d058c24008623fe7e6b4c0d9043fe19ac8151)

* Tue Oct 8 16:21:52 2013 +0200 - Pieter Hollants <pieter@hollants.com>

  Explicitly comment why we set watcher_info struct's max_size manually

  (Git commit 60d51c9324e1aae8964cb7d46cb1136e0e772d22)

* Fri Jul 19 18:20:24 2013 +0200 - Pieter Hollants <pieter@hollants.com>

  Adapt the Makefile's srcdist and rpms targets to the new examples dir

  (Git commit e96fd75fe905d2c922da4dacdf110082f50ba4bb)

* Thu Jul 18 17:16:02 2013 +0200 - Pieter Hollants <pieter@hollants.com>

  Undo part of fa6e2d9723 (much longer string in simple_agent.py)

  That line was intended for debugging only.

  (Git commit e194a756b6ca368d0984b2bbea8e420dccb91f14)

* Thu Jul 18 17:13:16 2013 +0200 - Pieter Hollants <pieter@hollants.com>

  Use local copy of netsnmpagent module for example agents

  So you don't have to "make install" first.

  (Git commit fa6e2d9723de724bf619713ad41097b79616d41b)

* Wed Jul 17 23:41:31 2013 +0200 - Pieter Hollants <pieter@hollants.com>

  Fix more overseen references to "example" in run_simple_agent.sh

  (Git commit 29f77605c12e839a755c122445789bc1f0706823)

* Fri Jul 12 00:05:19 2013 +0200 - Pieter Hollants <pieter@hollants.com>

  simple_agent.py: Remove the caret that shouldn't be

  Narf...

  (Git commit 0e4aa6163a4555e846a0dc6b2a0221782a98d59f)

* Fri Jul 12 00:01:55 2013 +0200 - Pieter Hollants <pieter@hollants.com>

  Fix overseen references to "example" that should be "simple"

  Thanks to mjs7231 for reporting.

  (Git commit 3cb813f430a6d3ba4b3f3508f8f7801957b777de)

* Sun Jul 7 22:38:48 2013 +0200 - Pieter Hollants <pieter@hollants.com>

  Small update to the README

  - Phrase missing API stability less dramatically
  - Add TODO of SNMP notifications/traps

  (Git commit ca1f9ce7994a8db6a66efbd4729e8c814d6177f2)

* Sun Jul 7 22:36:51 2013 +0200 - Pieter Hollants <pieter@hollants.com>

  New example threading_agent.py demonstrating asynchronous data updates

  The default simple_agent.py always blocked until certain events occured,
  eg. SNMP requests had to be processed, and only updated its SNMP objects 
  inbetween. Also SNMP requests couldn't be handled while data was in the 
  process of being updated. Thus here's a more real life-usable example
  that outsources data updating into a separate thread. It does however
  not address possible locking issues.

  (Git commit c8d08523d707a62d85205b5a0f0260340d38d9ea)

* Sun Jul 7 20:03:43 2013 +0200 - Pieter Hollants <pieter@hollants.com>

  Non-functional improvements to the simple agent

  simple_agent.py's heading comment block:
  - Add note on running the run_simple_agent.sh script
  - Add note on using sudo when starting the agent directly
  - Encourage user to use own <rosecret> instead of "public"

  simple_agent.py's counters code:
  - Prettify sort order of code blocks
  - Explain initialization value
  - Document that increment() is a counter object's method more explicitly

  run_simple_agent.sh:
  - Mention snmpget as well

  (Git commit dff681469369bb61145d0a814e6921d507eec33c)

* Sun Jul 7 14:59:13 2013 +0200 - Pieter Hollants <pieter@hollants.com>

  Rename example agent to simple agent

  We're going to have other example agents in the examples/ subdirectory
  as well, therefore the name "example agent" would be ambiguous. The MIB
  and its contents have been renamed, too.

  (Git commit 4fadc259ded94736bfd8dd665577fa5877d00faf)

* Sun Jul 7 14:49:05 2013 +0200 - Pieter Hollants <pieter@hollants.com>

  Move example agent into new subdir examples/

  (Git commit 53f47da9ae4fe1a7b462e57ddb7b6e36abd72931)


Changes from v0.4.4 to v0.4.5
=============================

* Mon Apr 29 15:05:26 2013 +0200 - Pieter Hollants <pieter@hollants.com>

  Makefile/RPM spec file: Cosmetics and smaller cleanups

  (Git commit b3e7d35531f2f5c983798e15f237a18b59a5233b)

* Mon Apr 29 12:57:57 2013 +0200 - Pieter Hollants <pieter@hollants.com>

  Use $@ instead of explicit filename references in ChangeLog Makefile
  target

  (Git commit 01abbd6e525a8f05fd7bdc2881be8be750c6ef42)


Changes from v0.4.3 to v0.4.4
=============================

* Sun Apr 28 00:51:19 2013 +0200 - Pieter Hollants <pieter@hollants.com>

  Use more accurate variable name $PKGREMAIL when building RPM spec file's
  %changelog section

  The one who uses the .spec file is not necessarily the $AUTHOR of
  python-netsnmpagent.

  (Git commit 1fc4d6c743dd5827592c594882d264a754753681)

* Sun Apr 28 00:49:42 2013 +0200 - Pieter Hollants <pieter@hollants.com>

  Use C locale to generate dates for RPM spec file's %changelog section

  RPM might otherwise complain about an "invalid date format" when
  building the package..

  (Git commit 3e2623d78cd326b1ec87a3d768e871c245b9a8e7)

* Sat Apr 27 19:16:50 2013 +0200 - Pieter Hollants <pieter@hollants.com>

  Automatically generate %changelog section for RPM spec file

  The spec file uses a different changelog style than the ChangeLog file,
  which would be too verbose for this purpose. Usually package maintainers
  note changes to the spec file itself here as well and often give a more
  high-level summary of changes of the software being packaged. Our
  automatically generated changelog will not be of the same quality as we
  only indicate the timestamps a version was tagged and an "Update to
  version x.y.z"-style message. But until now we didn't use the ChangeLog
  section at all. And package maintainers can still replace it with a more
  detailed, manually maintained version.

  (Git commit e4a21d8fe50e1a86c558101a5f5e1e55015c58e8)

* Sat Apr 27 16:37:25 2013 +0200 - Pieter Hollants <pieter@hollants.com>

  Collect RPMs built in dist/ and clean up RPM build dirs

  (Git commit d184c128c339846fe2188f36fc94b338745b31d1)

* Sat Apr 27 16:34:41 2013 +0200 - Pieter Hollants <pieter@hollants.com>

  Generate RPM spec file along with source distribution archive

  Utility of the spec file is increased if it has python-netsnmpagent's
  version number already specified -- the old way of requiring a RPM
  "--define" only worked when the Git repo was available. Now one can take
  the generated dist/python-netsnmpagent.spec along with the source
  archive and simply copy it some build host and build.

  (Git commit 5a8f0e5afa12e1bb67df45531dd51b47ab33935c)


Changes from v0.4.2 to v0.4.3
=============================

* Wed Apr 24 11:57:29 2013 +0200 - Pieter Hollants <pieter@hollants.com>

  Clear counter variable also when a Table object is cleared

  (Git commit b4e19f42fa587e135c74785a39090df7a7c7bf83)


Changes from v0.4.1 to v0.4.2
=============================

* Tue Mar 26 19:16:13 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Fix specfile so it builds on SLES11 and SLES11SP1, too

  (Git commit 8e186e646b6fb8cfe53882b930f3a3a5b028f138)


Changes from v0.4 to v0.4.1
===========================

* Tue Mar 26 15:55:24 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Fixes to the spec file so it builds for openSUSE, SLES11 and RHEL6

  (Git commit b1b1cfe4b746b32142c36fd159b2bbabe0454d18)


Changes from v0.3 to v0.4
=========================

* Sat Mar 23 14:30:04 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Add missing prototypes for init_mib() and
  netsnmp_table_dataset_remove_and_delete_row()

  (Git commit 5c4618526f4def25479503853a67c77d72dfc8ae)

* Sat Mar 23 14:16:47 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Add prototype for netsnmp_table_dataset_remove_and_delete_row

  (Git commit 8ec11c314dde071ad073dd8ae08c5b67883b2298)

* Sat Mar 23 14:15:23 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Abstract netsnmp_table_dataset_remove_and_delete_row from actual library
  as well

  Another function that used to be in libnetsnmphelpers in net-snmp <5.6
  and now is part of libnetsnmpagent.

  (Git commit c068cace7f3aba096705cdc923ca99442bfb1e4e)

* Tue Mar 5 23:30:31 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Update README to reflect commit activity

  This is more and more getting fun :-)

  (Git commit a6777f189618f413c991d456fb27fe4ba8fbdbb1)

* Tue Mar 5 23:29:38 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Formatting for consistent code style

  (Git commit 92385a159bc7249c0c508fc068292b088c652541)

* Tue Mar 5 22:03:37 2013 +0000 - Steven Hiscocks <steven@hiscocks.me.uk>

  Add increment method to asntypes COUNTER and COUNTER64

  (Git commit 7d3d7058c01d09086b8ecc85f443cd709f1b1ec3)

* Wed Feb 27 00:50:56 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Fix ChangeLog generation for the case when we're on a tag

  The mechanism erroneously tried to generate a changelog "between vX.Y
  and vX.Y" when we're on that very tag.

  (Git commit da08641c0ccfe1b43038f3bd840bbc3b2d5253f5)

* Wed Feb 27 00:46:13 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Include documentation and example files in built RPM

  Seeing that the module will be installed on many plattforms in form of
  an RPM, it is wise to have the documentation files and also the example 
  agent and its files included.

  (Git commit ccf0a05b60ae7a4efa7468e1a3ae7fd2b7cb00ed)

* Tue Mar 5 18:21:15 2013 +0000 - Steven Hiscocks <steven@hiscocks.me.uk>

  Add optional argument to check_and_process as to whether to block

  (Git commit eb2d9b8822a4aed6bf10be55b510429049c94122)


Changes from v0.2 to v0.3
=========================

* Wed Feb 27 00:50:56 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Fix ChangeLog generation for the case when we're on a tag

  The mechanism erroneously tried to generate a changelog "between vX.Y
  and vX.Y" when we're on that very tag.

  (Git commit 78ebb0940c6de00a008e2e2321e9bcf362a90514)

* Wed Feb 27 00:46:13 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Include documentation and example files in built RPM

  Seeing that the module will be installed on many plattforms in form of
  an RPM, it is wise to have the documentation files and also the example 
  agent and its files included.

  (Git commit c3c9456cd330c99f6bcc6d69c7e1ad0c433fd4a1)

* Tue Feb 26 11:51:08 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Automatically generate ChangeLog from git commits

  We now have a ChangeLog automatically generated from the Git history, so
  users who do not follow the proceedings in the Git repository itself can
  see what has changed between each version. The ChangeLog is built
  whenever a source distribution archive is generated. It can also be
  explicitly built by using "make ChangeLog".

  (Git commit c54fc95c4f7ba3f26c776871d418df54abe704d7)

* Tue Feb 26 11:33:39 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Add MANIFEST.in file so source distributions include necessary files

  distutils by default expects LICENSE.txt, not LICENSE. It also needs to
  be explicitly told about our example agent and associated files.

  (Git commit b394bdeaf55c2ad5903c3fbd90409cd2017780bf)

* Mon Feb 25 20:30:20 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Replace hardcoded version number with latest Git tag

  With this change, the version number is no longer hard-coded inside
  setup.py. Instead, the version number is derived from the latest git tag
  using "git describe". The Makefile (which is now more than a pure
  convenience Makefile) will generate setup.py from setup.py.in
  (which has been renamed accordingly), so that a source distribution
  (.tar.gz) will have the correct version number inside.

  As a special rule, whenever the Git checkout is not at a tag, "git
  describe" will generate a string similar to "0.2-21-g0e10fca",
  indicating that there have been 21 commits since the last tag "0.2" and
  the latest commit is g0e10fca. We translate this to
  "0.2_next21_g0e10fca" so a.) RPM does not complain about the dashes (it
  doesn't allow them in its "Version" field) and b.) the "next" indicates
  that this is a forthcoming version.

  (Git commit 7e920bb4e372f29cc3e0167224689e15bed14104)

* Mon Feb 25 18:52:22 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  API change: swap "oidstr" and "initval" arguments for scalar variables

  The function signature for create_vartype_class() has changed and as
  such the constructor method signature for all classes using the
  @VarTypeClass decorator, that is, all classes representing SNMP scalar
  variables, eg. Integer32(), Unsigned32() etc. "initval" now comes first
  so that in scenarios where we just a SNMP variable without the intent of 
  registering it we can simply write

    agent.Integer32(20)

  instead of

    agent.Integer32(initval=20)

  which, of course, implies "oidstr" == None. The former construct is of
  much more use when being interpreted as "initval" instead of "oidstr" as
  in

    agent.Integer32("EXAMPLE-MIB::exampleInteger32")

  which continues requiring an "oidstr=" prefix to work.

  This means that if you have already written agents using
  python-netsnmpagent and you did not follow the style in example_agent.py
  with explicit "initval=" and "oidstr=" qualifiers, you WILL have to
  adapt your code.

  (Git commit 0e10fca0ce6c34cd6730d3fc73158fe40386e14d)

* Mon Feb 25 18:51:50 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Fix typo in README (SNMP contents, eh?...)

  (Git commit 77dce9d7c43fe2ad68fcdd44917f0e2af73ce56f)

* Fri Feb 22 19:58:43 2013 +0000 - Steven Hiscocks <steven@hiscocks.me.uk>

  Fix counter64 incorrectly setting low and high in c structure

  (Git commit 809193cb1d4549f9849164aa7126972894b99e76)

* Fri Feb 22 18:18:48 2013 +0000 - Steven Hiscocks <steven@hiscocks.me.uk>

  Handle wrap of 32bit and 64bit counters

  (Git commit 9a2c4430e8011bdd6f2662bef90d63909c6d8003)

* Fri Feb 22 14:06:47 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Distinguish libraries when errors in library loading occur

  (Git commit 5c61efa9ef337641bfd26dc98e8600a8afba74d4)

* Fri Feb 22 13:54:16 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Update README with credits

  (Git commit 7b5fd128712073343a5c69025c6972dde53f1e02)

* Fri Feb 22 13:52:43 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Fix example agent's working with SNMP contexts

  (Git commit 1d9b0bbc92f02d99c86b2106c5a00598250ba73e)

* Fri Feb 22 13:12:04 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Abstract certain functions from actual library for compatibility with
  net-snmp <5.6

  From net-snmp 5.5 to 5.6, all code from libnetsnmphelpers.so got
  integrated into libnetsnmpagent.so. While this doesn't break C programs
  since ld-linux.so will take care of dynamically resolving referenced
  symbols, with ctypes all prototype definitions and functions calls
  always depend on a particular libX handle.

  Therefore we now test using netsnmp_create_watcher_info whether that
  function is available in libnetsnmpagent and fall back to
  libnetsnmphelpers otherwise. The remaining code now uses libnsX to
  abstract from the actual library used.

  (Git commit 7f8ec59e26cd2ada809410b053d29a59f0efb3e3)

* Fri Feb 22 13:05:03 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Make comment about net-snmp 5.4.x workaround more verbose

  (Git commit d9388eeae15119ff4c5bd3e87578e4ff83b682e3)

* Fri Feb 22 12:15:51 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Work around unresolved dependencies bug in net-snmp 5.4.x libraries

  (Git commit 792977b5657e200a13794257bd12622b8d127021)

* Thu Feb 21 23:43:24 2013 +0000 - Steven Hiscocks <steven@hiscocks.me.uk>

  Added context argument to getRegistered and getContexts method

  (Git commit 830835b82bb7b976d8e57a28b2e0cbb1157aa2ff)

* Fri Feb 15 13:37:45 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Throw out SuSE-specific python macros from RPM specfile

  First of all, this module is noarch by definition. Second, SuSE macros
  won't be available on RHEL et al.

  (Git commit 9c0409d27624decaa309c998e56787f45ae29b51)

* Fri Feb 15 13:20:50 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Create BUILD directory during RPM build (required for SLES11SP2)

  (Git commit 6e66f11ff16e44ae686803980f00bf9121a60f78)

* Thu Feb 14 10:42:48 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Initialize variable so we can detect missing snmpd correctly

  (Git commit 53960d8547fdb648c86e5948a2a4db27d2470394)

* Sun Feb 10 12:00:37 2013 +0000 - Steven Hiscocks <steven@hiscocks.me.uk>

  Added ability to set context name for SNMP variables

  (Git commit ef457b1ea98cdf1a09bfaf705d7f7b5c6f7a6ffd)

* Mon Jan 21 14:41:16 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Rename "PersistentDir" option to "PersistenceDir" and streamline options
  in example agent

  (Git commit fe0d6b44964b8973f0dc0dc6f6b723d5630b3557)

* Mon Jan 21 13:33:29 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Bump year in copyright notices

  (Git commit f3d99ec7b4c36f145cfcc28cbf3bc5d163462f64)

* Mon Jan 21 12:14:28 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Fix Makefile targets and RPM building

  (Git commit 8b25ca9ced0997626a6eb25851c209e4e0f479b7)


Changes from v0.1.1 to v0.2
===========================

* Mon Jan 21 12:13:06 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Increase version number to 0.2

  (Git commit 1ba10cab7be6389d65c208df7a5c52c0bebb4f51)

* Mon Jan 21 12:12:32 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Add local .spec file and Makefile target for RPM building

  (Git commit 116f4b4a9f184764bf3fea0dfc8cc4b9c2b6d668)

* Mon Jan 21 11:02:06 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Synchronize Makefile style with my other projects

  (Git commit 446a70cfa71457b463d70e834241600f58e9965c)

* Mon Jan 21 10:55:49 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Fix cleanup of *.pyc files

  (Git commit fc66e3ef6ba1b0374c81d9060cfa8a8bd47cee4d)

* Mon Jan 21 10:30:10 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Remove duplicate error handling statements

  set -e = set -o errexit

  (Git commit cde7b4908fca46ade88eed199d0d9f05c06d7a4d)

* Mon Jan 21 10:29:39 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Synchronize heading comment block style with my other projects

  (Git commit 32045ecd31ef39accdebaa46d0b620b82fe61e1e)

* Fri Jan 18 18:49:36 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Add missing .0 index for scalar variables

  Scalar variables must be registered with register_watched_scalar(),
  which automatically adds the ".0" suffix required by the SNMP standards.

  (Git commit 0dedf78627ccd9fd6f32361dd1fc82150e5b6a20)

* Wed Jan 16 14:13:50 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Add a function to clear the table (ie. remove all table rows)

  (Git commit fc2ba0976ec85bc92cd29c71abd348976270d7d8)

* Mon Jan 14 14:39:25 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Support auto-update of row counter variable for tables

  A SNMP variable of an integer type can be created and passed in to the
  Table() constructor in the "counterobj" property. netsnmpagent will then
  auto-increase this variable's value whenever a new row is added with
  addRow(). Naturally the variable should be exposed read-only.

  (Git commit f607142140200a0acb16bb442332e8d3013fd74c)

* Mon Jan 14 14:38:27 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Make the return value of integer variables types ordinary integers
  unless absolutely necessary

  (Git commit 8489ea8998b653af3f6df3367f4aa59ca9c38ddb)

* Mon Jan 14 14:13:43 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Rename poll() to check_and_process() for consistency with net-snmp API

  The name "poll" wasn't really intuitive, anyway.

  (Git commit f2558fee86bd1711893f93f429bb6ea642d21dfb)

* Fri Jan 11 14:54:57 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Update README

  (Git commit a2ae83446fb90d2d50080ac2d6f9b1a30bf41940)

* Fri Jan 11 14:50:53 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Make Makefile clean up *.pyc files as well

  (Git commit 7f9763d3cc835c56005a204f3a6c3ac4946a2a04)

* Fri Jan 11 14:49:36 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Correct dist target in convenience Makefile

  (Git commit 49524931c09337b0d8bc279d20e480d46e4421a9)

* Fri Jan 11 13:44:03 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Add dist directory generated by distutils to .gitignore

  (Git commit 1e6610b72a81fc291cb7e9e52d69e660cb919ac7)

* Fri Jan 11 13:43:41 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Add MANIFEST generated by distutils to .gitignore

  (Git commit 8e21655794de6f466b3d7152ae70903a12d4ad04)


Initial version 0.1.1
=====================

* Fri Jan 11 13:36:35 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Bump version number to 0.1.1

  (Git commit 34158a2751b42764559930a03e6e4a1328f03709)

* Fri Jan 11 13:35:43 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Modify License specification to conform with openSUSE guidelines

  (Git commit 87f978986c9e466cae82e9bb6c4e2231c27888f0)

* Fri Jan 11 13:34:30 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Remove the she-bang from netsnmpagent.py and netsnmpapi.py

  These are Python modules not supposed to be called directly.

  (Git commit 2a482be4b5f2b4b58867660f20f98e13086ac020)

* Fri Jan 11 13:26:10 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Clean up dist directory as well

  (Git commit b0ea63d4658eeca4a69051e5cae63678e2af6024)

* Fri Jan 11 11:22:02 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Add convenience Makefile

  (Git commit d0ac759c8f1bee0dbf5044023d1b1fd526e59189)

* Fri Jan 11 11:21:16 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Remove python- prefix from package name

  (Git commit 8f4fb7377abf39669245506d3b0020e7bfffdee8)

* Thu Jan 10 17:19:10 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Update README

  (Git commit 37be34d9cf4cd95ae08c084c9b0c91dd8aa9b202)

* Thu Jan 10 17:08:42 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Add distutils-style setup.py script

  (Git commit b8f015747f6bcd9413bd1094e9dd88628825e011)

* Thu Jan 10 16:50:39 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Add own class for IpAddress to offer more natural Python interface

  IP addresses are stored as unsigned integers, but the Python interface
  should use strings so that IP addresses can be given in their natural
  form, ie. 127.0.0.1.

  (Git commit 86cc5a3bed54991eafa171becf30175c1efb451f)

* Thu Jan 10 15:42:54 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Make Table value() method return integer-style values for integers, not
  strings

  (Git commit 0419cb46d68ab0358babb5af2fbcfed87947fe7c)

* Thu Jan 10 15:36:27 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Let pprint module do the variable dumping in example agent

  (Git commit 6af9e9677e243e7601fba0a6e3ac0c40607e83d9)

* Thu Jan 10 15:23:54 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Improve Table value() output

  Row indices were returned incorrectly. Also make the returned object a
  dictionary containing dictionaries that match the value() output for
  Integer32 etc.

  (Git commit db79e071de38623ef4acb01e96fdf7293ed526cd)

* Thu Jan 10 15:22:24 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Of course one should use existing data types first...

  (Git commit c0fab40bb4c934fada5821c9952e9113274f70d2)

* Thu Jan 10 15:21:03 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Add a second example table to demonstrate different index types

  (Git commit 628cb7b9a5d4dce83e9938806b28947a2dc62380)

* Thu Jan 10 15:09:08 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Cosmetics in example agent's DumpRegistered() output

  (Git commit 305d0240414f8e3b8dac35b9132a8ce5e5cc68e5)

* Mon Jan 7 11:51:38 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Make run_example_agent.sh find snmpd within /usr/local as well

  (Git commit a5cbdc7bde9a5f323cb28c4678efd78cced77ce1)

* Fri Jan 4 14:54:35 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Cosmetics

  (Git commit b5eb7c4bdca5957f1e863953730541a2060a79ed)

* Fri Jan 4 14:49:39 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Add first implementation of value() method for tables

  (Git commit 2e204946984db2b3ad65b662229d82e4e84b955e)

* Fri Jan 4 14:47:09 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Add more error handling for netsnmp_ds_set_* calls

  (Git commit 7e6f8eddfb8b71f2d60690136df0b52a709e7a62)

* Thu Jan 3 16:18:31 2013 +0100 - Pieter Hollants <pieter@hollants.com>

  Add support for Counter64 data type

  This one requires actually some help since inheriting from
  ctypes.Structure alone does not work. net-snmp uses a C structure of two
  long variables internally to store the Counter64 value, so we need to
  provide wrapper functions for that.

  (Git commit a49b3a6a60e54aa632fca390a3d3afe16534adfd)

* Wed Dec 26 15:08:18 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Update README

  (Git commit cca2b90091e1bbf533c7a6cb34d6dbeacef24e74)

* Wed Dec 26 14:58:45 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Fix typos in README

  (Git commit f515bafa980673a3353308c2dc69402bcbf49157)

* Wed Dec 26 14:46:25 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  First implementation of table support

  Among the existing scalar variables, netsnmpagent now supports SNMP
  tables. Table objects are defined in terms of the types of the row
  indexes, the number of columns, their types and their default row values
  and whether they are extendable or not (ie. whether new rows can be
  added through snmpset). After creation (and registration), rows can be
  added and individual cell contents set.

  This implementation does not support the value() method for tables yet.

  (Git commit e3c2b42e344544145b2e1335d12327247bf03544)

* Wed Dec 26 14:40:47 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Use a string index type for the exampleTable

  In preparation for the upcoming table support, the index type for
  exampleTable (exampleTableIndex) was changed to a string type since
  it'll make for a more advanced example than an integer type.

  (Git commit f696b7fe11e60345130b5e53068c3206691f8c01)

* Wed Dec 26 00:07:04 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Move net-snmp API stuff into own file and define C function prototypes

  Everything ctypes and libnetsnmpagent-related has been moved into the
  new file netsnmpapi.py that gets imported by netsnmpagent.py. All
  netsnmp functions called are now also defined in terms of argument and
  result types, similar to C prototypes. To achieve this, the
  libnetsnmpagent handle is now defined globally instead of being part of
  the netsnmpAgent class.

  (Git commit f9114e0cc22665afd37abf224ab9f10861e5c03e)

* Sun Dec 23 22:34:06 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Add DISPLAY-HINT for exampleOctetString so UTF-8 encoded strings can be
  set properly

  (Git commit 44713eb7aba8a80a5747d73775bd427e64a3bd61)

* Sun Dec 23 22:27:21 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Correct max_size calculation for scalar SNMP objects

  (Git commit 77b9fb048e2ed477b654475247f952acdef6b439)

* Sun Dec 23 22:24:03 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Cosmetical optimization of SNMP object's cref() method

  (Git commit a25799afe631c2689e775e7c167263a69a7b6a2f)

* Sun Dec 23 22:20:59 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Reunify SNMP object creation and registration again

  It turned out to be unnecessarily complex to maintain consistency with
  the seperation of SNMP object creation and registration as introduced in
  0f7a4cdbf4677ebae52e0abee2acacd148c50491. Yet, that change is not
  literally undone:
  - Registration of an SNMP object must now be specified at object
  creation time by passing an "oidstr", if desired. If left off, the
  return object will remain unbound to the MIB and can be used mostly for
  object property inspection. As a consequence, register() was removed
  again. The new "writable" parameter to the object's creation method
  replaces register()'s "allow_set".
  - Previously, objects were created and if register() was called on them,
  it called a defined callback method. Now, the object's creation method
  calls the renamed _prepareRegistration() method instead and incorporates
  _registerWatcher() functionality.
  - The variable type's props array no longer needs a "register_func"
  member.

  (Git commit cb0bb0d44eb4be5c6f9e98920f269020bae2e145)

* Sun Dec 23 21:48:05 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Improve comment for DisplayString method

  (Git commit 5a85195fa56046f50d1114ba2ef5ab5e537b6fb7)

* Sun Dec 23 21:39:38 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  example_agent.py cosmetics: move agent.start() call before handler
  definition

  (Git commit 5270e9653eaa5fcc002429b4402aa1fbe197d1c5)

* Sun Dec 23 21:28:14 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Add Python shebangs for netsnmpagent.py and example_agent.py

  (Git commit 7172cd2edc3aa38be50c5f4c4fe689ae1d4d8031)

* Thu Dec 20 12:22:32 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Fix wrong table column number in EXAMPLE-MIB.txt

  (Git commit f12e5c9ff298493ffab58a27f9702485a4b6e4e1)

* Tue Dec 18 14:50:00 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Generalize for SNMP tables, separate SNMP object creation and
  registration

  This change generalizes netsnmpagent in that we now deal with "SNMP
  objects" instead of just SNMP variables. This is in preparation of the
  upcoming support of SNMP tables.

  Because of the semantics associated with how we will wrap tables, SNMP
  object creation and registration under a certain OID are now separate
  tasks. SNMP objects now must be explicitly registered (see
  example_agent.py).

  Further details of the changes:
  - Because registering a certain SNMP object is object-dependent, the
  VarTypeClass() decorator now expects a new member "register_func" that
  specifies the callback function that will be called by the new generic
  register() method.
  - register() incorporates the former oidstr2oid() method
  - The VarTypeClass() decorator's variable registration code went into
  register() and the new callback function _registerWatcher() as well.
  - Variable type class instances now possess most of the atttributes from
  their props[] array such as "asntype" and "flags"
  - _data_size and _max_size were not always set correctly
  - Variable type class instances now possess a new cref() method which
  always returns the correct pointer to the enclosed _cvar, depending on
  the variable type

  (Git commit 0f7a4cdbf4677ebae52e0abee2acacd148c50491)

* Wed Nov 28 13:30:04 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Add run_example_agent.sh script to make running example_agent.py easier

  example_agent.py has now learned two command line options:
  -m/--master-socket allows specifying the Unix domain socket that
  python-netsnmpagent will use to connect to the master snmpd agent and
  speak AgentX. -p/--persistent-dir is passed on the net-snmp library and
  sets the directory the library will use to store persistance
  information.

  Both parameters are used by the new run_example_agent.sh script to be
  able to setup a net-snmp instance running under the current user and
  independent from a eventually running system-level snmpd service. They
  will also be used by upcoming automatic tests.

  run_example_agent takes care of
  - creating a temporary directory
  - creating a minimal snmpd configuration that especially places all
  system file/directory references into the temporary directory instead
  - running snmpd with additional necessary parameters
  - giving the user guidance as to the right net-snmp CLI utility commands
  - running example_agent.py with suitable parameters
  - cleanup of the temporary dir upon exit

  (Git commit c54e1a67f32fcc086aa0ee4ab8b567bab2391db3)

* Wed Nov 28 12:55:57 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Rename example.py to example_agent.py

  (Git commit 6db1ac747835f512aaa1783b1a5a7350429a99c9)

* Wed Nov 28 11:58:25 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Add support to modify persistance directory

  (Git commit 92388737919b9eb2b6bdc170c41e1c13c06fc21b)

* Wed Nov 28 00:45:06 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Minor cosmetics

  (Git commit ee5245d45ff319e30b8f2b8ed4c63463e1b14b62)

* Wed Nov 28 00:41:37 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Fix and expand EXAMPLE-MIB

  - Rename IPAddress to IpAddress
  - Replace exampleString with exampleOctetString and exampleDisplayString
  - Add missing IMPORTs for Counter32, TimeTicks and IpAddress to
  IpAddress
  - Add exampleCounter, exampleTimeTicks, exampleIpAddress,
  exampleOctetString and
   exampleDisplayString to exampleMIBScalarsGroup conformance group

  EXAMPLE-MIB.txt should always be validated with smilint.

  (Git commit 3798704e9b4633ebf4a398251e89881b3986dffd)

* Wed Nov 28 00:29:12 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Use single C variable reference and mutable string buffer

  String handling was broken. We must use ctypes.create_string_buffer with
  a defined MAX_STR_SIZE instead of ctypes.c_char_p because the latter
  creates a buffer which a.) Python considered immutable while "snmpset"
  would happily write into it and b.) had an implicit maximum size
  depending on the initial creation string, causing possible memory
  corruption when "snmpset" would be used with a larger string.

  It also didn't make much sense to re-create a new ctypes.* instance upon
  each SNMP variable update from within the Python agent, because the
  integer types were mutable before and strings have become so.

  We fill out netsnmp_watcher_info's "max_size" properly now. Required for
  string types.

  Also discarded the special handling for strings, special handling now
  depends on props["flags"] only.

  Reordered things in define_and_register() and accordingly renamed it to
  register_and_define().

  Added more verbose comments about the process of SNMP variable
  registration.

  (Git commit 65ba9c1223f347eaa5d347c334aa646e61102326)

* Wed Nov 28 00:00:38 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Make example.py dump vars when SIGHUP is received

  Also give exampleString a friendlier default value.

  (Git commit 98d567461f4ae3f4479bbbabfd4b3e02431ae05a)

* Tue Nov 27 12:45:11 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Implement special handling for c_char_p variable types more explicitly

  We need a special case distinction for c_char_p (char *) variables
  during variable creation anyway (doesn't use ctypes.byref()), so no need
  for props["flags"], which was different for c_char_p only.

  Also fix watcher info's max_size as 0 as it is only used if the
  WATCHER_MAX_SIZE flag is set which we don't use.

  (Git commit 9b4297f4c87b3c16b1e8beaa4aa9010b96985316)

* Mon Nov 26 14:30:54 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Fix check that vars can't be added after agent start

  (Git commit ade8000db69ed9520676af6fa6f886ec76ed4f61)

* Mon Nov 26 14:29:38 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Cosmetics to make line lengths <= 80 chars

  (Git commit 14f8afa4e82c9adb2f52eaf240385453b8606993)

* Mon Nov 26 14:20:31 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Cosmetics

  (Git commit f328fbe1459bf9d8609bc4bdb84a5a580de794c6)

* Mon Nov 26 14:18:52 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Streamline SNMP variable class definition

  Before, there was a netsnmpVariable class and Integer32, Unsigned32,
  DisplayString32 etc. classes deriving from it (and an intermediate class
  netsnmpIntegerVariable). The variables carried the SNMP registration
  intelligence. In addition, netsnmpAgent had an addVar() method and proxy
  methods named liked the classes, taking care of creating variable
  instance and adding them to an agent's internal variable registry.

  Now, netsnmpAgent features a VarTypeClass decorator method that gets
  applied to methods Integer32, Unsigned32, DisplayString32 etc. which do
  nothing but return a dictionary with variable type properties. The
  decorator transforms these functions so that they a.) define the
  suitable class b.) create an instance and c.) register that instance
  with net-snmp. The classes themselves are now nothing but wrappers for
  the ctypes variables. So the registration intelligence (and
  oidstr2oid()) is back in netsnmpAgent itself again.-

  (Git commit b2e4c4d50c53e070e6635e2051873f1e2104516d)

* Mon Nov 26 13:50:36 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Let example.py print the registered vars for debugging and ease of use

  (Git commit 3aa9ac50fd3255fbf5695a1aaab61fd1b818c300)

* Sun Nov 25 23:49:19 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Major rewrite of SNMP variable handling and exposed API

  Before, the code using the module (eg. example.py) had to own
  ctypes-style variables and deal with conversions etc. netsnmpAgent just
  provided a registration function.

  Now, netsnmpAgent offers methods that return classes inheriting from a
  base class, netsnmpVariable, one class for each variable type. Class
  creation requires specification of the OID to register for and
  indication whether the variable should be writable using SNMP requests.
  Each class obtained this way offers value() and update() methods, called
  by the client at its decretion. See example.py how much shorter and
  nicer this looks.

  The interface is not quite polished yet, currently netsnmpVariable and
  deriving classes share the same namespace as netsnmpAgent and require an
  "agentlib" argument to get access to netsnmpAgent's libnetsnmpagent
  handle. This is currently provided by an addVar method for which there
  are in turn wrapper functions named after each variable type. This could
  need some improvement, probably using a factory method and/or
  decorators.

  In other news:
  - Moved net-snmp constants to the module level to avoid accessibility
  problems from within the new netsnmpVariable class and inheriting
  classes.
  - Removed debug-style print statement that spit out the name of each
  loaded MIB upon agent startup
  - Simplified library loading code since it looks like libnetsnmpagent
  alone will suffice.

  (Git commit e4fc68bfdf93998fd622d96d326443ef87a124d6)

* Sat Nov 24 02:05:54 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Add support for IPAddress variables

  (Git commit 4ffe76d0e967332994ea1da1d5b0c6ee6237bae3)

* Sat Nov 24 00:56:22 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Add support for TimeTicks variables

  (Git commit fbe5e01239396c7924816bf831e8e78dabc826e2)

* Fri Nov 23 23:42:53 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Cosmectic fix for correct size of Unsigned32 variables

  (Git commit 1e6973be62966a0cb4ae6703d9a612d40d863e47)

* Fri Nov 23 23:32:46 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Add support for Counter32 variables

  (Git commit 7563a6c16491efc86484426218b355ef9236fcf0)

* Fri Nov 23 17:51:54 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Added TODOs

  (Git commit e1c7400bbfe951523f15139e6c4c3f85e0942410)

* Fri Nov 23 17:41:00 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Add LICENSE

  (Git commit 2eb7fb848c1cede41018a340b656feadcd131fbf)

* Fri Nov 23 17:40:15 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Add a first version of a README

  (Git commit 609ee8edc197914ff0fb1b7d6b955f273ac080db)

* Fri Nov 23 16:28:32 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Added .gitignore to ignore *.pyc files

  (Git commit 62574958cf3ff02497bfb07bd9e10a17709947fb)

* Fri Nov 23 16:10:31 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Cosmetics

  (Git commit c06ba86f1df7d515b0567559e5ff6483cb302a3b)

* Fri Nov 23 16:10:31 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Add read-only variables support

  (Git commit f2def554a8cb54b0ea593da42ffec4daddb97a25)

* Thu Nov 22 22:58:24 2012 +0100 - Pieter Hollants <pieter@hollants.com>

  Initial commit

  (Git commit ff76a9d3fb6148ed4a6d588358840984eee14e24)

