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