First public release: Trigger 1.0.40
Release 1.0.0.80

- Typo fix in sample conf/trigger_settings.py
- Explicit imports from trigger.acl and a little docstring cleanup in bin/optimizer
- trigger.acl.autoacl.autoacl() now takes optional explicit_acls as 2nd
  argument, a set of ACL names, so that we can reference explicit_acls within
  autoacl() implicit ACL logic, but we don't have to rely on the internals.
- trigger.acl.db.AclsDB.get_acl_set() modified to populate explicit_acls before
  implicit_acls. autoacl() is now called with these explicit_acls as the 2nd
  argument.
- Sample autoacl.py in conf/autoacl.py updated to support explicit_acls and a
  simple example of how it could be used.
- ACL objects now have a family attribute to support this when constructed or
  parsed using the .output_junos() method.
Release 1.0.0.90

- Updated license to BSD Clear License.
- Added support for .gorc file to specify commands to run when using gong to
  login to a device. Unique commands cand be specified for each vendor.
- Default realm for credentials within .tacacsrc can now be specified within
  settings.DEFAULT_REALM
- The following changes have been made to trigger.tacacsrc:

  - New module-level update_credentials() function added to facilitate updating of
    cached user credentials by client applications (e.g. gong)
  - Renamed the exceptions within trigger.tacacsrc to be more human-readable
  - Tacacsrc._parse_old() completely redesigned with real error-handling for
    bad/missing passwords (GPG-parsing coming "Soon")
  - New Tacacsrc.update_creds() method used to facilitate update of stored
    credentials within .tacacsrc
  - Realm is now stored as an attribute on Credentials objects to simplify
    loose-coupling of device/realm information while passing around
    credentials.
  - prompt_credentials() refactored to be more user-friendly.
  - Blank passwords can no longer be stored within .tacacsrc.

- The following changes have been made to trigger.twister:

  - trigger.twister internals have been updated to support the passing of a
    list of initial_commands to execute on a device upon logging in.
  - TriggerClientFactory now reads the default realm from
    settings.DEFAULT_REALM when populating credentials.
  - TriggerClientFactory credentials detection improved
  - All referencing of username/password from credentials by index replaced
    with attributes.
  - Failed logins via telnet/ssh will now raise a LoginFailure exception that
    can be handled by client applications (such as gong)

- bin/gong now detects login failures and prompts users to update their cached
  password.
- A bunch of last-minute documentation changes
- Changed prefix from /usr/local/trigger to /etc/trigger
- trigger_settings.py moved to /etc/trigger/settings.py
Release 1.0.0.100

- trigger.conf converted from a module to a package.
- All global default settings are now baked into trigger.conf.settings
- trigger.conf.settings and trigger.acl.autoacl may now be imported without the
  proper expected config files in place on disk. If the config files cannot be
  found, default versions of these objects will be returned.
- All trigger modules can now be imported with default values (but don't try
  instantiating any objects without following the install instructions!)
- More documentation enhancement and clarification
Fixed issue 5 and 6

- Added ability for gong --oob to lookup devices by partial hostnames using
  trigger.netdevices.device_match() (fixes #5)
- The get_firewall_db_conn() function was moved out of settings.py into
  trigger.acl.queue.Queue where it belongs (fixes #6)
- Documentation updated to support these changes.
Release 1.1

- Fixed missing imports from bin/acl_script and removed a bunch of
  duplicated code already within the Trigger libs.
- Some new utilities added to trigger.acl.tools for merging new access into
  an existing ACL object
- Fixed  a bug in bin/netdev with the budget code option (-b)
- trigger.acl.parser.RangeList now sorts port range tuples when parsing
  access-lists.
- trigger.tacacsrc.get_device_password() user-friendly message moved to
  trigger.twister.pty_connect() so it no longer bleeds into non-interactive
  usage.
- trigger.acl.parser.Term.output_ios() updated to support optional `acl_name`
  argument for cases when you need to output a Term separately from an ACL
  object. trigger.acl.tools.check_access(), bin/check_access, &
  bin/find_access also had to be updated to utilize this new argument.
- trigger.acl.tools.check_access updated to support 'complicated' checks
  against Juniper firewall terms with a 'port' statement defined.
Release 1.2

Commando API overhauled and support added for RANCID.
Support for SSH auto-detection and pty/async improvements.

- RANCID is now officially supported as a source for network device
  metadata. A new RANCID compatibility module has been added at
  trigger.rancid. RANCID can support either single or multiple instance
  configurations. Multiple instances support can be toggled by setting
  settings.RANCID_RECURSE_SUBDIRS to True.

- The following changes have been made to trigger.netdevices:

  - NetDevices can now import from RANCID
  - A new Vendor type has been added to trigger.netdevices to store
    canonical vendor names as determined by the new settings.VENDOR_MAP
    attribute
  - When device objects are created, the manufacturer attribute is mapped
    to a dynamic vendor attribute. This is intended to normalize the way
    that Trigger identifies vendors internally by a single lower-cased
    word, and can be customized in the Trigger configuration using
    settings.VENDOR_MAP.
  - All NetDevice objects now have a .vendor attribute with their
    canonical Vendor object attached to it
  - If the deviceType attribute is not set, it is determined
    automatically based on the vendor attribute. The default types for
    each vendor can be customized using settings.DEFAULT_TYPES. If a
    vendor is not specified witihin DEFAULT_TYPES, settings.FALLBACK_TYPE
    will be used.
  - All logical comparisons that onced used the hard-coded value of the
    .manufacturer attribute of a device now instead compares against the
    .vendor attribute
  - trigger.cmds.NetACLInfo adapted to use Commando 2.0
  - You may now tell NetDevices not to fetch acls from AclsDB when
    instantiate you may also do the same for individual NetDevice objects
    that you manually create
  - All NetDevice objects now have a .execute() method to perform async
    interaction
  - The connect() function is now automatically attached to every NetDevice
    object; to get a pty it's as simple as dev.connect().
  - New helper methods added to NetDevice objects:

    - SSH functionality methods:.has_ssh (port connection test), .can_ssh_async
      (device supports async), .can_ssh_pty (device supports pty)
    - NetDevice.is_ioslike() to test if a device is IOS-like as specified by
      settings.IOSLIKE_VENDORS
    - NetDevice.is_netscreen() to test if a device is a NetScreen firewall
    - NetDevice.is_reachable() to test if a device responds to a ping

- The following changes have been made to trigger.cmds:

  - The Commando class been completely redesigned to reduce boilerplate
    and simplify creation of new command adapters. This is leveraging the
    changes to NetDevice objects, where the vendor name can be expected
    to always be normalized to a singe, lower-cased word. Defining
    commands to send to devices is as simple as definiing a "to_{vendor}"
    method, and parsing return results as simple as "from_{vendor}".
  - All dynamic lookups now using the normalized vendor name (e.g. cisco,
    juniper)
  - Base parse/generate lookup can be disabled explicitly in Commando
    subclas

- The following changes have been made to trigger.twister:

  - Detection of remotely closed SSH connections so bin/gong users can be
    properly notified (e.g. ssh_exchange_identification errors)
  - New execute() function to automatically choose the best execute_ function
    for a given NetDevice object. This function is attached to all NetDevice
    objects
  - execute_ioslike() now determines whether to use SSH or Telnet automatically
  - All pty connection logic moved out of bin/gong into trigger.twister and is
    exposed as the connect() function and also attached to all NetDevice
    objects
  - Interactive sessions may now be optionally logged to a file-like object by
    passing the log_to argument to the Interactor constructor
  - execute_junoscript() now using execute_generic_ssh()
  - Command interval added to Junoscript channels for consistency
  - Global NetDevices import removed from twister; moved to only occur when a
    telnet channel is created

- The following changes have been made to trigger.conf.settings:

  - A mapping of officially supported platforms has been defined at
    settings.SUPPORTED_PLATFORMS
  - settings.VALID_VENDORS has been renamed to settings.SUPPORTED_VENDORS
  - A mapping of officially supported device types has been defined at
    settings.SUPPORTED_TYPES
  - You may now disable telnet fallback using settings.TELNET_ENABLED
  - You may now disable SSH for pty or async by vendor/type using
     settings.SSH_PTY_DISABLED and settings.SSH_ASYNC_DISABLED
  - settings.SSH_TYPES has been removed as it is no longer needed

- The following changes have been made to Trigger's exception handling

  - All exceptions moved to trigger.exceptions and given docstrings
  - trigger.acl.exceptions has been removed
  - All calls to exceptions updated to new-style exceptions

- Two new helper functions added to trigger.utils.cli: setup_tty_for_pty() and
  update_password_and_reconnect(), which modularize functionality that was in
  bin/gong that didn't seem to fit anywhere else
- New -v option added to bin/netdev to support vendor lookups
Release 1.2.1

- :bug:`30` Bugfix in ``bin/acl`` where tftproot was hard-coded. It now
  reads from :setting:`TFTPROOT_DIR`.
- :feature:`37` Fixed misleading "make discard" output from
  ``bin/check_access``, to use the ``Term.extra`` attribute to store a
  user-friendly comment to make it clear that the term's action has been
  modified by the "make discard" keyword. - :feature:`39`  Call
  ``create_cm_ticket()`` in a ``try..commit`` block so it can't crash
  ``bin/load_acl``.
- :bug:`40` Update dot_gorc.example with ``[init_commands]``.
- :bug:`43` Bugfix in bin/acl to address incorrect exception reference
  from when exceptions were cleaned up in release 1.2.
- Simplified basic `~trigger.cmds.Commando` example in ``docs/index.rst``.
- Simplified activity output in `~trigger.cmds.Commando` base to/from
  methods.
- Replaced all calls to ``time.sleep()`` with ``reactor.callLater()``
  within `~trigger.twister` support of the ``command_interval`` argument
  to Twisted state machine constructors.
- Added a way to do SSH version detection within `~trigger.utils.network`

  - Enhanced `~trigger.utils.networktest_tcp_port` to support optional
    ``check_result`` and ``expected_result`` arguments. If
    ``check_result`` is set, the first line of output is retreived from
    the connection and the starting characters must match
    ``expected_result``.
  - Added a `~trigger.utils.network.test_ssh` function to shortcut to
    check port 22 for a banner. Defaults to SSHv2.
  - SSH auto-detection in `~trigger.netdevices.NetDevices` objects now
    uses `~trigger.utils.network.test_ssh`.

- Added a new `~trigger.utils.crypt_md5` password-hashing function.
- Added proper argument signature to `~trigger.acl.db.get_netdevices`.
- Updated misnamed ``BadPolicerNameError`` to
  `~trigger.exceptions.BadPolicerName`
- More and better documentation improvements, including new
  documentation for ``bin/acl_script``.
Release 1.2.2

- Arista support was added to bin/load_acl
- Added "SSH-1.99" as a valid SSHv2 version in
  trigger.utils.network.test_ssh() to fix a bug in which devices
  presenting this banner were errantly falling back to telnet and
  causing weird behavior during interactive sessions.
- Changed trigger.twister.connect() to pass the vendor name to
  trigger.gorc.get_init_commands() so that it is more explicit when
  debugging.
- Added an extensible event notification system

  - A new pluggable notification system has been added in
    trigger.utils.notifications, which defaults to email notifications.
    New event handlers and event types can be easily added and specified
    with the configuration using settings.NOTIFICATION_HANDLERS.

  - The following changes have been made to bin/load_acl:

    - All alerts are now using the new notification system
    - email_users() moved to trigger.utils.notifications.send_email()
    - All calls to send failures now call
      trigger.utils.notifications.send_notification()
    - All calls to send successes now calls
      trigger.utils.notifications.send_email()

  - In support of the new notification system, the following config
    settings have been added:

    - settings.EMAIL_SENDER - The default email sender
    - settings.NOTIFICATION_SENDER - The default notification sender
    - settings.SUCCESS_RECIPIENTS - Hosts/addresses to send successes
    - settings.FAILURE_RECIPIENTS - Hosts/addresses to send failures
    - settings.NOTIFICATION_HANDLERS - A list of handler functions to
      process in order

  - A new utility module has been added to import modules in
    trigger.utils.importlib, and trigger.conf.import_path() was moved to
    trigger.utils.importlib.import_module_from_path() to bring these
    import tools under one roof.
Add parsing of ranges for fragment-offset in Juniper ACLs (fixes #47)
Merge branch '1.2.3-beta' of github.com:aol/trigger into 1.2.3-beta
Merge branch 'issue-47' into 1.2.3-beta
Change ACL parser to Omit src/dst ports if range is 0-65535 (fixes #49)
Merge remote-tracking branch 'nocisco/nocisco' into 1.2.3-beta
Release 1.2.3

+ Minor bugfix when checking device names and printing warning within
  trigger.cmds.Commando
+ Fix typo that was causing Cisco parsing to generate an unhandled
  exception within trigger.cmds.NetACLInfo
+ Changed ACL parser to omit src/dst ports if port range is 0-65535
+ Added parsing of ranges for 'fragment-offset' statements in Juniper
  ACLs
+ Updated docs to say we're using a interactive Python interpreter and
  added OpenHatch profile to contact info
Merge pull request #52 from jathanism/master

Release 1.2.3
Merge pull request #53 from jathanism/develop

Console paging disabled now by default for SSH Channels (fixes #33)