Stem Docs

stem

Source code for stem

# Copyright 2011-2019, Damian Johnson and The Tor Project
# See LICENSE for licensing information

"""
Library for working with the tor process.

**Module Overview:**

::

  Endpoint - Networking endpoint.
    |- ORPort - Tor relay endpoint.
    +- DirPort - Descriptor mirror.

  ControllerError - Base exception raised when using the controller.
    |- ProtocolError - Malformed socket data.
    |
    |- OperationFailed - Tor was unable to successfully complete the operation.
    |  |- UnsatisfiableRequest - Tor was unable to satisfy a valid request.
    |  |  |- CircuitExtensionFailed - Attempt to make or extend a circuit failed.
    |  |  |- DescriptorUnavailable - The given relay descriptor is unavailable.
    |  |  +- Timeout - Caller requested timeout was reached.
    |  |
    |  |
    |  +- InvalidRequest - Invalid request.
    |     +- InvalidArguments - Invalid request parameters.
    |
    +- SocketError - Communication with the socket failed.
       +- SocketClosed - Socket has been shut down.

  DownloadFailed - Inability to download a resource.
    +- DownloadTimeout - Download timeout reached.

.. data:: Runlevel (enum)

  Rating of importance used for event logging.

  =========== ===========
  Runlevel    Description
  =========== ===========
  **ERR**     critical issues that impair tor's ability to function
  **WARN**    non-critical issues the user should be aware of
  **NOTICE**  information that may be helpful to the user
  **INFO**    high level runtime information
  **DEBUG**   low level runtime information
  =========== ===========

.. data:: Signal (enum)

  Signals that the tor process will accept.

  .. versionchanged:: 1.3.0
     Added the HEARTBEAT signal.

  .. versionchanged:: 1.8.0
     Added the ACTIVE and DORMANT signals. You can check for Tor support for
     these signals with the **DORMANT_MODE** :data:`~stem.version.Requirement`

  ========================= ===========
  Signal                    Description
  ========================= ===========
  **RELOAD** or **HUP**     reloads our torrc
  **SHUTDOWN** or **INT**   shut down, waiting ShutdownWaitLength first if we're a relay
  **DUMP** or **USR1**      dumps information about open connections and circuits to our log
  **DEBUG** or **USR2**     switch our logging to the DEBUG runlevel
  **HALT** or **TERM**      exit tor immediately
  **NEWNYM**                switch to new circuits, so new application requests don't share any circuits with old ones (this also clears our DNS cache)
  **CLEARDNSCACHE**         clears cached DNS results
  **HEARTBEAT**             trigger a heartbeat log message
  **DORMANT**               enables *dormant mode*, during which tor will avoid cpu and network usage
  **ACTIVE**                disables *dormant mode*
  ========================= ===========

.. data:: Flag (enum)

  Flag assigned to tor relays by the authorities to indicate various
  characteristics.

  **Note:** The BADDIRECTORY flag was `removed from tor <https://gitweb.torproject.org/torspec.git/commit/dir-spec.txt?id=2f012f1>`_.

  .. versionchanged:: 1.5.0
     Added the NO_ED_CONSENSUS flag.

  .. versionchanged:: 1.8.0
     Added the STALE_DESC flag.

  =================== ===========
  Flag                Description
  =================== ===========
  **AUTHORITY**       relay is a directory authority
  **BADEXIT**         relay shouldn't be used as an exit due to being either problematic or malicious
  **BADDIRECTORY**    relay shouldn't be used for directory information
  **EXIT**            relay's exit policy makes it more useful as an exit rather than middle hop
  **FAST**            relay's suitable for high-bandwidth circuits
  **GUARD**           relay's suitable for being an entry guard (first hop)
  **HSDIR**           relay is being used as a v2 hidden service directory
  **NAMED**           relay can be referred to by its nickname
  **NO_ED_CONSENSUS** relay's Ed25519 doesn't reflrect the consensus
  **RUNNING**         relay is currently usable
  **STABLE**          relay's suitable for long-lived circuits
  **STALE_DESC**      relay descriptor is outdated and should be re-uploaded
  **UNNAMED**         relay isn't currently bound to a nickname
  **V2DIR**           relay supports the v2 directory protocol
  **VALID**           relay has been validated
  =================== ===========

.. data:: CircStatus (enum)

  Statuses that a circuit can be in. Tor may provide statuses not in this enum.

  .. versionchanged:: 1.6.0
     Added the GUARD_WAIT signal.

  ============== ===========
  CircStatus     Description
  ============== ===========
  **LAUNCHED**   new circuit was created
  **BUILT**      circuit finished being created and can accept traffic
  **GUARD_WAIT** waiting to see if there's a circuit with a better guard before using
  **EXTENDED**   circuit has been extended by a hop
  **FAILED**     circuit construction failed
  **CLOSED**     circuit has been closed
  ============== ===========

.. data:: CircBuildFlag (enum)

  Attributes about how a circuit is built. These were introduced in tor version
  0.2.3.11. Tor may provide flags not in this enum.

  ================= ===========
  CircBuildFlag     Description
  ================= ===========
  **ONEHOP_TUNNEL** single hop circuit to fetch directory information
  **IS_INTERNAL**   circuit that won't be used for client traffic
  **NEED_CAPACITY** circuit only includes high capacity relays
  **NEED_UPTIME**   circuit only includes relays with a high uptime
  ================= ===========

.. data:: CircPurpose (enum)

  Description of what a circuit is intended for. These were introduced in tor
  version 0.2.1.6. Tor may provide purposes not in this enum.

  ==================== ===========
  CircPurpose          Description
  ==================== ===========
  **GENERAL**          client traffic or fetching directory information
  **HS_CLIENT_INTRO**  client side introduction point for a hidden service circuit
  **HS_CLIENT_REND**   client side hidden service rendezvous circuit
  **HS_SERVICE_INTRO** server side introduction point for a hidden service circuit
  **HS_SERVICE_REND**  server side hidden service rendezvous circuit
  **TESTING**          testing to see if we're reachable, so we can be used as a relay
  **CONTROLLER**       circuit that was built by a controller
  **MEASURE_TIMEOUT**  circuit being kept around to see how long it takes
  ==================== ===========

.. data:: CircClosureReason (enum)

  Reason that a circuit is being closed or failed to be established. Tor may
  provide reasons not in this enum.

  ========================= ===========
  CircClosureReason         Description
  ========================= ===========
  **NONE**                  no reason given
  **TORPROTOCOL**           violation in the tor protocol
  **INTERNAL**              internal error
  **REQUESTED**             requested by the client via a TRUNCATE command
  **HIBERNATING**           relay is currently hibernating
  **RESOURCELIMIT**         relay is out of memory, sockets, or circuit IDs
  **CONNECTFAILED**         unable to contact the relay
  **OR_IDENTITY**           relay had the wrong OR identification
  **OR_CONN_CLOSED**        connection failed after being established
  **FINISHED**              circuit has expired (see tor's MaxCircuitDirtiness config option)
  **TIMEOUT**               circuit construction timed out
  **DESTROYED**             circuit unexpectedly closed
  **NOPATH**                not enough relays to make a circuit
  **NOSUCHSERVICE**         requested hidden service does not exist
  **MEASUREMENT_EXPIRED**   same as **TIMEOUT** except that it was left open for measurement purposes
  ========================= ===========

.. data:: CircEvent (enum)

  Type of change reflected in a circuit by a CIRC_MINOR event. Tor may provide
  event types not in this enum.

  ===================== ===========
  CircEvent             Description
  ===================== ===========
  **PURPOSE_CHANGED**   circuit purpose or hidden service state has changed
  **CANNIBALIZED**      circuit connections are being reused for a different circuit
  ===================== ===========

.. data:: HiddenServiceState (enum)

  State that a hidden service circuit can have. These were introduced in tor
  version 0.2.3.11. Tor may provide states not in this enum.

  Enumerations fall into four groups based on their prefix...

  ======= ===========
  Prefix  Description
  ======= ===========
  HSCI_*  client-side introduction-point
  HSCR_*  client-side rendezvous-point
  HSSI_*  service-side introduction-point
  HSSR_*  service-side rendezvous-point
  ======= ===========

  ============================= ===========
  HiddenServiceState            Description
  ============================= ===========
  **HSCI_CONNECTING**           connecting to the introductory point
  **HSCI_INTRO_SENT**           sent INTRODUCE1 and awaiting a reply
  **HSCI_DONE**                 received a reply, circuit is closing
  **HSCR_CONNECTING**           connecting to the introductory point
  **HSCR_ESTABLISHED_IDLE**     rendezvous-point established, awaiting an introduction
  **HSCR_ESTABLISHED_WAITING**  introduction received, awaiting a rend
  **HSCR_JOINED**               connected to the hidden service
  **HSSI_CONNECTING**           connecting to the introductory point
  **HSSI_ESTABLISHED**          established introductory point
  **HSSR_CONNECTING**           connecting to the introductory point
  **HSSR_JOINED**               connected to the rendezvous-point
  ============================= ===========

.. data:: RelayEndReason (enum)

  Reasons why the stream is to be closed.

  =================== ===========
  RelayEndReason      Description
  =================== ===========
  **MISC**            none of the following reasons
  **RESOLVEFAILED**   unable to resolve the hostname
  **CONNECTREFUSED**  remote host refused the connection
  **EXITPOLICY**      OR refuses to connect to the destination
  **DESTROY**         circuit is being shut down
  **DONE**            connection has been closed
  **TIMEOUT**         connection timed out
  **NOROUTE**         routing error while contacting the destination
  **HIBERNATING**     relay is temporarily hibernating
  **INTERNAL**        internal error at the relay
  **RESOURCELIMIT**   relay has insufficient resources to service the request
  **CONNRESET**       connection was unexpectedly reset
  **TORPROTOCOL**     violation in the tor protocol
  **NOTDIRECTORY**    directory information requested from a relay that isn't mirroring it
  =================== ===========

.. data:: StreamStatus (enum)

  State that a stream going through tor can have. Tor may provide states not in
  this enum.

  ================= ===========
  StreamStatus      Description
  ================= ===========
  **NEW**           request for a new connection
  **NEWRESOLVE**    request to resolve an address
  **REMAP**         address is being re-mapped to another
  **SENTCONNECT**   sent a connect cell along a circuit
  **SENTRESOLVE**   sent a resolve cell along a circuit
  **SUCCEEDED**     stream has been established
  **FAILED**        stream is detached, and won't be re-established
  **DETACHED**      stream is detached, but might be re-established
  **CLOSED**        stream has closed
  ================= ===========

.. data:: StreamClosureReason (enum)

  Reason that a stream is being closed or failed to be established. This
  includes all values in the :data:`~stem.RelayEndReason` enumeration as
  well as the following. Tor may provide reasons not in this enum.

  ===================== ===========
  StreamClosureReason   Description
  ===================== ===========
  **END**               endpoint has sent a RELAY_END cell
  **PRIVATE_ADDR**      endpoint was a private address (127.0.0.1, 10.0.0.1, etc)
  ===================== ===========

.. data:: StreamSource (enum)

  Cause of a stream being remapped to another address. Tor may provide sources
  not in this enum.

  ============= ===========
  StreamSource  Description
  ============= ===========
  **CACHE**     tor is remapping because of a cached answer
  **EXIT**      exit relay requested the remap
  ============= ===========

.. data:: StreamPurpose (enum)

  Purpsoe of the stream. This is only provided with new streams and tor may
  provide purposes not in this enum.

  ================= ===========
  StreamPurpose     Description
  ================= ===========
  **DIR_FETCH**     fetching directory information (descriptors, consensus, etc)
  **DIR_UPLOAD**    uploading our descriptor to an authority
  **DNS_REQUEST**   user initiated DNS request
  **DIRPORT_TEST**  checking that our directory port is reachable externally
  **USER**          either relaying user traffic or not one of the above categories
  ================= ===========

.. data:: ORStatus (enum)

  State that an OR connection can have. Tor may provide states not in this
  enum.

  =============== ===========
  ORStatus        Description
  =============== ===========
  **NEW**         received OR connection, starting server-side handshake
  **LAUNCHED**    launched outbound OR connection, starting client-side handshake
  **CONNECTED**   OR connection has been established
  **FAILED**      attempt to establish OR connection failed
  **CLOSED**      OR connection has been closed
  =============== ===========

.. data:: ORClosureReason (enum)

  Reason that an OR connection is being closed or failed to be established. Tor
  may provide reasons not in this enum.

  =================== ===========
  ORClosureReason     Description
  =================== ===========
  **DONE**            OR connection shut down cleanly
  **CONNECTREFUSED**  got a ECONNREFUSED when connecting to the relay
  **IDENTITY**        identity of the relay wasn't what we expected
  **CONNECTRESET**    got a ECONNRESET or similar error from relay
  **TIMEOUT**         got a ETIMEOUT or similar error from relay
  **NOROUTE**         got a ENOTCONN, ENETUNREACH, ENETDOWN, EHOSTUNREACH, or similar error from relay
  **IOERROR**         got a different kind of error from relay
  **RESOURCELIMIT**   relay has insufficient resources to service the request
  **MISC**            connection refused for another reason
  **PT_MISSING**      no pluggable transport was available
  =================== ===========

.. data:: AuthDescriptorAction (enum)

  Actions that directory authorities might take with relay descriptors. Tor may
  provide reasons not in this enum.

  ===================== ===========
  AuthDescriptorAction  Description
  ===================== ===========
  **ACCEPTED**          accepting the descriptor as the newest version
  **DROPPED**           descriptor rejected without notifying the relay
  **REJECTED**          relay notified that its descriptor has been rejected
  ===================== ===========

.. data:: StatusType (enum)

  Sources for tor status events. Tor may provide types not in this enum.

  ============= ===========
  StatusType    Description
  ============= ===========
  **GENERAL**   general tor activity, not specifically as a client or relay
  **CLIENT**    related to our activity as a tor client
  **SERVER**    related to our activity as a tor relay
  ============= ===========

.. data:: GuardType (enum)

  Use a guard relay can be for. Tor may provide types not in this enum.

  =========== ===========
  GuardType   Description
  =========== ===========
  **ENTRY**   used to connect to the tor network
  =========== ===========

.. data:: GuardStatus (enum)

  Status a guard relay can have. Tor may provide types not in this enum.

  ============= ===========
  GuardStatus   Description
  ============= ===========
  **NEW**       new guard that we weren't previously using
  **DROPPED**   removed from use as one of our guards
  **UP**        guard is now reachable
  **DOWN**      guard is now unreachable
  **BAD**       consensus or relay considers this relay to be unusable as a guard
  **GOOD**      consensus or relay considers this relay to be usable as a guard
  ============= ===========

.. data:: TimeoutSetType (enum)

  Way in which the timeout value of a circuit is changing. Tor may provide
  types not in this enum.

  =============== ===========
  TimeoutSetType  Description
  =============== ===========
  **COMPUTED**    tor has computed a new timeout based on prior circuits
  **RESET**       timeout reverted to its default
  **SUSPENDED**   timeout reverted to its default until network connectivity has recovered
  **DISCARD**     throwing out timeout value from when the network was down
  **RESUME**      resumed calculations to determine the proper timeout
  =============== ===========

.. data:: ConnectionType (enum)

  Purpose for a tor connection. Tor may provide types not in this enum.

  The meaning behind these values is a bit unclear, pending :trac:`10086`.

  .. versionadded:: 1.2.0

  =============== ===========
  ConnectionType  Description
  =============== ===========
  **OR**          carrying traffic within the tor network
  **DIR**         fetching or sending tor descriptor data
  **EXIT**        carrying traffic between the tor network and an external destination
  =============== ===========

.. data:: TokenBucket (enum)

  Bucket categories of TB_EMPTY events.

  .. versionadded:: 1.2.0

  =============== ===========
  TokenBucket     Description
  =============== ===========
  **GLOBAL**      global token bucket
  **RELAY**       relay token bucket
  **ORCONN**      bucket used for OR connections
  =============== ===========

.. data:: HSDescAction (enum)

  Action beeing taken in a HS_DESC event.

  .. versionadded:: 1.2.0

  .. versionchanged:: 1.4.0
     Added the UPLOAD and UPLOADED actions.

  .. versionchanged:: 1.5.0
     Added the CREATED action.

  =============== ===========
  HSDescAction    Description
  =============== ===========
  **REQUESTED**   uncached hidden service descriptor is being requested
  **UPLOAD**      descriptor is being uploaded with HSPOST
  **RECEIVED**    hidden service descriptor has been retrieved
  **UPLOADED**    descriptor was uploaded with HSPOST
  **IGNORE**      fetched descriptor was ignored because we already have its v0 descriptor
  **FAILED**      we were unable to retrieve the descriptor
  **CREATED**     hidden service descriptor was just created
  =============== ===========

.. data:: HSDescReason (enum)

  Reason for the hidden service descriptor to fail to be fetched.

  .. versionadded:: 1.3.0

  .. versionchanged:: 1.4.0
     Added the UPLOAD_REJECTED reason.

  .. versionchanged:: 1.6.0
     Added the QUERY_NO_HSDIR reason.

  .. versionchanged:: 1.8.0
     Added the QUERY_RATE_LIMITED reason.

  ======================= ===========
  HSDescReason            Description
  ======================= ===========
  **BAD_DESC**            descriptor was unparseable
  **QUERY_REJECTED**      hidden service directory refused to provide the descriptor
  **UPLOAD_REJECTED**     descriptor was rejected by the hidden service directory
  **NOT_FOUND**           descriptor with the given identifier wasn't found
  **QUERY_NO_HSDIR**      no hidden service directory was found
  **QUERY_RATE_LIMITED**  request was throttled
  **UNEXPECTED**          failure type is unknown
  ======================= ===========

.. data:: HSAuth (enum)

  Type of authentication being used for a HS_DESC event.

  .. versionadded:: 1.2.0

  ================= ===========
  HSAuth            Description
  ================= ===========
  **NO_AUTH**       no authentication
  **BASIC_AUTH**    general hidden service authentication
  **STEALTH_AUTH**  authentication method that hides service activity from unauthorized clients
  **UNKNOWN**       unrecognized method of authentication
  ================= ===========
"""

import traceback

import stem.util
import stem.util.enum

__version__ = '1.8.1-maint'
__author__ = 'Damian Johnson'
__contact__ = 'atagar@torproject.org'
__url__ = 'https://stem.torproject.org/'
__license__ = 'LGPLv3'

__all__ = [
  'client',
  'descriptor',
  'response',
  'util',
  'connection',
  'control',
  'directory',
  'exit_policy',
  'prereq',
  'process',
  'socket',
  'version',
  'ControllerError',
  'ProtocolError',
  'OperationFailed',
  'UnsatisfiableRequest',
  'CircuitExtensionFailed',
  'DescriptorUnavailable',
  'Timeout',
  'InvalidRequest',
  'InvalidArguments',
  'SocketError',
  'SocketClosed',
  'DownloadFailed',
  'DownloadTimeout',
  'Runlevel',
  'Signal',
  'Flag',
  'CircStatus',
  'CircBuildFlag',
  'CircPurpose',
  'CircClosureReason',
  'CircEvent',
  'HiddenServiceState',
  'HSAuth',
  'HSDescAction',
  'HSDescReason',
  'RelayEndReason',
  'StreamStatus',
  'StreamClosureReason',
  'StreamSource',
  'StreamPurpose',
  'ORStatus',
  'ORClosureReason',
  'AuthDescriptorAction',
  'StatusType',
  'GuardType',
  'GuardStatus',
  'TimeoutSetType',
]

# Constant that we use by default for our User-Agent when downloading descriptors
stem.USER_AGENT = 'Stem/%s' % __version__

# Constant to indicate an undefined argument default. Usually we'd use None for
# this, but users will commonly provide None as the argument so need something
# else fairly unique...

UNDEFINED = '<Undefined_ >'


class Endpoint(object):
  """
  Tor endpint that can be connected to.

  .. versionadded:: 1.7.0

  :var str address: ip address of the endpoint
  :var int port: port of the endpoint
  """

  def __init__(self, address, port):
    if not stem.util.connection.is_valid_ipv4_address(address) and not stem.util.connection.is_valid_ipv6_address(address):
      raise ValueError("'%s' isn't a valid IPv4 or IPv6 address" % address)
    elif not stem.util.connection.is_valid_port(port):
      raise ValueError("'%s' isn't a valid port" % port)

    self.address = address
    self.port = int(port)

  def __hash__(self):
    return stem.util._hash_attr(self, 'address', 'port', cache = True)

  def __eq__(self, other):
    return hash(self) == hash(other) if isinstance(other, Endpoint) else False

  def __ne__(self, other):
    return not self == other


class ORPort(Endpoint):
  """
  Tor relay's ORPort. The endpoint on which Tor accepts relay traffic.

  :var list link_protocols: link protocol version we're willing to establish
  """

  def __init__(self, address, port, link_protocols = None):
    super(ORPort, self).__init__(address, port)
    self.link_protocols = link_protocols

  def __hash__(self):
    return stem.util._hash_attr(self, 'link_protocols', parent = Endpoint, cache = True)


class DirPort(Endpoint):
  """
  Tor relay's DirPort. The endpoint on which Tor provides http access for
  downloading descriptors.
  """


[docs]class ControllerError(Exception): 'Base error for controller communication issues.'
[docs]class ProtocolError(ControllerError): 'Malformed content from the control socket.'
[docs]class OperationFailed(ControllerError): """ Base exception class for failed operations that return an error code :var str code: error code returned by Tor :var str message: error message returned by Tor or a human readable error message """ def __init__(self, code = None, message = None): super(ControllerError, self).__init__(message) self.code = code self.message = message
[docs]class UnsatisfiableRequest(OperationFailed): """ Exception raised if Tor was unable to process our request. """
[docs]class CircuitExtensionFailed(UnsatisfiableRequest): """ An attempt to create or extend a circuit failed. :var stem.response.CircuitEvent circ: response notifying us of the failure """ def __init__(self, message, circ = None): super(CircuitExtensionFailed, self).__init__(message = message) self.circ = circ
[docs]class DescriptorUnavailable(UnsatisfiableRequest): """ Tor was unable to provide a descriptor for the given relay. .. versionchanged:: 1.7.0 Subclassed under UnsatisfiableRequest rather than OperationFailed. """ def __init__(self, message): super(DescriptorUnavailable, self).__init__(message = message)
[docs]class Timeout(UnsatisfiableRequest): """ Timeout requested by the caller was reached. .. versionadded:: 1.7.0 """ def __init__(self, message): super(Timeout, self).__init__(message = message)
[docs]class InvalidRequest(OperationFailed): """ Exception raised when the request was invalid or malformed. """
[docs]class InvalidArguments(InvalidRequest): """ Exception class for requests which had invalid arguments. :var str code: error code returned by Tor :var str message: error message returned by Tor or a human readable error message :var list arguments: a list of arguments which were invalid """ def __init__(self, code = None, message = None, arguments = None): super(InvalidArguments, self).__init__(code, message) self.arguments = arguments
[docs]class SocketError(ControllerError): 'Error arose while communicating with the control socket.'
[docs]class SocketClosed(SocketError): 'Control socket was closed before completing the message.'
[docs]class DownloadFailed(IOError): """ Inability to download a resource. Python's urllib module raises a wide variety of undocumented exceptions (urllib2.URLError, socket.timeout, and others). This wraps lower level failures in a common exception type that retains their exception and `stacktrace <https://docs.python.org/3/library/traceback.html>`_. .. versionadded:: 1.8.0 :var str url: url we failed to download from :var Exception error: original urllib exception :var traceback stacktrace: original stacktrace :var str stacktrace_str: string representation of the stacktrace """ def __init__(self, url, error, stacktrace, message = None): if message is None: # The string representation of exceptions can reside in several places. # urllib.URLError use a 'reason' attribute that in turn may referrence # low level structures such as socket.gaierror. Whereas most exceptions # use a 'message' attribute. reason = str(error) all_str_repr = ( getattr(getattr(error, 'reason', None), 'strerror', None), getattr(error, 'reason', None), getattr(error, 'message', None), ) for str_repr in all_str_repr: if str_repr and isinstance(str_repr, str): reason = str_repr break message = 'Failed to download from %s (%s): %s' % (url, type(error).__name__, reason) super(DownloadFailed, self).__init__(message) self.url = url self.error = error self.stacktrace = stacktrace self.stacktrace_str = ''.join(traceback.format_tb(stacktrace))
[docs]class DownloadTimeout(DownloadFailed): """ Timeout reached while downloading this resource. .. versionadded:: 1.8.0 """ def __init__(self, url, error, stacktrace, timeout): message = 'Failed to download from %s: %0.1f second timeout reached' % (url, timeout) super(DownloadTimeout, self).__init__(url, error, stacktrace, message)
Runlevel = stem.util.enum.UppercaseEnum( 'DEBUG', 'INFO', 'NOTICE', 'WARN', 'ERR', ) Flag = stem.util.enum.Enum( ('AUTHORITY', 'Authority'), ('BADEXIT', 'BadExit'), ('BADDIRECTORY', 'BadDirectory'), ('EXIT', 'Exit'), ('FAST', 'Fast'), ('GUARD', 'Guard'), ('HSDIR', 'HSDir'), ('NAMED', 'Named'), ('NO_ED_CONSENSUS', 'NoEdConsensus'), ('RUNNING', 'Running'), ('STABLE', 'Stable'), ('STALE_DESC', 'StaleDesc'), ('UNNAMED', 'Unnamed'), ('V2DIR', 'V2Dir'), ('V3DIR', 'V3Dir'), ('VALID', 'Valid'), ) Signal = stem.util.enum.UppercaseEnum( 'RELOAD', 'HUP', 'SHUTDOWN', 'INT', 'DUMP', 'USR1', 'DEBUG', 'USR2', 'HALT', 'TERM', 'NEWNYM', 'CLEARDNSCACHE', 'HEARTBEAT', 'ACTIVE', 'DORMANT', ) CircStatus = stem.util.enum.UppercaseEnum( 'LAUNCHED', 'BUILT', 'GUARD_WAIT', 'EXTENDED', 'FAILED', 'CLOSED', ) CircBuildFlag = stem.util.enum.UppercaseEnum( 'ONEHOP_TUNNEL', 'IS_INTERNAL', 'NEED_CAPACITY', 'NEED_UPTIME', ) CircPurpose = stem.util.enum.UppercaseEnum( 'GENERAL', 'HS_CLIENT_INTRO', 'HS_CLIENT_REND', 'HS_SERVICE_INTRO', 'HS_SERVICE_REND', 'TESTING', 'CONTROLLER', 'MEASURE_TIMEOUT', ) CircClosureReason = stem.util.enum.UppercaseEnum( 'NONE', 'TORPROTOCOL', 'INTERNAL', 'REQUESTED', 'HIBERNATING', 'RESOURCELIMIT', 'CONNECTFAILED', 'OR_IDENTITY', 'OR_CONN_CLOSED', 'FINISHED', 'TIMEOUT', 'DESTROYED', 'NOPATH', 'NOSUCHSERVICE', 'MEASUREMENT_EXPIRED', ) CircEvent = stem.util.enum.UppercaseEnum( 'PURPOSE_CHANGED', 'CANNIBALIZED', ) HiddenServiceState = stem.util.enum.UppercaseEnum( 'HSCI_CONNECTING', 'HSCI_INTRO_SENT', 'HSCI_DONE', 'HSCR_CONNECTING', 'HSCR_ESTABLISHED_IDLE', 'HSCR_ESTABLISHED_WAITING', 'HSCR_JOINED', 'HSSI_CONNECTING', 'HSSI_ESTABLISHED', 'HSSR_CONNECTING', 'HSSR_JOINED', ) RelayEndReason = stem.util.enum.UppercaseEnum( 'MISC', 'RESOLVEFAILED', 'CONNECTREFUSED', 'EXITPOLICY', 'DESTROY', 'DONE', 'TIMEOUT', 'NOROUTE', 'HIBERNATING', 'INTERNAL', 'RESOURCELIMIT', 'CONNRESET', 'TORPROTOCOL', 'NOTDIRECTORY', ) StreamStatus = stem.util.enum.UppercaseEnum( 'NEW', 'NEWRESOLVE', 'REMAP', 'SENTCONNECT', 'SENTRESOLVE', 'SUCCEEDED', 'FAILED', 'DETACHED', 'CLOSED', ) # StreamClosureReason is a superset of RelayEndReason StreamClosureReason = stem.util.enum.UppercaseEnum(*(RelayEndReason.keys() + [ 'END', 'PRIVATE_ADDR', ])) StreamSource = stem.util.enum.UppercaseEnum( 'CACHE', 'EXIT', ) StreamPurpose = stem.util.enum.UppercaseEnum( 'DIR_FETCH', 'DIR_UPLOAD', 'DNS_REQUEST', 'DIRPORT_TEST', 'USER', ) ORStatus = stem.util.enum.UppercaseEnum( 'NEW', 'LAUNCHED', 'CONNECTED', 'FAILED', 'CLOSED', ) ORClosureReason = stem.util.enum.UppercaseEnum( 'DONE', 'CONNECTREFUSED', 'IDENTITY', 'CONNECTRESET', 'TIMEOUT', 'NOROUTE', 'IOERROR', 'RESOURCELIMIT', 'MISC', 'PT_MISSING', ) AuthDescriptorAction = stem.util.enum.UppercaseEnum( 'ACCEPTED', 'DROPPED', 'REJECTED', ) StatusType = stem.util.enum.UppercaseEnum( 'GENERAL', 'CLIENT', 'SERVER', ) GuardType = stem.util.enum.UppercaseEnum( 'ENTRY', ) GuardStatus = stem.util.enum.UppercaseEnum( 'NEW', 'UP', 'DOWN', 'BAD', 'GOOD', 'DROPPED', ) TimeoutSetType = stem.util.enum.UppercaseEnum( 'COMPUTED', 'RESET', 'SUSPENDED', 'DISCARD', 'RESUME', ) ConnectionType = stem.util.enum.UppercaseEnum( 'OR', 'DIR', 'EXIT', ) TokenBucket = stem.util.enum.UppercaseEnum( 'GLOBAL', 'RELAY', 'ORCONN', ) HSDescAction = stem.util.enum.UppercaseEnum( 'REQUESTED', 'UPLOAD', 'RECEIVED', 'UPLOADED', 'IGNORE', 'FAILED', 'CREATED', ) HSDescReason = stem.util.enum.UppercaseEnum( 'BAD_DESC', 'QUERY_REJECTED', 'UPLOAD_REJECTED', 'NOT_FOUND', 'QUERY_NO_HSDIR', 'UNEXPECTED', ) HSAuth = stem.util.enum.UppercaseEnum( 'NO_AUTH', 'BASIC_AUTH', 'STEALTH_AUTH', 'UNKNOWN', ) import stem.util.connection # importing afterward to avoid circular dependency