Full Code of Supervisor/supervisor for AI

main abc60468ea4b cached
135 files
1.7 MB
397.7k tokens
3224 symbols
1 requests
Download .txt
Showing preview only (1,774K chars total). Download the full file or copy to clipboard to get everything.
Repository: Supervisor/supervisor
Branch: main
Commit: abc60468ea4b
Files: 135
Total size: 1.7 MB

Directory structure:
gitextract_lqosy3py/

├── .github/
│   └── workflows/
│       └── main.yml
├── .gitignore
├── .readthedocs.yaml
├── CHANGES.rst
├── COPYRIGHT.txt
├── LICENSES.txt
├── MANIFEST.in
├── README.rst
├── docs/
│   ├── .static/
│   │   └── repoze.css
│   ├── Makefile
│   ├── api.rst
│   ├── conf.py
│   ├── configuration.rst
│   ├── development.rst
│   ├── events.rst
│   ├── faq.rst
│   ├── glossary.rst
│   ├── index.rst
│   ├── installing.rst
│   ├── introduction.rst
│   ├── logging.rst
│   ├── plugins.rst
│   ├── running.rst
│   ├── subprocess.rst
│   ├── upgrading.rst
│   └── xmlrpc.rst
├── setup.cfg
├── setup.py
├── supervisor/
│   ├── __init__.py
│   ├── childutils.py
│   ├── compat.py
│   ├── confecho.py
│   ├── datatypes.py
│   ├── dispatchers.py
│   ├── events.py
│   ├── http.py
│   ├── http_client.py
│   ├── loggers.py
│   ├── medusa/
│   │   ├── CHANGES.txt
│   │   ├── LICENSE.txt
│   │   ├── README.txt
│   │   ├── TODO.txt
│   │   ├── __init__.py
│   │   ├── asynchat_25.py
│   │   ├── asyncore_25.py
│   │   ├── auth_handler.py
│   │   ├── counter.py
│   │   ├── default_handler.py
│   │   ├── docs/
│   │   │   ├── README.html
│   │   │   ├── async_blurbs.txt
│   │   │   ├── data_flow.html
│   │   │   ├── programming.html
│   │   │   ├── proxy_notes.txt
│   │   │   ├── threads.txt
│   │   │   └── tkinter.txt
│   │   ├── filesys.py
│   │   ├── http_date.py
│   │   ├── http_server.py
│   │   ├── logger.py
│   │   ├── producers.py
│   │   ├── util.py
│   │   └── xmlrpc_handler.py
│   ├── options.py
│   ├── pidproxy.py
│   ├── poller.py
│   ├── process.py
│   ├── rpcinterface.py
│   ├── skel/
│   │   └── sample.conf
│   ├── socket_manager.py
│   ├── states.py
│   ├── supervisorctl.py
│   ├── supervisord.py
│   ├── templating.py
│   ├── tests/
│   │   ├── __init__.py
│   │   ├── base.py
│   │   ├── fixtures/
│   │   │   ├── donothing.conf
│   │   │   ├── example/
│   │   │   │   └── included.conf
│   │   │   ├── hello.sh
│   │   │   ├── include.conf
│   │   │   ├── issue-1054.conf
│   │   │   ├── issue-1170a.conf
│   │   │   ├── issue-1170b.conf
│   │   │   ├── issue-1170c.conf
│   │   │   ├── issue-1224.conf
│   │   │   ├── issue-1231a.conf
│   │   │   ├── issue-1231b.conf
│   │   │   ├── issue-1231c.conf
│   │   │   ├── issue-1298.conf
│   │   │   ├── issue-1483a.conf
│   │   │   ├── issue-1483b.conf
│   │   │   ├── issue-1483c.conf
│   │   │   ├── issue-1596.conf
│   │   │   ├── issue-291a.conf
│   │   │   ├── issue-550.conf
│   │   │   ├── issue-565.conf
│   │   │   ├── issue-638.conf
│   │   │   ├── issue-663.conf
│   │   │   ├── issue-664.conf
│   │   │   ├── issue-733.conf
│   │   │   ├── issue-835.conf
│   │   │   ├── issue-836.conf
│   │   │   ├── issue-986.conf
│   │   │   ├── listener.py
│   │   │   ├── print_env.py
│   │   │   ├── spew.py
│   │   │   ├── test_1231.py
│   │   │   └── unkillable_spew.py
│   │   ├── test_childutils.py
│   │   ├── test_confecho.py
│   │   ├── test_datatypes.py
│   │   ├── test_dispatchers.py
│   │   ├── test_end_to_end.py
│   │   ├── test_events.py
│   │   ├── test_http.py
│   │   ├── test_http_client.py
│   │   ├── test_loggers.py
│   │   ├── test_options.py
│   │   ├── test_pidproxy.py
│   │   ├── test_poller.py
│   │   ├── test_process.py
│   │   ├── test_rpcinterfaces.py
│   │   ├── test_socket_manager.py
│   │   ├── test_states.py
│   │   ├── test_supervisorctl.py
│   │   ├── test_supervisord.py
│   │   ├── test_templating.py
│   │   ├── test_web.py
│   │   └── test_xmlrpc.py
│   ├── ui/
│   │   ├── status.html
│   │   ├── stylesheets/
│   │   │   └── supervisor.css
│   │   └── tail.html
│   ├── version.txt
│   ├── web.py
│   └── xmlrpc.py
└── tox.ini

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/workflows/main.yml
================================================
name: Run all tests

on: [push, pull_request]

env:
  PIP: "env PIP_DISABLE_PIP_VERSION_CHECK=1
            PYTHONWARNINGS=ignore:DEPRECATION
            pip --no-cache-dir"

jobs:
  tests_py2x:
    runs-on: ubuntu-22.04
    container:
      image: python:2.7
    strategy:
      fail-fast: false
      matrix:
        toxenv: [py27, py27-configparser]

    steps:
    - uses: actions/checkout@v4

    - name: Install dependencies
      run: $PIP install virtualenv tox

    - name: Run the unit tests
      run: TOXENV=${{ matrix.toxenv }} tox

    - name: Run the end-to-end tests
      run: TOXENV=${{ matrix.toxenv }} END_TO_END=1 tox

  tests_py34:
    runs-on: ubuntu-22.04
    container:
      image: ubuntu:20.04
      env:
        LANG: C.UTF-8

    steps:
    - uses: actions/checkout@v4

    - name: Install build dependencies
      run: |
        apt-get update
        apt-get install -y build-essential unzip wget \
                           libncurses5-dev libgdbm-dev libnss3-dev \
                           libreadline-dev zlib1g-dev

    - name: Build OpenSSL 1.0.2 (required by Python 3.4)
      run: |
        cd $RUNNER_TEMP
        wget https://github.com/openssl/openssl/releases/download/OpenSSL_1_0_2u/openssl-1.0.2u.tar.gz
        tar -xf openssl-1.0.2u.tar.gz
        cd openssl-1.0.2u
        ./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl shared zlib-dynamic
        make
        make install

        echo CFLAGS="-I/usr/local/ssl/include $CFLAGS" >> $GITHUB_ENV
        echo LDFLAGS="-L/usr/local/ssl/lib $LDFLAGS" >> $GITHUB_ENV
        echo LD_LIBRARY_PATH="/usr/local/ssl/lib:$LD_LIBRARY_PATH" >> $GITHUB_ENV

        ln -s /usr/local/ssl/lib/libssl.so.1.0.0 /usr/lib/libssl.so.1.0.0
        ln -s /usr/local/ssl/lib/libcrypto.so.1.0.0 /usr/lib/libcrypto.so.1.0.0
        ldconfig

    - name: Build Python 3.4
      run: |
        cd $RUNNER_TEMP
        wget -O cpython-3.4.10.zip https://github.com/python/cpython/archive/refs/tags/v3.4.10.zip
        unzip cpython-3.4.10.zip
        cd cpython-3.4.10
        ./configure --with-ensurepip=install
        make
        make install

        python3.4 --version
        python3.4 -c 'import ssl'
        pip3.4 --version

        ln -s /usr/local/bin/python3.4 /usr/local/bin/python
        ln -s /usr/local/bin/pip3.4 /usr/local/bin/pip

    - name: Install Python dependencies
      run: |
        $PIP install virtualenv==20.4.7 tox==3.14.0

    - name: Run the unit tests
      run: TOXENV=py34 tox

    - name: Run the end-to-end tests
      run: TOXENV=py34 END_TO_END=1 tox

  tests_py35:
    runs-on: ubuntu-22.04
    container:
      image: python:3.5
    strategy:
      fail-fast: false

    steps:
    - uses: actions/checkout@v4

    - name: Install dependencies
      run: $PIP install virtualenv tox

    - name: Run the unit tests
      run: TOXENV=py35 tox

    - name: Run the end-to-end tests
      run: TOXENV=py35 END_TO_END=1 tox

  tests_py36:
    runs-on: ubuntu-22.04
    container:
      image: python:3.6
    strategy:
      fail-fast: false

    steps:
    - uses: actions/checkout@v4

    - name: Install dependencies
      run: $PIP install virtualenv tox

    - name: Run the unit tests
      run: TOXENV=py36 tox

    - name: Run the end-to-end tests
      run: TOXENV=py36 END_TO_END=1 tox

  tests_py3x:
    runs-on: ubuntu-22.04
    strategy:
      fail-fast: false
      matrix:
        python-version: [3.7, 3.8, 3.9, "3.10", 3.11, 3.12, 3.13, 3.14]

    steps:
    - uses: actions/checkout@v4

    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v5
      with:
        python-version: ${{ matrix.python-version }}

    - name: Install dependencies
      run: $PIP install virtualenv tox

    - name: Set variable for TOXENV based on Python version
      id: toxenv
      run: python -c 'import sys; print("TOXENV=py%d%d" % (sys.version_info.major, sys.version_info.minor))' | tee -a $GITHUB_OUTPUT

    - name: Run the unit tests
      run: TOXENV=${{steps.toxenv.outputs.TOXENV}} tox

    - name: Run the end-to-end tests
      run: TOXENV=${{steps.toxenv.outputs.TOXENV}} END_TO_END=1 tox

  coverage_py27:
    runs-on: ubuntu-22.04
    container:
      image: python:2.7
    strategy:
      fail-fast: false

    steps:
    - uses: actions/checkout@v4

    - name: Install dependencies
      run: $PIP install virtualenv tox

    - name: Run unit test coverage
      run: TOXENV=cover tox

  coverage_py3x:
    runs-on: ubuntu-22.04
    strategy:
      fail-fast: false
      matrix:
        python-version: [3.8]

    steps:
    - uses: actions/checkout@v4

    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v5
      with:
        python-version: ${{ matrix.python-version }}

    - name: Install dependencies
      run: $PIP install virtualenv tox

    - name: Run unit test coverage
      run: TOXENV=cover3 tox

  docs:
    runs-on: ubuntu-22.04

    steps:
    - uses: actions/checkout@v4

    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v5
      with:
        python-version: "3.8"

    - name: Install dependencies
      run: $PIP install virtualenv tox>=4.0.0

    - name: Build the docs
      run: TOXENV=docs tox


================================================
FILE: .gitignore
================================================
*~
*.egg
*.egg-info
*.log
*.pyc
*.pyo
*.swp
*.pss
.DS_Store
.coverage*
.eggs/
.pytest_cache/
.tox/
build/
docs/.build/
dist/
env*/
venv*/
htmlcov/
tmp/
coverage.xml
nosetests.xml
.cache/


================================================
FILE: .readthedocs.yaml
================================================
# .readthedocs.yaml
# Read the Docs configuration file
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details

# Required
version: 2

# Set the version of Python and other tools you might need
build:
  os: ubuntu-22.04
  tools:
    python: "3.11"

# Build documentation in the docs/ directory with Sphinx
sphinx:
  configuration: docs/conf.py

# We recommend specifying your dependencies to enable reproducible builds:
# https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html
# python:
#   install:
#   - requirements: docs/requirements.txt



================================================
FILE: CHANGES.rst
================================================
4.4.0.dev0 (Next Release)
-------------------------

- Fixed a bug where ``supervisord`` would wait 1 second on startup before
  starting any programs.  Patch by Stepan Blyshchak.

- Fixed a bug where the XML-RPC method ``supervisor.getAllConfigInfo()``
  did not return the value of the ``autorestart`` program option.

- Fixed a bug where an escaped percent sign (``%%``) could not be used
  in ``environment=`` in the ``[supervisord]`` section of the config file.
  The bug did not affect ``[program:x]`` sections, where an escaped
  percent sign in ``environment=`` already worked.  Patch by yuk1pedia.

- Parsing ``environment=`` in the config file now uses ``shlex`` in POSIX
  mode instead of legacy mode to allow for escaped quotes in the values.
  However, on Python 2 before 2.7.13 and Python 3 before 3.5.3, POSIX mode
  can't be used because of a `bug <https://bugs.python.org/issue21999>`_
  in ``shlex``.  If ``supervisord`` is run on a Python version with the bug,
  it will fall back to legacy mode.  Patch by Stefan Friesel.

- The old example scripts in the ``supervisor/scripts/`` directory of
  the package, which were largely undocumented, had no test coverage, and
  were last updated over a decade ago, have been removed.

- When importing a plugin fails, the error message printed by ``supervisord``
  now includes the Python exception message for easier debugging.
  Patch by Sandro Jäckel.

4.3.0 (2025-08-23)
------------------

- Fixed a bug where the poller would not unregister a closed
  file descriptor under some circumstances, which caused excessive
  polling, resulting in higher CPU usage.  Patch by aftersnow.

- Fixed a bug where restarting ``supervisord`` may have failed with
  the message ``Error: Another program is already listening
  on a port that one of our HTTP servers is configured to use.``
  if an HTTP request was made during restart.  Patch by Julien Le Cléach.

- Fixed a unit test that failed only on Python 3.13.  Only test code was
  changed; no changes to ``supervisord`` itself.  Patch by Colin Watson.

- On Python 3.8 and later, ``setuptools`` is no longer a runtime
  dependency.  Patch by Ofek Lev.

- On Python versions before 3.8, ``setuptools`` is still a runtime
  dependency (for ``pkg_resources``) but it is no longer declared in
  ``setup.py`` as such.  This is because adding a conditional dependency
  with an environment marker (``setuptools; python_version < '3.8'``)
  breaks installation in some scenarios, e.g. ``setup.py install`` or
  older versions of ``pip``.  Ensure that ``setuptools`` is installed
  if using Python before 3.8.

4.2.5 (2022-12-23)
------------------

- Fixed a bug where the XML-RPC method ``supervisor.startProcess()`` would
  return 500 Internal Server Error instead of an XML-RPC fault response
  if the command could not be parsed.  Patch by Julien Le Cléach.

- Fixed a bug on Python 2.7 where a ``UnicodeDecodeError`` may have occurred
  when using the web interface.  Patch by Vinay Sajip.

- Removed use of ``urllib.parse`` functions ``splithost``, ``splitport``, and
  ``splittype`` deprecated in Python 3.8.

- Removed use of ``asynchat`` and ``asyncore`` deprecated in Python 3.10.

- The return value of the XML-RPC method ``supervisor.getAllConfigInfo()``
  now includes the ``directory``, ``uid``, and ``serverurl`` of the
  program.  Patch by Yellmean.

- If a subprocess exits with a unexpected exit code (one not listed in
  ``exitcodes=`` in a ``[program:x]`` section) then the exit will now be logged
  at the ``WARN`` level instead of ``INFO``.  Patch by Precy Lee.

- ``supervisorctl shutdown`` now shows an error message if an argument is
  given.

- File descriptors are now closed using the faster ``os.closerange()`` instead
  of calling ``os.close()`` in a loop.  Patch by tyong920.

4.2.4 (2021-12-30)
------------------

- Fixed a bug where the ``--identifier`` command line argument was ignored.
  It was broken since at least 3.0a7 (released in 2009) and probably earlier.
  Patch by Julien Le Cléach.

4.2.3 (2021-12-27)
------------------

- Fixed a race condition where an ``rpcinterface`` extension that subscribed
  to events would not see the correct process state if it accessed the
  the ``state`` attribute on a ``Subprocess`` instance immediately in the
  event callback.  Patch by Chao Wang.

- Added the ``setuptools`` package to the list of dependencies in
  ``setup.py`` because it is a runtime dependency.  Patch by Louis Sautier.

- The web interface will now return a 404 Not Found response if a log file
  is missing.  Previously, it would return 410 Gone.  It was changed because
  410 is intended to mean that the condition is likely to be permanent.  A
  log file missing is usually temporary, e.g. a process that was never started
  will not have a log file but will have one as soon as it is started.

4.2.2 (2021-02-26)
------------------

- Fixed a bug where ``supervisord`` could crash if a subprocess exited
  immediately before trying to kill it.

- Fixed a bug where the ``stdout_syslog`` and ``stderr_syslog`` options
  of a ``[program:x]`` section could not be used unless file logging for
  the same program had also been configured.  The file and syslog options
  can now be used independently.  Patch by Scott Stroupe.

- Fixed a bug where the ``logfile`` option in the ``[supervisord]``
  section would not log to syslog when the special filename of
  ``syslog`` was supplied, as is supported by all other log filename
  options.  Patch by Franck Cuny.

- Fixed a bug where environment variables defined in ``environment=``
  in the ``[supervisord]`` section or a ``[program:x]`` section could
  not be used in ``%(ENV_x)s`` expansions.  Patch by MythRen.

- The  ``supervisorctl signal`` command now allows a signal to be sent
  when a process is in the ``STOPPING`` state.  Patch by Mike Gould.

- ``supervisorctl`` and ``supervisord`` now print help when given ``-?``
  in addition to the existing ``-h``/``--help``.

4.2.1 (2020-08-20)
------------------

- Fixed a bug on Python 3 where a network error could cause ``supervisord``
  to crash with the error ``<class 'TypeError'>:can't concat str to bytes``.
  Patch by Vinay Sajip.

- Fixed a bug where a test would fail on systems with glibc 2.3.1 because
  the default value of SOMAXCONN changed.

4.2.0 (2020-04-30)
------------------

- When ``supervisord`` is run in the foreground, a new ``--silent`` option
  suppresses the main log from being echoed to ``stdout`` as it normally
  would.  Patch by Trevor Foster.

- Parsing ``command=`` now supports a new expansion, ``%(numprocs)d``, that
  expands to the value of ``numprocs=`` in the same section.  Patch by
  Santjago Corkez.

- Web UI buttons no longer use background images.  Patch by Dmytro Karpovych.

- The Web UI now has a link to view ``tail -f stderr`` for a process in
  addition to the existing ``tail -f stdout`` link.  Based on a
  patch by OuroborosCoding.

- The HTTP server will now send an ``X-Accel-Buffering: no`` header in
  logtail responses to fix Nginx proxy buffering.  Patch by Weizhao Li.

- When ``supervisord`` reaps an unknown PID, it will now log a description
  of the ``waitpid`` status.  Patch by Andrey Zelenchuk.

- Fixed a bug introduced in 4.0.3 where ``supervisorctl tail -f foo | grep bar``
  would fail with the error ``NoneType object has no attribute 'lower'``.  This
  only occurred on Python 2.7 and only when piped.  Patch by Slawa Pidgorny.

4.1.0 (2019-10-19)
------------------

- Fixed a bug on Python 3 only where logging to syslog did not work and
  would log the exception ``TypeError: a bytes-like object is required, not 'str'``
  to the main ``supervisord`` log file.  Patch by Vinay Sajip and Josh Staley.

- Fixed a Python 3.8 compatibility issue caused by the removal of
  ``cgi.escape()``.  Patch by Mattia Procopio.

- The ``meld3`` package is no longer a dependency.  A version of ``meld3``
  is now included within the ``supervisor`` package itself.

4.0.4 (2019-07-15)
------------------

- Fixed a bug where ``supervisorctl tail <name> stdout`` would actually tail
  ``stderr``.  Note that ``tail <name>`` without the explicit ``stdout``
  correctly tailed ``stdout``.  The bug existed since 3.0a3 (released in
  2007).  Patch by Arseny Hofman.

- Improved the warning message added in 4.0.3 so it is now emitted for
  both ``tail`` and ``tail -f``.  Patch by Vinay Sajip.

- CVE-2019-12105.  Documentation addition only, no code changes.  This CVE
  states that ``inet_http_server`` does not use authentication by default
  (`details <https://github.com/Supervisor/supervisor/issues/1245>`_).  Note that
  ``inet_http_server`` is not enabled by default, and is also not enabled
  in the example configuration output by ``echo_supervisord_conf``.  The
  behavior of the ``inet_http_server`` options have been correctly documented,
  and have not changed, since the feature was introduced in 2006.  A new
  `warning message <https://github.com/Supervisor/supervisor/commit/4e334d9cf2a1daff685893e35e72398437df3dcb>`_
  was added to the documentation.

4.0.3 (2019-05-22)
------------------

- Fixed an issue on Python 2 where running ``supervisorctl tail -f <name>``
  would fail with the message
  ``Cannot connect, error: <type 'exceptions.UnicodeEncodeError'>`` where it
  may have worked on Supervisor 3.x.  The issue was introduced in Supervisor
  4.0.0 due to new bytes/strings conversions necessary to add Python 3 support.
  For ``supervisorctl`` to correctly display logs with Unicode characters, the
  terminal encoding specified by the environment must support it.  If not, the
  ``UnicodeEncodeError`` may still occur on either Python 2 or 3.  A new
  warning message is now printed if a problematic terminal encoding is
  detected.  Patch by Vinay Sajip.

4.0.2 (2019-04-17)
------------------

- Fixed a bug where inline comments in the config file were not parsed
  correctly such that the comments were included as part of the values.
  This only occurred on Python 2, and only where the environment had an
  extra ``configparser`` module installed.  The bug was introduced in
  Supervisor 4.0.0 because of Python 2/3 compatibility code that expected
  a Python 2 environment to only have a ``ConfigParser`` module.

4.0.1 (2019-04-10)
------------------

- Fixed an issue on Python 3 where an ``OSError: [Errno 29] Illegal seek``
  would occur if ``logfile`` in the ``[supervisord]`` section was set to
  a special file like ``/dev/stdout`` that was not seekable, even if
  ``logfile_maxbytes = 0`` was set to disable rotation.  The issue only
  affected the main log and not child logs.  Patch by Martin Falatic.

4.0.0 (2019-04-05)
------------------

- Support for Python 3 has been added.  On Python 3, Supervisor requires
  Python 3.4 or later.  Many thanks to Vinay Sajip, Scott Maxwell, Palm Kevin,
  Tres Seaver, Marc Abramowitz, Son Nguyen, Shane Hathaway, Evan Andrews,
  and Ethan Hann who all made major contributions to the Python 3 porting
  effort.  Thanks also to all contributors who submitted issue reports and
  patches towards this effort.

- Support for Python 2.4, 2.5, and 2.6 has been dropped.  On Python 2,
  Supervisor now requires Python 2.7.

- The ``supervisor`` package is no longer a namespace package.

- The behavior of the config file expansion ``%(here)s`` has changed.  In
  previous versions, a bug caused ``%(here)s`` to always expand to the
  directory of the root config file.  Now, when ``%(here)s`` is used inside
  a file included via ``[include]``, it will expand to the directory of
  that file.  Thanks to Alex Eftimie and Zoltan Toth-Czifra for the patches.

- The default value for the config file setting ``exitcodes=``, the expected
  exit codes of a program, has changed.  In previous versions, it was ``0,2``.
  This caused issues with Golang programs where ``panic()`` causes the exit
  code to be ``2``.  The default value for ``exitcodes`` is now ``0``.

- An undocumented feature where multiple ``supervisorctl`` commands could be
  combined on a single line separated by semicolons has been removed.

- ``supervisorctl`` will now set its exit code to a non-zero value when an
  error condition occurs.  Previous versions did not set the exit code for
  most error conditions so it was almost always 0.  Patch by Luke Weber.

- Added new ``stdout_syslog`` and ``stderr_syslog`` options to the config
  file.  These are boolean options that indicate whether process output will
  be sent to syslog.  Supervisor can now log to both files and syslog at the
  same time.  Specifying a log filename of ``syslog`` is still supported
  but deprecated.  Patch by Jason R. Coombs.

3.4.0 (2019-04-05)
------------------

- FastCGI programs (``[fcgi-program:x]`` sections) can now be used in
  groups (``[group:x]``).  Patch by Florian Apolloner.

- Added a new ``socket_backlog`` option to the ``[fcgi-program:x]`` section
  to set the listen(2) socket backlog.  Patch by Nenad Merdanovic.

- Fixed a bug where ``SupervisorTransport`` (the XML-RPC transport used with
  Unix domain sockets) did not close the connection when ``close()`` was
  called on it.  Patch by Jérome Perrin.

- Fixed a bug where ``supervisorctl start <name>`` could hang for a long time
  if the system clock rolled back.  Patch by Joe LeVeque.

3.3.5 (2018-12-22)
------------------

- Fixed a race condition where ``supervisord`` would cancel a shutdown
  already in progress if it received ``SIGHUP``.  Now, ``supervisord`` will
  ignore ``SIGHUP`` if shutdown is already in progress.  Patch by Livanh.

- Fixed a bug where searching for a relative command ignored changes to
  ``PATH`` made in ``environment=``.  Based on a patch by dongweiming.

- ``childutils.ProcessCommunicationsProtocol`` now does an explicit
  ``flush()`` after writing to ``stdout``.

- A more descriptive error message is now emitted if a name in the config
  file contains a disallowed character.  Patch by Rick van Hattem.

3.3.4 (2018-02-15)
------------------

- Fixed a bug where rereading the configuration would not detect changes to
  eventlisteners.  Patch by Michael Ihde.

- Fixed a bug where the warning ``Supervisord is running as root and it is
  searching for its config file`` may have been incorrectly shown by
  ``supervisorctl`` if its executable name was changed.

- Fixed a bug where ``supervisord`` would continue starting up if the
  ``[supervisord]`` section of the config file specified ``user=`` but
  ``setuid()`` to that user failed.  It will now exit immediately if it
  cannot drop privileges.

- Fixed a bug in the web interface where redirect URLs did not have a slash
  between the host and query string, which caused issues when proxying with
  Nginx.  Patch by Luke Weber.

- When ``supervisord`` successfully drops privileges during startup, it is now
  logged at the ``INFO`` level instead of ``CRIT``.

- The HTTP server now returns a Content-Type header specifying UTF-8 encoding.
  This may fix display issues in some browsers.  Patch by Katenkka.

3.3.3 (2017-07-24)
------------------

- Fixed CVE-2017-11610.  A vulnerability was found where an authenticated
  client can send a malicious XML-RPC request to ``supervisord`` that will
  run arbitrary shell commands on the server.  The commands will be run as
  the same user as ``supervisord``.  Depending on how ``supervisord`` has been
  configured, this may be root.  See
  https://github.com/Supervisor/supervisor/issues/964 for details.

3.3.2 (2017-06-03)
------------------

- Fixed a bug introduced in 3.3.0 where the ``supervisorctl reload`` command
  would crash ``supervisord`` with the error ``OSError: [Errno 9] Bad file
  descriptor`` if the ``kqueue`` poller was used.  Patch by Jared Suttles.

- Fixed a bug introduced in 3.3.0 where ``supervisord`` could get stuck in a
  polling loop after the web interface was used, causing high CPU usage.
  Patch by Jared Suttles.

- Fixed a bug where if ``supervisord`` attempted to start but aborted due to
  another running instance of ``supervisord`` with the same config, the
  pidfile of the running instance would be deleted.  Patch by coldnight.

- Fixed a bug where ``supervisorctl fg`` would swallow most XML-RPC faults.
  ``fg`` now prints the fault and exits.

- Parsing the config file will now fail with an error message if a process
  or group name contains a forward slash character (``/``) since it would
  break the URLs used by the web interface.

- ``supervisorctl reload`` now shows an error message if an argument is
  given.  Patch by Joel Krauska.

- ``supervisorctl`` commands ``avail``, ``reread``, and ``version`` now show
  an error message if an argument is given.

3.3.1 (2016-08-02)
------------------

- Fixed an issue where ``supervisord`` could hang when responding to HTTP
  requests (including ``supervisorctl`` commands) if the system time was set
  back after ``supervisord`` was started.

- Zope ``trackrefs``, a debugging tool that was included in the ``tests``
  directory but hadn't been used for years, has been removed.

3.3.0 (2016-05-14)
------------------

- ``supervisord`` will now use ``kqueue``, ``poll``, or ``select`` to monitor
  its file descriptors, in that order, depending on what is available on the
  system.  Previous versions used ``select`` only and would crash with the error
  ``ValueError: filedescriptor out of range in select()`` when running a large
  number of subprocesses (whatever number resulted in enough file descriptors
  to exceed the fixed-size file descriptor table used by ``select``, which is
  typically 1024).  Patch by Igor Sobreira.

- ``/etc/supervisor/supervisord.conf`` has been added to the config file search
  paths.  Many versions of Supervisor packaged for Debian and Ubuntu have
  included a patch that added this path.  This difference was reported in a
  number of tickets as a source of confusion and upgrade difficulties, so the
  path has been added.  Patch by Kelvin Wong.

- Glob patterns in the ``[include]`` section now support the
  ``host_node_name`` expansion.  Patch by Paul Lockaby.

- Files included via the ``[include]`` section are now logged at the ``INFO``
  level instead of ``WARN``.  Patch by Daniel Hahler.

3.2.4 (2017-07-24)
------------------

- Backported from Supervisor 3.3.3:  Fixed CVE-2017-11610.  A vulnerability
  was found where an authenticated client can send a malicious XML-RPC request
  to ``supervisord`` that will run arbitrary shell commands on the server.
  The commands will be run as the same user as ``supervisord``.  Depending on
  how ``supervisord`` has been configured, this may be root.  See
  https://github.com/Supervisor/supervisor/issues/964 for details.

3.2.3 (2016-03-19)
------------------

- 400 Bad Request is now returned if an XML-RPC request is received with
  invalid body data.  In previous versions, 500 Internal Server Error
  was returned.

3.2.2 (2016-03-04)
------------------

- Parsing the config file will now fail with an error message if an
  ``inet_http_server`` or ``unix_http_server`` section contains a ``username=``
  but no ``password=``.  In previous versions, ``supervisord`` would start with
  this invalid configuration but the HTTP server would always return a 500
  Internal Server Error.  Thanks to Chris Ergatides for reporting this issue.

3.2.1 (2016-02-06)
------------------

- Fixed a server exception ``OverflowError: int exceeds XML-RPC limits`` that
  made ``supervisorctl status`` unusable if the system time was far into the
  future.  The XML-RPC API returns timestamps as XML-RPC integers, but
  timestamps will exceed the maximum value of an XML-RPC integer in January
  2038 ("Year 2038 Problem").  For now, timestamps exceeding the maximum
  integer will be capped at the maximum to avoid the exception and retain
  compatibility with existing API clients.  In a future version of the API,
  the return type for timestamps will be changed.

3.2.0 (2015-11-30)
------------------

- Files included via the ``[include]`` section are read in sorted order.  In
  past versions, the order was undefined.  Patch by Ionel Cristian Mărieș.

- ``supervisorctl start`` and ``supervisorctl stop`` now complete more quickly
  when handling many processes.  Thanks to Chris McDonough for this patch.
  See: https://github.com/Supervisor/supervisor/issues/131

- Environment variables are now expanded for all config file options.
  Patch by Dexter Tad-y.

- Added ``signalProcess``, ``signalProcessGroup``, and ``signalAllProcesses``
  XML-RPC methods to supervisor RPC interface.  Thanks to Casey Callendrello,
  Marc Abramowitz, and Moriyoshi Koizumi for the patches.

- Added ``signal`` command to supervisorctl.  Thanks to Moriyoshi Koizumi and
  Marc Abramowitz for the patches.

- Errors caused by bad values in a config file now show the config section
  to make debugging easier.  Patch by Marc Abramowitz.

- Setting ``redirect_stderr=true`` in an ``[eventlistener:x]`` section is now
  disallowed because any messages written to ``stderr`` would interfere
  with the eventlistener protocol on ``stdout``.

- Fixed a bug where spawning a process could cause ``supervisord`` to crash
  if an ``IOError`` occurred while setting up logging.  One way this could
  happen is if a log filename was accidentally set to a directory instead
  of a file.  Thanks to Grzegorz Nosek for reporting this issue.

- Fixed a bug introduced in 3.1.0 where ``supervisord`` could crash when
  attempting to display a resource limit error.

- Fixed a bug where ``supervisord`` could crash with the message
  ``Assertion failed for processname: RUNNING not in STARTING`` if a time
  change caused the last start time of the process to be in the future.
  Thanks to Róbert Nagy, Sergey Leschenko, and samhair for the patches.

- A warning is now logged if an eventlistener enters the UNKNOWN state,
  which usually indicates a bug in the eventlistener.  Thanks to Steve
  Winton and detailyang for reporting issues that led to this change.

- Errors from the web interface are now logged at the ``ERROR`` level.
  Previously, they were logged at the ``TRACE`` level and easily
  missed.  Thanks to Thomas Güttler for reporting this issue.

- Fixed ``DeprecationWarning: Parameters to load are deprecated. Call
  .resolve and .require separately.`` on setuptools >= 11.3.

- If ``redirect_stderr=true`` and ``stderr_logfile=auto``, no stderr log
  file will be created.  In previous versions, an empty stderr log file
  would be created.  Thanks to Łukasz Kożuchowski for the initial patch.

- Fixed an issue in Medusa that would cause ``supervisorctl tail -f`` to
  disconnect if many other ``supervisorctl`` commands were run in parallel.
  Patch by Stefan Friesel.

3.1.4 (2017-07-24)
------------------

- Backported from Supervisor 3.3.3:  Fixed CVE-2017-11610.  A vulnerability
  was found where an authenticated client can send a malicious XML-RPC request
  to ``supervisord`` that will run arbitrary shell commands on the server.
  The commands will be run as the same user as ``supervisord``.  Depending on
  how ``supervisord`` has been configured, this may be root.  See
  https://github.com/Supervisor/supervisor/issues/964 for details.

3.1.3 (2014-10-28)
------------------

- Fixed an XML-RPC bug where the ElementTree-based parser handled strings
  like ``<value><string>hello</string></value>`` but not strings like
  ``<value>hello</value>``, which are valid in the XML-RPC spec.  This
  fixes compatibility with the Apache XML-RPC client for Java and
  possibly other clients.

3.1.2 (2014-09-07)
------------------

- Fixed a bug where ``tail group:*`` in ``supervisorctl`` would show a 500
  Internal Server Error rather than a BAD_NAME fault.

- Fixed a bug where the web interface would show a 500 Internal Server Error
  instead of an error message for some process start faults.

- Removed medusa files not used by Supervisor.

3.1.1 (2014-08-11)
------------------

- Fixed a bug where ``supervisorctl tail -f name`` output would stop if log
  rotation occurred while tailing.

- Prevent a crash when a greater number of file descriptors were attempted to
  be opened than permitted by the environment when starting a bunch of
  programs.  Now, instead a spawn error is logged.

- Compute "channel delay" properly, fixing symptoms where a supervisorctl
  start command would hang for a very long time when a process (or many
  processes) are spewing to their stdout or stderr.  See comments attached to
  https://github.com/Supervisor/supervisor/pull/263 .

- Added ``docs/conf.py``, ``docs/Makefile``, and ``supervisor/scripts/*.py``
  to the release package.

3.1.0 (2014-07-29)
------------------

- The output of the ``start``, ``stop``, ``restart``, and ``clear`` commands
  in ``supervisorctl`` has been changed to be consistent with the ``status``
  command.  Previously, the ``status`` command would show a process like
  ``foo:foo_01`` but starting that process would show ``foo_01: started``
  (note the group prefix ``foo:`` was missing).  Now, starting the process
  will show ``foo:foo_01: started``.  Suggested by Chris Wood.

- The ``status`` command in ``supervisorctl`` now supports group name
  syntax: ``status group:*``.

- The process column in the table output by the ``status`` command in
  ``supervisorctl`` now expands to fit the widest name.

- The ``update`` command in ``supervisorctl`` now accepts optional group
  names.  When group names are specified, only those groups will be
  updated.  Patch by Gary M. Josack.

- Tab completion in ``supervisorctl`` has been improved and now works for
  more cases.  Thanks to Mathieu Longtin and Marc Abramowitz for the patches.

- Attempting to start or stop a process group in ``supervisorctl`` with the
  ``group:*`` syntax will now show the same error message as the ``process``
  syntax if the name does not exist.  Previously, it would show a Python
  exception.  Patch by George Ang.

- Added new ``PROCESS_GROUP_ADDED`` and ``PROCESS_GROUP_REMOVED`` events.
  These events are fired when process groups are added or removed from
  Supervisor's runtime configuration when using the ``add`` and ``remove``
  commands in ``supervisorctl``.  Patch by Brent Tubbs.

- Stopping a process in the backoff state now changes it to the stopped
  state.  Previously, an attempt to stop a process in backoff would be
  ignored.  Patch by Pascal Varet.

- The ``directory`` option is now expanded separately for each process in
  a homogeneous process group.  This allows each process to have its own
  working directory.  Patch by Perttu Ranta-aho.

- Removed ``setuptools`` from the ``requires`` list in ``setup.py`` because
  it caused installation issues on some systems.

- Fixed a bug in Medusa where the HTTP Basic authorizer would cause an
  exception if the password contained a colon.  Thanks to Thomas Güttler
  for reporting this issue.

- Fixed an XML-RPC bug where calling supervisor.clearProcessLogs() with a
  name like ``group:*`` would cause a 500 Internal Server Error rather than
  returning a BAD_NAME fault.

- Fixed a hang that could occur in ``supervisord`` if log rotation is used
  and an outside program deletes an active log file.  Patch by Magnus Lycka.

- A warning is now logged if a glob pattern in an ``[include]`` section does
  not match any files.  Patch by Daniel Hahler.

3.0.1 (2017-07-24)
------------------

- Backported from Supervisor 3.3.3:  Fixed CVE-2017-11610.  A vulnerability
  was found where an authenticated client can send a malicious XML-RPC request
  to ``supervisord`` that will run arbitrary shell commands on the server.
  The commands will be run as the same user as ``supervisord``.  Depending on
  how ``supervisord`` has been configured, this may be root.  See
  https://github.com/Supervisor/supervisor/issues/964 for details.

3.0 (2013-07-30)
----------------

- Parsing the config file will now fail with an error message if a process
  or group name contains characters that are not compatible with the
  eventlistener protocol.

- Fixed a bug where the ``tail -f`` command in ``supervisorctl`` would fail
  if the combined length of the username and password was over 56 characters.

- Reading the config file now gives a separate error message when the config
  file exists but can't be read.  Previously, any error reading the file
  would be reported as "could not find config file".  Patch by Jens Rantil.

- Fixed an XML-RPC bug where array elements after the first would be ignored
  when using the ElementTree-based XML parser.  Patch by Zev Benjamin.

- Fixed the usage message output by ``supervisorctl`` to show the correct
  default config file path.  Patch by Alek Storm.

3.0b2 (2013-05-28)
------------------

- The behavior of the program option ``user`` has changed.  In all previous
  versions, if ``supervisord`` failed to switch to the user, a warning would
  be sent to the stderr log but the child process would still be spawned.
  This means that a mistake in the config file could result in a child
  process being unintentionally spawned as root.  Now, ``supervisord`` will
  not spawn the child unless it was able to successfully switch to the user.
  Thanks to Igor Partola for reporting this issue.

- If a user specified in the config file does not exist on the system,
  ``supervisord`` will now print an error and refuse to start.

- Reverted a change to logging introduced in 3.0b1 that was intended to allow
  multiple processes to log to the same file with the rotating log handler.
  The implementation caused supervisord to crash during reload and to leak
  file handles.  Also, since log rotation options are given on a per-program
  basis, impossible configurations could be created (conflicting rotation
  options for the same file).  Given this and that supervisord now has syslog
  support, it was decided to remove this feature.  A warning was added to the
  documentation that two processes may not log to the same file.

- Fixed a bug where parsing ``command=`` could cause supervisord to crash if
  shlex.split() fails, such as a bad quoting.  Patch by Scott Wilson.

- It is now possible to use ``supervisorctl`` on a machine with no
  ``supervisord.conf`` file by supplying the connection information in
  command line options.  Patch by Jens Rantil.

- Fixed a bug where supervisord would crash if the syslog handler was used
  and supervisord received SIGUSR2 (log reopen request).

- Fixed an XML-RPC bug where calling supervisor.getProcessInfo() with a bad
  name would cause a 500 Internal Server Error rather than the returning
  a BAD_NAME fault.

- Added a favicon to the web interface.  Patch by Caio Ariede.

- Fixed a test failure due to incorrect handling of daylight savings time
  in the childutils tests.  Patch by Ildar Hizbulin.

- Fixed a number of pyflakes warnings for unused variables, imports, and
  dead code.  Patch by Philippe Ombredanne.

3.0b1 (2012-09-10)
------------------

- Fixed a bug where parsing ``environment=`` did not verify that key/value
  pairs were correctly separated.  Patch by Martijn Pieters.

- Fixed a bug in the HTTP server code that could cause unnecessary delays
  when sending large responses.  Patch by Philip Zeyliger.

- When supervisord starts up as root, if the ``-c`` flag was not provided, a
  warning is now emitted to the console.  Rationale: supervisord looks in the
  current working directory for a ``supervisord.conf`` file; someone might
  trick the root user into starting supervisord while cd'ed into a directory
  that has a rogue ``supervisord.conf``.

- A warning was added to the documentation about the security implications of
  starting supervisord without the ``-c`` flag.

- Add a boolean program option ``stopasgroup``, defaulting to false.
  When true, the flag causes supervisor to send the stop signal to the
  whole process group.  This is useful for programs, such as Flask in debug
  mode, that do not propagate stop signals to their children, leaving them
  orphaned.

- Python 2.3 is no longer supported.  The last version that supported Python
  2.3 is Supervisor 3.0a12.

- Removed the unused "supervisor_rpc" entry point from setup.py.

- Fixed a bug in the rotating log handler that would cause unexpected
  results when two processes were set to log to the same file.  Patch
  by Whit Morriss.

- Fixed a bug in config file reloading where each reload could leak memory
  because a list of warning messages would be appended but never cleared.
  Patch by Philip Zeyliger.

- Added a new Syslog log handler.  Thanks to Denis Bilenko, Nathan L. Smith,
  and Jason R. Coombs, who each contributed to the patch.

- Put all change history into a single file (CHANGES.txt).

3.0a12 (2011-12-06)
-------------------

- Released to replace a broken 3.0a11 package where non-Python files were
  not included in the package.

3.0a11 (2011-12-06)
-------------------

- Added a new file, ``PLUGINS.rst``, with a listing of third-party plugins
  for Supervisor.  Contributed by Jens Rantil.

- The ``pid`` command in supervisorctl can now be used to retrieve the PIDs
  of child processes.  See ``help pid``.  Patch by Gregory Wisniewski.

- Added a new ``host_node_name`` expansion that will be expanded to the
  value returned by Python's ``platform.node`` (see
  http://docs.python.org/library/platform.html#platform.node).
  Patch by Joseph Kondel.

- Fixed a bug in the web interface where pages over 64K would be truncated.
  Thanks to Drew Perttula and Timothy Jones for reporting this.

- Renamed ``README.txt`` to ``README.rst`` so GitHub renders the file as
  ReStructuredText.

- The XML-RPC server is now compatible with clients that do not send empty
  <params> when there are no parameters for the method call.  Thanks to
  Johannes Becker for reporting this.

- Fixed ``supervisorctl --help`` output to show the correct program name.

- The behavior of the configuration options ``minfds`` and ``minprocs`` has
  changed.  Previously, if a hard limit was less than ``minfds`` or
  ``minprocs``, supervisord would unconditionally abort with an error.  Now,
  supervisord will attempt to raise the hard limit.  This may succeed if
  supervisord is run as root, otherwise the error is printed as before.
  Patch by Benoit Sigoure.

- Add a boolean program option ``killasgroup``, defaulting to false,
  if true when resorting to send SIGKILL to stop/terminate the process
  send it to its whole process group instead to take care of possible
  children as well and not leave them behind.  Patch by Samuele Pedroni.

- Environment variables may now be used in the configuration file
  for options that support string expansion.  Patch by Aleksey Sivokon.

- Fixed a race condition where supervisord might not act on a signal sent
  to it.  Thanks to Adar Dembo for reporting the issue and supplying the
  initial patch.

- Updated the output of ``echo_supervisord_conf`` to fix typos and
  improve comments.  Thanks to Jens Rantil for noticing these.

- Fixed a possible 500 Server Error from the web interface.  This was
  observed when using Supervisor on a domain socket behind Nginx, where
  Supervisor would raise an exception because REMOTE_ADDR was not set.
  Patch by David Bennett.

3.0a10 (2011-03-30)
-------------------

- Fixed the stylesheet of the web interface so the footer line won't overlap
  a long process list.  Thanks to Derek DeVries for the patch.

- Allow rpc interface plugins to register new events types.

- Bug fix for FCGI sockets not getting cleaned up when the ``reload`` command
  is issued from supervisorctl.  Also, the default behavior has changed for
  FCGI sockets.  They are now closed whenever the number of running processes
  in a group hits zero.  Previously, the sockets were kept open unless a
  group-level stop command was issued.

- Better error message when HTTP server cannot reverse-resolve a hostname to
  an IP address.  Previous behavior: show a socket error.  Current behavior:
  spit out a suggestion to stdout.

- Environment variables set via ``environment=`` value within
  ``[supervisord]`` section had no effect.  Thanks to Wyatt Baldwin
  for a patch.

- Fix bug where stopping process would cause process output that happened
  after the stop request was issued to be lost.  See
  https://github.com/Supervisor/supervisor/issues/11.

- Moved 2.X change log entries into ``HISTORY.txt``.

- Converted ``CHANGES.txt`` and ``README.txt`` into proper ReStructuredText
  and included them in the ``long_description`` in ``setup.py``.

- Added a tox.ini to the package (run via ``tox`` in the package dir).  Tests
  supervisor on multiple Python versions.

3.0a9 (2010-08-13)
------------------

- Use rich comparison methods rather than __cmp__ to sort process configs and
  process group configs to better straddle Python versions.  (thanks to
  Jonathan Riboux for identifying the problem and supplying an initial
  patch).

- Fixed test_supervisorctl.test_maintail_dashf test for Python 2.7.  (thanks
  to Jonathan Riboux for identifying the problem and supplying an initial
  patch).

- Fixed the way that supervisor.datatypes.url computes a "good" URL
  for compatibility with Python 2.7 and Python >= 2.6.5.  URLs with
  bogus "schemes://" will now be accepted as a version-straddling
  compromise (before they were rejected before supervisor would
  start).  (thanks to Jonathan Riboux for identifying the problem
  and supplying an initial patch).

- Add a ``-v`` / ``--version`` option to supervisord: Print the
  supervisord version number out to stdout and exit.  (Roger Hoover)

- Import iterparse from xml.etree when available (eg: Python 2.6).  Patch
  by Sidnei da Silva.

- Fixed the url to the supervisor-users mailing list.  Patch by
  Sidnei da Silva

- When parsing "environment=" in the config file, changes introduced in
  3.0a8 prevented Supervisor from parsing some characters commonly
  found in paths unless quoting was used as in this example::

    environment=HOME='/home/auser'

  Supervisor once again allows the above line to be written as::

    environment=HOME=/home/auser

  Alphanumeric characters, "_", "/", ".", "+", "-", "(", ")", and ":" can all
  be used as a value without quoting. If any other characters are needed in
  the value, please quote it as in the first example above.  Thanks to Paul
  Heideman for reporting this issue.

- Supervisor will now look for its config file in locations relative to the
  executable path, allowing it to be used more easily in virtual
  environments.  If sys.argv[0] is ``/path/to/venv/bin/supervisorctl``,
  supervisor will now look for it's config file in
  ``/path/to/venv/etc/supervisord.conf`` and
  ``/path/to/venv/supervisord.conf`` in addition to the other standard
  locations.  Patch by Chris Rossi.

3.0a8 (2010-01-20)
------------------

- Don't cleanup file descriptors on first supervisord invocation:
  this is a lame workaround for Snow Leopard systems that use
  libdispatch and are receiving "Illegal instruction" messages at
  supervisord startup time.  Restarting supervisord via
  "supervisorctl restart" may still cause a crash on these systems.

- Got rid of Medusa hashbang headers in various files to ease RPM
  packaging.

- Allow umask to be 000 (patch contributed by Rowan Nairn).

- Fixed a bug introduced in 3.0a7 where supervisorctl wouldn't ask
  for a username/password combination properly from a
  password-protected supervisord if it wasn't filled in within the
  "[supervisorctl]" section username/password values.  It now
  properly asks for a username and password.

- Fixed a bug introduced in 3.0a7 where setup.py would not detect the
  Python version correctly.  Patch by Daniele Paolella.

- Fixed a bug introduced in 3.0a7 where parsing a string of key/value
  pairs failed on Python 2.3 due to use of regular expression syntax
  introduced in Python 2.4.

- Removed the test suite for the ``memmon`` console script, which was
  moved to the Superlance package in 3.0a7.

- Added release dates to CHANGES.txt.

- Reloading the config for an fcgi process group did not close the fcgi
  socket - now, the socket is closed whenever the group is stopped as a unit
  (including during config update). However, if you stop all the processes
  in a group individually, the socket will remain open to allow for graceful
  restarts of FCGI daemons.  (Roger Hoover)

- Rereading the config did not pick up changes to the socket parameter in a
  fcgi-program section.  (Roger Hoover)

- Made a more friendly exception message when a FCGI socket cannot be
  created.  (Roger Hoover)

- Fixed a bug where the --serverurl option of supervisorctl would not
  accept a URL with a "unix" scheme.  (Jason Kirtland)

- Running the tests now requires the "mock" package.  This dependency has
  been added to "tests_require" in setup.py.  (Roger Hoover)

- Added support for setting the ownership and permissions for an FCGI socket.
  This is done using new "socket_owner" and "socket_mode" options in an
  [fcgi-program:x] section.  See the manual for details.  (Roger Hoover)

- Fixed a bug where the FCGI socket reference count was not getting
  decremented on spawn error.  (Roger Hoover)

- Fixed a Python 2.6 deprecation warning on use of the "sha" module.

- Updated ez_setup.py to one that knows about setuptools 0.6c11.

- Running "supervisorctl shutdown" no longer dumps a Python backtrace
  when it can't connect to supervisord on the expected socket.  Thanks
  to Benjamin Smith for reporting this.

- Removed use of collections.deque in our bundled version of asynchat
  because it broke compatibility with Python 2.3.

- The sample configuration output by "echo_supervisord_conf" now correctly
  shows the default for "autorestart" as "unexpected".  Thanks to
  William Dode for noticing it showed the wrong value.

3.0a7 (2009-05-24)
------------------

- We now bundle our own patched version of Medusa contributed by Jason
  Kirtland to allow Supervisor to run on Python 2.6.  This was done
  because Python 2.6 introduced backwards incompatible changes to
  asyncore and asynchat in the stdlib.

- The console script ``memmon``, introduced in Supervisor 3.0a4, has
  been moved to Superlance (http://pypi.python.org/pypi/superlance).
  The Superlance package contains other useful monitoring tools designed
  to run under Supervisor.

- Supervisorctl now correctly interprets all of the error codes that can
  be returned when starting a process.  Patch by Francesc Alted.

- New ``stdout_events_enabled`` and ``stderr_events_enabled`` config options
  have been added to the ``[program:x]``, ``[fcgi-program:x]``, and
  ``[eventlistener:x]`` sections.  These enable the emitting of new
  PROCESS_LOG events for a program.  If unspecified, the default is False.

  If enabled for a subprocess, and data is received from the stdout or
  stderr of the subprocess while not in the special capture mode used by
  PROCESS_COMMUNICATION, an event will be emitted.

  Event listeners can subscribe to either PROCESS_LOG_STDOUT or
  PROCESS_LOG_STDERR individually, or PROCESS_LOG for both.

- Values for subprocess environment variables specified with environment=
  in supervisord.conf can now be optionally quoted, allowing them to
  contain commas.  Patch by Tim Godfrey.

- Added a new event type, REMOTE_COMMUNICATION, that is emitted by a new
  RPC method, supervisor.sendRemoteCommEvent().

- Patch for bug #268 (KeyError on ``here`` expansion for
  stdout/stderr_logfile) from David E. Kindred.

- Add ``reread``, ``update``, and ``avail`` commands based on Anders
  Quist's ``online_config_reload.diff`` patch.  This patch extends
  the "add" and "drop" commands with automagical behavior::

    In supervisorctl:

      supervisor> status
      bar                              RUNNING    pid 14864, uptime 18:03:42
      baz                              RUNNING    pid 23260, uptime 0:10:16
      foo                              RUNNING    pid 14866, uptime 18:03:42
      gazonk                           RUNNING    pid 23261, uptime 0:10:16
      supervisor> avail
      bar                              in use    auto      999:999
      baz                              in use    auto      999:999
      foo                              in use    auto      999:999
      gazonk                           in use    auto      999:999
      quux                             avail     auto      999:999

    Now we add this to our conf:

      [group:zegroup]
      programs=baz,gazonk

    Then we reread conf:

      supervisor> reread
      baz: disappeared
      gazonk: disappeared
      quux: available
      zegroup: available
      supervisor> avail
      bar                              in use    auto      999:999
      foo                              in use    auto      999:999
      quux                             avail     auto      999:999
      zegroup:baz                      avail     auto      999:999
      zegroup:gazonk                   avail     auto      999:999
      supervisor> status
      bar                              RUNNING    pid 14864, uptime 18:04:18
      baz                              RUNNING    pid 23260, uptime 0:10:52
      foo                              RUNNING    pid 14866, uptime 18:04:18
      gazonk                           RUNNING    pid 23261, uptime 0:10:52

    The magic make-it-so command:

      supervisor> update
      baz: stopped
      baz: removed process group
      gazonk: stopped
      gazonk: removed process group
      zegroup: added process group
      quux: added process group
      supervisor> status
      bar                              RUNNING    pid 14864, uptime 18:04:43
      foo                              RUNNING    pid 14866, uptime 18:04:43
      quux                             RUNNING    pid 23561, uptime 0:00:02
      zegroup:baz                      RUNNING    pid 23559, uptime 0:00:02
      zegroup:gazonk                   RUNNING    pid 23560, uptime 0:00:02
      supervisor> avail
      bar                              in use    auto      999:999
      foo                              in use    auto      999:999
      quux                             in use    auto      999:999
      zegroup:baz                      in use    auto      999:999
      zegroup:gazonk                   in use    auto      999:999

- Fix bug with symptom "KeyError: 'process_name'" when using a logfile name
  including documented``process_name`` Python string expansions.

- Tab completions in the supervisorctl shell, and a foreground mode for
  Supervisor, implemented as a part of GSoC.  The supervisorctl program now
  has a ``fg`` command, which makes it possible to supply inputs to a
  process, and see its output/error stream in real time.

- Process config reloading implemented by Anders Quist.  The
  supervisorctl program now has the commands "add" and "drop".
  "add <programname>" adds the process group implied by <programname>
  in the config file.  "drop <programname>" removes the process
  group from the running configuration (it must already be stopped).
  This makes it possible to add processes to and remove processes from
  a running supervisord without restarting the supervisord process.

- Fixed a bug where opening the HTTP servers would fail silently
  for socket errors other than errno.EADDRINUSE.

- Thanks to Dave Peticolas, using "reload" against a supervisord
  that is running in the background no longer causes supervisord
  to crash.

- Configuration options for logfiles now accept mixed case reserved
  words (e.g. "AUTO" or "auto") for consistency with other options.

- childutils.eventdata was buggy, it could not deal with carriage returns
  in data.  See http://www.plope.com/software/collector/257.  Thanks
  to Ian Bicking.

- Per-process exitcodes= configuration now will not accept exit
  codes that are not 8-bit unsigned integers (supervisord will not
  start when one of the exit codes is outside the range of 0 - 255).

- Per-process ``directory`` value can now contain expandable values like
  ``%(here)s``. (See http://www.plope.com/software/collector/262).

- Accepted patch from Roger Hoover to allow for a new sort of
  process group: "fcgi-program".  Adding one of these to your
  supervisord.conf allows you to control fastcgi programs.  FastCGI
  programs cannot belong to heterogenous groups.

  The configuration for FastCGI programs is the same as regular programs
  except an additional "socket" parameter.  Substitution happens on the
  socket parameter with the ``here`` and ``program_name`` variables::

   [fcgi-program:fcgi_test]
   ;socket=tcp://localhost:8002
   socket=unix:///path/to/fcgi/socket

- Supervisorctl now supports a plugin model for supervisorctl
  commands.

- Added the ability to retrieve supervisord's own pid through
  supervisor.getPID() on the XML-RPC interface or a new
  "pid" command on supervisorctl.

3.0a6 (2008-04-07)
------------------

- The RotatingFileLogger had a race condition in its doRollover
  method whereby a file might not actually exist despite a call to
  os.path.exists on the line above a place where we try to remove
  it.  We catch the exception now and ignore the missing file.

3.0a5 (2008-03-13)
------------------

- Supervisorctl now supports persistent readline history.  To
  enable, add "history_file = <pathname>" to the ``[supervisorctl]``
  section in your supervisord.conf file.

- Multiple commands may now be issued on one supervisorctl command
  line, e.g. "restart prog; tail -f prog".  Separate commands with a
  single semicolon; they will be executed in order as you would
  expect.

3.0a4 (2008-01-30)
------------------

- 3.0a3 broke Python 2.3 backwards compatibility.

- On Debian Sarge, one user reported that a call to
  options.mktempfile would fail with an "[Errno 9] Bad file
  descriptor" at supervisord startup time.  I was unable to
  reproduce this, but we found a workaround that seemed to work for
  him and it's included in this release.  See
  http://www.plope.com/software/collector/252 for more information.
  Thanks to William Dode.

- The fault ``ALREADY_TERMINATED`` has been removed.  It was only raised by
  supervisor.sendProcessStdin().  That method now returns ``NOT_RUNNING``
  for parity with the other methods. (Mike Naberezny)

- The fault TIMED_OUT has been removed.  It was not used.

- Supervisor now depends on meld3 0.6.4, which does not compile its
  C extensions by default, so there is no more need to faff around
  with NO_MELD3_EXTENSION_MODULES during installation if you don't
  have a C compiler or the Python development libraries on your
  system.

- Instead of making a user root around for the sample.conf file,
  provide a convenience command "echo_supervisord_conf", which he can
  use to echo the sample.conf to his terminal (and redirect to a file
  appropriately).  This is a new user convenience (especially one who
  has no Python experience).

- Added ``numprocs_start`` config option to ``[program:x]`` and
  ``[eventlistener:x]`` sections.  This is an offset used to compute
  the first integer that ``numprocs`` will begin to start from.
  Contributed by Antonio Beamud Montero.

- Added capability for ``[include]`` config section to config format.
  This section must contain a single key "files", which must name a
  space-separated list of file globs that will be included in
  supervisor's configuration.  Contributed by Ian Bicking.

- Invoking the ``reload`` supervisorctl command could trigger a bug in
  supervisord which caused it to crash.  See
  http://www.plope.com/software/collector/253 .  Thanks to William Dode for
  a bug report.

- The ``pidproxy`` script was made into a console script.

- The ``password`` value in both the ``[inet_http_server]`` and
  ``[unix_http_server]`` sections can now optionally be specified as a SHA
  hexdigest instead of as cleartext.  Values prefixed with ``{SHA}`` will be
  considered SHA hex digests.  To encrypt a password to a form suitable for
  pasting into the configuration file using Python, do, e.g.::

     >>> import sha
     >>> '{SHA}' + sha.new('thepassword').hexdigest()
     '{SHA}82ab876d1387bfafe46cc1c8a2ef074eae50cb1d'

- The subtypes of the events PROCESS_STATE_CHANGE (and
  PROCESS_STATE_CHANGE itself) have been removed, replaced with a
  simpler set of PROCESS_STATE subscribable event types.

  The new event types are:

    PROCESS_STATE_STOPPED
    PROCESS_STATE_EXITED
    PROCESS_STATE_STARTING
    PROCESS_STATE_STOPPING
    PROCESS_STATE_BACKOFF
    PROCESS_STATE_FATAL
    PROCESS_STATE_RUNNING
    PROCESS_STATE_UNKNOWN
    PROCESS_STATE # abstract

  PROCESS_STATE_STARTING replaces:

    PROCESS_STATE_CHANGE_STARTING_FROM_STOPPED
    PROCESS_STATE_CHANGE_STARTING_FROM_BACKOFF
    PROCESS_STATE_CHANGE_STARTING_FROM_EXITED
    PROCESS_STATE_CHANGE_STARTING_FROM_FATAL

  PROCESS_STATE_RUNNING replaces
  PROCESS_STATE_CHANGE_RUNNING_FROM_STARTED

  PROCESS_STATE_BACKOFF replaces
  PROCESS_STATE_CHANGE_BACKOFF_FROM_STARTING

  PROCESS_STATE_STOPPING replaces:

    PROCESS_STATE_CHANGE_STOPPING_FROM_RUNNING
    PROCESS_STATE_CHANGE_STOPPING_FROM_STARTING

  PROCESS_STATE_EXITED replaces
  PROCESS_STATE_CHANGE_EXITED_FROM_RUNNING

  PROCESS_STATE_STOPPED replaces
  PROCESS_STATE_CHANGE_STOPPED_FROM_STOPPING

  PROCESS_STATE_FATAL replaces
  PROCESS_STATE_CHANGE_FATAL_FROM_BACKOFF

  PROCESS_STATE_UNKNOWN replaces PROCESS_STATE_CHANGE_TO_UNKNOWN

  PROCESS_STATE replaces PROCESS_STATE_CHANGE

  The PROCESS_STATE_CHANGE_EXITED_OR_STOPPED abstract event is gone.

  All process state changes have at least "processname",
  "groupname", and "from_state" (the name of the previous state) in
  their serializations.

  PROCESS_STATE_EXITED additionally has "expected" (1 or 0) and "pid"
  (the process id) in its serialization.

  PROCESS_STATE_RUNNING, PROCESS_STATE_STOPPING,
  PROCESS_STATE_STOPPED additionally have "pid" in their
  serializations.

  PROCESS_STATE_STARTING and PROCESS_STATE_BACKOFF have "tries" in
  their serialization (initially "0", bumped +1 each time a start
  retry happens).

- Remove documentation from README.txt, point people to
  http://supervisord.org/manual/ .

- The eventlistener request/response protocol has changed.  OK/FAIL
  must now be wrapped in a RESULT envelope so we can use it for more
  specialized communications.

  Previously, to signify success, an event listener would write the string
  ``OK\n`` to its stdout.  To signify that the event was seen but couldn't
  be handled by the listener and should be rebuffered, an event listener
  would write the string ``FAIL\n`` to its stdout.

  In the new protocol, the listener must write the string::

    RESULT {resultlen}\n{result}

  For example, to signify OK::

    RESULT 2\nOK

  To signify FAIL::

    RESULT 4\nFAIL

  See the scripts/sample_eventlistener.py script for an example.

- To provide a hook point for custom results returned from event
  handlers (see above) the [eventlistener:x] configuration sections
  now accept a "result_handler=" parameter,
  e.g. "result_handler=supervisor.dispatchers:default_handler" (the
  default) or "handler=mypackage:myhandler".  The keys are pkgutil
  "entry point" specifications (importable Python function names).
  Result handlers must be callables which accept two arguments: one
  named "event" which represents the event, and the other named
  "result", which represents the listener's result.  A result
  handler either executes successfully or raises an exception.  If
  it raises a supervisor.dispatchers.RejectEvent exception, the
  event will be rebuffered, and the eventhandler will be placed back
  into the ACKNOWLEDGED state.  If it raises any other exception,
  the event handler will be placed in the UNKNOWN state.  If it does
  not raise any exception, the event is considered successfully
  processed.  A result handler's return value is ignored.  Writing a
  result handler is a "in case of emergency break glass" sort of
  thing, it is not something to be used for arbitrary business code.
  In particular, handlers *must not block* for any appreciable
  amount of time.

  The standard eventlistener result handler
  (supervisor.dispatchers:default_handler) does nothing if it receives an
  "OK" and will raise a supervisor.dispatchers.RejectEvent exception if it
  receives any other value.

- Supervisord now emits TICK events, which happen every N seconds.
  Three types of TICK events are available: TICK_5 (every five
  seconds), TICK_60 (every minute), TICK_3600 (every hour).  Event
  listeners may subscribe to one of these types of events to perform
  every-so-often processing.  TICK events are subtypes of the EVENT
  type.

- Get rid of OSX platform-specific memory monitor and replace with
  memmon.py, which works on both Linux and Mac OS.  This script is
  now a console script named "memmon".

- Allow "web handler" (the handler which receives http requests from
  browsers visiting the web UI of supervisor) to deal with POST requests.

- RPC interface methods stopProcess(), stopProcessGroup(), and
  stopAllProcesses() now take an optional "wait" argument that defaults
  to True for parity with the start methods.

3.0a3 (2007-10-02)
------------------

- Supervisorctl now reports a better error message when the main supervisor
  XML-RPC namespace is not registered.  Thanks to Mike Orr for reporting
  this. (Mike Naberezny)

- Create ``scripts`` directory within supervisor package, move
  ``pidproxy.py`` there, and place sample event listener and comm event
  programs within the directory.

- When an event notification is buffered (either because a listener rejected
  it or because all listeners were busy when we attempted to send it
  originally), we now rebuffer it in a way that will result in it being
  retried earlier than it used to be.

- When a listener process exits (unexpectedly) before transitioning from the
  BUSY state, rebuffer the event that was being processed.

- supervisorctl ``tail`` command now accepts a trailing specifier: ``stderr``
  or ``stdout``, which respectively, allow a user to tail the stderr or
  stdout of the named process.  When this specifier is not provided, tail
  defaults to stdout.

- supervisor ``clear`` command now clears both stderr and stdout logs for the
  given process.

- When a process encounters a spawn error as a result of a failed execve or
  when it cannot setuid to a given uid, it now puts this info into the
  process' stderr log rather than its stdout log.

- The event listener protocol header now contains the ``server`` identifier,
  the ``pool`` that the event emanated from, and the ``poolserial`` as well
  as the values it previously contained (version, event name, serial, and
  length).  The server identifier is taken from the config file options value
  ``identifier``, the ``pool`` value is the name of the listener pool that
  this event emanates from, and the ``poolserial`` is a serial number
  assigned to the event local to the pool that is processing it.

- The event listener protocol header is now a sequence of key-value
  pairs rather than a list of positional values.  Previously, a
  representative header looked like::

    SUPERVISOR3.0 PROCESS_COMMUNICATION_STDOUT 30 22\n

  Now it looks like::

    ver:3.0 server:supervisor serial:21 ...

- Specific event payload serializations have changed.  All event
  types that deal with processes now include the pid of the process
  that the event is describing.  In event serialization "header"
  values, we've removed the space between the header name and the
  value and headers are now separated by a space instead of a line
  feed.  The names of keys in all event types have had underscores
  removed.

- Abandon the use of the Python stdlib ``logging`` module for speed
  and cleanliness purposes.  We've rolled our own.

- Fix crash on start if AUTO logging is used with a max_bytes of
  zero for a process.

- Improve process communication event performance.

- The process config parameters ``stdout_capturefile`` and
  ``stderr_capturefile`` are no longer valid.  They have been replaced with
  the ``stdout_capture_maxbytes`` and ``stderr_capture_maxbytes`` parameters,
  which are meant to be suffix-multiplied integers.  They both default to
  zero.  When they are zero, process communication event capturing is not
  performed.  When either is nonzero, the value represents the maximum number
  of bytes that will be captured between process event start and end tags.
  This change was to support the fact that we no longer keep capture data in
  a separate file, we just use a FIFO in RAM to maintain capture info.  For
  users whom don't care about process communication events, or whom haven't
  changed the defaults for ``stdout_capturefile`` or ``stderr_capturefile``,
  they needn't do anything to their configurations to deal with this change.

- Log message levels have been normalized.  In particular, process
  stdin/stdout is now logged at ``debug`` level rather than at ``trace``
  level (``trace`` level is now reserved for output useful typically for
  debugging supervisor itself).  See "Supervisor Log Levels" in the
  documentation for more info.

- When an event is rebuffered (because all listeners are busy or a
  listener rejected the event), the rebuffered event is now inserted
  in the head of the listener event queue.  This doesn't guarantee
  event emission in natural ordering, because if a listener rejects
  an event or dies while it's processing an event, it can take an
  arbitrary amount of time for the event to be rebuffered, and other
  events may be processed in the meantime.  But if pool listeners
  never reject an event or don't die while processing an event, this
  guarantees that events will be emitted in the order that they were
  received because if all listeners are busy, the rebuffered event
  will be tried again "first" on the next go-around.

- Removed EVENT_BUFFER_OVERFLOW event type.

- The supervisorctl xmlrpc proxy can now communicate with
  supervisord using a persistent HTTP connection.

- A new module "supervisor.childutils" was added.  This module
  provides utilities for Python scripts which act as children of
  supervisord.  Most notably, it contains an API method
  "getRPCInterface" allows you to obtain an xmlrpclib ServerProxy
  that is willing to communicate with the parent supervisor.  It
  also contains utility functions that allow for parsing of
  supervisor event listener protocol headers.  A pair of scripts
  (loop_eventgen.py and loop_listener.py) were added to the script
  directory that serve as examples about how to use the childutils
  module.

- A new envvar is added to child process environments:
  SUPERVISOR_SERVER_URL.  This contains the server URL for the
  supervisord running the child.

- An ``OK`` URL was added at ``/ok.html`` which just returns the string
  ``OK`` (can be used for up checks or speed checks via plain-old-HTTP).

- An additional command-line option ``--profile_options`` is accepted
  by the supervisord script for developer use::

    supervisord -n -c sample.conf --profile_options=cumulative,calls

  The values are sort_stats options that can be passed to the
  standard Python profiler's PStats sort_stats method.

  When you exit supervisor, it will print Python profiling output to
  stdout.

- If cElementTree is installed in the Python used to invoke
  supervisor, an alternate (faster, by about 2X) XML parser will be
  used to parse XML-RPC request bodies.  cElementTree was added as
  an "extras_require" option in setup.py.

- Added the ability to start, stop, and restart process groups to
  supervisorctl.  To start a group, use ``start groupname:*``.  To start
  multiple groups, use ``start groupname1:* groupname2:*``.  Equivalent
  commands work for "stop" and "restart". You can mix and match short
  processnames, fully-specified group:process names, and groupsplats on the
  same line for any of these commands.

- Added ``directory`` option to process config.  If you set this
  option, supervisor will chdir to this directory before executing
  the child program (and thus it will be the child's cwd).

- Added ``umask`` option to process config.  If you set this option,
  supervisor will set the umask of the child program.  (Thanks to
  Ian Bicking for the suggestion).

- A pair of scripts ``osx_memmon_eventgen.py`` and `osx_memmon_listener.py``
  have been added to the scripts directory.  If they are used together as
  described in their comments, processes which are consuming "too much"
  memory will be restarted.  The ``eventgen`` script only works on OSX (my
  main development platform) but it should be trivially generalizable to
  other operating systems.

- The long form ``--configuration`` (-c) command line option for
  supervisord was broken.  Reported by Mike Orr.  (Mike Naberezny)

- New log level: BLAT (blather).  We log all
  supervisor-internal-related debugging info here.  Thanks to Mike
  Orr for the suggestion.

- We now allow supervisor to listen on both a UNIX domain socket and an inet
  socket instead of making them mutually exclusive.  As a result, the options
  "http_port", "http_username", "http_password", "sockchmod" and "sockchown"
  are no longer part of the ``[supervisord]`` section configuration. These
  have been supplanted by two other sections: ``[unix_http_server]`` and
  ``[inet_http_server]``.  You'll need to insert one or the other (depending
  on whether you want to listen on a UNIX domain socket or a TCP socket
  respectively) or both into your supervisord.conf file.  These sections have
  their own options (where applicable) for port, username, password, chmod,
  and chown.  See README.txt for more information about these sections.

- All supervisord command-line options related to "http_port",
  "http_username", "http_password", "sockchmod" and "sockchown" have
  been removed (see above point for rationale).

- The option that *used* to be ``sockchown`` within the ``[supervisord]``
  section (and is now named ``chown`` within the ``[unix_http_server]``
  section) used to accept a dot-separated user.group value.  The separator
  now must be a colon ":", e.g. "user:group".  Unices allow for dots in
  usernames, so this change is a bugfix.  Thanks to Ian Bicking for the bug
  report.

- If a '-c' option is not specified on the command line, both supervisord and
  supervisorctl will search for one in the paths ``./supervisord.conf`` ,
  ``./etc/supervisord.conf`` (relative to the current working dir when
  supervisord or supervisorctl is invoked) or in ``/etc/supervisord.conf``
  (the old default path).  These paths are searched in order, and supervisord
  and supervisorctl will use the first one found.  If none are found,
  supervisor will fail to start.

- The Python string expression ``%(here)s`` (referring to the directory in
  which the configuration file was found) can be used within the
  following sections/options within the config file::

      unix_http_server:file
      supervisor:directory
      supervisor:logfile
      supervisor:pidfile
      supervisor:childlogdir
      supervisor:environment
      program:environment
      program:stdout_logfile
      program:stderr_logfile
      program:process_name
      program:command

- The ``--environment`` aka ``-b`` option was removed from the list of
  available command-line switches to supervisord (use "A=1 B=2
  bin/supervisord" instead).

- If the socket filename (the tail-end of the unix:// URL) was
  longer than 64 characters, supervisorctl would fail with an
  encoding error at startup.

- The ``identifier`` command-line argument was not functional.

- Fixed http://www.plope.com/software/collector/215 (bad error
  message in supervisorctl when program command not found on PATH).

- Some child processes may not have been shut down properly at
  supervisor shutdown time.

- Move to ZPL-derived (but not ZPL) license available from
  http://www.repoze.org/LICENSE.txt; it's slightly less restrictive
  than the ZPL (no servicemark clause).

- Spurious errors related to unclosed files ("bad file descriptor",
  typically) were evident at supervisord "reload" time (when using
  the "reload" command from supervisorctl).

- We no longer bundle ez_setup to bootstrap setuptools installation.

3.0a2 (2007-08-24)
------------------

- Fixed the README.txt example for defining the supervisor RPC
  interface in the configuration file.  Thanks to Drew Perttula.

- Fixed a bug where process communication events would not have the
  proper payload if the payload data was very short.

- when supervisord attempted to kill a process with SIGKILL after
  the process was not killed within "stopwaitsecs" using a "normal"
  kill signal, supervisord would crash with an improper
  AssertionError.  Thanks to Calvin Hendryx-Parker.

- On Linux, Supervisor would consume too much CPU in an effective
  "busywait" between the time a subprocess exited and the time at
  which supervisor was notified of its exit status.  Thanks to Drew
  Perttula.

- RPC interface behavior change: if the RPC method
  "sendProcessStdin" is called against a process that has closed its
  stdin file descriptor (e.g. it has done the equivalent of
  "sys.stdin.close(); os.close(0)"), we return a NO_FILE fault
  instead of accepting the data.

- Changed the semantics of the process configuration ``autorestart``
  parameter with respect to processes which move between the RUNNING and
  EXITED state.  ``autorestart`` was previously a boolean.  Now it's a
  trinary, accepting one of ``false``, ``unexpected``, or ``true``.  If it's
  ``false``, a process will never be automatically restarted from the EXITED
  state.  If it's ``unexpected``, a process that enters the EXITED state will
  be automatically restarted if it exited with an exit code that was not
  named in the process config's ``exitcodes`` list.  If it's ``true``, a
  process that enters the EXITED state will be automatically restarted
  unconditionally.  The default is now ``unexpected`` (it was previously
  ``true``).  The readdition of this feature is a reversion of the behavior
  change note in the changelog notes for 3.0a1 that asserted we never cared
  about the process' exit status when determining whether to restart it or
  not.

- setup.py develop (and presumably setup.py install) would fail under Python
  2.3.3, because setuptools attempted to import ``splituser`` from urllib2,
  and it didn't exist.

- It's now possible to use ``setup.py install`` and ``setup.py develop`` on
  systems which do not have a C compiler if you set the environment variable
  "NO_MELD3_EXTENSION_MODULES=1" in the shell in which you invoke these
  commands (versions of meld3 > 0.6.1 respect this envvar and do not try to
  compile optional C extensions when it's set).

- The test suite would fail on Python versions <= 2.3.3 because
  the "assertTrue" and "assertFalse" methods of unittest.TestCase
  didn't exist in those versions.

- The ``supervisorctl`` and ``supervisord`` wrapper scripts were disused in
  favor of using setuptools' ``console_scripts`` entry point settings.

- Documentation files and the sample configuration file are put into
  the generated supervisor egg's ``doc`` directory.

- Using the web interface would cause fairly dramatic memory
  leakage.  We now require a version of meld3 that does not appear
  to leak memory from its C extensions (0.6.3).

3.0a1 (2007-08-16)
------------------

- Default config file comment documented 10 secs as default for ``startsecs``
  value in process config, in reality it was 1 sec.  Thanks to Christoph
  Zwerschke.

- Make note of subprocess environment behavior in README.txt.
  Thanks to Christoph Zwerschke.

- New "strip_ansi" config file option attempts to strip ANSI escape
  sequences from logs for smaller/more readable logs (submitted by
  Mike Naberezny).

- The XML-RPC method supervisor.getVersion() has been renamed for
  clarity to supervisor.getAPIVersion().  The old name is aliased
  for compatibility but is deprecated and will be removed in a
  future version (Mike Naberezny).

- Improved web interface styling (Mike Naberezny, Derek DeVries)

- The XML-RPC method supervisor.startProcess() now checks that
  the file exists and is executable (Mike Naberezny).

- Two environment variables, "SUPERVISOR_PROCESS_NAME" and
  "SUPERVISOR_PROCESS_GROUP" are set in the environment of child
  processes, representing the name of the process and group in
  supervisor's configuration.

- Process state map change: a process may now move directly from the
  STARTING state to the STOPPING state (as a result of a stop
  request).

- Behavior change: if ``autorestart`` is true, even if a process exits with
  an "expected" exit code, it will still be restarted.  In the immediately
  prior release of supervisor, this was true anyway, and no one complained,
  so we're going to consider that the "officially correct" behavior from now
  on.

- Supervisor now logs subprocess stdout and stderr independently.
  The old program config keys "logfile", "logfile_backups" and
  "logfile_maxbytes" are superseded by "stdout_logfile",
  "stdout_logfile_backups", and "stdout_logfile_maxbytes".  Added
  keys include "stderr_logfile", "stderr_logfile_backups", and
  "stderr_logfile_maxbytes".  An additional "redirect_stderr" key is
  used to cause program stderr output to be sent to its stdout
  channel.  The keys "log_stderr" and "log_stdout" have been
  removed.

- ``[program:x]`` config file sections now represent "homogeneous process
  groups" instead of single processes.  A "numprocs" key in the section
  represents the number of processes that are in the group.  A "process_name"
  key in the section allows composition of the each process' name within the
  homogeneous group.

- A new kind of config file section, ``[group:x]`` now exists, allowing users
  to group heterogeneous processes together into a process group that can be
  controlled as a unit from a client.

- Supervisord now emits "events" at certain points in its normal
  operation.  These events include supervisor state change events,
  process state change events, and "process communication events".

- A new kind of config file section ``[eventlistener:x]`` now exists.  Each
  section represents an "event listener pool", which is a special kind of
  homogeneous process group.  Each process in the pool is meant to receive
  supervisor "events" via its stdin and perform some notification (e.g. send
  a mail, log, make an http request, etc.)

- Supervisord can now capture data between special tokens in
  subprocess stdout/stderr output and emit a "process communications
  event" as a result.

- Supervisor's XML-RPC interface may be extended arbitrarily by programmers.
  Additional top-level namespace XML-RPC interfaces can be added using the
  ``[rpcinterface:foo]`` declaration in the configuration file.

- New ``supervisor``-namespace XML-RPC methods have been added:
  getAPIVersion (returns the XML-RPC API version, the older
  "getVersion" is now deprecated), "startProcessGroup" (starts all
  processes in a supervisor process group), "stopProcessGroup"
  (stops all processes in a supervisor process group), and
  "sendProcessStdin" (sends data to a process' stdin file
  descriptor).

- ``supervisor``-namespace XML-RPC methods which previously accepted
  ony a process name as "name" (startProcess, stopProcess,
  getProcessInfo, readProcessLog, tailProcessLog, and
  clearProcessLog) now accept a "name" which may contain both the
  process name and the process group name in the form
  ``groupname:procname``.  For backwards compatibility purposes,
  "simple" names will also be accepted but will be expanded
  internally (e.g. if "foo" is sent as a name, it will be expanded
  to "foo:foo", representing the foo process within the foo process
  group).

- 2.X versions of supervisorctl will work against supervisor 3.0
  servers in a degraded fashion, but 3.X versions of supervisorctl
  will not work at all against supervisor 2.X servers.

2.2b1 (2007-03-31)
------------------

- Individual program configuration sections can now specify an
  environment.

- Added a 'version' command to supervisorctl.  This returns the
  version of the supervisor2 package which the remote supervisord
  process is using.

2.1 (2007-03-17)
----------------

- When supervisord was invoked more than once, and its configuration
  was set up to use a UNIX domain socket as the HTTP server, the
  socket file would be erased in error.  The symptom of this was
  that a subsequent invocation of supervisorctl could not find the
  socket file, so the process could not be controlled (it and all of
  its subprocesses would need to be killed by hand).

- Close subprocess file descriptors properly when a subprocess exits
  or otherwise dies.  This should result in fewer "too many open
  files to spawn foo" messages when supervisor is left up for long
  periods of time.

- When a process was not killable with a "normal" signal at shutdown
  time, too many "INFO: waiting for x to die" messages would be sent
  to the log until we ended up killing the process with a SIGKILL.
  Now a maximum of one every three seconds is sent up until SIGKILL
  time.  Thanks to Ian Bicking.

- Add an assertion: we never want to try to marshal None to XML-RPC
  callers.  Issue 223 in the collector from vgatto indicates that
  somehow a supervisor XML-RPC method is returning None (which
  should never happen), but I cannot identify how.  Maybe the
  assertion will give us more clues if it happens again.

- Supervisor would crash when run under Python 2.5 because the
  xmlrpclib.Transport class in Python 2.5 changed in a
  backward-incompatible way.  Thanks to Eric Westra for the bug
  report and a fix.

- Tests now pass under Python 2.5.

- Better supervisorctl reporting on stop requests that have a FAILED
  status.

- Removed duplicated code (readLog/readMainLog), thanks to Mike
  Naberezny.

- Added tailProcessLog command to the XML-RPC API.  It provides a
  more efficient way to tail logs than readProcessLog().  Use
  readProcessLog() to read chunks and tailProcessLog() to tail.
  (thanks to Mike Naberezny).

2.1b1 (2006-08-30)
------------------

- "supervisord -h" and "supervisorctl -h" did not work (traceback
  instead of showing help view (thanks to Damjan from Macedonia for
  the bug report).

- Processes which started successfully after failing to start
  initially are no longer reported in BACKOFF state once they are
  started successfully (thanks to Damjan from Macedonia for the bug
  report).

- Add new 'maintail' command to supervisorctl shell, which allows
  you to tail the 'main' supervisor log.  This uses a new
  readMainLog xmlrpc API.

- Various process-state-transition related changes, all internal.
  README.txt updated with new state transition map.

- startProcess and startAllProcesses xmlrpc APIs changed: instead of
  accepting a timeout integer, these accept a wait boolean (timeout
  is implied by process' "startsecs" configuration).  If wait is
  False, do not wait for startsecs.

Known issues:

- Code does not match state transition map.  Processes which are
  configured as autorestarting which start "successfully" but
  subsequently die after 'startsecs' go through the transitions
  RUNNING -> BACKOFF -> STARTING instead of the correct transitions
  RUNNING -> EXITED -> STARTING.  This has no real negative effect,
  but should be fixed for correctness.

2.0 (2006-08-30)
----------------

- pidfile written in daemon mode had incorrect pid.

- supervisorctl: tail (non -f) did not pass through proper error
  messages when supplied by the server.

- Log signal name used to kill processes at debug level.

- supervisorctl "tail -f" didn't work with supervisorctl sections
  configured with an absolute unix:// URL

- New "environment" config file option allows you to add environment
  variable values to supervisord environment from config file.

2.0b1 (2006-07-12)
------------------

- Fundamental rewrite based on 1.0.7, use distutils (only) for
  installation, use ConfigParser rather than ZConfig, use HTTP for
  wire protocol, web interface, less lies in supervisorctl.

1.0.7 (2006-07-11)
------------------

- Don't log a waitpid error if the error value is "no children".

- Use select() against child file descriptor pipes and bump up select
  timeout appropriately.

1.0.6 (2005-11-20)
------------------

- Various tweaks to make run more effectively on Mac OS X
  (including fixing tests to run there, no more "error reading
  from fd XXX" in logtail output, reduced disk/CPU usage as a
  result of not writing to log file unnecessarily on Mac OS).

1.0.5 (2004-07-29)
------------------

- Short description: In previous releases, managed programs that
  created voluminous stdout/stderr output could run more slowly
  than usual when invoked under supervisor, now they do not.

  Long description: The supervisord manages child output by
  polling pipes related to child process stderr/stdout.  Polling
  operations are performed in the mainloop, which also performs a
  'select' on the filedescriptor(s) related to client/server
  operations.  In prior releases, the select timeout was set to 2
  seconds.  This release changes the timeout to 1/10th of a second
  in order to keep up with client stdout/stderr output.

  Gory description: On Linux, at least, there is a pipe buffer
  size fixed by the kernel of somewhere between 512 - 4096 bytes;
  when a child process writes enough data to fill the pipe buffer,
  it will block on further stdout/stderr output until supervisord
  comes along and clears out the buffer by reading bytes from the
  pipe within the mainloop.  We now clear these buffers much more
  quickly than we did before due to the increased frequency of
  buffer reads in the mainloop; the timeout value of 1/10th of a
  second seems to be fast enough to clear out the buffers of child
  process pipes when managing programs on even a very fast system
  while still enabling the supervisord process to be in a sleeping
  state for most of the time.

1.0.4 or "Alpha 4" (2004-06-30)
-------------------------------

- Forgot to update version tag in configure.py, so the supervisor version
  in a3 is listed as "1.0.1", where it should be "1.0.3".  a4 will be
  listed as "1.0.4'.

- Instead of preventing a process from starting if setuid() can't
  be called (if supervisord is run as nonroot, for example), just log
  the error and proceed.

1.0.3 or "Alpha 3" (2004-05-26)
-------------------------------

- The daemon could chew up a lot of CPU time trying to select()
  on real files (I didn't know select() failed to block when a file
  is at EOF).  Fixed by polling instead of using select().

- Processes could "leak" and become zombies due to a bug in
  reaping dead children.

- supervisord now defaults to daemonizing itself.

- 'daemon' config file option and -d/--daemon command-line option
  removed from supervisord acceptable options.  In place of these
  options, we now have a 'nodaemon' config file option and a
  -n/--nodaemon command-line option.

- logtail now works.

- pidproxy changed slightly to reap children synchronously.

- in alpha2 changelist, supervisord was reported to have a
  "noauth" command-line option.  This was not accurate.  The way
  to turn off auth on the server is to disinclude the "passwdfile"
  config file option from the server config file.  The client
  however does indeed still have a noauth option, which prevents
  it from ever attempting to send authentication credentials to
  servers.

- ZPL license added for ZConfig to LICENSE.txt

1.0.2 or "Alpha 2" (Unreleased)
-------------------------------

- supervisorctl and supervisord no longer need to run on the same machine
  due to the addition of internet socket support.

- supervisorctl and supervisord no longer share a common configuration
  file format.

- supervisorctl now uses a persistent connection to supervisord
  (as opposed to creating a fresh connection for each command).

- SRP (Secure Remote Password) authentication is now a supported form
  of access control for supervisord.  In supervisorctl interactive mode,
  by default, users will be asked for credentials when attempting to
  talk to a supervisord that requires SRP authentication.

- supervisord has a new command-line option and configuration file
  option for specifying "noauth" mode, which signifies that it
  should not require authentication from clients.

- supervisorctl has a new command-line option and configuration
  option for specifying "noauth" mode, which signifies that it
  should never attempt to send authentication info to servers.

- supervisorctl has new commands: open: opens a connection to a new
  supervisord; close: closes the current connection.

- supervisorctl's "logtail" command now retrieves log data from
  supervisord's log file remotely (as opposed to reading it
  directly from a common filesystem).  It also no longer emulates
  "tail -f", it just returns <n> lines of the server's log file.

- The supervisord/supervisorctl wire protocol now has protocol versioning
  and is documented in "protocol.txt".

- "configfile" command-line override -C changed to -c

- top-level section name for supervisor schema changed to 'supervisord'
  from 'supervisor'

- Added 'pidproxy' shim program.

Known issues in alpha 2:

- If supervisorctl loses a connection to a supervisord or if the
  remote supervisord crashes or shuts down unexpectedly, it is
  possible that any supervisorctl talking to it will "hang"
  indefinitely waiting for data.  Pressing Ctrl-C will allow you
  to restart supervisorctl.

- Only one supervisorctl process may talk to a given supervisord
  process at a time.  If two supervisorctl processes attempt to talk
  to the same supervisord process, one will "win" and the other will
  be disconnected.

- Sometimes if a pidproxy is used to start a program, the pidproxy
  program itself will "leak".

1.0.0 or "Alpha 1" (Unreleased)
-------------------------------

Initial release.


================================================
FILE: COPYRIGHT.txt
================================================
Supervisor is Copyright (c) 2006-2015 Agendaless Consulting and Contributors.
(http://www.agendaless.com), All Rights Reserved

medusa was (is?) Copyright (c) Sam Rushing.

http_client.py code Copyright (c) by Daniel Krech, http://eikeon.com/.


================================================
FILE: LICENSES.txt
================================================
Supervisor is licensed under the following license:

  A copyright notice accompanies this license document that identifies
  the copyright holders.

  Redistribution and use in source and binary forms, with or without
  modification, are permitted provided that the following conditions are
  met:

  1.  Redistributions in source code must retain the accompanying
      copyright notice, this list of conditions, and the following
      disclaimer.

  2.  Redistributions in binary form must reproduce the accompanying
      copyright notice, this list of conditions, and the following
      disclaimer in the documentation and/or other materials provided
      with the distribution.

  3.  Names of the copyright holders must not be used to endorse or
      promote products derived from this software without prior
      written permission from the copyright holders.

  4.  If any files are modified, you must cause the modified files to
      carry prominent notices stating that you changed the files and
      the date of any change.

  Disclaimer

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND
    ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
    TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
    PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
    TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
    ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
    THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.

http_client.py code is based on code by Daniel Krech, which was
released under this license:

  LICENSE AGREEMENT FOR RDFLIB 0.9.0 THROUGH 2.3.1
  ------------------------------------------------
  Copyright (c) 2002-2005, Daniel Krech, http://eikeon.com/
  All rights reserved.

  Redistribution and use in source and binary forms, with or without
  modification, are permitted provided that the following conditions are
  met:

    * Redistributions of source code must retain the above copyright
  notice, this list of conditions and the following disclaimer.

    * Redistributions in binary form must reproduce the above
  copyright notice, this list of conditions and the following
  disclaimer in the documentation and/or other materials provided
  with the distribution.

    * Neither the name of Daniel Krech nor the names of its
  contributors may be used to endorse or promote products derived
  from this software without specific prior written permission.

  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Medusa, the asynchronous communications framework upon which
supervisor's server and client code is based, was created by Sam
Rushing:

  Medusa was once distributed under a 'free for non-commercial use'
  license, but in May of 2000 Sam Rushing changed the license to be
  identical to the standard Python license at the time.  The standard
  Python license has always applied to the core components of Medusa,
  this change just frees up the rest of the system, including the http
  server, ftp server, utilities, etc.  Medusa is therefore under the
  following license:

  ==============================
  Permission to use, copy, modify, and distribute this software and
  its documentation for any purpose and without fee is hereby granted,
  provided that the above copyright notice appear in all copies and
  that both that copyright notice and this permission notice appear in
  supporting documentation, and that the name of Sam Rushing not be
  used in advertising or publicity pertaining to distribution of the
  software without specific, written prior permission.

  SAM RUSHING DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
  INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
  NO EVENT SHALL SAM RUSHING BE LIABLE FOR ANY SPECIAL, INDIRECT OR
  CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
  OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
  NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
  WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  ==============================


================================================
FILE: MANIFEST.in
================================================
include CHANGES.rst
include COPYRIGHT.txt
include LICENSES.txt
include README.rst
include tox.ini
include supervisor/version.txt
include supervisor/skel/*.conf
recursive-include supervisor/tests/fixtures *.conf *.py
recursive-include supervisor/ui *.html *.css *.png *.gif
include docs/Makefile
recursive-include docs *.py *.rst *.css *.gif *.png
recursive-exclude docs/.build *


================================================
FILE: README.rst
================================================
Supervisor
==========

Supervisor is a client/server system that allows its users to
control a number of processes on UNIX-like operating systems.

Supported Platforms
-------------------

Supervisor has been tested and is known to run on Linux (Ubuntu), Mac OS X
(10.4, 10.5, 10.6), and Solaris (10 for Intel) and FreeBSD 6.1.  It will
likely work fine on most UNIX systems.

Supervisor will not run at all under any version of Windows.

Supervisor is intended to work on Python 3 version 3.4 or later
and on Python 2 version 2.7.

Documentation
-------------

You can view the current Supervisor documentation online `in HTML format
<http://supervisord.org/>`_ .  This is where you should go for detailed
installation and configuration documentation.

Reporting Bugs and Viewing the Source Repository
------------------------------------------------

Please report bugs in the `GitHub issue tracker
<https://github.com/Supervisor/supervisor/issues>`_.

You can view the source repository for supervisor via
`https://github.com/Supervisor/supervisor
<https://github.com/Supervisor/supervisor>`_.

Contributing
------------

We'll review contributions from the community in
`pull requests <https://help.github.com/articles/using-pull-requests>`_
on GitHub.


================================================
FILE: docs/.static/repoze.css
================================================
@import url('default.css');
body {
    background-color: #006339;
}
 
div.document {
    background-color: #dad3bd;
}

div.sphinxsidebar h3, h4, h5, a {
    color: #127c56 !important;
}

div.related {
    color: #dad3bd !important;
    background-color: #00744a;
}
 
div.related a {
    color: #dad3bd !important;
}

/* override the justify text align of the default */

div.body p {
    text-align: left !important;
}

/* fix google chrome <pre> tag renderings */

pre {
   line-height: normal !important;
}


================================================
FILE: docs/Makefile
================================================
# Makefile for Sphinx documentation
#

# You can set these variables from the command line.
SPHINXOPTS    =
SPHINXBUILD   = sphinx-build
PAPER         =

# Internal variables.
PAPEROPT_a4     = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS   = -d .build/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .

.PHONY: help clean html web pickle htmlhelp latex changes linkcheck

help:
	@echo "Please use \`make <target>' where <target> is one of"
	@echo "  html      to make standalone HTML files"
	@echo "  pickle    to make pickle files (usable by e.g. sphinx-web)"
	@echo "  htmlhelp  to make HTML files and a HTML help project"
	@echo "  latex     to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
	@echo "  changes   to make an overview over all changed/added/deprecated items"
	@echo "  linkcheck to check all external links for integrity"

clean:
	-rm -rf .build/*

html:
	mkdir -p .build/html .build/doctrees
	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) .build/html
	@echo
	@echo "Build finished. The HTML pages are in .build/html."

pickle:
	mkdir -p .build/pickle .build/doctrees
	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) .build/pickle
	@echo
	@echo "Build finished; now you can process the pickle files or run"
	@echo "  sphinx-web .build/pickle"
	@echo "to start the sphinx-web server."

web: pickle

htmlhelp:
	mkdir -p .build/htmlhelp .build/doctrees
	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) .build/htmlhelp
	@echo
	@echo "Build finished; now you can run HTML Help Workshop with the" \
	      ".hhp project file in .build/htmlhelp."

latex:
	mkdir -p .build/latex .build/doctrees
	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) .build/latex
	@echo
	@echo "Build finished; the LaTeX files are in .build/latex."
	@echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \
	      "run these through (pdf)latex."

changes:
	mkdir -p .build/changes .build/doctrees
	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) .build/changes
	@echo
	@echo "The overview file is in .build/changes."

linkcheck:
	mkdir -p .build/linkcheck .build/doctrees
	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) .build/linkcheck
	@echo
	@echo "Link check complete; look for any errors in the above output " \
	      "or in .build/linkcheck/output.txt."


================================================
FILE: docs/api.rst
================================================
.. _xml_rpc:

XML-RPC API Documentation
=========================

To use the XML-RPC interface, first make sure you have configured the interface
factory properly by setting the default factory. See :ref:`rpcinterface_factories`.

Then you can connect to supervisor's HTTP port
with any XML-RPC client library and run commands against it.

An example of doing this using Python 2's ``xmlrpclib`` client library
is as follows.

.. code-block:: python

    import xmlrpclib
    server = xmlrpclib.Server('http://localhost:9001/RPC2')

An example of doing this using Python 3's ``xmlrpc.client`` library
is as follows.

.. code-block:: python

    from xmlrpc.client import ServerProxy
    server = ServerProxy('http://localhost:9001/RPC2')

You may call methods against :program:`supervisord` and its
subprocesses by using the ``supervisor`` namespace.  An example is
provided below.

.. code-block:: python

    server.supervisor.getState()

You can get a list of methods supported by the
:program:`supervisord` XML-RPC interface by using the XML-RPC
``system.listMethods`` API:

.. code-block:: python

    server.system.listMethods()

You can see help on a method by using the ``system.methodHelp`` API
against the method:

.. code-block:: python

    server.system.methodHelp('supervisor.shutdown')

The :program:`supervisord` XML-RPC interface also supports the
`XML-RPC multicall API
<http://web.archive.org/web/20060824100531/http://www.xmlrpc.com/discuss/msgReader$1208>`_.

You can extend :program:`supervisord` functionality with new XML-RPC
API methods by adding new top-level RPC interfaces as necessary.
See :ref:`rpcinterface_factories`.

.. note::

  Any XML-RPC method call may result in a fault response.  This includes errors caused
  by the client such as bad arguments, and any errors that make :program:`supervisord`
  unable to fulfill the request.  Many XML-RPC client programs will raise an exception
  when a fault response is encountered.

.. automodule:: supervisor.rpcinterface

Status and Control
------------------

  .. autoclass:: SupervisorNamespaceRPCInterface

    .. automethod:: getAPIVersion

        This API is versioned separately from Supervisor itself. The API version
        returned by ``getAPIVersion`` only changes when the API changes. Its purpose
        is to help the client identify with which version of the Supervisor API it
        is communicating.

        When writing software that communicates with this API, it is highly
        recommended that you first test the API version for compatibility before
        making method calls.

        .. note::

          The ``getAPIVersion`` method replaces ``getVersion`` found in Supervisor
          versions prior to 3.0a1. It is aliased for compatibility but getVersion()
          is deprecated and support will be dropped from Supervisor in a future
          version.

    .. automethod:: getSupervisorVersion

    .. automethod:: getIdentification

        This method allows the client to identify with which Supervisor
        instance it is communicating in the case of environments where
        multiple Supervisors may be running.

        The identification is a string that must be set in Supervisor’s
        configuration file. This method simply returns that value back to the
        client.

    .. automethod:: getState

        This is an internal value maintained by Supervisor that determines what
        Supervisor believes to be its current operational state.

        Some method calls can alter the current state of the Supervisor. For
        example, calling the method supervisor.shutdown() while the station is
        in the RUNNING state places the Supervisor in the SHUTDOWN state while
        it is shutting down.

        The supervisor.getState() method provides a means for the client to check
        Supervisor's state, both for informational purposes and to ensure that the
        methods it intends to call will be permitted.

        The return value is a struct:

        .. code-block:: python

            {'statecode': 1,
             'statename': 'RUNNING'}

        The possible return values are:

        +---------+----------+----------------------------------------------+
        |statecode|statename |Description                                   |
        +=========+==========+==============================================+
        | 2       |FATAL     |Supervisor has experienced a serious error.   |
        +---------+----------+----------------------------------------------+
        | 1       |RUNNING   |Supervisor is working normally.               |
        +---------+----------+----------------------------------------------+
        | 0       |RESTARTING|Supervisor is in the process of restarting.   |
        +---------+----------+----------------------------------------------+
        | -1      |SHUTDOWN  |Supervisor is in the process of shutting down.|
        +---------+----------+----------------------------------------------+

        The ``FATAL`` state reports unrecoverable errors, such as internal
        errors inside Supervisor or system runaway conditions. Once set to
        ``FATAL``, the Supervisor can never return to any other state without
        being restarted.

        In the ``FATAL`` state, all future methods except
        supervisor.shutdown() and supervisor.restart() will automatically fail
        without being called and the fault ``FATAL_STATE`` will be raised.

        In the ``SHUTDOWN`` or ``RESTARTING`` states, all method calls are
        ignored and their possible return values are undefined.

    .. automethod:: getPID

    .. automethod:: readLog

        It can either return the entire log, a number of characters from the
        tail of the log, or a slice of the log specified by the offset and
        length parameters:

        +--------+---------+------------------------------------------------+
        | Offset | Length  | Behavior of ``readProcessLog``                 |
        +========+=========+================================================+
        |Negative|Not Zero | Bad arguments. This will raise the fault       |
        |        |         | ``BAD_ARGUMENTS``.                             |
        +--------+---------+------------------------------------------------+
        |Negative|Zero     | This will return the tail of the log, or offset|
        |        |         | number of characters from the end of the log.  |
        |        |         | For example, if ``offset`` = -4 and ``length`` |
        |        |         | = 0, then the last four characters will be     |
        |        |         | returned from the end of the log.              |
        +--------+---------+------------------------------------------------+
        |Zero or |Negative | Bad arguments. This will raise the fault       |
        |Positive|         | ``BAD_ARGUMENTS``.                             |
        +--------+---------+------------------------------------------------+
        |Zero or |Zero     | All characters will be returned from the       |
        |Positive|         | ``offset`` specified.                          |
        +--------+---------+------------------------------------------------+
        |Zero or |Positive | A number of characters length will be returned |
        |Positive|         | from the ``offset``.                           |
        +--------+---------+------------------------------------------------+

        If the log is empty and the entire log is requested, an empty string
        is returned.

        If either offset or length is out of range, the fault
        ``BAD_ARGUMENTS`` will be returned.

        If the log cannot be read, this method will raise either the
        ``NO_FILE`` error if the file does not exist or the ``FAILED`` error
        if any other problem was encountered.

        .. note::

          The readLog() method replaces readMainLog() found in Supervisor
          versions prior to 2.1. It is aliased for compatibility but
          readMainLog() is deprecated and support will be dropped from
          Supervisor in a future version.


    .. automethod:: clearLog

        If the log cannot be cleared because the log file does not exist, the
        fault ``NO_FILE`` will be raised. If the log cannot be cleared for any
        other reason, the fault ``FAILED`` will be raised.

    .. automethod:: shutdown

        This method shuts down the Supervisor daemon. If any processes are running,
        they are automatically killed without warning.

        Unlike most other methods, if Supervisor is in the ``FATAL`` state,
        this method will still function.

    .. automethod:: restart

        This method soft restarts the Supervisor daemon. If any processes are
        running, they are automatically killed without warning. Note that the
        actual UNIX process for Supervisor cannot restart; only Supervisor’s
        main program loop. This has the effect of resetting the internal
        states of Supervisor.

        Unlike most other methods, if Supervisor is in the ``FATAL`` state,
        this method will still function.


Process Control
---------------

  .. autoclass:: SupervisorNamespaceRPCInterface
    :noindex:

    .. automethod:: getProcessInfo

        The return value is a struct:

        .. code-block:: python

            {'name':           'process name',
             'group':          'group name',
             'description':    'pid 18806, uptime 0:03:12'
             'start':          1200361776,
             'stop':           0,
             'now':            1200361812,
             'state':          20,
             'statename':      'RUNNING',
             'spawnerr':       '',
             'exitstatus':     0,
             'logfile':        '/path/to/stdout-log', # deprecated, b/c only
             'stdout_logfile': '/path/to/stdout-log',
             'stderr_logfile': '/path/to/stderr-log',
             'pid':            1}

        .. describe:: name

            Name of the process

        .. describe:: group

            Name of the process' group

        .. describe:: description

            If process state is running description's value is process_id
            and uptime. Example "pid 18806, uptime 0:03:12 ".
            If process state is stopped description's value is stop time.
            Example:"Jun 5 03:16 PM ".

        .. describe:: start

            UNIX timestamp of when the process was started

        .. describe:: stop

            UNIX timestamp of when the process last ended, or 0 if the process
            has never been stopped.

        .. describe:: now

            UNIX timestamp of the current time, which can be used to calculate
            process up-time.

        .. describe:: state

            State code, see :ref:`process_states`.

        .. describe:: statename

            String description of `state`, see :ref:`process_states`.

        .. describe:: logfile

            Deprecated alias for ``stdout_logfile``.  This is provided only
            for compatibility with clients written for Supervisor 2.x and
            may be removed in the future.  Use ``stdout_logfile`` instead.

        .. describe:: stdout_logfile

            Absolute path and filename to the STDOUT logfile

        .. describe:: stderr_logfile

            Absolute path and filename to the STDERR logfile

        .. describe:: spawnerr

            Description of error that occurred during spawn, or empty string
            if none.

        .. describe:: exitstatus

            Exit status (errorlevel) of process, or 0 if the process is still
            running.

        .. describe:: pid

            UNIX process ID (PID) of the process, or 0 if the process is not
            running.


    .. automethod:: getAllProcessInfo

        Each element contains a struct, and this struct contains the exact
        same elements as the struct returned by ``getProcessInfo``. If the process
        table is empty, an empty array is returned.

    .. automethod:: getAllConfigInfo

    .. automethod:: startProcess

    .. automethod:: startAllProcesses

    .. automethod:: startProcessGroup

    .. automethod:: stopProcess

    .. automethod:: stopProcessGroup

    .. automethod:: stopAllProcesses

    .. automethod:: signalProcess

    .. automethod:: signalProcessGroup

    .. automethod:: signalAllProcesses

    .. automethod:: sendProcessStdin

    .. automethod:: sendRemoteCommEvent

    .. automethod:: reloadConfig

    .. automethod:: addProcessGroup

    .. automethod:: removeProcessGroup

Process Logging
---------------

  .. autoclass:: SupervisorNamespaceRPCInterface
    :noindex:

    .. automethod:: readProcessStdoutLog

    .. automethod:: readProcessStderrLog

    .. automethod:: tailProcessStdoutLog

    .. automethod:: tailProcessStderrLog

    .. automethod:: clearProcessLogs

    .. automethod:: clearAllProcessLogs


.. automodule:: supervisor.xmlrpc

System Methods
--------------

  .. autoclass:: SystemNamespaceRPCInterface

    .. automethod:: listMethods

    .. automethod:: methodHelp

    .. automethod:: methodSignature

    .. automethod:: multicall


================================================
FILE: docs/conf.py
================================================
# -*- coding: utf-8 -*-
#
# Supervisor documentation build configuration file
#
# This file is execfile()d with the current directory set to its containing
# dir.
#
# The contents of this file are pickled, so don't put values in the
# namespace that aren't pickleable (module imports are okay, they're
# removed automatically).
#
# All configuration values have a default value; values that are commented
# out serve to show the default value.

import sys, os
from datetime import date

# If your extensions are in another directory, add it here. If the
# directory is relative to the documentation root, use os.path.abspath to
# make it absolute, like shown here.
#sys.path.append(os.path.abspath('some/directory'))

parent = os.path.dirname(os.path.dirname(__file__))
sys.path.append(os.path.abspath(parent))

version_txt = os.path.join(parent, 'supervisor/version.txt')
supervisor_version = open(version_txt).read().strip()

# General configuration
# ---------------------

# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
extensions = ['sphinx.ext.autodoc']

# Add any paths that contain templates here, relative to this directory.
templates_path = ['.templates']

# The suffix of source filenames.
source_suffix = '.rst'

# The master toctree document.
master_doc = 'index'

# General substitutions.
project = 'Supervisor'
year = date.today().year
copyright = '2004-%d, Agendaless Consulting and Contributors' % year

# The default replacements for |version| and |release|, also used in various
# other places throughout the built documents.
#
# The short X.Y version.
version = supervisor_version
# The full version, including alpha/beta/rc tags.
release = version

# There are two options for replacing |today|: either, you set today to
# some non-false value, then it is used:
#today = ''
# Else, today_fmt is used as the format for a strftime call.
today_fmt = '%B %d, %Y'

# List of documents that shouldn't be included in the build.
#unused_docs = []

# List of directories, relative to source directories, that shouldn't be
# searched for source files.
#exclude_dirs = []

# The reST default role (used for this markup: `text`) to use for all
# documents.
#default_role = None

# If true, '()' will be appended to :func: etc. cross-reference text.
#add_function_parentheses = True

# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
#add_module_names = True

# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
#show_authors = False

# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'


# Options for HTML output
# -----------------------

# The style sheet to use for HTML and HTML Help pages. A file of that name
# must exist either in Sphinx' static/ path, or in one of the custom paths
# given in html_static_path.
html_style = 'repoze.css'

# The name for this set of Sphinx documents.  If None, it defaults to
# "<project> v<release> documentation".
#html_title = None

# A shorter title for the navigation bar.  Default is the same as
# html_title.
#html_short_title = None

# The name of an image file (within the static path) to place at the top of
# the sidebar.
html_logo = '.static/logo_hi.gif'

# The name of an image file (within the static path) to use as favicon of
# the docs.  This file should be a Windows icon file (.ico) being 16x16 or
# 32x32 pixels large.
#html_favicon = None

# Add any paths that contain custom static files (such as style sheets)
# here, relative to this directory. They are copied after the builtin
# static files, so a file named "default.css" will overwrite the builtin
# "default.css".
html_static_path = ['.static']

# If not '', a 'Last updated on:' timestamp is inserted at every page
# bottom, using the given strftime format.
html_last_updated_fmt = '%b %d, %Y'

# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#html_use_smartypants = True

# Custom sidebar templates, maps document names to template names.
#html_sidebars = {}

# Additional templates that should be rendered to pages, maps page names to
# template names.
#html_additional_pages = {}

# If false, no module index is generated.
#html_use_modindex = True

# If false, no index is generated.
#html_use_index = True

# If true, the index is split into individual pages for each letter.
#html_split_index = False

# If true, the reST sources are included in the HTML build as
# _sources/<name>.
#html_copy_source = True

# If true, an OpenSearch description file will be output, and all pages
# will contain a <link> tag referring to it.  The value of this option must
# be the base URL from which the finished HTML is served.
#html_use_opensearch = ''

# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml").
#html_file_suffix = ''

# Output file base name for HTML help builder.
htmlhelp_basename = 'supervisor'


# Options for LaTeX output
# ------------------------

# The paper size ('letter' or 'a4').
#latex_paper_size = 'letter'

# The font size ('10pt', '11pt' or '12pt').
#latex_font_size = '10pt'

# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
#  author, document class [howto/manual]).
latex_documents = [
  ('index', 'supervisor.tex', 'supervisor Documentation',
   'Supervisor Developers', 'manual'),
]

# The name of an image file (relative to this directory) to place at the
# top of the title page.
latex_logo = '.static/logo_hi.gif'

# For "manual" documents, if this is true, then toplevel headings are
# parts, not chapters.
#latex_use_parts = False

# Additional stuff for the LaTeX preamble.
#latex_preamble = ''

# Documents to append as an appendix to all manuals.
#latex_appendices = []

# If false, no module index is generated.
#latex_use_modindex = True


================================================
FILE: docs/configuration.rst
================================================
Configuration File
==================

The Supervisor configuration file is conventionally named
:file:`supervisord.conf`.  It is used by both :program:`supervisord`
and :program:`supervisorctl`.  If either application is started
without the ``-c`` option (the option which is used to tell the
application the configuration filename explicitly), the application
will look for a file named :file:`supervisord.conf` within the
following locations, in the specified order.  It will use the first
file it finds.

#. :file:`../etc/supervisord.conf` (Relative to the executable)

#. :file:`../supervisord.conf` (Relative to the executable)

#. :file:`$CWD/supervisord.conf`

#. :file:`$CWD/etc/supervisord.conf`

#. :file:`/etc/supervisord.conf`

#. :file:`/etc/supervisor/supervisord.conf` (since Supervisor 3.3.0)

.. note::

  Many versions of Supervisor packaged for Debian and Ubuntu included a patch
  that added ``/etc/supervisor/supervisord.conf`` to the search paths.  The
  first PyPI package of Supervisor to include it was Supervisor 3.3.0.

File Format
-----------

:file:`supervisord.conf` is a Windows-INI-style (Python ConfigParser)
file.  It has sections (each denoted by a ``[header]``) and key / value
pairs within the sections.  The sections and their allowable values
are described below.

Environment Variables
~~~~~~~~~~~~~~~~~~~~~

Environment variables that are present in the environment at the time that
:program:`supervisord` is started can be used in the configuration file
using the Python string expression syntax ``%(ENV_X)s``:

.. code-block:: ini

    [program:example]
    command=/usr/bin/example --loglevel=%(ENV_LOGLEVEL)s

In the example above, the expression ``%(ENV_LOGLEVEL)s`` would be expanded
to the value of the environment variable ``LOGLEVEL``.

.. note::

    In Supervisor 3.2 and later, ``%(ENV_X)s`` expressions are supported in
    all options.  In prior versions, some options support them, but most
    do not.  See the documentation for each option below.


``[unix_http_server]`` Section Settings
---------------------------------------

The :file:`supervisord.conf` file contains a section named
``[unix_http_server]`` under which configuration parameters for an
HTTP server that listens on a UNIX domain socket should be inserted.
If the configuration file has no ``[unix_http_server]`` section, a
UNIX domain socket HTTP server will not be started.  The allowable
configuration values are as follows.

``[unix_http_server]`` Section Values
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

``file``

  A path to a UNIX domain socket on which supervisor will listen for
  HTTP/XML-RPC requests.  :program:`supervisorctl` uses XML-RPC to
  communicate with :program:`supervisord` over this port.  This option
  can include the value ``%(here)s``, which expands to the directory
  in which the :program:`supervisord` configuration file was found.

  *Default*:  None.

  *Required*:  No.

  *Introduced*: 3.0

.. warning::

  The example configuration output by :program:`echo_supervisord_conf` uses
  ``/tmp/supervisor.sock`` as the socket file.  That path is an example only
  and will likely need to be changed to a location more appropriate for your
  system.  Some systems periodically delete older files in ``/tmp``.  If the
  socket file is deleted, :program:`supervisorctl` will be unable to
  connect to :program:`supervisord`.

``chmod``

  Change the UNIX permission mode bits of the UNIX domain socket to
  this value at startup.

  *Default*: ``0700``

  *Required*:  No.

  *Introduced*: 3.0

``chown``

  Change the user and group of the socket file to this value.  May be
  a UNIX username (e.g. ``chrism``) or a UNIX username and group
  separated by a colon (e.g. ``chrism:wheel``).

  *Default*:  Use the username and group of the user who starts supervisord.

  *Required*:  No.

  *Introduced*: 3.0

``username``

  The username required for authentication to this HTTP server.

  *Default*:  No username required.

  *Required*:  No.

  *Introduced*: 3.0

``password``

  The password required for authentication to this HTTP server.  This
  can be a cleartext password, or can be specified as a SHA-1 hash if
  prefixed by the string ``{SHA}``.  For example,
  ``{SHA}82ab876d1387bfafe46cc1c8a2ef074eae50cb1d`` is the SHA-stored
  version of the password "thepassword".

  Note that hashed password must be in hex format.

  *Default*:  No password required.

  *Required*:  No.

  *Introduced*: 3.0

``[unix_http_server]`` Section Example
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: ini

   [unix_http_server]
   file = /tmp/supervisor.sock
   chmod = 0777
   chown= nobody:nogroup
   username = user
   password = 123

``[inet_http_server]`` Section Settings
---------------------------------------

The :file:`supervisord.conf` file contains a section named
``[inet_http_server]`` under which configuration parameters for an
HTTP server that listens on a TCP (internet) socket should be
inserted.  If the configuration file has no ``[inet_http_server]``
section, an inet HTTP server will not be started.  The allowable
configuration values are as follows.

.. warning::

  The inet HTTP server is not enabled by default.  If you choose to enable it,
  please read the following security warning.  The inet HTTP server is intended
  for use within a trusted environment only.  It should only be bound to localhost
  or only accessible from within an isolated, trusted network.  The inet HTTP server
  does not support any form of encryption.  The inet HTTP server does not use
  authentication by default (see the ``username=`` and ``password=`` options).
  The inet HTTP server can be controlled remotely from :program:`supervisorctl`.
  It also serves a web interface that allows subprocesses to be started or stopped,
  and subprocess logs to be viewed.  **Never expose the inet HTTP server to the
  public internet.**

``[inet_http_server]`` Section Values
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

``port``

  A TCP host:port value or (e.g. ``127.0.0.1:9001``) on which
  supervisor will listen for HTTP/XML-RPC requests.
  :program:`supervisorctl` will use XML-RPC to communicate with
  :program:`supervisord` over this port.  To listen on all interfaces
  in the machine, use ``:9001`` or ``*:9001``.  Please read the security
  warning above.

  *Default*:  No default.

  *Required*:  Yes.

  *Introduced*: 3.0

``username``

  The username required for authentication to this HTTP server.

  *Default*:  No username required.

  *Required*:  No.

  *Introduced*: 3.0

``password``

  The password required for authentication to this HTTP server.  This
  can be a cleartext password, or can be specified as a SHA-1 hash if
  prefixed by the string ``{SHA}``.  For example,
  ``{SHA}82ab876d1387bfafe46cc1c8a2ef074eae50cb1d`` is the SHA-stored
  version of the password "thepassword".

  Note that hashed password must be in hex format.

  *Default*:  No password required.

  *Required*:  No.

  *Introduced*: 3.0

``[inet_http_server]`` Section Example
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: ini

   [inet_http_server]
   port = 127.0.0.1:9001
   username = user
   password = 123

``[supervisord]`` Section Settings
----------------------------------

The :file:`supervisord.conf` file contains a section named
``[supervisord]`` in which global settings related to the
:program:`supervisord` process should be inserted.  These are as
follows.

``[supervisord]`` Section Values
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

``logfile``

  The path to the activity log of the supervisord process.  This
  option can include the value ``%(here)s``, which expands to the
  directory in which the supervisord configuration file was found.

  .. note::

    If ``logfile`` is set to a special file like ``/dev/stdout`` that is
    not seekable, log rotation must be disabled by setting
    ``logfile_maxbytes = 0``.

  *Default*:  :file:`$CWD/supervisord.log`

  *Required*:  No.

  *Introduced*: 3.0

``logfile_maxbytes``

  The maximum number of bytes that may be consumed by the activity log
  file before it is rotated (suffix multipliers like "KB", "MB", and
  "GB" can be used in the value).  Set this value to 0 to indicate an
  unlimited log size.

  *Default*:  50MB

  *Required*:  No.

  *Introduced*: 3.0

``logfile_backups``

  The number of backups to keep around resulting from activity log
  file rotation.  If set to 0, no backups will be kept.

  *Default*:  10

  *Required*:  No.

  *Introduced*: 3.0

``loglevel``

  The logging level, dictating what is written to the supervisord
  activity log.  One of ``critical``, ``error``, ``warn``, ``info``,
  ``debug``, ``trace``, or ``blather``.  Note that at log level
  ``debug``, the supervisord log file will record the stderr/stdout
  output of its child processes and extended info about process
  state changes, which is useful for debugging a process which isn't
  starting properly.  See also: :ref:`activity_log_levels`.

  *Default*:  info

  *Required*:  No.

  *Introduced*: 3.0

``pidfile``

  The location in which supervisord keeps its pid file.  This option
  can include the value ``%(here)s``, which expands to the directory
  in which the supervisord configuration file was found.

  *Default*:  :file:`$CWD/supervisord.pid`

  *Required*:  No.

  *Introduced*: 3.0

``umask``

  The :term:`umask` of the supervisord process.

  *Default*:  ``022``

  *Required*:  No.

  *Introduced*: 3.0

``nodaemon``

  If true, supervisord will start in the foreground instead of
  daemonizing.

  *Default*:  false

  *Required*:  No.

  *Introduced*: 3.0

``silent``

  If true and not daemonized, logs will not be directed to stdout.

  *Default*:  false

  *Required*: No.

  *Introduced*: 4.2.0

``minfds``

  The minimum number of file descriptors that must be available before
  supervisord will start successfully.  A call to setrlimit will be made
  to attempt to raise the soft and hard limits of the supervisord process to
  satisfy ``minfds``.  The hard limit may only be raised if supervisord
  is run as root.  supervisord uses file descriptors liberally, and will
  enter a failure mode when one cannot be obtained from the OS, so it's
  useful to be able to specify a minimum value to ensure it doesn't run out
  of them during execution.  These limits will be inherited by the managed
  subprocesses.  This option is particularly useful on Solaris,
  which has a low per-process fd limit by default.

  *Default*:  1024

  *Required*:  No.

  *Introduced*: 3.0

``minprocs``

  The minimum number of process descriptors that must be available
  before supervisord will start successfully.  A call to setrlimit will be
  made to attempt to raise the soft and hard limits of the supervisord process
  to satisfy ``minprocs``.  The hard limit may only be raised if supervisord
  is run as root.  supervisord will enter a failure mode when the OS runs out
  of process descriptors, so it's useful to ensure that enough process
  descriptors are available upon :program:`supervisord` startup.

  *Default*:  200

  *Required*:  No.

  *Introduced*: 3.0

``nocleanup``

  Prevent supervisord from clearing any existing ``AUTO``
  child log files at startup time.  Useful for debugging.

  *Default*:  false

  *Required*:  No.

  *Introduced*: 3.0

``childlogdir``

  The directory used for ``AUTO`` child log files.  This option can
  include the value ``%(here)s``, which expands to the directory in
  which the :program:`supervisord` configuration file was found.

  *Default*: value of Python's :func:`tempfile.gettempdir`

  *Required*:  No.

  *Introduced*: 3.0

``user``

  Instruct :program:`supervisord` to switch users to this UNIX user
  account before doing any meaningful processing.  The user can only
  be switched if :program:`supervisord` is started as the root user.

  *Default*: do not switch users

  *Required*:  No.

  *Introduced*: 3.0

  *Changed*: 3.3.4.  If :program:`supervisord` can't switch to the
  specified user, it will write an error message to ``stderr`` and
  then exit immediately.  In earlier versions, it would continue to
  run but would log a message at the ``critical`` level.

``directory``

  When :program:`supervisord` daemonizes, switch to this directory.
  This option can include the value ``%(here)s``, which expands to the
  directory in which the :program:`supervisord` configuration file was
  found.

  *Default*: do not cd

  *Required*:  No.

  *Introduced*: 3.0

``strip_ansi``

  Strip all ANSI escape sequences from child log files.

  *Default*: false

  *Required*:  No.

  *Introduced*: 3.0

``environment``

  A list of key/value pairs in the form ``KEY="val",KEY2="val2"`` that
  will be placed in the environment of all child processes.  This does
  not change the environment of :program:`supervisord` itself.  This
  option can include the value ``%(here)s``, which expands to the
  directory in which the supervisord configuration file was found.
  Values containing non-alphanumeric characters should be quoted
  (e.g. ``KEY="val:123",KEY2="val,456"``).  Otherwise, quoting the
  values is optional but recommended.  To escape percent characters,
  simply use two. (e.g. ``URI="/first%%20name"``) **Note** that
  subprocesses will inherit the environment variables of the shell
  used to start :program:`supervisord` except for the ones overridden
  here and within the program's ``environment`` option.  See
  :ref:`subprocess_environment`.

  *Default*: no values

  *Required*:  No.

  *Introduced*: 3.0

``identifier``

  The identifier string for this supervisor process, used by the RPC
  interface.

  *Default*: supervisor

  *Required*:  No.

  *Introduced*: 3.0

``[supervisord]`` Section Example
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: ini

   [supervisord]
   logfile = /tmp/supervisord.log
   logfile_maxbytes = 50MB
   logfile_backups=10
   loglevel = info
   pidfile = /tmp/supervisord.pid
   nodaemon = false
   minfds = 1024
   minprocs = 200
   umask = 022
   user = chrism
   identifier = supervisor
   directory = /tmp
   nocleanup = true
   childlogdir = /tmp
   strip_ansi = false
   environment = KEY1="value1",KEY2="value2"

``[supervisorctl]`` Section Settings
------------------------------------

  The configuration file may contain settings for the
  :program:`supervisorctl` interactive shell program.  These options
  are listed below.

``[supervisorctl]`` Section Values
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

``serverurl``

  The URL that should be used to access the supervisord server,
  e.g. ``http://localhost:9001``.  For UNIX domain sockets, use
  ``unix:///absolute/path/to/file.sock``.

  *Default*: ``http://localhost:9001``

  *Required*:  No.

  *Introduced*: 3.0

``username``

  The username to pass to the supervisord server for use in
  authentication.  This should be same as ``username`` from the
  supervisord server configuration for the port or UNIX domain socket
  you're attempting to access.

  *Default*: No username

  *Required*:  No.

  *Introduced*: 3.0

``password``

  The password to pass to the supervisord server for use in
  authentication. This should be the cleartext version of ``password``
  from the supervisord server configuration for the port or UNIX
  domain socket you're attempting to access.  This value cannot be
  passed as a SHA hash.  Unlike other passwords specified in this
  file, it must be provided in cleartext.

  *Default*: No password

  *Required*:  No.

  *Introduced*: 3.0

``prompt``

  String used as supervisorctl prompt.

  *Default*: ``supervisor``

  *Required*:  No.

  *Introduced*: 3.0

``history_file``

  A path to use as the ``readline`` persistent history file.  If you
  enable this feature by choosing a path, your supervisorctl commands
  will be kept in the file, and you can use readline (e.g. arrow-up)
  to invoke commands you performed in your last supervisorctl session.

  *Default*: No file

  *Required*:  No.

  *Introduced*: 3.0a5

``[supervisorctl]`` Section Example
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: ini

   [supervisorctl]
   serverurl = unix:///tmp/supervisor.sock
   username = chris
   password = 123
   prompt = mysupervisor

.. _programx_section:

``[program:x]`` Section Settings
--------------------------------

The configuration file must contain one or more ``program`` sections
in order for supervisord to know which programs it should start and
control.  The header value is composite value.  It is the word
"program", followed directly by a colon, then the program name.  A
header value of ``[program:foo]`` describes a program with the name of
"foo".  The name is used within client applications that control the
processes that are created as a result of this configuration.  It is
an error to create a ``program`` section that does not have a name.
The name must not include a colon character or a bracket character.
The value of the name is used as the value for the
``%(program_name)s`` string expression expansion within other values
where specified.

.. note::

   A ``[program:x]`` section actually represents a "homogeneous
   process group" to supervisor (as of 3.0).  The members of the group
   are defined by the combination of the ``numprocs`` and
   ``process_name`` parameters in the configuration.  By default, if
   numprocs and process_name are left unchanged from their defaults,
   the group represented by ``[program:x]`` will be named ``x`` and
   will have a single process named ``x`` in it.  This provides a
   modicum of backwards compatibility with older supervisor releases,
   which did not treat program sections as homogeneous process group
   definitions.

   But for instance, if you have a ``[program:foo]`` section with a
   ``numprocs`` of 3 and a ``process_name`` expression of
   ``%(program_name)s_%(process_num)02d``, the "foo" group will
   contain three processes, named ``foo_00``, ``foo_01``, and
   ``foo_02``.  This makes it possible to start a number of very
   similar processes using a single ``[program:x]`` section.  All
   logfile names, all environment strings, and the command of programs
   can also contain similar Python string expressions, to pass
   slightly different parameters to each process.

``[program:x]`` Section Values
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

``command``

  The command that will be run when this program is started.  The
  command can be either absolute (e.g. ``/path/to/programname``) or
  relative (e.g. ``programname``).  If it is relative, the
  supervisord's environment ``$PATH`` will be searched for the
  executable.  Programs can accept arguments, e.g. ``/path/to/program
  foo bar``.  The command line can use double quotes to group
  arguments with spaces in them to pass to the program,
  e.g. ``/path/to/program/name -p "foo bar"``.  Note that the value of
  ``command`` may include Python string expressions,
  e.g. ``/path/to/programname --port=80%(process_num)02d`` might
  expand to ``/path/to/programname --port=8000`` at runtime.  String
  expressions are evaluated against a dictionary containing the keys
  ``group_name``, ``host_node_name``, ``program_name``, ``process_num``,
  ``numprocs``, ``here`` (the directory of the supervisord config file),
  and all supervisord's environment variables prefixed with ``ENV_``.
  Controlled programs should themselves not be daemons, as supervisord
  assumes it is responsible for daemonizing its subprocesses (see
  :ref:`nondaemonizing_of_subprocesses`).

  .. note::

    The command will be truncated if it looks like a config file comment,
    e.g. ``command=bash -c 'foo ; bar'`` will be truncated to
    ``command=bash -c 'foo``.  Quoting will not prevent this behavior,
    since the configuration file reader does not parse the command like
    a shell would.

  *Default*: No default.

  *Required*:  Yes.

  *Introduced*: 3.0

  *Changed*: 4.2.0.  Added support for the ``numprocs`` expansion.

``process_name``

  A Python string expression that is used to compose the supervisor
  process name for this process.  You usually don't need to worry
  about setting this unless you change ``numprocs``.  The string
  expression is evaluated against a dictionary that includes
  ``group_name``, ``host_node_name``, ``process_num``, ``program_name``,
  and ``here`` (the directory of the supervisord config file).

  *Default*: ``%(program_name)s``

  *Required*:  No.

  *Introduced*: 3.0

``numprocs``

  Supervisor will start as many instances of this program as named by
  numprocs.  Note that if numprocs > 1, the ``process_name``
  expression must include ``%(process_num)s`` (or any other
  valid Python string expression that includes ``process_num``) within
  it.

  *Default*: 1

  *Required*:  No.

  *Introduced*: 3.0

``numprocs_start``

  An integer offset that is used to compute the number at which
  ``process_num`` starts.

  *Default*: 0

  *Required*:  No.

  *Introduced*: 3.0

``priority``

  The relative priority of the program in the start and shutdown
  ordering.  Lower priorities indicate programs that start first and
  shut down last at startup and when aggregate commands are used in
  various clients (e.g. "start all"/"stop all").  Higher priorities
  indicate programs that start last and shut down first.

  *Default*: 999

  *Required*:  No.

  *Introduced*: 3.0

``autostart``

  If true, this program will start automatically when supervisord is
  started.

  *Default*: true

  *Required*:  No.

  *Introduced*: 3.0

``startsecs``

  The total number of seconds which the program needs to stay running
  after a startup to consider the start successful (moving the process
  from the ``STARTING`` state to the ``RUNNING`` state).  Set to ``0``
  to indicate that the program needn't stay running for any particular
  amount of time.

  .. note::

      Even if a process exits with an "expected" exit code (see
      ``exitcodes``), the start will still be considered a failure
      if the process exits quicker than ``startsecs``.

  *Default*: 1

  *Required*:  No.

  *Introduced*: 3.0

``startretries``

  The number of serial failure attempts that :program:`supervisord`
  will allow when attempting to start the program before giving up and
  putting the process into an ``FATAL`` state.

  .. note::

      After each failed restart, process will be put in ``BACKOFF`` state
      and each retry attempt will take increasingly more time.

      See :ref:`process_states` for explanation of the ``FATAL`` and
      ``BACKOFF`` states.

  *Default*: 3

  *Required*:  No.

  *Introduced*: 3.0

``autorestart``

  Specifies if :program:`supervisord` should automatically restart a
  process if it exits when it is in the ``RUNNING`` state.  May be
  one of ``false``, ``unexpected``, or ``true``.  If ``false``, the
  process will not be autorestarted.  If ``unexpected``, the process
  will be restarted when the program exits with an exit code that is
  not one of the exit codes associated with this process' configuration
  (see ``exitcodes``).  If ``true``, the process will be unconditionally
  restarted when it exits, without regard to its exit code.

  .. note::

      ``autorestart`` controls whether :program:`supervisord` will
      autorestart a program if it exits after it has successfully started
      up (the process is in the ``RUNNING`` state).

      :program:`supervisord` has a different restart mechanism for when the
      process is starting up (the process is in the ``STARTING`` state).
      Retries during process startup are controlled by ``startsecs``
      and ``startretries``.

  *Default*: unexpected

  *Required*:  No.

  *Introduced*: 3.0

``exitcodes``

  The list of "expected" exit codes for this program used with ``autorestart``.
  If the ``autorestart`` parameter is set to ``unexpected``, and the process
  exits in any other way than as a result of a supervisor stop
  request, :program:`supervisord` will restart the process if it exits
  with an exit code that is not defined in this list.

  *Default*: 0

  *Required*:  No.

  *Introduced*: 3.0

  .. note::

      In Supervisor versions prior to 4.0, the default was ``0,2``.  In
      Supervisor 4.0, the default was changed to ``0``.

``stopsignal``

  The signal used to kill the program when a stop is requested.  This can be
  specified using the signal's name or its number.  It is normally one of:
  ``TERM``, ``HUP``, ``INT``, ``QUIT``, ``KILL``, ``USR1``, or ``USR2``.

  *Default*: TERM

  *Required*:  No.

  *Introduced*: 3.0

``stopwaitsecs``

  The number of seconds to wait for the OS to return a SIGCHLD to
  :program:`supervisord` after the program has been sent a stopsignal.
  If this number of seconds elapses before :program:`supervisord`
  receives a SIGCHLD from the process, :program:`supervisord` will
  attempt to kill it with a final SIGKILL.

  *Default*: 10

  *Required*:  No.

  *Introduced*: 3.0

``stopasgroup``

  If true, the flag causes supervisor to send the stop signal to the
  whole process group and implies ``killasgroup`` is true.  This is useful
  for programs, such as Flask in debug mode, that do not propagate
  stop signals to their children, leaving them orphaned.

  *Default*: false

  *Required*:  No.

  *Introduced*: 3.0b1

``killasgroup``

  If true, when resorting to send SIGKILL to the program to terminate
  it send it to its whole process group instead, taking care of its
  children as well, useful e.g with Python programs using
  :mod:`multiprocessing`.

  *Default*: false

  *Required*:  No.

  *Introduced*: 3.0a11

``user``

  Instruct :program:`supervisord` to use this UNIX user account as the
  account which runs the program.  The user can only be switched if
  :program:`supervisord` is run as the root user.  If :program:`supervisord`
  can't switch to the specified user, the program will not be started.

  .. note::

      The user will be changed using ``setuid`` only.  This does not start
      a login shell and does not change environment variables like
      ``USER`` or ``HOME``.  See :ref:`subprocess_environment` for details.

  *Default*: Do not switch users

  *Required*:  No.

  *Introduced*: 3.0

``redirect_stderr``

  If true, cause the process' stderr output to be sent back to
  :program:`supervisord` on its stdout file descriptor (in UNIX shell
  terms, this is the equivalent of executing ``/the/program 2>&1``).

  .. note::

     Do not set ``redirect_stderr=true`` in an ``[eventlistener:x]`` section.
     Eventlisteners use ``stdout`` and ``stdin`` to communicate with
     ``supervisord``.  If ``stderr`` is redirected, output from
     ``stderr`` will interfere with the eventlistener protocol.

  *Default*: false

  *Required*:  No.

  *Introduced*: 3.0, replaces 2.0's ``log_stdout`` and ``log_stderr``

``stdout_logfile``

  Put process stdout output in this file (and if redirect_stderr is
  true, also place stderr output in this file).  If ``stdout_logfile``
  is unset or set to ``AUTO``, supervisor will automatically choose a
  file location.  If this is set to ``NONE``, supervisord will create
  no log file.  ``AUTO`` log files and their backups will be deleted
  when :program:`supervisord` restarts.  The ``stdout_logfile`` value
  can contain Python string expressions that will evaluated against a
  dictionary that contains the keys ``group_name``, ``host_node_name``,
  ``process_num``, ``program_name``, and ``here`` (the directory of the
  supervisord config file).

  .. note::

     It is not possible for two processes to share a single log file
     (``stdout_logfile``) when rotation (``stdout_logfile_maxbytes``)
     is enabled.  This will result in the file being corrupted.

  .. note::

    If ``stdout_logfile`` is set to a special file like ``/dev/stdout``
    that is not seekable, log rotation must be disabled by setting
    ``stdout_logfile_maxbytes = 0``.

  *Default*: ``AUTO``

  *Required*:  No.

  *Introduced*: 3.0, replaces 2.0's ``logfile``

``stdout_logfile_maxbytes``

  The maximum number of bytes that may be consumed by
  ``stdout_logfile`` before it is rotated (suffix multipliers like
  "KB", "MB", and "GB" can be used in the value).  Set this value to 0
  to indicate an unlimited log size.

  *Default*: 50MB

  *Required*:  No.

  *Introduced*: 3.0, replaces 2.0's ``logfile_maxbytes``

``stdout_logfile_backups``

  The number of ``stdout_logfile`` backups to keep around resulting
  from process stdout log file rotation.  If set to 0, no backups
  will be kept.

  *Default*: 10

  *Required*:  No.

  *Introduced*: 3.0, replaces 2.0's ``logfile_backups``

``stdout_capture_maxbytes``

  Max number of bytes written to capture FIFO when process is in
  "stdout capture mode" (see :ref:`capture_mode`).  Should be an
  integer (suffix multipliers like "KB", "MB" and "GB" can used in the
  value).  If this value is 0, process capture mode will be off.

  *Default*: 0

  *Required*:  No.

  *Introduced*: 3.0

``stdout_events_enabled``

  If true, PROCESS_LOG_STDOUT events will be emitted when the process
  writes to its stdout file descriptor.  The events will only be
  emitted if the file descriptor is not in capture mode at the time
  the data is received (see :ref:`capture_mode`).

  *Default*: 0

  *Required*:  No.

  *Introduced*: 3.0a7

``stdout_syslog``

  If true, stdout will be directed to syslog along with the process name.

  *Default*: False

  *Required*:  No.

  *Introduced*: 4.0.0

``stderr_logfile``

  Put process stderr output in this file unless ``redirect_stderr`` is
  true.  Accepts the same value types as ``stdout_logfile`` and may
  contain the same Python string expressions.

  .. note::

     It is not possible for two processes to share a single log file
     (``stderr_logfile``) when rotation (``stderr_logfile_maxbytes``)
     is enabled.  This will result in the file being corrupted.

  .. note::

    If ``stderr_logfile`` is set to a special file like ``/dev/stderr``
    that is not seekable, log rotation must be disabled by setting
    ``stderr_logfile_maxbytes = 0``.

  *Default*: ``AUTO``

  *Required*:  No.

  *Introduced*: 3.0

``stderr_logfile_maxbytes``

  The maximum number of bytes before logfile rotation for
  ``stderr_logfile``.  Accepts the same value types as
  ``stdout_logfile_maxbytes``.

  *Default*: 50MB

  *Required*:  No.

  *Introduced*: 3.0

``stderr_logfile_backups``

  The number of backups to keep around resulting from process stderr
  log file rotation.  If set to 0, no backups will be kept.

  *Default*: 10

  *Required*:  No.

  *Introduced*: 3.0

``stderr_capture_maxbytes``

  Max number of bytes written to capture FIFO when process is in
  "stderr capture mode" (see :ref:`capture_mode`).  Should be an
  integer (suffix multipliers like "KB", "MB" and "GB" can used in the
  value).  If this value is 0, process capture mode will be off.

  *Default*: 0

  *Required*:  No.

  *Introduced*: 3.0

``stderr_events_enabled``

  If true, PROCESS_LOG_STDERR events will be emitted when the process
  writes to its stderr file descriptor.  The events will only be
  emitted if the file descriptor is not in capture mode at the time
  the data is received (see :ref:`capture_mode`).

  *Default*: false

  *Required*:  No.

  *Introduced*: 3.0a7

``stderr_syslog``

  If true, stderr will be directed to syslog along with the process name.

  *Default*: False

  *Required*:  No.

  *Introduced*: 4.0.0

``environment``

  A list of key/value pairs in the form ``KEY="val",KEY2="val2"`` that
  will be placed in the child process' environment.  The environment
  string may contain Python string expressions that will be evaluated
  against a dictionary containing ``group_name``, ``host_node_name``,
  ``process_num``, ``program_name``, and ``here`` (the directory of the
  supervisord config file).  Values containing non-alphanumeric characters
  should be quoted (e.g. ``KEY="val:123",KEY2="val,456"``).  Otherwise,
  quoting the values is optional but recommended.  **Note** that the
  subprocess will inherit the environment variables of the shell used to
  start "supervisord" except for the ones overridden here.  See
  :ref:`subprocess_environment`.

  *Default*: No extra environment

  *Required*:  No.

  *Introduced*: 3.0

``directory``

  A file path representing a directory to which :program:`supervisord`
  should temporarily chdir before exec'ing the child.

  *Default*: No chdir (inherit supervisor's)

  *Required*:  No.

  *Introduced*: 3.0

``umask``

  An octal number (e.g. 002, 022) representing the umask of the
  process.

  *Default*: No special umask (inherit supervisor's)

  *Required*:  No.

  *Introduced*: 3.0

``serverurl``

  The URL passed in the environment to the subprocess process as
  ``SUPERVISOR_SERVER_URL`` (see :mod:`supervisor.childutils`) to
  allow the subprocess to easily communicate with the internal HTTP
  server.  If provided, it should have the same syntax and structure
  as the ``[supervisorctl]`` section option of the same name.  If this
  is set to AUTO, or is unset, supervisor will automatically construct
  a server URL, giving preference to a server that listens on UNIX
  domain sockets over one that listens on an internet socket.

  *Default*: AUTO

  *Required*:  No.

  *Introduced*: 3.0

``[program:x]`` Section Example
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: ini

   [program:cat]
   command=/bin/cat
   process_name=%(program_name)s
   numprocs=1
   directory=/tmp
   umask=022
   priority=999
   autostart=true
   autorestart=unexpected
   startsecs=10
   startretries=3
   exitcodes=0
   stopsignal=TERM
   stopwaitsecs=10
   stopasgroup=false
   killasgroup=false
   user=chrism
   redirect_stderr=false
   stdout_logfile=/a/path
   stdout_logfile_maxbytes=1MB
   stdout_logfile_backups=10
   stdout_capture_maxbytes=1MB
   stdout_events_enabled=false
   stderr_logfile=/a/path
   stderr_logfile_maxbytes=1MB
   stderr_logfile_backups=10
   stderr_capture_maxbytes=1MB
   stderr_events_enabled=false
   environment=A="1",B="2"
   serverurl=AUTO

``[include]`` Section Settings
------------------------------

The :file:`supervisord.conf` file may contain a section named
``[include]``.  If the configuration file contains an ``[include]``
section, it must contain a single key named "files".  The values in
this key specify other configuration files to be included within the
configuration.

.. note::

    The ``[include]`` section is processed only by ``supervisord``.  It is
    ignored by ``supervisorctl``.


``[include]`` Section Values
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

``files``

  A space-separated sequence of file globs.  Each file glob may be
  absolute or relative.  If the file glob is relative, it is
  considered relative to the location of the configuration file which
  includes it.  A "glob" is a file pattern which matches a specified
  pattern according to the rules used by the Unix shell. No tilde
  expansion is done, but ``*``, ``?``, and character ranges expressed
  with ``[]`` will be correctly matched.  The string expression is
  evaluated against a dictionary that includes ``host_node_name``
  and ``here`` (the directory of the supervisord config file).  Recursive
  includes from included files are not supported.

  *Default*: No default (required)

  *Required*:  Yes.

  *Introduced*: 3.0

  *Changed*: 3.3.0.  Added support for the ``host_node_name`` expansion.

``[include]`` Section Example
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: ini

   [include]
   files = /an/absolute/filename.conf /an/absolute/*.conf foo.conf config??.conf

``[group:x]`` Section Settings
------------------------------

It is often useful to group "homogeneous" process groups (aka
"programs") together into a "heterogeneous" process group so they can
be controlled as a unit from Supervisor's various controller
interfaces.

To place programs into a group so you can treat them as a unit, define
a ``[group:x]`` section in your configuration file.  The group header
value is a composite.  It is the word "group", followed directly by a
colon, then the group name.  A header value of ``[group:foo]``
describes a group with the name of "foo".  The name is used within
client applications that control the processes that are created as a
result of this configuration.  It is an error to create a ``group``
section that does not have a name.  The name must not include a colon
character or a bracket character.

For a ``[group:x]``, there must be one or more ``[program:x]``
sections elsewhere in your configuration file, and the group must
refer to them by name in the ``programs`` value.

If "homogeneous" process groups (represented by program sections) are
placed into a "heterogeneous" group via ``[group:x]`` section's
``programs`` line, the homogeneous groups that are implied by the
program section will not exist at runtime in supervisor.  Instead, all
processes belonging to each of the homogeneous groups will be placed
into the heterogeneous group.  For example, given the following group
configuration:

.. code-block:: ini

   [group:foo]
   programs=bar,baz
   priority=999

Given the above, at supervisord startup, the ``bar`` and ``baz``
homogeneous groups will not exist, and the processes that would have
been under them will now be moved into the ``foo`` group.

``[group:x]`` Section Values
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

``programs``

  A comma-separated list of program names.  The programs which are
  listed become members of the group.

  *Default*: No default (required)

  *Required*:  Yes.

  *Introduced*: 3.0

``priority``

  A priority number analogous to a ``[program:x]`` priority value
  assigned to the group.

  *Default*: 999

  *Required*:  No.

  *Introduced*: 3.0

``[group:x]`` Section Example
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: ini

   [group:foo]
   programs=bar,baz
   priority=999


``[fcgi-program:x]`` Section Settings
-------------------------------------

Supervisor can manage groups of `FastCGI <http://www.fastcgi.com>`_
processes that all listen on the same socket.  Until now, deployment
flexibility for FastCGI was limited.  To get full process management,
you could use mod_fastcgi under Apache but then you were stuck with
Apache's inefficient concurrency model of one process or thread per
connection.  In addition to requiring more CPU and memory resources,
the process/thread per connection model can be quickly saturated by a
slow resource, preventing other resources from being served.  In order
to take advantage of newer event-driven web servers such as lighttpd
or nginx which don't include a built-in process manager, you had to
use scripts like cgi-fcgi or spawn-fcgi.  These can be used in
conjunction with a process manager such as supervisord or daemontools
but require each FastCGI child process to bind to its own socket.
The disadvantages of this are: unnecessarily complicated web server
configuration, ungraceful restarts, and reduced fault tolerance.  With
fewer sockets to configure, web server configurations are much smaller
if groups of FastCGI processes can share sockets.  Shared sockets
allow for graceful restarts because the socket remains bound by the
parent process while any of the child processes are being restarted.
Finally, shared sockets are more fault tolerant because if a given
process fails, other processes can continue to serve inbound
connections.

With integrated FastCGI spawning support, Supervisor gives you the
best of both worlds.  You get full-featured process management with
groups of FastCGI processes sharing sockets without being tied to a
particular web server.  It's a clean separation of concerns, allowing
the web server and the process manager to each do what they do best.

.. note::

   The socket manager in Supervisor was originally developed to support
   FastCGI processes but it is not limited to FastCGI.  Other protocols may
   be used as well with no special configuration.  Any program that can
   access an open socket from a file descriptor (e.g. with
   `socket.fromfd <http://docs.python.org/library/socket.html#socket.fromfd>`_
   in Python) can use the socket manager.  Supervisor will automatically
   create the socket, bind, and listen before forking the first child in a
   group.  The socket will be passed to each child on file descriptor
   number ``0`` (zero).  When the last child in the group exits,
   Supervisor will close the socket.

.. note::

   Prior to Supervisor 3.4.0, FastCGI programs (``[fcgi-program:x]``)
   could not be referenced in groups (``[group:x]``).

All the options available to ``[program:x]`` sections are
also respected by ``fcgi-program`` sections.

``[fcgi-program:x]`` Section Values
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

``[fcgi-program:x]`` sections have a few keys which ``[program:x]``
sections do not have.

``socket``

  The FastCGI socket for this program, either TCP or UNIX domain
  socket. For TCP sockets, use this format: ``tcp://localhost:9002``.
  For UNIX domain sockets, use ``unix:///absolute/path/to/file.sock``.
  String expressions are evaluated against a dictionary containing the
  keys "program_name" and "here" (the directory of the supervisord
  config file).

  *Default*: No default.

  *Required*:  Yes.

  *Introduced*: 3.0

``socket_backlog``

  Sets socket listen(2) backlog.

  *Default*: socket.SOMAXCONN

  *Required*:  No.

  *Introduced*: 3.4.0

``socket_owner``

  For UNIX domain sockets, this parameter can be used to specify the user
  and group for the FastCGI socket. May be a UNIX username (e.g. chrism)
  or a UNIX username and group separated by a colon (e.g. chrism:wheel).

  *Default*: Uses the user and group set for the fcgi-program

  *Required*:  No.

  *Introduced*: 3.0

``socket_mode``

  For UNIX domain sockets, this parameter can be used to specify the
  permission mode.

  *Default*: 0700

  *Required*:  No.

  *Introduced*: 3.0

Consult :ref:`programx_section` for other allowable keys, delta the
above constraints and additions.

``[fcgi-program:x]`` Section Example
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: ini

   [fcgi-program:fcgiprogramname]
   command=/usr/bin/example.fcgi
   socket=unix:///var/run/supervisor/%(program_name)s.sock
   socket_owner=chrism
   socket_mode=0700
   process_name=%(program_name)s_%(process_num)02d
   numprocs=5
   directory=/tmp
   umask=022
   priority=999
   autostart=true
   autorestart=unexpected
   startsecs=1
   startretries=3
   exitcodes=0
   stopsignal=QUIT
   stopasgroup=false
   killasgroup=false
   stopwaitsecs=10
   user=chrism
   redirect_stderr=true
   stdout_logfile=/a/path
   stdout_logfile_maxbytes=1MB
   stdout_logfile_backups=10
   stdout_events_enabled=false
   stderr_logfile=/a/path
   stderr_logfile_maxbytes=1MB
   stderr_logfile_backups=10
   stderr_events_enabled=false
   environment=A="1",B="2"
   serverurl=AUTO

``[eventlistener:x]`` Section Settings
--------------------------------------

Supervisor allows specialized homogeneous process groups ("event
listener pools") to be defined within the configuration file.  These
pools contain processes that are meant to receive and respond to event
notifications from supervisor's event system.  See :ref:`events` for
an explanation of how events work and how to implement programs that
can be declared as event listeners.

Note that all the options available to ``[program:x]`` sections are
respected by eventlistener sections *except* for ``stdout_capture_maxbytes``.
Eventlisteners cannot emit process communication events on ``stdout``,
but can emit on ``stderr`` (see :ref:`capture_mode`).

``[eventlistener:x]`` Section Values
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

``[eventlistener:x]`` sections have a few keys which ``[program:x]``
sections do not have.

``buffer_size``

  The event listener pool's event queue buffer size.  When a listener
  pool's event buffer is overflowed (as can happen when an event
  listener pool cannot keep up with all of the events sent to it), the
  oldest event in the buffer is discarded.

``events``

  A comma-separated list of event type names that this listener is
  "interested" in receiving notifications for (see
  :ref:`event_types` for a list of valid event type names).

``result_handler``

  An `entry point object reference
  <https://packaging.python.org/en/latest/specifications/entry-points/#data-model>`_
  string that resolves to a Python callable.  The default value is
  ``supervisor.dispatchers:default_handler``.  Specifying an alternate
  result handler is a very uncommon thing to need to do, and as a
  result, how to create one is not documented.

Consult :ref:`programx_section` for other allowable keys, delta the
above constraints and additions.

``[eventlistener:x]`` Section Example
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: ini

   [eventlistener:theeventlistenername]
   command=/bin/eventlistener
   process_name=%(program_name)s_%(process_num)02d
   numprocs=5
   events=PROCESS_STATE
   buffer_size=10
   directory=/tmp
   umask=022
   priority=-1
   autostart=true
   autorestart=unexpected
   startsecs=1
   startretries=3
   exitcodes=0
   stopsignal=QUIT
   stopwaitsecs=10
   stopasgroup=false
   killasgroup=false
   user=chrism
   redirect_stderr=false
   stdout_logfile=/a/path
   stdout_logfile_maxbytes=1MB
   stdout_logfile_backups=10
   stdout_events_enabled=false
   stderr_logfile=/a/path
   stderr_logfile_maxbytes=1MB
   stderr_logfile_backups=10
   stderr_events_enabled=false
   environment=A="1",B="2"
   serverurl=AUTO

``[rpcinterface:x]`` Section Settings
-------------------------------------

Adding ``rpcinterface:x`` settings in the configuration file is only
useful for people who wish to extend supervisor with additional custom
behavior.

In the sample config file (see :ref:`create_config`), there is a section
which is named ``[rpcinterface:supervisor]``.  By default it looks like the
following.

.. code-block:: ini

   [rpcinterface:supervisor]
   supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

The ``[rpcinterface:supervisor]`` section *must* remain in the
configuration for the standard setup of supervisor to work properly.
If you don't want supervisor to do anything it doesn't already do out
of the box, this is all you need to know about this type of section.

However, if you wish to add rpc interface namespaces in order to
customize supervisor, you may add additional ``[rpcinterface:foo]``
sections, where "foo" represents the namespace of the interface (from
the web root), and the value named by
``supervisor.rpcinterface_factory`` is a factory callable which should
have a function signature that accepts a single positional argument
``supervisord`` and as many keyword arguments as required to perform
configuration.  Any extra key/value pairs defined within the
``[rpcinterface:x]`` section will be passed as keyword arguments to
the factory.

Here's an example of a factory function, created in the
``__init__.py`` file of the Python package ``my.package``.

.. code-block:: python

   from my.package.rpcinterface import AnotherRPCInterface

   def make_another_rpcinterface(supervisord, **config):
       retries = int(config.get('retries', 0))
       another_rpc_interface = AnotherRPCInterface(supervisord, retries)
       return another_rpc_interface

And a section in the config file meant to configure it.

.. code-block:: ini

   [rpcinterface:another]
   supervisor.rpcinterface_factory = my.package:make_another_rpcinterface
   retries = 1

``[rpcinterface:x]`` Section Values
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

``supervisor.rpcinterface_factory``

  ``entry point object reference`` dotted name to your RPC interface's
  factory function.

  *Default*: N/A

  *Required*:  No.

  *Introduced*: 3.0

``[rpcinterface:x]`` Section Example
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: ini

   [rpcinterface:another]
   supervisor.rpcinterface_factory = my.package:make_another_rpcinterface
   retries = 1


================================================
FILE: docs/development.rst
================================================
Resources and Development
=========================

Bug Tracker
-----------

Supervisor has a bugtracker where you may report any bugs or other
errors you find.  Please report bugs to the `GitHub issues page
<https://github.com/supervisor/supervisor/issues>`_.

Version Control Repository
--------------------------

You can also view the `Supervisor version control repository
<https://github.com/Supervisor/supervisor>`_.

Contributing
------------

We'll review contributions from the community in
`pull requests <https://help.github.com/articles/using-pull-requests>`_
on GitHub.

Author Information
------------------

The following people are responsible for creating Supervisor.

Original Author
~~~~~~~~~~~~~~~

- `Chris McDonough <https://github.com/mcdonc>`_ is the original author of
  Supervisor.

Contributors
~~~~~~~~~~~~

Contributors are tracked on the `GitHub contributions page
<https://github.com/Supervisor/supervisor/graphs/contributors>`_.  The two lists
below are included for historical reasons.

This first list recognizes significant contributions that were made
before the repository moved to GitHub.

- Anders Quist: Anders contributed the patch that was the basis for
  Supervisor’s ability to reload parts of its configuration without
  restarting.

- Derek DeVries: Derek did the web design of Supervisor’s internal web
  interface and website logos.

- Guido van Rossum: Guido authored ``zdrun`` and ``zdctl``, the
  programs from Zope that were the original basis for Supervisor.  He
  also created Python, the programming language that Supervisor is
  written in.

- Jason Kirtland: Jason fixed Supervisor to run on Python 2.6 by
  contributing a patched version of Medusa (a Supervisor dependency)
  that we now bundle.

- Roger Hoover: Roger added support for spawning FastCGI programs. He
  has also been one of the most active mailing list users, providing
  his testing and feedback.

- Siddhant Goel: Siddhant worked on :program:`supervisorctl` as our
  Google Summer of Code student for 2008. He implemented the ``fg``
  command and also added tab completion.

This second list records contributors who signed a legal agreement.
The legal agreement was
`introduced <https://github.com/Supervisor/supervisor/commit/7bdac36e67a91b513a2e53a6098751509a7a9e34>`_
in January 2014 but later
`withdrawn <https://github.com/Supervisor/supervisor/commit/79090d521c512634bed03a65147f16cd41456051>`_
in March 2014.  This list is being preserved in case it is useful
later (e.g. if at some point there was a desire to donate the project
to a foundation that required such agreements).

- Chris McDonough, 2006-06-26

- Siddhant Goel, 2008-06-15

- Chris Rossi, 2010-02-02

- Roger Hoover, 2010-08-17

- Benoit Sigoure, 2011-06-21

- John Szakmeister, 2011-09-06

- Gunnlaugur Þór Briem, 2011-11-26

- Jens Rantil, 2011-11-27

- Michael Blume, 2012-01-09

- Philip Zeyliger, 2012-02-21

- Marcelo Vanzin, 2012-05-03

- Martijn Pieters, 2012-06-04

- Marcin Kuźmiński, 2012-06-21

- Jean Jordaan, 2012-06-28

- Perttu Ranta-aho, 2012-09-27

- Chris Streeter, 2013-03-23

- Caio Ariede, 2013-03-25

- David Birdsong, 2013-04-11

- Lukas Rist, 2013-04-18

- Honza Pokorny, 2013-07-23

- Thúlio Costa, 2013-10-31

- Gary M. Josack, 2013-11-12

- Márk Sági-Kazár, 2013-12-16


================================================
FILE: docs/events.rst
================================================
.. _events:

Events
======

Events are an advanced feature of Supervisor introduced in version
3.0.  You don't need to understand events if you simply want to use
Supervisor as a mechanism to restart crashed processes or as a system
to manually control process state.  You do need to understand events
if you want to use Supervisor as part of a process
monitoring/notification framework.

Event Listeners and Event Notifications
---------------------------------------

Supervisor provides a way for a specially written program (which it
runs as a subprocess) called an "event listener" to subscribe to
"event notifications".  An event notification implies that something
happened related to a subprocess controlled by :program:`supervisord`
or to :program:`supervisord` itself.  Event notifications are grouped
into types in order to make it possible for event listeners to
subscribe to a limited subset of event notifications.  Supervisor
continually emits event notifications as its running even if there are
no listeners configured.  If a listener is configured and subscribed
to an event type that is emitted during a :program:`supervisord`
lifetime, that listener will be notified.

The purpose of the event notification/subscription system is to
provide a mechanism for arbitrary code to be run (e.g. send an email,
make an HTTP request, etc) when some condition is met.  That condition
usually has to do with subprocess state.  For instance, you may want
to notify someone via email when a process crashes and is restarted by
Supervisor.

The event notification protocol is based on communication via a
subprocess' stdin and stdout.  Supervisor sends specially-formatted
input to an event listener process' stdin and expects
specially-formatted output from an event listener's stdout, forming a
request-response cycle.  A protocol agreed upon between supervisor and
the listener's implementer allows listeners to process event
notifications.  Event listeners can be written in any language
supported by the platform you're using to run Supervisor.  Although
event listeners may be written in any language, there is special
library support for Python in the form of a
:mod:`supervisor.childutils` module, which makes creating event
listeners in Python slightly easier than in other languages.

Configuring an Event Listener
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

A supervisor event listener is specified via a ``[eventlistener:x]``
section in the configuration file.  Supervisor ``[eventlistener:x]``
sections are treated almost exactly like supervisor ``[program:x]``
section with the respect to the keys allowed in their configuration
except that Supervisor does not respect "capture mode" output from
event listener processes (ie. event listeners cannot be
``PROCESS_COMMUNICATIONS_EVENT`` event generators).  Therefore it is
an error to specify ``stdout_capture_maxbytes`` or
``stderr_capture_maxbytes`` in the configuration of an eventlistener.
There is no artificial constraint on the number of eventlistener
sections that can be placed into the configuration file.

When an ``[eventlistener:x]`` section is defined, it actually defines
a "pool", where the number of event listeners in the pool is
determined by the ``numprocs`` value within the section.

The ``events`` parameter of the ``[eventlistener:x]`` section
specifies the events that will be sent to a listener pool.  A
well-written event listener will ignore events that it cannot process,
but there is no guarantee that a specific event listener won't crash
as a result of receiving an event type it cannot handle.  Therefore,
depending on the listener implementation, it may be important to
specify in the configuration that it may receive only certain types of
events.  The implementor of the event listener is the only person who
can tell you what these are (and therefore what value to put in the
``events`` configuration).  Examples of eventlistener
configurations that can be placed in ``supervisord.conf`` are as
follows.

.. code-block:: ini

   [eventlistener:memmon]
   command=memmon -a 200MB -m bob@example.com
   events=TICK_60

.. code-block:: ini

   [eventlistener:mylistener]
   command=my_custom_listener.py
   events=PROCESS_STATE,TICK_60

.. note::

   An advanced feature, specifying an alternate "result handler" for a
   pool, can be specified via the ``result_handler`` parameter of an
   ``[eventlistener:x]`` section in the form of an `entry point object reference
   <https://packaging.python.org/en/latest/specifications/entry-points/#data-model>`_
   string.  The default result handler is
   ``supervisord.dispatchers:default_handler``.  Creating an alternate
   result handler is not currently documented.

When an event notification is sent by supervisor, all event listener
pools which are subscribed to receive events for the event's type
(filtered by the ``events`` value in the eventlistener
section) will be found.  One of the listeners in each listener pool
will receive the event notification (any "available" listener).

Every process in an event listener pool is treated equally by
supervisor.  If a process in the pool is unavailable (because it is
already processing an event, because it has crashed, or because it has
elected to removed itself from the pool), supervisor will choose
another process from the pool.  If the event cannot be sent because
all listeners in the pool are "busy", the event will be buffered and
notification will be retried later.  "Later" is defined as "the next
time that the :program:`supervisord` select loop executes".  For
satisfactory event processing performance, you should configure a pool
with as many event listener processes as appropriate to handle your
event load.  This can only be determined empirically for any given
workload, there is no "magic number" but to help you determine the
optimal number of listeners in a given pool, Supervisor will emit
warning messages to its activity log when an event cannot be sent
immediately due to pool congestion.  There is no artificial constraint
placed on the number of processes that can be in a pool, it is limited
only by your platform constraints.

A listener pool has an event buffer queue.  The queue is sized via the
listener pool's ``buffer_size`` config file option.  If the queue is
full and supervisor attempts to buffer an event, supervisor will throw
away the oldest event in the buffer and log an error.

Writing an Event Listener
~~~~~~~~~~~~~~~~~~~~~~~~~

An event listener implementation is a program that is willing to
accept structured input on its stdin stream and produce structured
output on its stdout stream.  An event listener implementation should
operate in "unbuffered" mode or should flush its stdout every time it
needs to communicate back to the supervisord process.  Event listeners
can be written to be long-running or may exit after a single request
(depending on the implementation and the ``autorestart`` parameter in
the eventlistener's configuration).

An event listener can send arbitrary output to its stderr, which will
be logged or ignored by supervisord depending on the stderr-related
logfile configuration in its ``[eventlistener:x]`` section.

Event Notification Protocol
+++++++++++++++++++++++++++

When supervisord sends a notification to an event listener process,
the listener will first be sent a single "header" line on its
stdin. The composition of the line is a set of colon-separated tokens
(each of which represents a key-value pair) separated from each other
by a single space.  The line is terminated with a ``\n`` (linefeed)
character.  The tokens on the line are not guaranteed to be in any
particular order.  The types of tokens currently defined are in the
table below.

Header Tokens
@@@@@@@@@@@@@

=========== =============================================   ===================
Key         Description                                     Example
=========== =============================================   ===================
ver         The event system protocol version               3.0
server      The identifier of the supervisord sending the
            event (see config file ``[supervisord]``
            section ``identifier`` value.
serial      An integer assigned to each event.  No two      30
            events generated during the lifetime of
            a :program:`supervisord` process will have
            the same serial number.  The value is useful
            for functional testing and detecting event
            ordering anomalies.
pool        The name of the event listener pool which       myeventpool
            generated this event.
poolserial  An integer assigned to each event by the        30
            eventlistener pool which it is being sent
            from.  No two events generated by the same
            eventlistener pool during the lifetime of a
            :program:`supervisord` process will have the
            same ``poolserial`` number.  This value can
            be used to detect event ordering anomalies.
eventname   The specific event type name (see               TICK_5
            :ref:`event_types`)
len         An integer indicating the number of bytes in    22
            the event payload, aka the ``PAYLOAD_LENGTH``
=========== =============================================   ===================

An example of a complete header line is as follows.

.. code-block:: text

   ver:3.0 server:supervisor serial:21 pool:listener poolserial:10 eventname:PROCESS_COMMUNICATION_STDOUT len:54

Directly following the linefeed character in the header is the event
payload.  It consists of ``PAYLOAD_LENGTH`` bytes representing a
serialization of the event data.  See :ref:`event_types` for the
specific event data serialization definitions.

An example payload for a ``PROCESS_COMMUNICATION_STDOUT`` event
notification is as follows.

.. code-block:: text

   processname:foo groupname:bar pid:123
   This is the data that was sent between the tags

The payload structure of any given event is determined only by the
event's type.

Event Listener States
+++++++++++++++++++++

An event listener process has three possible states that are
maintained by supervisord:

=============================   ==============================================
Name                            Description
=============================   ==============================================
ACKNOWLEDGED                    The event listener has acknowledged (accepted
                                or rejected) an event send.
READY                           Event notifications may be sent to this event
                                listener
BUSY                            Event notifications may not be sent to this
                                event listener.
=============================   ==============================================

When an event listener process first starts, supervisor automatically
places it into the ``ACKNOWLEDGED`` state to allow for startup
activities or guard against startup failures (hangs).  Until the
listener sends a ``READY\n`` string to its stdout, it will stay in
this state.

When supervisor sends an event notification to a listener in the
``READY`` state, the listener will be placed into the ``BUSY`` state
until it receives an ``OK`` or ``FAIL`` response from the listener, at
which time, the listener will be transitioned back into the
``ACKNOWLEDGED`` state.

Event Listener Notification Protocol
++++++++++++++++++++++++++++++++++++

Supervisor will notify an event listener in the ``READY`` state of an
event by sending data to the stdin of the process.  Supervisor will
never send anything to the stdin of an event listener process while
that process is in the ``BUSY`` or ``ACKNOWLEDGED`` state.  Supervisor
starts by sending the header.

Once it has processed the header, the event listener implementation
should read ``PAYLOAD_LENGTH`` bytes from its stdin, perform an
arbitrary action based on the values in the header and the data parsed
out of the serialization.  It is free to block for an arbitrary amount
of time while doing this.  Supervisor will continue processing
normally as it waits for a response and it will send other events of
the same type to other listener processes in the same pool as
necessary.

After the event listener has processed the event serialization, in
order to notify supervisord about the result, it should send back a
result structure on its stdout.  A result structure is the word
"RESULT", followed by a space, followed by the result length, followed
by a line feed, followed by the result content.  For example,
``RESULT 2\nOK`` is the result "OK".  Conventionally, an event
listener will use either ``OK`` or ``FAIL`` as the result content.
These strings have special meaning to the default result handler.

If the default result handler receives ``OK`` as result content, it
will assume that the listener processed the event notification
successfully.  If it receives ``FAIL``, it will assume that the
listener has failed to process the event, and the event will be
rebuffered and sent again at a later time.  The event listener may
reject the event for any reason by returning a ``FAIL`` result.  This
does not indicate a problem with the event data or the event listener.
Once an ``OK`` or ``FAIL`` result is received by supervisord, the
event listener is placed into the ``ACKNOWLEDGED`` state.

Once the listener is in the ``ACKNOWLEDGED`` state, it may either exit
(and subsequently may be restarted by supervisor if its
``autorestart`` config parameter is ``true``), or it may continue
running.  If it continues to run, in order to be placed back into the
``READY`` state by supervisord, it must send a ``READY`` token
followed immediately by a line feed to its stdout.

Example Event Listener Implementation
+++++++++++++++++++++++++++++++++++++

A Python implementation of a "long-running" event listener which
accepts an event notification, prints the header and payload to its
stderr, and responds with an ``OK`` result, and then subsequently a
``READY`` is as follows.

.. code-block:: python

   import sys

   def write_stdout(s):
       # only eventlistener protocol messages may be sent to stdout
       sys.stdout.write(s)
       sys.stdout.flush()

   def write_stderr(s):
       sys.stderr.write(s)
       sys.stderr.flush()

   def main():
       while 1:
           # transition from ACKNOWLEDGED to READY
           write_stdout('READY\n')

           # read header line and print it to stderr
           line = sys.stdin.readline()
           write_stderr(line)

           # read event payload and print it to stderr
           headers = dict([ x.split(':') for x in line.split() ])
           data = sys.stdin.read(int(headers['len']))
           write_stderr(data)

           # transition from READY to ACKNOWLEDGED
           write_stdout('RESULT 2\nOK')

   if __name__ == '__main__':
       main()

Other sample event listeners are present within the :term:`Superlance`
package, including one which can monitor supervisor subprocesses and
restart a process if it is using "too much" memory.

Event Listener Error Conditions
+++++++++++++++++++++++++++++++

If the event listener process dies while the event is being
transmitted to its stdin, or if it dies before sending an result
structure back to supervisord, the event is assumed to not be
processed and will be rebuffered by supervisord and sent again later.

If an event listener sends data to its stdout which supervisor does
not recognize as an appropriate response based on the state that the
event listener is in, the event listener will be placed into the
``UNKNOWN`` state, and no further event notifications will be sent to
it.  If an event was being processed by the listener during this time,
it will be rebuffered and sent again later.

Miscellaneous
+++++++++++++

Event listeners may use the Supervisor XML-RPC interface to call "back
in" to Supervisor.  As such, event listeners can impact the state of a
Supervisor subprocess as a result of receiving an event notification.
For example, you may want to generate an event every few minutes
related to process usage of Supervisor-controlled subprocesses, and if
any of those processes exceed some memory threshold, you would like
to restart it.  You would write a program that caused supervisor to
generate ``PROCESS_COMMUNICATION`` events every so often with memory
information in them, and an event listener to perform an action based
on processing the data it receives from these events.

.. _event_types:

Event Types
-----------

The event types are a controlled set, defined by Supervisor itself.
There is no way to add an event type without changing
:program:`supervisord` itself.  This is typically not a problem,
though, because metadata is attached to events that can be used by
event listeners as additional filter criterion, in conjunction with
its type.

Event types that may be subscribed to by event listeners are
predefined by supervisor and fall into several major categories,
including "process state change", "process communication", and
"supervisor state change" events. Below are tables describing
these event types.

In the below list, we indicate that some event types have a "body"
which is a a *token set*.  A token set consists of a set of characters
with space-separated tokens.  Each token represents a key-value pair.
The key and value are separated by a colon.  For example:

.. code-block:: text

   processname:cat groupname:cat from_state:STOPPED

Token sets do not have a linefeed or carriage return character at
their end.

``EVENT`` Event Type
~~~~~~~~~~~~~~~~~~~~

The base event type.  This event type is abstract.  It will never be
sent directly.  Subscribing to this event type will cause a subscriber
to receive all event notifications emitted by Supervisor.

*Name*: ``EVENT``

*Subtype Of*: N/A

*Body Description*: N/A


``PROCESS_STATE`` Event Type
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This process type indicates a process has moved from one state to
another.  See :ref:`process_states` for a description of the states
that a process moves through during its lifetime.  This event type is
abstract, it will never be sent directly.  Subscribing to this event
type will cause a subscriber to receive event notifications of all the
event types that are subtypes of ``PROCESS_STATE``.

*Name*: ``PROCESS_STATE``

*Subtype Of*: ``EVENT``

Body Description
++++++++++++++++

All subtypes of ``PROCESS_STATE`` have a body which is a token set.
Additionally, each ``PROCESS_STATE`` subtype's token set has a default
set of key/value pairs: ``processname``, ``groupname``, and
``from_state``.  ``processname`` represents the process name which
supervisor knows this process as. ``groupname`` represents the name of
the supervisord group which this process is in.  ``from_state`` is the
name of the state from which this process is transitioning (the new
state is implied by the concrete event type).  Concrete subtypes may
include additional key/value pairs in the token set.

``PROCESS_STATE_STARTING`` Event Type
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


Indicates a process has moved from a state to the STARTING state.

*Name*: ``PROCESS_STATE_STARTING``

*Subtype Of*: ``PROCESS_STATE``

Body Description
++++++++++++++++

This body is a token set.  It has the default set of key/value pairs
plus an additional ``tries`` key.  ``tries`` represents the number of
times this process has entered this state before transitioning to
RUNNING or FATAL (it will never be larger than the "startretries"
parameter of the process).  For example:

.. code-block:: text

   processname:cat groupname:cat from_state:STOPPED tries:0

``PROCESS_STATE_RUNNING`` Event Type
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Indicates a process has moved from the ``STARTING`` state to the
``RUNNING`` state.  This means that the process has successfully
started as far as Supervisor is concerned.

*Name*: ``PROCESS_STATE_RUNNING``

*Subtype Of*: ``PROCESS_STATE``

Body Description
++++++++++++++++

This body is a token set.  It has the default set of key/value pairs
plus an additional ``pid`` key.  ``pid`` represents the UNIX
process id of the process that was started.  For example:

.. code-block:: text

   processname:cat groupname:cat from_state:STARTING pid:2766

``PROCESS_STATE_BACKOFF`` Event Type
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Indicates a process has moved from the ``STARTING`` state to the
``BACKOFF`` state.  This means that the process did not successfully
enter the RUNNING state, and Supervisor is going to try to restart it
unless it has exceeded its "startretries" configuration limit.

*Name*: ``PROCESS_STATE_BACKOFF``

*Subtype Of*: ``PROCESS_STATE``

Body Description
++++++++++++++++

This body is a token set.  It has the default set of key/value pairs
plus an additional ``tries`` key.  ``tries`` represents the number of
times this process has entered this state before transitioning to
``RUNNING`` or ``FATAL`` (it will never be larger than the
"startretries" parameter of the process).  For example:

.. code-block:: text

   processname:cat groupname:cat from_state:STOPPED tries:0

``PROCESS_STATE_STOPPING`` Event Type
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Indicates a process has moved from either the ``RUNNING`` state or the
``STARTING`` state to the ``STOPPING`` state.

*Name*: ``PROCESS_STATE_STOPPING``

*Subtype Of*: ``PROCESS_STATE``

Body Description
++++++++++++++++

This body is a token set.  It has the default set of key/value pairs
plus an additional ``pid`` key.  ``pid`` represents the UNIX process
id of the process that was started.  For example:

.. code-block:: text

   processname:cat groupname:cat from_state:STARTING pid:2766

``PROCESS_STATE_EXITED`` Event Type
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Indicates a process has moved from the ``RUNNING`` state to the
``EXITED`` state.

*Name*: ``PROCESS_STATE_EXITED``

*Subtype Of*: ``PROCESS_STATE``

Body Description
++++++++++++++++

This body is a token set.  It has the default set of key/value pairs
plus two additional keys: ``pid`` and ``expected``.  ``pid``
represents the UNIX process id of the process that exited.
``expected`` represents whether the process exited with an expected
exit code or not.  It will be ``0`` if the exit code was unexpected,
or ``1`` if the exit code was expected. For example:

.. code-block:: text

   processname:cat groupname:cat from_state:RUNNING expected:0 pid:2766

``PROCESS_STATE_STOPPED`` Event Type
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Indicates a process has moved from the ``STOPPING`` state to the
``STOPPED`` state.

*Name*: ``PROCESS_STATE_STOPPED``

*Subtype Of*: ``PROCESS_STATE``

Body Description
++++++++++++++++

This body is a token set.  It has the default set of key/value pairs
plus an additional ``pid`` key.  ``pid`` represents the UNIX process
id of the process that was started.  For example:

.. code-block:: text

   processname:cat groupname:cat from_state:STOPPING pid:2766

``PROCESS_STATE_FATAL`` Event Type
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Indicates a process has moved from the ``BACKOFF`` state to the
``FATAL`` state.  This means that Supervisor tried ``startretries``
number of times unsuccessfully to start the process, and gave up
attempting to restart it.

*Name*: ``PROCESS_STATE_FATAL``

*Subtype Of*: ``PROCESS_STATE``

Body Description
++++++++++++++++

This event type is a token set with the default key/value pairs.  For
example:

.. code-block:: text

   processname:cat groupname:cat from_state:BACKOFF

``PROCESS_STATE_UNKNOWN`` Event Type
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Indicates a process has moved from any state to the ``UNKNOWN`` state
(indicates an error in :program:`supervisord`).  This state transition
will only happen if :program:`supervisord` itself has a programming
error.

*Name*: ``PROCESS_STATE_UNKNOWN``

*Subtype Of*: ``PROCESS_STATE``

Body Description
++++++++++++++++

This event type is a token set with the default key/value pairs.  For
example:

.. code-block:: text

   processname:cat groupname:cat from_state:BACKOFF

``REMOTE_COMMUNICATION`` Event Type
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

An event type raised when the ``supervisor.sendRemoteCommEvent()``
method is called on Supervisor's RPC interface.  The ``type`` and
``data`` are arguments of the RPC method.

*Name*: ``REMOTE_COMMUNICATION``

*Subtype Of*: ``EVENT``

Body Description
++++++++++++++++

.. code-block:: text

   type:type
   data

``PROCESS_LOG`` Event Type
~~~~~~~~~~~~~~~~~~~~~~~~~~

An event type emitted when a process writes to stdout or stderr.  The
event will only be emitted if the file descriptor is not in capture
mode and if ``stdout_events_enabled`` or ``stderr_events_enabled``
config options are set to ``true``.  This event type is abstract, it
will never be sent directly.  Subscribing to this event type will
cause a subscriber to receive event notifications for all subtypes of
``PROCESS_LOG``.

*Name*: ``PROCESS_LOG``

*Subtype Of*: ``EVENT``

*Body Description*: N/A

``PROCESS_LOG_STDOUT`` Event Type
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Indicates a process has written to its stdout file descriptor.  The
event will only be emitted if the file descriptor is not in capture
mode and if the ``stdout_events_enabled`` config option is set to
``true``.

*Name*: ``PROCESS_LOG_STDOUT``

*Subtype Of*: ``PROCESS_LOG``

Body Description
++++++++++++++++

.. code-block:: text

   processname:name 
Download .txt
gitextract_lqosy3py/

├── .github/
│   └── workflows/
│       └── main.yml
├── .gitignore
├── .readthedocs.yaml
├── CHANGES.rst
├── COPYRIGHT.txt
├── LICENSES.txt
├── MANIFEST.in
├── README.rst
├── docs/
│   ├── .static/
│   │   └── repoze.css
│   ├── Makefile
│   ├── api.rst
│   ├── conf.py
│   ├── configuration.rst
│   ├── development.rst
│   ├── events.rst
│   ├── faq.rst
│   ├── glossary.rst
│   ├── index.rst
│   ├── installing.rst
│   ├── introduction.rst
│   ├── logging.rst
│   ├── plugins.rst
│   ├── running.rst
│   ├── subprocess.rst
│   ├── upgrading.rst
│   └── xmlrpc.rst
├── setup.cfg
├── setup.py
├── supervisor/
│   ├── __init__.py
│   ├── childutils.py
│   ├── compat.py
│   ├── confecho.py
│   ├── datatypes.py
│   ├── dispatchers.py
│   ├── events.py
│   ├── http.py
│   ├── http_client.py
│   ├── loggers.py
│   ├── medusa/
│   │   ├── CHANGES.txt
│   │   ├── LICENSE.txt
│   │   ├── README.txt
│   │   ├── TODO.txt
│   │   ├── __init__.py
│   │   ├── asynchat_25.py
│   │   ├── asyncore_25.py
│   │   ├── auth_handler.py
│   │   ├── counter.py
│   │   ├── default_handler.py
│   │   ├── docs/
│   │   │   ├── README.html
│   │   │   ├── async_blurbs.txt
│   │   │   ├── data_flow.html
│   │   │   ├── programming.html
│   │   │   ├── proxy_notes.txt
│   │   │   ├── threads.txt
│   │   │   └── tkinter.txt
│   │   ├── filesys.py
│   │   ├── http_date.py
│   │   ├── http_server.py
│   │   ├── logger.py
│   │   ├── producers.py
│   │   ├── util.py
│   │   └── xmlrpc_handler.py
│   ├── options.py
│   ├── pidproxy.py
│   ├── poller.py
│   ├── process.py
│   ├── rpcinterface.py
│   ├── skel/
│   │   └── sample.conf
│   ├── socket_manager.py
│   ├── states.py
│   ├── supervisorctl.py
│   ├── supervisord.py
│   ├── templating.py
│   ├── tests/
│   │   ├── __init__.py
│   │   ├── base.py
│   │   ├── fixtures/
│   │   │   ├── donothing.conf
│   │   │   ├── example/
│   │   │   │   └── included.conf
│   │   │   ├── hello.sh
│   │   │   ├── include.conf
│   │   │   ├── issue-1054.conf
│   │   │   ├── issue-1170a.conf
│   │   │   ├── issue-1170b.conf
│   │   │   ├── issue-1170c.conf
│   │   │   ├── issue-1224.conf
│   │   │   ├── issue-1231a.conf
│   │   │   ├── issue-1231b.conf
│   │   │   ├── issue-1231c.conf
│   │   │   ├── issue-1298.conf
│   │   │   ├── issue-1483a.conf
│   │   │   ├── issue-1483b.conf
│   │   │   ├── issue-1483c.conf
│   │   │   ├── issue-1596.conf
│   │   │   ├── issue-291a.conf
│   │   │   ├── issue-550.conf
│   │   │   ├── issue-565.conf
│   │   │   ├── issue-638.conf
│   │   │   ├── issue-663.conf
│   │   │   ├── issue-664.conf
│   │   │   ├── issue-733.conf
│   │   │   ├── issue-835.conf
│   │   │   ├── issue-836.conf
│   │   │   ├── issue-986.conf
│   │   │   ├── listener.py
│   │   │   ├── print_env.py
│   │   │   ├── spew.py
│   │   │   ├── test_1231.py
│   │   │   └── unkillable_spew.py
│   │   ├── test_childutils.py
│   │   ├── test_confecho.py
│   │   ├── test_datatypes.py
│   │   ├── test_dispatchers.py
│   │   ├── test_end_to_end.py
│   │   ├── test_events.py
│   │   ├── test_http.py
│   │   ├── test_http_client.py
│   │   ├── test_loggers.py
│   │   ├── test_options.py
│   │   ├── test_pidproxy.py
│   │   ├── test_poller.py
│   │   ├── test_process.py
│   │   ├── test_rpcinterfaces.py
│   │   ├── test_socket_manager.py
│   │   ├── test_states.py
│   │   ├── test_supervisorctl.py
│   │   ├── test_supervisord.py
│   │   ├── test_templating.py
│   │   ├── test_web.py
│   │   └── test_xmlrpc.py
│   ├── ui/
│   │   ├── status.html
│   │   ├── stylesheets/
│   │   │   └── supervisor.css
│   │   └── tail.html
│   ├── version.txt
│   ├── web.py
│   └── xmlrpc.py
└── tox.ini
Download .txt
Showing preview only (259K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3224 symbols across 57 files)

FILE: supervisor/childutils.py
  function getRPCTransport (line 12) | def getRPCTransport(env):
  function getRPCInterface (line 17) | def getRPCInterface(env):
  function get_headers (line 23) | def get_headers(line):
  function eventdata (line 26) | def eventdata(payload):
  function get_asctime (line 31) | def get_asctime(now=None):
  class ProcessCommunicationsProtocol (line 39) | class ProcessCommunicationsProtocol:
    method send (line 40) | def send(self, msg, fp=sys.stdout):
    method stdout (line 46) | def stdout(self, msg):
    method stderr (line 49) | def stderr(self, msg):
  class EventListenerProtocol (line 54) | class EventListenerProtocol:
    method wait (line 55) | def wait(self, stdin=sys.stdin, stdout=sys.stdout):
    method ready (line 62) | def ready(self, stdout=sys.stdout):
    method ok (line 66) | def ok(self, stdout=sys.stdout):
    method fail (line 69) | def fail(self, stdout=sys.stdout):
    method send (line 72) | def send(self, data, stdout=sys.stdout):

FILE: supervisor/compat.py
  function as_bytes (line 14) | def as_bytes(s, encoding='utf-8'):
  function as_string (line 20) | def as_string(s, encoding='utf-8'):
  function is_text_stream (line 26) | def is_text_stream(stream):
  class unicode (line 46) | class unicode(str):
    method __init__ (line 47) | def __init__(self, string, encoding, errors):
  function as_bytes (line 50) | def as_bytes(s, encoding='utf8'):
  function as_string (line 56) | def as_string(s, encoding='utf8'):
  function is_text_stream (line 62) | def is_text_stream(stream):
  function import_spec (line 189) | def import_spec(spec):
  function import_spec (line 195) | def import_spec(spec):
  function resource_filename (line 208) | def resource_filename(package, path):
  function resource_filename (line 213) | def resource_filename(package, path):

FILE: supervisor/confecho.py
  function main (line 6) | def main(out=sys.stdout):

FILE: supervisor/datatypes.py
  function process_or_group_name (line 13) | def process_or_group_name(name):
  function integer (line 22) | def integer(value):
  function boolean (line 31) | def boolean(s):
  function list_of_strings (line 41) | def list_of_strings(arg):
  function list_of_ints (line 49) | def list_of_ints(arg):
  function list_of_exitcodes (line 58) | def list_of_exitcodes(arg):
  function dict_of_key_value_pairs (line 68) | def dict_of_key_value_pairs(arg):
  class Automatic (line 94) | class Automatic:
  class Syslog (line 97) | class Syslog:
  function logfile_name (line 105) | def logfile_name(val):
  class RangeCheckedConversion (line 120) | class RangeCheckedConversion:
    method __init__ (line 123) | def __init__(self, conversion, min=None, max=None):
    method __call__ (line 128) | def __call__(self, value):
  function inet_address (line 140) | def inet_address(s):
  class SocketAddress (line 158) | class SocketAddress:
    method __init__ (line 159) | def __init__(self, s):
  class SocketConfig (line 168) | class SocketConfig:
    method __repr__ (line 175) | def __repr__(self):
    method __str__ (line 180) | def __str__(self):
    method __eq__ (line 183) | def __eq__(self, other):
    method __ne__ (line 192) | def __ne__(self, other):
    method get_backlog (line 195) | def get_backlog(self):
    method addr (line 198) | def addr(self): # pragma: no cover
    method create_and_bind (line 201) | def create_and_bind(self): # pragma: no cover
  class InetStreamSocketConfig (line 204) | class InetStreamSocketConfig(SocketConfig):
    method __init__ (line 210) | def __init__(self, host, port, **kwargs):
    method addr (line 216) | def addr(self):
    method create_and_bind (line 219) | def create_and_bind(self):
  class UnixStreamSocketConfig (line 229) | class UnixStreamSocketConfig(SocketConfig):
    method __init__ (line 237) | def __init__(self, path, **kwargs):
    method addr (line 244) | def addr(self):
    method create_and_bind (line 247) | def create_and_bind(self):
    method get_mode (line 262) | def get_mode(self):
    method get_owner (line 265) | def get_owner(self):
    method _chmod (line 268) | def _chmod(self):
    method _chown (line 276) | def _chown(self):
  function colon_separated_user_group (line 284) | def colon_separated_user_group(arg):
  function name_to_uid (line 301) | def name_to_uid(name):
  function name_to_gid (line 320) | def name_to_gid(name):
  function gid_for_uid (line 339) | def gid_for_uid(uid):
  function octal_type (line 343) | def octal_type(arg):
  function existing_directory (line 349) | def existing_directory(v):
  function existing_dirpath (line 355) | def existing_dirpath(v):
  function logging_level (line 366) | def logging_level(value):
  class SuffixMultiplier (line 373) | class SuffixMultiplier:
    method __init__ (line 377) | def __init__(self, d, default=1):
    method __call__ (line 388) | def __call__(self, v):
  function url (line 399) | def url(value):
  function signal_number (line 408) | def signal_number(value):
  class RestartWhenExitUnexpected (line 422) | class RestartWhenExitUnexpected:
  class RestartUnconditionally (line 425) | class RestartUnconditionally:
  function auto_restart (line 428) | def auto_restart(value):
  function profile_options (line 442) | def profile_options(value):

FILE: supervisor/dispatchers.py
  class PDispatcher (line 14) | class PDispatcher:
    method __init__ (line 20) | def __init__(self, process, channel, fd):
    method __repr__ (line 26) | def __repr__(self):
    method readable (line 32) | def readable(self):
    method writable (line 35) | def writable(self):
    method handle_read_event (line 38) | def handle_read_event(self):
    method handle_write_event (line 41) | def handle_write_event(self):
    method handle_error (line 44) | def handle_error(self):
    method close (line 57) | def close(self):
    method flush (line 63) | def flush(self):
  class POutputDispatcher (line 66) | class POutputDispatcher(PDispatcher):
    method __init__ (line 84) | def __init__(self, process, event_type, fd):
    method _init_normallog (line 112) | def _init_normallog(self):
    method _init_capturelog (line 144) | def _init_capturelog(self):
    method removelogs (line 160) | def removelogs(self):
    method reopenlogs (line 167) | def reopenlogs(self):
    method _log (line 173) | def _log(self, data):
    method record_output (line 205) | def record_output(self):
    method toggle_capturemode (line 241) | def toggle_capturemode(self):
    method writable (line 265) | def writable(self):
    method readable (line 268) | def readable(self):
    method handle_read_event (line 273) | def handle_read_event(self):
  class PEventListenerDispatcher (line 283) | class PEventListenerDispatcher(PDispatcher):
    method __init__ (line 294) | def __init__(self, process, channel, fd):
    method removelogs (line 318) | def removelogs(self):
    method reopenlogs (line 324) | def reopenlogs(self):
    method writable (line 330) | def writable(self):
    method readable (line 333) | def readable(self):
    method handle_read_event (line 338) | def handle_read_event(self):
    method handle_listener_state_change (line 358) | def handle_listener_state_change(self):
    method handle_result (line 445) | def handle_result(self, result):
    method _change_listener_state (line 463) | def _change_listener_state(self, new_state):
  class PInputDispatcher (line 482) | class PInputDispatcher(PDispatcher):
    method __init__ (line 485) | def __init__(self, process, channel, fd):
    method writable (line 489) | def writable(self):
    method readable (line 494) | def readable(self):
    method flush (line 497) | def flush(self):
    method handle_write_event (line 503) | def handle_write_event(self):
  function stripEscapes (line 518) | def stripEscapes(s):
  class RejectEvent (line 540) | class RejectEvent(Exception):
  function default_handler (line 544) | def default_handler(event, response):

FILE: supervisor/events.py
  function subscribe (line 6) | def subscribe(type, callback):
  function unsubscribe (line 9) | def unsubscribe(type, callback):
  function notify (line 12) | def notify(event):
  function clear (line 17) | def clear():
  class Event (line 20) | class Event:
  class ProcessLogEvent (line 24) | class ProcessLogEvent(Event):
    method __init__ (line 27) | def __init__(self, process, pid, data):
    method payload (line 32) | def payload(self):
  class ProcessLogStdoutEvent (line 49) | class ProcessLogStdoutEvent(ProcessLogEvent):
  class ProcessLogStderrEvent (line 52) | class ProcessLogStderrEvent(ProcessLogEvent):
  class ProcessCommunicationEvent (line 55) | class ProcessCommunicationEvent(Event):
    method __init__ (line 61) | def __init__(self, process, pid, data):
    method payload (line 66) | def payload(self):
  class ProcessCommunicationStdoutEvent (line 80) | class ProcessCommunicationStdoutEvent(ProcessCommunicationEvent):
  class ProcessCommunicationStderrEvent (line 83) | class ProcessCommunicationStderrEvent(ProcessCommunicationEvent):
  class RemoteCommunicationEvent (line 86) | class RemoteCommunicationEvent(Event):
    method __init__ (line 87) | def __init__(self, type, data):
    method payload (line 91) | def payload(self):
  class SupervisorStateChangeEvent (line 94) | class SupervisorStateChangeEvent(Event):
    method payload (line 96) | def payload(self):
  class SupervisorRunningEvent (line 99) | class SupervisorRunningEvent(SupervisorStateChangeEvent):
  class SupervisorStoppingEvent (line 102) | class SupervisorStoppingEvent(SupervisorStateChangeEvent):
  class EventRejectedEvent (line 105) | class EventRejectedEvent: # purposely does not subclass Event
    method __init__ (line 106) | def __init__(self, process, event):
  class ProcessStateEvent (line 110) | class ProcessStateEvent(Event):
    method __init__ (line 114) | def __init__(self, process, from_state, expected=True):
    method payload (line 122) | def payload(self):
    method get_extra_values (line 132) | def get_extra_values(self):
  class ProcessStateFatalEvent (line 135) | class ProcessStateFatalEvent(ProcessStateEvent):
  class ProcessStateUnknownEvent (line 138) | class ProcessStateUnknownEvent(ProcessStateEvent):
  class ProcessStateStartingOrBackoffEvent (line 141) | class ProcessStateStartingOrBackoffEvent(ProcessStateEvent):
    method get_extra_values (line 142) | def get_extra_values(self):
  class ProcessStateBackoffEvent (line 145) | class ProcessStateBackoffEvent(ProcessStateStartingOrBackoffEvent):
  class ProcessStateStartingEvent (line 148) | class ProcessStateStartingEvent(ProcessStateStartingOrBackoffEvent):
  class ProcessStateExitedEvent (line 151) | class ProcessStateExitedEvent(ProcessStateEvent):
    method get_extra_values (line 152) | def get_extra_values(self):
  class ProcessStateRunningEvent (line 155) | class ProcessStateRunningEvent(ProcessStateEvent):
    method get_extra_values (line 156) | def get_extra_values(self):
  class ProcessStateStoppingEvent (line 159) | class ProcessStateStoppingEvent(ProcessStateEvent):
    method get_extra_values (line 160) | def get_extra_values(self):
  class ProcessStateStoppedEvent (line 163) | class ProcessStateStoppedEvent(ProcessStateEvent):
    method get_extra_values (line 164) | def get_extra_values(self):
  class ProcessGroupEvent (line 167) | class ProcessGroupEvent(Event):
    method __init__ (line 168) | def __init__(self, group):
    method payload (line 171) | def payload(self):
  class ProcessGroupAddedEvent (line 174) | class ProcessGroupAddedEvent(ProcessGroupEvent):
  class ProcessGroupRemovedEvent (line 177) | class ProcessGroupRemovedEvent(ProcessGroupEvent):
  class TickEvent (line 180) | class TickEvent(Event):
    method __init__ (line 182) | def __init__(self, when, supervisord):
    method payload (line 186) | def payload(self):
  class Tick5Event (line 189) | class Tick5Event(TickEvent):
  class Tick60Event (line 192) | class Tick60Event(TickEvent):
  class Tick3600Event (line 195) | class Tick3600Event(TickEvent):
  class EventTypes (line 200) | class EventTypes:
  function getEventNameByType (line 229) | def getEventNameByType(requested):
  function register (line 234) | def register(name, event):

FILE: supervisor/http.py
  class NOT_DONE_YET (line 28) | class NOT_DONE_YET:
  class deferring_chunked_producer (line 31) | class deferring_chunked_producer:
    method __init__ (line 41) | def __init__ (self, producer, footers=None):
    method more (line 46) | def more (self):
  class deferring_composite_producer (line 63) | class deferring_composite_producer:
    method __init__ (line 65) | def __init__ (self, producers):
    method more (line 69) | def more (self):
  class deferring_globbing_producer (line 83) | class deferring_globbing_producer:
    method __init__ (line 90) | def __init__ (self, producer, buffer_size=1<<16):
    method more (line 96) | def more (self):
  class deferring_hooked_producer (line 113) | class deferring_hooked_producer:
    method __init__ (line 120) | def __init__ (self, producer, function):
    method more (line 126) | def more (self):
  class deferring_http_request (line 141) | class deferring_http_request(http_server.http_request):
    method done (line 147) | def done(self, *arg, **kw):
    method log (line 230) | def log (self, bytes):
    method cgi_environment (line 250) | def cgi_environment(self):
    method get_server_url (line 303) | def get_server_url(self):
  class deferring_http_channel (line 332) | class deferring_http_channel(http_server.http_channel):
    method writable (line 341) | def writable(self, now=None):
    method refill_buffer (line 356) | def refill_buffer (self):
    method found_terminator (line 388) | def found_terminator (self):
  class supervisor_http_server (line 468) | class supervisor_http_server(http_server.http_server):
    method prebind (line 472) | def prebind(self, sock, logger_object):
    method postbind (line 491) | def postbind(self):
    method log_info (line 515) | def log_info(self, message, type='info'):
  class supervisor_af_inet_http_server (line 521) | class supervisor_af_inet_http_server(supervisor_http_server):
    method __init__ (line 524) | def __init__(self, ip, port, logger_object):
  class supervisor_af_unix_http_server (line 551) | class supervisor_af_unix_http_server(supervisor_http_server):
    method __init__ (line 554) | def __init__(self, socketname, sockchmod, sockchown, logger_object):
    method checkused (line 625) | def checkused(self, socketname):
  class tail_f_producer (line 637) | class tail_f_producer:
    method __init__ (line 638) | def __init__(self, request, filename, head):
    method __del__ (line 648) | def __del__(self):
    method more (line 651) | def more(self):
    method _open (line 669) | def _open(self):
    method _close (line 674) | def _close(self):
    method _follow (line 677) | def _follow(self):
    method _fsize (line 688) | def _fsize(self):
  class logtail_handler (line 691) | class logtail_handler:
    method __init__ (line 695) | def __init__(self, supervisord):
    method match (line 698) | def match(self, request):
    method handle_request (line 701) | def handle_request(self, request):
  class mainlogtail_handler (line 760) | class mainlogtail_handler:
    method __init__ (line 764) | def __init__(self, supervisord):
    method match (line 767) | def match(self, request):
    method handle_request (line 770) | def handle_request(self, request):
  function make_http_servers (line 794) | def make_http_servers(options, supervisord):
  class LogWrapper (line 867) | class LogWrapper:
    method __init__ (line 870) | def __init__(self, logger):
    method log (line 873) | def log(self, msg):
  class encrypted_dictionary_authorizer (line 884) | class encrypted_dictionary_authorizer:
    method __init__ (line 885) | def __init__ (self, dict):
    method authorize (line 888) | def authorize(self, auth_info):
  class supervisor_auth_handler (line 900) | class supervisor_auth_handler(auth_handler):
    method __init__ (line 901) | def __init__(self, dict, handler, realm='default'):

FILE: supervisor/http_client.py
  class Listener (line 17) | class Listener(object):
    method status (line 19) | def status(self, url, status):
    method error (line 22) | def error(self, url, error):
    method response_header (line 25) | def response_header(self, url, name, value):
    method done (line 28) | def done(self, url):
    method feed (line 31) | def feed(self, url, data):
    method close (line 52) | def close(self, url):
  class HTTPHandler (line 55) | class HTTPHandler(asynchat.async_chat):
    method __init__ (line 56) | def __init__(
    method get (line 81) | def get(self, serverurl, path=''):
    method close (line 109) | def close(self):
    method header (line 116) | def header(self, name, value):
    method handle_error (line 120) | def handle_error(self):
    method handle_connect (line 134) | def handle_connect(self):
    method feed (line 153) | def feed(self, data):
    method collect_incoming_data (line 156) | def collect_incoming_data(self, bytes):
    method found_terminator (line 162) | def found_terminator(self):
    method ignore (line 166) | def ignore(self):
    method status_line (line 169) | def status_line(self):
    method headers (line 188) | def headers(self):
    method response_header (line 207) | def response_header(self, name, value):
    method body (line 210) | def body(self):
    method done (line 214) | def done(self):
    method chunked_size (line 217) | def chunked_size(self):
    method chunked_body (line 229) | def chunked_body(self):
    method trailer (line 235) | def trailer(self):

FILE: supervisor/loggers.py
  class LevelsByName (line 21) | class LevelsByName:
  class LevelsByDescription (line 30) | class LevelsByDescription:
  function _levelNumbers (line 39) | def _levelNumbers():
  function getLevelNumByDescription (line 48) | def getLevelNumByDescription(description):
  class Handler (line 52) | class Handler:
    method __init__ (line 56) | def __init__(self, stream=None):
    method setFormat (line 60) | def setFormat(self, fmt):
    method setLevel (line 63) | def setLevel(self, level):
    method flush (line 66) | def flush(self):
    method close (line 74) | def close(self):
    method emit (line 89) | def emit(self, record):
    method handleError (line 113) | def handleError(self):
  class StreamHandler (line 118) | class StreamHandler(Handler):
    method __init__ (line 119) | def __init__(self, strm=None):
    method remove (line 122) | def remove(self):
    method reopen (line 126) | def reopen(self):
  class BoundIO (line 129) | class BoundIO:
    method __init__ (line 130) | def __init__(self, maxbytes, buf=b''):
    method flush (line 134) | def flush(self):
    method close (line 137) | def close(self):
    method write (line 140) | def write(self, b):
    method getvalue (line 146) | def getvalue(self):
    method clear (line 149) | def clear(self):
  class FileHandler (line 152) | class FileHandler(Handler):
    method __init__ (line 156) | def __init__(self, filename, mode='ab'):
    method reopen (line 175) | def reopen(self):
    method remove (line 180) | def remove(self):
  class RotatingFileHandler (line 188) | class RotatingFileHandler(FileHandler):
    method __init__ (line 189) | def __init__(self, filename, mode='ab', maxBytes=512*1024*1024,
    method emit (line 219) | def emit(self, record):
    method _remove (line 229) | def _remove(self, fn): # pragma: no cover
    method _rename (line 233) | def _rename(self, src, tgt): # pragma: no cover
    method _exists (line 237) | def _exists(self, fn): # pragma: no cover
    method removeAndRename (line 241) | def removeAndRename(self, sfn, dfn):
    method doRollover (line 257) | def doRollover(self):
  class LogRecord (line 278) | class LogRecord:
    method __init__ (line 279) | def __init__(self, level, msg, **kw):
    method asdict (line 285) | def asdict(self):
  class Logger (line 299) | class Logger:
    method __init__ (line 300) | def __init__(self, level=None, handlers=None):
    method close (line 309) | def close(self):
    method blather (line 313) | def blather(self, msg, **kw):
    method trace (line 317) | def trace(self, msg, **kw):
    method debug (line 321) | def debug(self, msg, **kw):
    method info (line 325) | def info(self, msg, **kw):
    method warn (line 329) | def warn(self, msg, **kw):
    method error (line 333) | def error(self, msg, **kw):
    method critical (line 337) | def critical(self, msg, **kw):
    method log (line 341) | def log(self, level, msg, **kw):
    method addHandler (line 347) | def addHandler(self, hdlr):
    method getvalue (line 350) | def getvalue(self):
  class SyslogHandler (line 353) | class SyslogHandler(Handler):
    method __init__ (line 354) | def __init__(self):
    method close (line 358) | def close(self):
    method reopen (line 361) | def reopen(self):
    method _syslog (line 364) | def _syslog(self, msg): # pragma: no cover
    method emit (line 368) | def emit(self, record):
  function getLogger (line 382) | def getLogger(level=None):
  function handle_boundIO (line 387) | def handle_boundIO(logger, fmt, maxbytes=_2MB):
  function handle_stdout (line 396) | def handle_stdout(logger, fmt):
  function handle_syslog (line 403) | def handle_syslog(logger, fmt):
  function handle_file (line 410) | def handle_file(logger, filename, fmt, rotating=False, maxbytes=0, backu...

FILE: supervisor/medusa/asynchat_25.py
  class async_chat (line 54) | class async_chat (asyncore.dispatcher):
    method __init__ (line 63) | def __init__ (self, conn=None, map=None):
    method collect_incoming_data (line 69) | def collect_incoming_data(self, data):
    method found_terminator (line 72) | def found_terminator(self):
    method set_terminator (line 75) | def set_terminator (self, term):
    method get_terminator (line 79) | def get_terminator (self):
    method handle_read (line 87) | def handle_read (self):
    method handle_write (line 152) | def handle_write (self):
    method handle_close (line 155) | def handle_close (self):
    method push (line 158) | def push (self, data):
    method push_with_producer (line 163) | def push_with_producer (self, producer):
    method readable (line 167) | def readable (self):
    method writable (line 171) | def writable (self):
    method close_when_done (line 181) | def close_when_done (self):
    method refill_buffer (line 187) | def refill_buffer (self):
    method initiate_send (line 211) | def initiate_send (self):
    method discard_buffers (line 228) | def discard_buffers (self):
  class simple_producer (line 236) | class simple_producer:
    method __init__ (line 238) | def __init__ (self, data, buffer_size=512):
    method more (line 242) | def more (self):
  class fifo (line 252) | class fifo:
    method __init__ (line 253) | def __init__ (self, list=None):
    method __len__ (line 259) | def __len__ (self):
    method is_empty (line 262) | def is_empty (self):
    method first (line 265) | def first (self):
    method push (line 268) | def push (self, data):
    method pop (line 271) | def pop (self):
  function find_prefix_at_end (line 292) | def find_prefix_at_end (haystack, needle):

FILE: supervisor/medusa/asyncore_25.py
  class ExitNow (line 65) | class ExitNow(Exception):
  function read (line 68) | def read(obj):
  function write (line 76) | def write(obj):
  function _exception (line 84) | def _exception (obj):
  function readwrite (line 92) | def readwrite(obj, flags):
  function poll (line 105) | def poll(timeout=0.0, map=None):
  function poll2 (line 148) | def poll2(timeout=0.0, map=None):
  function loop (line 182) | def loop(timeout=30.0, use_poll=False, map=None, count=None):
  class dispatcher (line 200) | class dispatcher:
    method __init__ (line 208) | def __init__(self, sock=None, map=None):
    method __repr__ (line 229) | def __repr__(self):
    method add_channel (line 242) | def add_channel(self, map=None):
    method del_channel (line 248) | def del_channel(self, map=None):
    method create_socket (line 257) | def create_socket(self, family, type):
    method set_socket (line 264) | def set_socket(self, sock, map=None):
    method set_reuse_addr (line 270) | def set_reuse_addr(self):
    method readable (line 287) | def readable(self):
    method writable (line 290) | def writable(self):
    method listen (line 297) | def listen(self, num):
    method bind (line 303) | def bind(self, addr):
    method connect (line 307) | def connect(self, address):
    method accept (line 320) | def accept(self):
    method send (line 331) | def send(self, data):
    method recv (line 341) | def recv(self, buffer_size):
    method close (line 359) | def close(self):
    method __getattr__ (line 374) | def __getattr__(self, attr):
    method log (line 381) | def log(self, message):
    method log_info (line 384) | def log_info(self, message, type='info'):
    method handle_read_event (line 388) | def handle_read_event(self):
    method handle_write_event (line 402) | def handle_write_event(self):
    method handle_expt_event (line 409) | def handle_expt_event(self):
    method handle_error (line 412) | def handle_error(self):
    method handle_expt (line 432) | def handle_expt(self):
    method handle_read (line 435) | def handle_read(self):
    method handle_write (line 438) | def handle_write(self):
    method handle_connect (line 441) | def handle_connect(self):
    method handle_accept (line 444) | def handle_accept(self):
    method handle_close (line 447) | def handle_close(self):
  class dispatcher_with_send (line 456) | class dispatcher_with_send(dispatcher):
    method __init__ (line 458) | def __init__(self, sock=None, map=None):
    method initiate_send (line 462) | def initiate_send(self):
    method handle_write (line 466) | def handle_write(self):
    method writable (line 469) | def writable(self):
    method send (line 472) | def send(self, data):
  function compact_traceback (line 482) | def compact_traceback():
  function close_all (line 501) | def close_all(map=None):
  class file_wrapper (line 524) | class file_wrapper:
    method __init__ (line 528) | def __init__(self, fd):
    method recv (line 531) | def recv(self, buffersize):
    method send (line 534) | def send(self, s):
    method close (line 540) | def close(self):
    method fileno (line 543) | def fileno(self):
  class file_dispatcher (line 546) | class file_dispatcher(dispatcher):
    method __init__ (line 548) | def __init__(self, fd, map=None):
    method set_file (line 557) | def set_file(self, fd):

FILE: supervisor/medusa/auth_handler.py
  class auth_handler (line 34) | class auth_handler:
    method __init__ (line 35) | def __init__ (self, dict, handler, realm='default'):
    method match (line 42) | def match (self, request):
    method handle_request (line 46) | def handle_request (self, request):
    method handle_unauthorized (line 82) | def handle_unauthorized (self, request):
    method make_nonce (line 91) | def make_nonce (self, request):
    method apply_hash (line 101) | def apply_hash (self, s):
    method status (line 109) | def status (self):
  class dictionary_authorizer (line 124) | class dictionary_authorizer:
    method __init__ (line 125) | def __init__ (self, dict):
    method authorize (line 128) | def authorize (self, auth_info):

FILE: supervisor/medusa/counter.py
  class counter (line 17) | class counter:
    method __init__ (line 20) | def __init__ (self, initial_value=0):
    method increment (line 23) | def increment (self, delta=1):
    method decrement (line 31) | def decrement (self, delta=1):
    method as_long (line 39) | def as_long (self):
    method __nonzero__ (line 42) | def __nonzero__ (self):
    method __repr__ (line 47) | def __repr__ (self):
    method __str__ (line 50) | def __str__ (self):

FILE: supervisor/medusa/default_handler.py
  class default_handler (line 39) | class default_handler:
    method __init__ (line 53) | def __init__ (self, filesystem):
    method __repr__ (line 64) | def __repr__ (self):
    method match (line 72) | def match (self, request):
    method handle_request (line 77) | def handle_request (self, request):
    method set_content_type (line 171) | def set_content_type (self, path, request):
    method status (line 180) | def status (self):
  function get_extension (line 208) | def get_extension (path):

FILE: supervisor/medusa/filesys.py
  class abstract_filesystem (line 19) | class abstract_filesystem:
    method __init__ (line 20) | def __init__ (self):
    method current_directory (line 23) | def current_directory (self):
    method listdir (line 27) | def listdir (self, path, long=0):
    method open (line 34) | def open (self, path, mode):
    method stat (line 38) | def stat (self, path):
    method isdir (line 42) | def isdir (self, path):
    method isfile (line 46) | def isfile (self, path):
    method cwd (line 50) | def cwd (self, path):
    method cdup (line 54) | def cdup (self):
    method longify (line 59) | def longify (self, path):
  function safe_stat (line 78) | def safe_stat (path):
  class os_filesystem (line 84) | class os_filesystem:
    method __init__ (line 91) | def __init__ (self, root, wd='/'):
    method current_directory (line 95) | def current_directory (self):
    method isfile (line 98) | def isfile (self, path):
    method isdir (line 102) | def isdir (self, path):
    method cwd (line 106) | def cwd (self, path):
    method cdup (line 128) | def cdup (self):
    method listdir (line 131) | def listdir (self, path, long=0):
    method stat (line 149) | def stat (self, path):
    method open (line 153) | def open (self, path, mode):
    method unlink (line 157) | def unlink (self, path):
    method mkdir (line 161) | def mkdir (self, path):
    method rmdir (line 165) | def rmdir (self, path):
    method rename (line 169) | def rename(self, src, dst):
    method normalize (line 173) | def normalize (self, path):
    method translate (line 182) | def translate (self, path):
    method longify (line 192) | def longify (self, path_stat_info_tuple):
    method __repr__ (line 196) | def __repr__ (self):
  class unix_filesystem (line 204) | class unix_filesystem (os_filesystem):
  class schizophrenic_unix_filesystem (line 207) | class schizophrenic_unix_filesystem (os_filesystem):
    method __init__ (line 213) | def __init__ (self, root, wd='/', persona=(None, None)):
    method become_persona (line 217) | def become_persona (self):
    method become_nobody (line 224) | def become_nobody (self):
    method cwd (line 230) | def cwd (self, path):
    method cdup (line 237) | def cdup (self):
    method open (line 244) | def open (self, filename, mode):
    method listdir (line 251) | def listdir (self, path, long=0):
  class msdos_filesystem (line 262) | class msdos_filesystem (os_filesystem):
    method longify (line 263) | def longify (self, path_stat_info_tuple):
  class merged_filesystem (line 275) | class merged_filesystem:
    method __init__ (line 276) | def __init__ (self, *fsys):
  function msdos_longify (line 282) | def msdos_longify (file, stat_info):
  function msdos_date (line 295) | def msdos_date (t):
  function unix_longify (line 332) | def unix_longify (file, stat_info):
  function ls_date (line 359) | def ls_date (now, t):
  class list_producer (line 383) | class list_producer:
    method __init__ (line 384) | def __init__ (self, list, func=None):
    method more (line 389) | def more (self):

FILE: supervisor/medusa/http_date.py
  function concat (line 6) | def concat (*args):
  function join (line 9) | def join (seq, field=' '):
  function group (line 12) | def group (s):
  function unpack_rfc822 (line 55) | def unpack_rfc822(m):
  function unpack_rfc850 (line 88) | def unpack_rfc850(m):
  function build_http_date (line 106) | def build_http_date (when):
  function parse_http_date (line 109) | def parse_http_date (d):

FILE: supervisor/medusa/http_server.py
  class http_request (line 38) | class http_request:
    method __init__ (line 57) | def __init__ (self, *args):
    method __setitem__ (line 80) | def __setitem__ (self, key, value):
    method __getitem__ (line 83) | def __getitem__ (self, key):
    method __contains__ (line 86) | def __contains__(self, key):
    method has_key (line 89) | def has_key (self, key):
    method build_reply_header (line 92) | def build_reply_header (self):
    method add_header (line 109) | def add_header(self, name, value):
    method clear_headers (line 113) | def clear_headers(self):
    method remove_header (line 121) | def remove_header(self, name, value=None):
    method get_reply_headers (line 161) | def get_reply_headers(self):
    method get_reply_header_text (line 185) | def get_reply_header_text(self):
    method split_uri (line 211) | def split_uri (self):
    method get_header_with_regex (line 220) | def get_header_with_regex (self, head_reg, group):
    method get_header (line 227) | def get_header (self, header):
    method collect_incoming_data (line 247) | def collect_incoming_data (self, data):
    method found_terminator (line 256) | def found_terminator (self):
    method push (line 265) | def push (self, thing):
    method response (line 274) | def response (self, code=200):
    method error (line 279) | def error (self, code):
    method done (line 296) | def done (self):
    method log_date_string (line 372) | def log_date_string (self, when):
    method log (line 392) | def log (self, bytes):
    method log_info (line 458) | def log_info(self, msg, level):
  class http_channel (line 466) | class http_channel (asynchat.async_chat):
    method __init__ (line 474) | def __init__ (self, server, conn, addr):
    method __repr__ (line 486) | def __repr__ (self):
    method check_maintenance (line 497) | def check_maintenance (self):
    method maintenance (line 501) | def maintenance (self):
    method kill_zombies (line 507) | def kill_zombies (self):
    method send (line 520) | def send (self, data):
    method recv (line 526) | def recv (self, buffer_size):
    method handle_error (line 541) | def handle_error (self):
    method log (line 548) | def log (self, *args):
    method collect_incoming_data (line 555) | def collect_incoming_data (self, data):
    method found_terminator (line 563) | def found_terminator (self):
    method writable_for_proxy (line 634) | def writable_for_proxy (self):
  class http_server (line 654) | class http_server (asyncore.dispatcher):
    method __init__ (line 660) | def __init__ (self, ip, port, resolver=None, logger_object=None):
    method writable (line 714) | def writable (self):
    method handle_read (line 717) | def handle_read (self):
    method readable (line 720) | def readable (self):
    method handle_connect (line 723) | def handle_connect (self):
    method handle_accept (line 726) | def handle_accept (self):
    method install_handler (line 747) | def install_handler (self, handler, back=0):
    method remove_handler (line 753) | def remove_handler (self, handler):
    method status (line 756) | def status (self):
  function maybe_status (line 785) | def maybe_status (thing):
  function join_headers (line 795) | def join_headers (headers):
  function get_header (line 804) | def get_header (head_reg, lines, group=1):
  function get_header_match (line 811) | def get_header_match (head_reg, lines):
  function crack_request (line 820) | def crack_request (r):
  function profile_loop (line 856) | def profile_loop ():

FILE: supervisor/medusa/logger.py
  class file_logger (line 30) | class file_logger:
    method __init__ (line 33) | def __init__ (self, file, flush=1, mode='a'):
    method __repr__ (line 44) | def __repr__ (self):
    method write (line 47) | def write (self, data):
    method writeline (line 51) | def writeline (self, line):
    method writelines (line 55) | def writelines (self, lines):
    method maybe_flush (line 59) | def maybe_flush (self):
    method flush (line 63) | def flush (self):
    method softspace (line 66) | def softspace (self, *args):
    method log (line 69) | def log (self, message):
  class rotating_file_logger (line 81) | class rotating_file_logger (file_logger):
    method __init__ (line 86) | def __init__ (self, file, freq=None, maxsize=None, flush=1, mode='a'):
    method __repr__ (line 94) | def __repr__ (self):
    method next_backup (line 98) | def next_backup (self, freq):
    method maybe_flush (line 109) | def maybe_flush (self):              # rotate first if necessary
    method maybe_rotate (line 114) | def maybe_rotate (self):
    method rotate (line 125) | def rotate (self):
  class socket_logger (line 142) | class socket_logger (asynchat.async_chat):
    method __init__ (line 144) | def __init__ (self, address):
    method __repr__ (line 154) | def __repr__ (self):
    method log (line 157) | def log (self, message):
  class multi_logger (line 164) | class multi_logger:
    method __init__ (line 165) | def __init__ (self, loggers):
    method __repr__ (line 168) | def __repr__ (self):
    method log (line 171) | def log (self, message):
  class resolving_logger (line 175) | class resolving_logger:
    method __init__ (line 180) | def __init__ (self, resolver, logger):
    class logger_thunk (line 184) | class logger_thunk:
      method __init__ (line 185) | def __init__ (self, message, logger):
      method __call__ (line 189) | def __call__ (self, host, ttl, answer):
    method log (line 194) | def log (self, ip, message):
  class unresolving_logger (line 203) | class unresolving_logger:
    method __init__ (line 205) | def __init__ (self, logger):
    method log (line 208) | def log (self, ip, message):
  function strip_eol (line 212) | def strip_eol (line):
  class tail_logger (line 217) | class tail_logger:
    method __init__ (line 219) | def __init__ (self, logger, size=500):
    method log (line 224) | def log (self, message):

FILE: supervisor/medusa/producers.py
  class simple_producer (line 17) | class simple_producer:
    method __init__ (line 19) | def __init__ (self, data, buffer_size=1024):
    method more (line 23) | def more (self):
  class scanning_producer (line 33) | class scanning_producer:
    method __init__ (line 35) | def __init__ (self, data, buffer_size=1024):
    method more (line 40) | def more (self):
  class lines_producer (line 53) | class lines_producer:
    method __init__ (line 56) | def __init__ (self, lines):
    method more (line 59) | def more (self):
  class buffer_list_producer (line 67) | class buffer_list_producer:
    method __init__ (line 72) | def __init__ (self, buffers):
    method more (line 76) | def more (self):
  class file_producer (line 84) | class file_producer:
    method __init__ (line 90) | def __init__ (self, file):
    method more (line 94) | def more (self):
  class output_producer (line 114) | class output_producer:
    method __init__ (line 116) | def __init__ (self):
    method write (line 119) | def write (self, data):
    method writeline (line 124) | def writeline (self, line):
    method writelines (line 127) | def writelines (self, lines):
    method flush (line 130) | def flush (self):
    method softspace (line 133) | def softspace (self, *args):
    method more (line 136) | def more (self):
  class composite_producer (line 144) | class composite_producer:
    method __init__ (line 146) | def __init__ (self, producers):
    method more (line 149) | def more (self):
  class globbing_producer (line 161) | class globbing_producer:
    method __init__ (line 168) | def __init__ (self, producer, buffer_size=1<<16):
    method more (line 173) | def more (self):
  class hooked_producer (line 185) | class hooked_producer:
    method __init__ (line 192) | def __init__ (self, producer, function):
    method more (line 197) | def more (self):
  class chunked_producer (line 217) | class chunked_producer:
    method __init__ (line 227) | def __init__ (self, producer, footers=None):
    method more (line 231) | def more (self):
  class compressed_producer (line 251) | class compressed_producer:
    method __init__ (line 264) | def __init__ (self, producer, level=5):
    method more (line 268) | def more (self):
  class escaping_producer (line 283) | class escaping_producer:
    method __init__ (line 288) | def __init__ (self, producer, esc_from='\r\n.', esc_to='\r\n..'):
    method more (line 295) | def more (self):

FILE: supervisor/medusa/util.py
  function html_repr (line 3) | def html_repr (object):
  function progressive_divide (line 16) | def progressive_divide (n, parts):
  function split_by_units (line 25) | def split_by_units (n, units, dividers, format_string):
  function english_bytes (line 37) | def english_bytes (n):
  function english_time (line 45) | def english_time (n):

FILE: supervisor/medusa/xmlrpc_handler.py
  class xmlrpc_handler (line 20) | class xmlrpc_handler:
    method match (line 22) | def match (self, request):
    method handle_request (line 29) | def handle_request (self, request):
    method continue_request (line 35) | def continue_request (self, data, request):
    method call (line 59) | def call (self, method, params):
  class collector (line 63) | class collector:
    method __init__ (line 67) | def __init__ (self, handler, request):
    method collect_incoming_data (line 83) | def collect_incoming_data (self, data):
    method found_terminator (line 86) | def found_terminator (self):
  class rpc_demo (line 95) | class rpc_demo (xmlrpc_handler):
    method call (line 97) | def call (self, method, params):

FILE: supervisor/options.py
  function _read_version_txt (line 58) | def _read_version_txt():
  function normalize_path (line 65) | def normalize_path(v):
  class Dummy (line 68) | class Dummy:
  class Options (line 71) | class Options:
    method __init__ (line 89) | def __init__(self, require_configfile=True):
    method default_configfile (line 122) | def default_configfile(self):
    method help (line 135) | def help(self, dummy):
    method usage (line 146) | def usage(self, msg):
    method add (line 152) | def add(self,
    method _set (line 236) | def _set(self, attr, value, prio):
    method realize (line 242) | def realize(self, args=None, doc=None, progname=None):
    method process_config (line 312) | def process_config(self, do_usage=True):
    method process_config_file (line 343) | def process_config_file(self, do_usage):
    method exists (line 357) | def exists(self, path):
    method open (line 360) | def open(self, fn, mode='r'):
    method get_plugins (line 363) | def get_plugins(self, parser, factory_key, section_prefix):
    method import_spec (line 389) | def import_spec(self, spec):
  class ServerOptions (line 394) | class ServerOptions(Options):
    method __init__ (line 409) | def __init__(self):
    method version (line 457) | def version(self, dummy):
    method getLogger (line 464) | def getLogger(self, *args, **kwargs):
    method default_configfile (line 467) | def default_configfile(self):
    method realize (line 479) | def realize(self, *arg, **kw):
    method process_config (line 541) | def process_config(self, do_usage=True):
    method read_config (line 547) | def read_config(self, fp):
    method process_groups_from_parser (line 674) | def process_groups_from_parser(self, parser):
    method parse_fcgi_socket (line 843) | def parse_fcgi_socket(self, sock, proc_uid, socket_owner, socket_mode,
    method processes_from_section (line 878) | def processes_from_section(self, parser, section, group_name,
    method _processes_from_section (line 888) | def _processes_from_section(self, parser, section, group_name,
    method _parse_servernames (line 1060) | def _parse_servernames(self, parser, stype):
    method _parse_username_and_password (line 1072) | def _parse_username_and_password(self, parser, section):
    method server_configs_from_parser (line 1084) | def server_configs_from_parser(self, parser):
    method daemonize (line 1137) | def daemonize(self):
    method _daemonize (line 1142) | def _daemonize(self):
    method write_pidfile (line 1194) | def write_pidfile(self):
    method cleanup (line 1205) | def cleanup(self):
    method _try_unlink (line 1215) | def _try_unlink(self, path):
    method close_httpservers (line 1221) | def close_httpservers(self):
    method close_logger (line 1244) | def close_logger(self):
    method setsignals (line 1247) | def setsignals(self):
    method get_signal (line 1256) | def get_signal(self):
    method openhttpservers (line 1259) | def openhttpservers(self, supervisord):
    method get_autochildlog_name (line 1280) | def get_autochildlog_name(self, name, identifier, channel):
    method clear_autochildlogdir (line 1288) | def clear_autochildlogdir(self):
    method get_socket_map (line 1306) | def get_socket_map(self):
    method cleanup_fds (line 1309) | def cleanup_fds(self):
    method kill (line 1314) | def kill(self, pid, signal):
    method waitpid (line 1317) | def waitpid(self):
    method drop_privileges (line 1341) | def drop_privileges(self, user):
    method set_uid_or_exit (line 1398) | def set_uid_or_exit(self):
    method set_rlimits_or_exit (line 1417) | def set_rlimits_or_exit(self):
    method make_logger (line 1477) | def make_logger(self):
    method make_http_servers (line 1498) | def make_http_servers(self, supervisord):
    method close_fd (line 1502) | def close_fd(self, fd):
    method fork (line 1508) | def fork(self):
    method dup2 (line 1511) | def dup2(self, frm, to):
    method setpgrp (line 1514) | def setpgrp(self):
    method stat (line 1517) | def stat(self, filename):
    method write (line 1520) | def write(self, fd, data):
    method execve (line 1523) | def execve(self, filename, argv, env):
    method mktempfile (line 1526) | def mktempfile(self, suffix, prefix, dir):
    method remove (line 1535) | def remove(self, path):
    method _exit (line 1538) | def _exit(self, code):
    method setumask (line 1541) | def setumask(self, mask):
    method get_path (line 1544) | def get_path(self):
    method get_pid (line 1553) | def get_pid(self):
    method check_execv_args (line 1556) | def check_execv_args(self, filename, argv, st):
    method reopenlogs (line 1569) | def reopenlogs(self):
    method readfd (line 1575) | def readfd(self, fd):
    method chdir (line 1584) | def chdir(self, dir):
    method make_pipes (line 1587) | def make_pipes(self, stderr=True):
    method close_parent_pipes (line 1618) | def close_parent_pipes(self, pipes):
    method close_child_pipes (line 1624) | def close_child_pipes(self, pipes):
  class ClientOptions (line 1630) | class ClientOptions(Options):
    method __init__ (line 1640) | def __init__(self):
    method realize (line 1666) | def realize(self, *arg, **kw):
    method read_config (line 1671) | def read_config(self, fp):
    method getServerProxy (line 1728) | def getServerProxy(self):
  class UnhosedConfigParser (line 1741) | class UnhosedConfigParser(ConfigParser.RawConfigParser):
    method __init__ (line 1744) | def __init__(self, *args, **kwargs):
    method read_string (line 1760) | def read_string(self, string, source='<string>'):
    method read (line 1769) | def read(self, filenames, **kwargs):
    method saneget (line 1790) | def saneget(self, section, option, default=_marker, do_expand=True,
    method getdefault (line 1809) | def getdefault(self, option, default=_marker, expansions={}, **kwargs):
    method expand_here (line 1813) | def expand_here(self, here):
  class Config (line 1823) | class Config(object):
    method __ne__ (line 1824) | def __ne__(self, other):
    method __lt__ (line 1827) | def __lt__(self, other):
    method __le__ (line 1833) | def __le__(self, other):
    method __gt__ (line 1839) | def __gt__(self, other):
    method __ge__ (line 1845) | def __ge__(self, other):
    method __repr__ (line 1851) | def __repr__(self):
  class ProcessConfig (line 1855) | class ProcessConfig(Config):
    method __init__ (line 1869) | def __init__(self, options, **params):
    method __eq__ (line 1876) | def __eq__(self, other):
    method get_path (line 1888) | def get_path(self):
    method create_autochildlogs (line 1897) | def create_autochildlogs(self):
    method make_process (line 1907) | def make_process(self, group=None):
    method make_dispatchers (line 1913) | def make_dispatchers(self, proc):
  class EventListenerConfig (line 1931) | class EventListenerConfig(ProcessConfig):
    method make_dispatchers (line 1932) | def make_dispatchers(self, proc):
  class FastCGIProcessConfig (line 1953) | class FastCGIProcessConfig(ProcessConfig):
    method make_process (line 1955) | def make_process(self, group=None):
    method make_dispatchers (line 1963) | def make_dispatchers(self, proc):
  class ProcessGroupConfig (line 1973) | class ProcessGroupConfig(Config):
    method __init__ (line 1974) | def __init__(self, options, name, priority, process_configs):
    method __eq__ (line 1980) | def __eq__(self, other):
    method after_setuid (line 1993) | def after_setuid(self):
    method make_group (line 1997) | def make_group(self):
  class EventListenerPoolConfig (line 2001) | class EventListenerPoolConfig(Config):
    method __init__ (line 2002) | def __init__(self, options, name, priority, process_configs, buffer_size,
    method __eq__ (line 2012) | def __eq__(self, other):
    method after_setuid (line 2026) | def after_setuid(self):
    method make_group (line 2030) | def make_group(self):
  class FastCGIGroupConfig (line 2034) | class FastCGIGroupConfig(ProcessGroupConfig):
    method __init__ (line 2035) | def __init__(self, options, name, priority, process_configs, socket_co...
    method __eq__ (line 2045) | def __eq__(self, other):
    method make_group (line 2054) | def make_group(self):
  function readFile (line 2058) | def readFile(filename, offset, length):
  function tailFile (line 2092) | def tailFile(filename, offset, length):
  function decode_wait_status (line 2133) | def decode_wait_status(sts):
  function signame (line 2161) | def signame(sig):
  function _init_signames (line 2172) | def _init_signames():
  class SignalReceiver (line 2183) | class SignalReceiver:
    method __init__ (line 2184) | def __init__(self):
    method receive (line 2187) | def receive(self, sig, frame):
    method get_signal (line 2191) | def get_signal(self):
  function expand (line 2200) | def expand(s, expansions, name):
  function make_namespec (line 2216) | def make_namespec(group_name, process_name):
  function split_namespec (line 2226) | def split_namespec(namespec):
  class ProcessException (line 2240) | class ProcessException(Exception):
  class BadCommand (line 2243) | class BadCommand(ProcessException):
  class NotExecutable (line 2246) | class NotExecutable(ProcessException):
  class NotFound (line 2250) | class NotFound(ProcessException):
  class NoPermission (line 2254) | class NoPermission(ProcessException):

FILE: supervisor/pidproxy.py
  class PidProxy (line 17) | class PidProxy:
    method __init__ (line 20) | def __init__(self, args):
    method go (line 29) | def go(self):
    method usage (line 41) | def usage(self):
    method setsignals (line 44) | def setsignals(self):
    method reap (line 53) | def reap(self, sig, frame):
    method passtochild (line 57) | def passtochild(self, sig, frame):
  function main (line 68) | def main():

FILE: supervisor/poller.py
  class BasePoller (line 4) | class BasePoller:
    method __init__ (line 6) | def __init__(self, options):
    method initialize (line 10) | def initialize(self):
    method register_readable (line 13) | def register_readable(self, fd):
    method register_writable (line 16) | def register_writable(self, fd):
    method unregister_readable (line 19) | def unregister_readable(self, fd):
    method unregister_writable (line 22) | def unregister_writable(self, fd):
    method poll (line 25) | def poll(self, timeout):
    method before_daemonize (line 28) | def before_daemonize(self):
    method after_daemonize (line 31) | def after_daemonize(self):
    method close (line 34) | def close(self):
  class SelectPoller (line 38) | class SelectPoller(BasePoller):
    method initialize (line 40) | def initialize(self):
    method register_readable (line 44) | def register_readable(self, fd):
    method register_writable (line 47) | def register_writable(self, fd):
    method unregister_readable (line 50) | def unregister_readable(self, fd):
    method unregister_writable (line 53) | def unregister_writable(self, fd):
    method unregister_all (line 56) | def unregister_all(self):
    method poll (line 59) | def poll(self, timeout):
    method _init_fdsets (line 77) | def _init_fdsets(self):
  class PollPoller (line 81) | class PollPoller(BasePoller):
    method initialize (line 83) | def initialize(self):
    method register_readable (line 90) | def register_readable(self, fd):
    method register_writable (line 94) | def register_writable(self, fd):
    method unregister_readable (line 98) | def unregister_readable(self, fd):
    method unregister_writable (line 104) | def unregister_writable(self, fd):
    method poll (line 110) | def poll(self, timeout):
    method _poll_fds (line 122) | def _poll_fds(self, timeout):
    method _ignore_invalid (line 131) | def _ignore_invalid(self, fd, eventmask):
  class KQueuePoller (line 143) | class KQueuePoller(BasePoller):
    method initialize (line 150) | def initialize(self):
    method register_readable (line 155) | def register_readable(self, fd):
    method register_writable (line 161) | def register_writable(self, fd):
    method unregister_readable (line 167) | def unregister_readable(self, fd):
    method unregister_writable (line 173) | def unregister_writable(self, fd):
    method _kqueue_control (line 179) | def _kqueue_control(self, fd, kevent):
    method poll (line 189) | def poll(self, timeout):
    method before_daemonize (line 208) | def before_daemonize(self):
    method after_daemonize (line 211) | def after_daemonize(self):
    method close (line 218) | def close(self):
  function implements_poll (line 222) | def implements_poll():
  function implements_kqueue (line 225) | def implements_kqueue():

FILE: supervisor/process.py
  class Subprocess (line 34) | class Subprocess(object):
    method __init__ (line 59) | def __init__(self, config):
    method removelogs (line 69) | def removelogs(self):
    method reopenlogs (line 74) | def reopenlogs(self):
    method drain (line 79) | def drain(self):
    method write (line 90) | def write(self, chars):
    method get_execv_args (line 105) | def get_execv_args(self):
    method change_state (line 162) | def change_state(self, new_state, expected=True):
    method _assertInState (line 179) | def _assertInState(self, *states):
    method record_spawnerr (line 187) | def record_spawnerr(self, msg):
    method spawn (line 191) | def spawn(self):
    method _spawn_as_parent (line 264) | def _spawn_as_parent(self, pid):
    method _prepare_child_fds (line 275) | def _prepare_child_fds(self):
    method _spawn_as_child (line 286) | def _spawn_as_child(self, filename, argv):
    method _check_and_adjust_for_system_clock_rollback (line 357) | def _check_and_adjust_for_system_clock_rollback(self, test_time):
    method stop (line 379) | def stop(self):
    method stop_report (line 385) | def stop_report(self):
    method give_up (line 397) | def give_up(self):
    method kill (line 404) | def kill(self, sig):
    method signal (line 489) | def signal(self, sig):
    method finish (line 536) | def finish(self, pid, sts):
    method set_uid (line 629) | def set_uid(self):
    method __lt__ (line 635) | def __lt__(self, other):
    method __eq__ (line 638) | def __eq__(self, other):
    method __repr__ (line 642) | def __repr__(self):
    method get_state (line 653) | def get_state(self):
    method transition (line 656) | def transition(self):
  class FastCGISubprocess (line 720) | class FastCGISubprocess(Subprocess):
    method __init__ (line 723) | def __init__(self, config):
    method before_spawn (line 727) | def before_spawn(self):
    method spawn (line 738) | def spawn(self):
    method after_finish (line 749) | def after_finish(self):
    method finish (line 756) | def finish(self, pid, sts):
    method _prepare_child_fds (line 764) | def _prepare_child_fds(self):
  class ProcessGroupBase (line 782) | class ProcessGroupBase(object):
    method __init__ (line 783) | def __init__(self, config):
    method __lt__ (line 790) | def __lt__(self, other):
    method __eq__ (line 793) | def __eq__(self, other):
    method __repr__ (line 796) | def __repr__(self):
    method removelogs (line 805) | def removelogs(self):
    method reopenlogs (line 809) | def reopenlogs(self):
    method stop_all (line 813) | def stop_all(self):
    method get_unstopped_processes (line 830) | def get_unstopped_processes(self):
    method get_dispatchers (line 835) | def get_dispatchers(self):
    method before_remove (line 841) | def before_remove(self):
  class ProcessGroup (line 844) | class ProcessGroup(ProcessGroupBase):
    method transition (line 845) | def transition(self):
  class FastCGIProcessGroup (line 849) | class FastCGIProcessGroup(ProcessGroup):
    method __init__ (line 851) | def __init__(self, config, **kwargs):
  class EventListenerPool (line 866) | class EventListenerPool(ProcessGroupBase):
    method __init__ (line 867) | def __init__(self, config):
    method handle_rejected (line 875) | def handle_rejected(self, event):
    method transition (line 882) | def transition(self):
    method before_remove (line 905) | def before_remove(self):
    method dispatch (line 908) | def dispatch(self):
    method _acceptEvent (line 920) | def _acceptEvent(self, event, head=False):
    method _dispatchEvent (line 949) | def _dispatchEvent(self, event):
    method _eventEnvelope (line 983) | def _eventEnvelope(self, event_type, serial, pool_serial, payload):
    method _subscribe (line 1000) | def _subscribe(self):
    method _unsubscribe (line 1005) | def _unsubscribe(self):
  class GlobalSerial (line 1011) | class GlobalSerial(object):
    method __init__ (line 1012) | def __init__(self):
  function new_serial (line 1017) | def new_serial(inst):

FILE: supervisor/rpcinterface.py
  class SupervisorNamespaceRPCInterface (line 49) | class SupervisorNamespaceRPCInterface:
    method __init__ (line 50) | def __init__(self, supervisord):
    method _update (line 53) | def _update(self, text):
    method getAPIVersion (line 61) | def getAPIVersion(self):
    method getSupervisorVersion (line 71) | def getSupervisorVersion(self):
    method getIdentification (line 79) | def getIdentification(self):
    method getState (line 87) | def getState(self):
    method getPID (line 102) | def getPID(self):
    method readLog (line 110) | def readLog(self, offset, length):
    method clearLog (line 132) | def clearLog(self):
    method shutdown (line 155) | def shutdown(self):
    method restart (line 164) | def restart(self):
    method reloadConfig (line 174) | def reloadConfig(self):
    method addProcessGroup (line 203) | def addProcessGroup(self, name):
    method removeProcessGroup (line 219) | def removeProcessGroup(self, name):
    method _getAllProcesses (line 234) | def _getAllProcesses(self, lexical=False):
    method _getGroupAndProcess (line 261) | def _getGroupAndProcess(self, name):
    method startProcess (line 278) | def startProcess(self, name, wait=True):
    method startProcessGroup (line 356) | def startProcessGroup(self, name, wait=True):
    method startAllProcesses (line 381) | def startAllProcesses(self, wait=True):
    method stopProcess (line 397) | def stopProcess(self, name, wait=True):
    method stopProcessGroup (line 448) | def stopProcessGroup(self, name, wait=True):
    method stopAllProcesses (line 473) | def stopAllProcesses(self, wait=True):
    method signalProcess (line 490) | def signalProcess(self, name, signal):
    method signalProcessGroup (line 521) | def signalProcessGroup(self, name, signal):
    method signalAllProcesses (line 546) | def signalAllProcesses(self, signal):
    method getAllConfigInfo (line 559) | def getAllConfigInfo(self):
    method _interpretProcessInfo (line 617) | def _interpretProcessInfo(self, info):
    method getProcessInfo (line 648) | def getProcessInfo(self, name):
    method _now (line 694) | def _now(self): # pragma: no cover
    method getAllProcessInfo (line 698) | def getAllProcessInfo(self):
    method _readProcessLog (line 713) | def _readProcessLog(self, name, offset, length, channel):
    method readProcessStdoutLog (line 730) | def readProcessStdoutLog(self, name, offset, length):
    method readProcessStderrLog (line 743) | def readProcessStderrLog(self, name, offset, length):
    method _tailProcessLog (line 754) | def _tailProcessLog(self, name, offset, length, channel):
    method tailProcessStdoutLog (line 767) | def tailProcessStdoutLog(self, name, offset, length):
    method tailProcessStderrLog (line 791) | def tailProcessStderrLog(self, name, offset, length):
    method clearProcessLogs (line 813) | def clearProcessLogs(self, name):
    method clearAllProcessLogs (line 837) | def clearAllProcessLogs(self):
    method sendProcessStdin (line 882) | def sendProcessStdin(self, name, chars):
    method sendRemoteCommEvent (line 920) | def sendRemoteCommEvent(self, type, data):
  function _total_seconds (line 939) | def _total_seconds(timedelta):
  function make_allfunc (line 943) | def make_allfunc(processes, predicate, func, **extra_kwargs):
  function isRunning (line 1033) | def isRunning(process):
  function isNotRunning (line 1036) | def isNotRunning(process):
  function isSignallable (line 1039) | def isSignallable(process):
  function make_main_rpcinterface (line 1044) | def make_main_rpcinterface(supervisord):

FILE: supervisor/socket_manager.py
  class Proxy (line 3) | class Proxy:
    method __init__ (line 8) | def __init__(self, object, **kwargs):
    method __del__ (line 12) | def __del__(self):
    method __getattr__ (line 16) | def __getattr__(self, name):
    method _get (line 19) | def _get(self):
  class ReferenceCounter (line 22) | class ReferenceCounter:
    method __init__ (line 26) | def __init__(self, **kwargs):
    method get_count (line 31) | def get_count(self):
    method increment (line 34) | def increment(self):
    method decrement (line 39) | def decrement(self):
  class SocketManager (line 46) | class SocketManager:
    method __init__ (line 53) | def __init__(self, socket_config, **kwargs):
    method __repr__ (line 62) | def __repr__(self):
    method config (line 67) | def config(self):
    method is_prepared (line 70) | def is_prepared(self):
    method get_socket (line 73) | def get_socket(self):
    method get_socket_ref_count (line 78) | def get_socket_ref_count(self):
    method _require_prepared (line 82) | def _require_prepared(self):
    method _prepare_socket (line 86) | def _prepare_socket(self):
    method _close (line 97) | def _close(self):

FILE: supervisor/states.py
  class ProcessStates (line 4) | class ProcessStates:
  function getProcessStateDescription (line 27) | def getProcessStateDescription(code):
  class SupervisorStates (line 31) | class SupervisorStates:
  function getSupervisorStateDescription (line 37) | def getSupervisorStateDescription(code):
  class EventListenerStates (line 41) | class EventListenerStates:
  function getEventListenerStateDescription (line 47) | def getEventListenerStateDescription(code):
  function _names_by_code (line 52) | def _names_by_code(states):

FILE: supervisor/supervisorctl.py
  class LSBInitExitStatuses (line 47) | class LSBInitExitStatuses:
  class LSBStatusExitStatuses (line 56) | class LSBStatusExitStatuses:
  class fgthread (line 64) | class fgthread(threading.Thread):
    method __init__ (line 70) | def __init__(self, program, ctl):
    method start (line 83) | def start(self): # pragma: no cover
    method run (line 89) | def run(self): # pragma: no cover
    method __run (line 96) | def __run(self): # pragma: no cover
    method globaltrace (line 102) | def globaltrace(self, frame, why, arg):
    method localtrace (line 108) | def localtrace(self, frame, why, arg):
    method kill (line 114) | def kill(self):
  class Controller (line 119) | class Controller(cmd.Cmd):
    method __init__ (line 121) | def __init__(self, options, completekey='tab', stdin=None,
    method emptyline (line 138) | def emptyline(self):
    method default (line 142) | def default(self, line):
    method exec_cmdloop (line 146) | def exec_cmdloop(self, args, options):
    method set_exitstatus_from_xmlrpc_fault (line 178) | def set_exitstatus_from_xmlrpc_fault(self, faultcode, ignored_faultcod...
    method onecmd (line 186) | def onecmd(self, line):
    method _get_do_func (line 231) | def _get_do_func(self, cmd):
    method output (line 241) | def output(self, message):
    method get_supervisor (line 246) | def get_supervisor(self):
    method get_server_proxy (line 249) | def get_server_proxy(self, namespace=None):
    method upcheck (line 256) | def upcheck(self):
    method complete (line 293) | def complete(self, text, state, line=None):
    method _complete_actions (line 326) | def _complete_actions(self, text):
    method _complete_groups (line 330) | def _complete_groups(self, text):
    method _complete_processes (line 338) | def _complete_processes(self, text):
    method _get_complete_info (line 350) | def _get_complete_info(self):
    method do_help (line 358) | def do_help(self, arg):
    method help_help (line 365) | def help_help(self):
    method do_EOF (line 369) | def do_EOF(self, arg):
    method help_EOF (line 373) | def help_EOF(self):
  function get_names (line 376) | def get_names(inst):
  class ControllerPluginBase (line 386) | class ControllerPluginBase:
    method __init__ (line 389) | def __init__(self, controller):
    method _doc_header (line 392) | def _doc_header(self):
    method do_help (line 396) | def do_help(self, arg):
  function not_all_langs (line 439) | def not_all_langs():
  function check_encoding (line 443) | def check_encoding(ctl):
  class DefaultControllerPlugin (line 450) | class DefaultControllerPlugin(ControllerPluginBase):
    method _tailf (line 453) | def _tailf(self, path):
    method do_tail (line 480) | def do_tail(self, arg):
    method help_tail (line 563) | def help_tail(self):
    method do_maintail (line 573) | def do_maintail(self, arg):
    method help_maintail (line 624) | def help_maintail(self):
    method do_quit (line 632) | def do_quit(self, arg):
    method help_quit (line 635) | def help_quit(self):
    method help_exit (line 640) | def help_exit(self):
    method _show_statuses (line 643) | def _show_statuses(self, process_infos):
    method do_status (line 657) | def do_status(self, arg):
    method help_status (line 700) | def help_status(self):
    method do_pid (line 708) | def do_pid(self, arg):
    method help_pid (line 735) | def help_pid(self):
    method _startresult (line 742) | def _startresult(self, result):
    method do_start (line 763) | def do_start(self, arg):
    method help_start (line 812) | def help_start(self):
    method _signalresult (line 819) | def _signalresult(self, result, success='signalled'):
    method _stopresult (line 837) | def _stopresult(self, result):
    method do_stop (line 840) | def do_stop(self, arg):
    method help_stop (line 889) | def help_stop(self):
    method do_signal (line 895) | def do_signal(self, arg):
    method help_signal (line 949) | def help_signal(self):
    method do_restart (line 955) | def do_restart(self, arg):
    method help_restart (line 970) | def help_restart(self):
    method do_shutdown (line 979) | def do_shutdown(self, arg):
    method help_shutdown (line 1016) | def help_shutdown(self):
    method do_reload (line 1019) | def do_reload(self, arg):
    method help_reload (line 1045) | def help_reload(self):
    method _formatChanges (line 1048) | def _formatChanges(self, added_changed_dropped_tuple):
    method _formatConfigInfo (line 1064) | def _formatConfigInfo(self, configinfo):
    method do_avail (line 1081) | def do_avail(self, arg):
    method help_avail (line 1101) | def help_avail(self):
    method do_reread (line 1104) | def do_reread(self, arg):
    method help_reread (line 1125) | def help_reread(self):
    method do_add (line 1128) | def do_add(self, arg):
    method help_add (line 1150) | def help_add(self):
    method do_remove (line 1154) | def do_remove(self, arg):
    method help_remove (line 1173) | def help_remove(self):
    method do_update (line 1177) | def do_update(self, arg):
    method help_update (line 1245) | def help_update(self):
    method _clearresult (line 1250) | def _clearresult(self, result):
    method do_clear (line 1262) | def do_clear(self, arg):
    method help_clear (line 1297) | def help_clear(self):
    method do_open (line 1303) | def do_open(self, arg):
    method help_open (line 1316) | def help_open(self):
    method do_version (line 1320) | def do_version(self, arg):
    method help_version (line 1332) | def help_version(self):
    method do_fg (line 1337) | def do_fg(self, arg):
    method help_fg (line 1403) | def help_fg(self,args=None):
  function main (line 1408) | def main(args=None, options=None):

FILE: supervisor/supervisord.py
  class Supervisor (line 48) | class Supervisor:
    method __init__ (line 54) | def __init__(self, options):
    method main (line 59) | def main(self):
    method run (line 80) | def run(self):
    method diff_to_active (line 98) | def diff_to_active(self):
    method add_process_group (line 113) | def add_process_group(self, config):
    method remove_process_group (line 122) | def remove_process_group(self, name):
    method get_process_map (line 130) | def get_process_map(self):
    method shutdown_report (line 136) | def shutdown_report(self):
    method ordered_stop_groups_phase_1 (line 156) | def ordered_stop_groups_phase_1(self):
    method ordered_stop_groups_phase_2 (line 161) | def ordered_stop_groups_phase_2(self):
    method runforever (line 174) | def runforever(self):
    method tick (line 274) | def tick(self, now=None):
    method reap (line 291) | def reap(self, once=False, recursionguard=0):
    method handle_signal (line 308) | def handle_signal(self):
    method get_state (line 336) | def get_state(self):
  function timeslice (line 339) | def timeslice(period, when):
  function profile (line 343) | def profile(cmd, globals, locals, sort_order, callers): # pragma: no cover
  function main (line 366) | def main(args=None, test=False):
  function go (line 386) | def go(options): # pragma: no cover

FILE: supervisor/templating.py
  function encode (line 58) | def encode(text, encoding):
  function encode (line 61) | def encode(text, encoding):
  function Replace (line 67) | def Replace(text, structure=False):
  class PyHelper (line 73) | class PyHelper:
    method findmeld (line 74) | def findmeld(self, node, name, default=None):
    method clone (line 82) | def clone(self, node, parent=None):
    method _bfclone (line 95) | def _bfclone(self, nodes, parent):
    method bfclone (line 108) | def bfclone(self, node, parent=None):
    method getiterator (line 120) | def getiterator(self, node, tag=None):
    method content (line 130) | def content(self, node, text, structure=False):
  class doctype (line 152) | class doctype:
  class _MeldElementInterface (line 163) | class _MeldElementInterface:
    method __init__ (line 171) | def __init__(self, tag, attrib):
    method __repr__ (line 176) | def __repr__(self):
    method __len__ (line 179) | def __len__(self):
    method __getitem__ (line 182) | def __getitem__(self, index):
    method __getslice__ (line 185) | def __getslice__(self, start, stop):
    method getchildren (line 188) | def getchildren(self):
    method find (line 191) | def find(self, path):
    method findtext (line 194) | def findtext(self, path, default=None):
    method findall (line 197) | def findall(self, path):
    method clear (line 200) | def clear(self):
    method get (line 205) | def get(self, key, default=None):
    method set (line 208) | def set(self, key, value):
    method keys (line 211) | def keys(self):
    method items (line 214) | def items(self):
    method getiterator (line 217) | def getiterator(self, *ignored_args, **ignored_kw):
    method __setitem__ (line 224) | def __setitem__(self, index, element):
    method __setslice__ (line 234) | def __setslice__(self, start, stop, elements):
    method append (line 239) | def append(self, element):
    method insert (line 243) | def insert(self, index, element):
    method __delitem__ (line 247) | def __delitem__(self, index):
    method __delslice__ (line 258) | def __delslice__(self, start, stop):
    method remove (line 264) | def remove(self, element):
    method makeelement (line 268) | def makeelement(self, tag, attrib):
    method __mod__ (line 273) | def __mod__(self, other):
    method fillmelds (line 279) | def fillmelds(self, **kw):
    method fillmeldhtmlform (line 295) | def fillmeldhtmlform(self, **kw):
    method findmeld (line 439) | def findmeld(self, name, default=None):
    method findmelds (line 450) | def findmelds(self):
    method findwithattrib (line 455) | def findwithattrib(self, attrib, value=None):
    method repeat (line 473) | def repeat(self, iterable, childname=None):
    method replace (line 505) | def replace(self, text, structure=False):
    method content (line 520) | def content(self, text, structure=False):
    method attributes (line 527) | def attributes(self, **kw):
    method write_xmlstring (line 538) | def write_xmlstring(self, encoding=None, doctype=None, fragment=False,
    method write_xml (line 550) | def write_xml(self, file, encoding=None, doctype=None,
    method write_htmlstring (line 574) | def write_htmlstring(self, encoding=None, doctype=doctype.html,
    method write_html (line 587) | def write_html(self, file, encoding=None, doctype=doctype.html,
    method write_xhtmlstring (line 612) | def write_xhtmlstring(self, encoding=None, doctype=doctype.xhtml,
    method write_xhtml (line 624) | def write_xhtml(self, file, encoding=None, doctype=doctype.xhtml,
    method clone (line 647) | def clone(self, parent=None):
    method deparent (line 653) | def deparent(self):
    method parentindex (line 661) | def parentindex(self):
    method shortrepr (line 667) | def shortrepr(self, encoding=None):
    method diffmeld (line 672) | def diffmeld(self, other):
    method meldid (line 716) | def meldid(self):
    method lineage (line 719) | def lineage(self):
  class MeldTreeBuilder (line 727) | class MeldTreeBuilder(TreeBuilder):
    method __init__ (line 728) | def __init__(self):
    method start (line 732) | def start(self, tag, attrs):
    method comment (line 743) | def comment(self, data):
    method doctype (line 748) | def doctype(self, name, pubid, system):
  class HTMLXMLParser (line 751) | class HTMLXMLParser(HTMLParser):
    method __init__ (line 756) | def __init__(self, builder=None, encoding=None):
    method close (line 771) | def close(self):
    method handle_starttag (line 776) | def handle_starttag(self, tag, attrs):
    method handle_endtag (line 814) | def handle_endtag(self, tag):
    method handle_charref (line 822) | def handle_charref(self, char):
    method handle_entityref (line 829) | def handle_entityref(self, name):
    method handle_data (line 840) | def handle_data(self, data):
    method unknown_entityref (line 845) | def unknown_entityref(self, name):
    method handle_comment (line 848) | def handle_comment(self, data):
  function do_parse (line 853) | def do_parse(source, parser):
  function parse_xml (line 861) | def parse_xml(source):
  function parse_html (line 869) | def parse_html(source, encoding=None):
  function parse_xmlstring (line 874) | def parse_xmlstring(text):
  function parse_htmlstring (line 878) | def parse_htmlstring(text, encoding=None):
  function _both_case (line 885) | def _both_case(mapping):
  function _write_html (line 905) | def _write_html(write, node, encoding, namespaces, depth=-1, maxdepth=No...
  function _write_xml (line 1005) | def _write_xml(write, node, encoding, namespaces, pipeline, xhtml=False):
  function _encode_attrib (line 1074) | def _encode_attrib(k, v, encoding):
  function _escape_cdata (line 1088) | def _escape_cdata(text, encoding=None):
  function _escape_attrib (line 1104) | def _escape_attrib(text, encoding):
  function _write_declaration (line 1124) | def _write_declaration(write, encoding):
  function _write_doctype (line 1138) | def _write_doctype(write, doctype):
  function insert_doctype (line 1154) | def insert_doctype(data, doctype=doctype.xhtml):
  function insert_meld_ns_decl (line 1168) | def insert_meld_ns_decl(data):
  function prefeed (line 1178) | def prefeed(data, doctype=doctype.xhtml):
  function sharedlineage (line 1185) | def sharedlineage(srcelement, tgtelement):
  function diffreduce (line 1198) | def diffreduce(elements):
  function intersection (line 1212) | def intersection(S1, S2):
  function melditerator (line 1219) | def melditerator(element, meldid=None, _MELD_ID=_MELD_ID):
  function _encode (line 1257) | def _encode(s, encoding):
  function _raise_serialization_error (line 1263) | def _raise_serialization_error(text):
  function _encode_entity (line 1269) | def _encode_entity(text):
  function fixtag (line 1291) | def fixtag(tag, namespaces):

FILE: supervisor/tests/base.py
  class DummyOptions (line 23) | class DummyOptions:
    method __init__ (line 35) | def __init__(self):
    method getLogger (line 93) | def getLogger(self, *args, **kw):
    method realize (line 99) | def realize(self, args, **kw):
    method process_config (line 103) | def process_config(self, do_usage=True):
    method cleanup_fds (line 106) | def cleanup_fds(self):
    method set_rlimits_or_exit (line 109) | def set_rlimits_or_exit(self):
    method set_uid_or_exit (line 113) | def set_uid_or_exit(self):
    method openhttpservers (line 117) | def openhttpservers(self, supervisord):
    method daemonize (line 120) | def daemonize(self):
    method setsignals (line 123) | def setsignals(self):
    method get_signal (line 126) | def get_signal(self):
    method get_socket_map (line 129) | def get_socket_map(self):
    method make_logger (line 132) | def make_logger(self):
    method clear_autochildlogdir (line 135) | def clear_autochildlogdir(self):
    method get_autochildlog_name (line 138) | def get_autochildlog_name(self, *ignored):
    method cleanup (line 141) | def cleanup(self):
    method write_pidfile (line 144) | def write_pidfile(self):
    method waitpid (line 147) | def waitpid(self):
    method kill (line 150) | def kill(self, pid, sig):
    method stat (line 155) | def stat(self, filename):
    method get_path (line 159) | def get_path(self):
    method get_pid (line 162) | def get_pid(self):
    method check_execv_args (line 166) | def check_execv_args(self, filename, argv, st):
    method make_pipes (line 171) | def make_pipes(self, stderr=True):
    method write (line 181) | def write(self, fd, chars):
    method fork (line 191) | def fork(self):
    method close_fd (line 196) | def close_fd(self, fd):
    method close_parent_pipes (line 199) | def close_parent_pipes(self, pipes):
    method close_child_pipes (line 202) | def close_child_pipes(self, pipes):
    method setpgrp (line 205) | def setpgrp(self):
    method dup2 (line 208) | def dup2(self, frm, to):
    method _exit (line 211) | def _exit(self, code):
    method execve (line 214) | def execve(self, filename, argv, environment):
    method drop_privileges (line 221) | def drop_privileges(self, uid):
    method readfd (line 226) | def readfd(self, fd):
    method reopenlogs (line 229) | def reopenlogs(self):
    method mktempfile (line 232) | def mktempfile(self, prefix, suffix, dir):
    method remove (line 235) | def remove(self, path):
    method exists (line 240) | def exists(self, path):
    method open (line 245) | def open(self, name, mode='r'):
    method chdir (line 250) | def chdir(self, dir):
    method setumask (line 255) | def setumask(self, mask):
  class DummyLogger (line 258) | class DummyLogger:
    method __init__ (line 261) | def __init__(self):
    method info (line 267) | def info(self, msg, **kw):
    method log (line 273) | def log(self, level, msg, **kw):
    method addHandler (line 278) | def addHandler(self, handler):
    method reopen (line 281) | def reopen(self):
    method close (line 283) | def close(self):
    method remove (line 285) | def remove(self):
    method flush (line 287) | def flush(self):
    method getvalue (line 289) | def getvalue(self):
  class DummySupervisor (line 292) | class DummySupervisor:
    method __init__ (line 293) | def __init__(self, options=None, state=None, process_groups=None):
    method get_state (line 308) | def get_state(self):
  class DummySocket (line 311) | class DummySocket:
    method __init__ (line 318) | def __init__(self, fd):
    method fileno (line 321) | def fileno(self):
    method bind (line 324) | def bind(self, addr):
    method listen (line 328) | def listen(self, backlog):
    method close (line 332) | def close(self):
    method __str__ (line 335) | def __str__(self):
  class DummySocketConfig (line 338) | class DummySocketConfig:
    method __init__ (line 339) | def __init__(self, fd, backlog=128):
    method addr (line 344) | def addr(self):
    method __eq__ (line 347) | def __eq__(self, other):
    method __ne__ (line 350) | def __ne__(self, other):
    method get_backlog (line 353) | def get_backlog(self):
    method create_and_bind (line 356) | def create_and_bind(self):
  class DummySocketManager (line 359) | class DummySocketManager:
    method __init__ (line 360) | def __init__(self, config, **kwargs):
    method config (line 363) | def config(self):
    method get_socket (line 366) | def get_socket(self):
  class DummyProcess (line 370) | class DummyProcess(object):
    method __init__ (line 397) | def __init__(self, config, state=None):
    method reopenlogs (line 426) | def reopenlogs(self):
    method removelogs (line 429) | def removelogs(self):
    method get_state (line 434) | def get_state(self):
    method stop (line 437) | def stop(self):
    method stop_report (line 443) | def stop_report(self):
    method kill (line 446) | def kill(self, signal):
    method signal (line 449) | def signal(self, signal):
    method spawn (line 453) | def spawn(self):
    method drain (line 458) | def drain(self):
    method readable_fds (line 461) | def readable_fds(self):
    method record_output (line 464) | def record_output(self):
    method finish (line 471) | def finish(self, pid, sts):
    method give_up (line 474) | def give_up(self):
    method get_execv_args (line 478) | def get_execv_args(self):
    method drain_output_fd (line 486) | def drain_output_fd(self, fd):
    method drain_input_fd (line 489) | def drain_input_fd(self, fd):
    method write (line 492) | def write(self, chars):
    method transition (line 497) | def transition(self):
    method __eq__ (line 500) | def __eq__(self, other):
    method __lt__ (line 503) | def __lt__(self, other):
  class DummyPConfig (line 506) | class DummyPConfig:
    method __init__ (line 507) | def __init__(self, options, name, command, directory=None, umask=None,
    method get_path (line 557) | def get_path(self):
    method create_autochildlogs (line 560) | def create_autochildlogs(self):
    method make_process (line 563) | def make_process(self, group=None):
    method make_dispatchers (line 568) | def make_dispatchers(self, proc):
  function makeExecutable (line 582) | def makeExecutable(file, substitutions=None):
  function makeSpew (line 602) | def makeSpew(unkillable=False):
  class DummyMedusaServerLogger (line 609) | class DummyMedusaServerLogger:
    method __init__ (line 610) | def __init__(self):
    method log (line 612) | def log(self, category, msg):
  class DummyMedusaServer (line 615) | class DummyMedusaServer:
    method __init__ (line 616) | def __init__(self):
  class DummyMedusaChannel (line 619) | class DummyMedusaChannel:
    method __init__ (line 620) | def __init__(self):
    method push_with_producer (line 624) | def push_with_producer(self, producer):
    method close_when_done (line 627) | def close_when_done(self):
    method set_terminator (line 630) | def set_terminator(self, terminator):
  class DummyRequest (line 633) | class DummyRequest(object):
    method __init__ (line 638) | def __init__(self, path, params, query, fragment, env=None):
    method split_uri (line 650) | def split_uri(self):
    method error (line 653) | def error(self, code):
    method push (line 656) | def push(self, producer):
    method __setitem__ (line 659) | def __setitem__(self, header, value):
    method __getitem__ (line 662) | def __getitem__(self, header):
    method __delitem__ (line 665) | def __delitem__(self, header):
    method has_key (line 668) | def has_key(self, header):
    method __contains__ (line 671) | def __contains__(self, item):
    method done (line 674) | def done(self):
    method build_reply_header (line 677) | def build_reply_header(self):
    method log (line 680) | def log(self, *arg, **kw):
    method cgi_environment (line 683) | def cgi_environment(self):
    method get_server_url (line 686) | def get_server_url(self):
  class DummyRPCInterfaceFactory (line 690) | class DummyRPCInterfaceFactory:
    method __init__ (line 691) | def __init__(self, supervisord, **config):
  class DummyRPCServer (line 695) | class DummyRPCServer:
    method __init__ (line 696) | def __init__(self):
  class DummySystemRPCNamespace (line 700) | class DummySystemRPCNamespace:
  class DummySupervisorRPCNamespace (line 703) | class DummySupervisorRPCNamespace:
    method getAPIVersion (line 750) | def getAPIVersion(self):
    method getPID (line 755) | def getPID(self):
    method _read_log (line 758) | def _read_log(self, channel, name, offset, length):
    method readProcessStdoutLog (line 769) | def readProcessStdoutLog(self, name, offset, length):
    method readProcessStderrLog (line 773) | def readProcessStderrLog(self, name, offset, length):
    method getAllProcessInfo (line 776) | def getAllProcessInfo(self):
    method getProcessInfo (line 779) | def getProcessInfo(self, name):
    method startProcess (line 792) | def startProcess(self, name):
    method startProcessGroup (line 811) | def startProcessGroup(self, name):
    method startAllProcesses (line 825) | def startAllProcesses(self):
    method stopProcessGroup (line 839) | def stopProcessGroup(self, name):
    method stopProcess (line 853) | def stopProcess(self, name):
    method stopAllProcesses (line 866) | def stopAllProcesses(self):
    method restart (line 879) | def restart(self):
    method shutdown (line 886) | def shutdown(self):
    method reloadConfig (line 893) | def reloadConfig(self):
    method addProcessGroup (line 896) | def addProcessGroup(self, name):
    method removeProcessGroup (line 911) | def removeProcessGroup(self, name):
    method clearProcessStdoutLog (line 921) | def clearProcessStdoutLog(self, name):
    method clearAllProcessLogs (line 931) | def clearAllProcessLogs(self):
    method raiseError (line 948) | def raiseError(self):
    method getXmlRpcUnmarshallable (line 951) | def getXmlRpcUnmarshallable(self):
    method getSupervisorVersion (line 954) | def getSupervisorVersion(self):
    method readLog (line 957) | def readLog(self, whence, offset):
    method signalProcessGroup (line 962) | def signalProcessGroup(self, name, signal):
    method signalProcess (line 977) | def signalProcess(self, name, signal):
    method signalAllProcesses (line 992) | def signalAllProcesses(self, signal):
  class DummyPGroupConfig (line 1009) | class DummyPGroupConfig:
    method __init__ (line 1010) | def __init__(self, options, name='whatever', priority=999, pconfigs=No...
    method after_setuid (line 1021) | def after_setuid(self):
    method make_group (line 1024) | def make_group(self):
    method __repr__ (line 1027) | def __repr__(self):
  class DummyFCGIGroupConfig (line 1031) | class DummyFCGIGroupConfig(DummyPGroupConfig):
    method __init__ (line 1032) | def __init__(self, options, name='whatever', priority=999, pconfigs=No...
  class DummyProcessGroup (line 1037) | class DummyProcessGroup(object):
    method __init__ (line 1038) | def __init__(self, config):
    method transition (line 1046) | def transition(self):
    method before_remove (line 1049) | def before_remove(self):
    method stop_all (line 1052) | def stop_all(self):
    method get_unstopped_processes (line 1055) | def get_unstopped_processes(self):
    method get_dispatchers (line 1058) | def get_dispatchers(self):
    method __lt__ (line 1061) | def __lt__(self, other):
    method __eq__ (line 1064) | def __eq__(self, other):
    method reopenlogs (line 1067) | def reopenlogs(self):
  class DummyFCGIProcessGroup (line 1070) | class DummyFCGIProcessGroup(DummyProcessGroup):
    method __init__ (line 1072) | def __init__(self, config):
  class PopulatedDummySupervisor (line 1076) | class PopulatedDummySupervisor(DummySupervisor):
    method __init__ (line 1077) | def __init__(self, options, group_name, *pconfigs):
    method set_procattr (line 1090) | def set_procattr(self, process_name, attr_name, val, group_name=None):
    method reap (line 1096) | def reap(self):
  class DummyDispatcher (line 1099) | class DummyDispatcher:
    method __init__ (line 1110) | def __init__(self, readable=False, writable=False, error=False):
    method readable (line 1124) | def readable(self):
    method writable (line 1126) | def writable(self):
    method handle_write_event (line 1128) | def handle_write_event(self):
    method handle_read_event (line 1132) | def handle_read_event(self):
    method handle_error (line 1136) | def handle_error(self):
    method close (line 1138) | def close(self):
    method flush (line 1140) | def flush(self):
  class DummyStream (line 1145) | class DummyStream:
    method __init__ (line 1146) | def __init__(self, error=None, fileno=20):
    method close (line 1152) | def close(self):
    method flush (line 1156) | def flush(self):
    method write (line 1160) | def write(self, msg):
    method seek (line 1166) | def seek(self, num, whence=0):
    method tell (line 1168) | def tell(self):
    method fileno (line 1170) | def fileno(self):
  class DummyEvent (line 1173) | class DummyEvent:
    method __init__ (line 1174) | def __init__(self, serial='abc'):
    method payload (line 1178) | def payload(self):
  class DummyPoller (line 1181) | class DummyPoller:
    method __init__ (line 1182) | def __init__(self, options):
    method register_readable (line 1186) | def register_readable(self, fd):
    method register_writable (line 1189) | def register_writable(self, fd):
    method poll (line 1192) | def poll(self, timeout):
    method close (line 1195) | def close(self):
  function dummy_handler (line 1198) | def dummy_handler(event, result):
  function rejecting_handler (line 1201) | def rejecting_handler(event, result):
  function exception_handler (line 1205) | def exception_handler(event, result):
  function lstrip (line 1208) | def lstrip(s):

FILE: supervisor/tests/fixtures/listener.py
  function write_and_flush (line 4) | def write_and_flush(stream, s):
  function write_stdout (line 8) | def write_stdout(s):
  function write_stderr (line 13) | def write_stderr(s):
  function main (line 17) | def main():

FILE: supervisor/tests/fixtures/test_1231.py
  function main (line 7) | def main():

FILE: supervisor/tests/test_childutils.py
  class ChildUtilsTests (line 8) | class ChildUtilsTests(unittest.TestCase):
    method test_getRPCInterface (line 9) | def test_getRPCInterface(self):
    method test_getRPCTransport_no_uname_pass (line 15) | def test_getRPCTransport_no_uname_pass(self):
    method test_getRPCTransport_with_uname_pass (line 22) | def test_getRPCTransport_with_uname_pass(self):
    method test_get_headers (line 32) | def test_get_headers(self):
    method test_eventdata (line 38) | def test_eventdata(self):
    method test_get_asctime (line 45) | def test_get_asctime(self):
  class TestProcessCommunicationsProtocol (line 51) | class TestProcessCommunicationsProtocol(unittest.TestCase):
    method test_send (line 52) | def test_send(self):
    method test_stdout (line 61) | def test_stdout(self):
    method test_stderr (line 74) | def test_stderr(self):
  class TestEventListenerProtocol (line 87) | class TestEventListenerProtocol(unittest.TestCase):
    method test_wait (line 88) | def test_wait(self):
    method test_token (line 102) | def test_token(self):
    method test_ok (line 110) | def test_ok(self):
    method test_fail (line 118) | def test_fail(self):
    method test_send (line 126) | def test_send(self):

FILE: supervisor/tests/test_confecho.py
  class TopLevelFunctionTests (line 7) | class TopLevelFunctionTests(unittest.TestCase):
    method test_main_writes_data_out_that_looks_like_a_config_file (line 8) | def test_main_writes_data_out_that_looks_like_a_config_file(self):

FILE: supervisor/tests/test_datatypes.py
  class ProcessOrGroupName (line 15) | class ProcessOrGroupName(unittest.TestCase):
    method _callFUT (line 16) | def _callFUT(self, arg):
    method test_strips_surrounding_whitespace (line 19) | def test_strips_surrounding_whitespace(self):
    method test_disallows_inner_spaces_for_eventlistener_protocol (line 23) | def test_disallows_inner_spaces_for_eventlistener_protocol(self):
    method test_disallows_colons_for_eventlistener_protocol (line 27) | def test_disallows_colons_for_eventlistener_protocol(self):
    method test_disallows_slashes_for_web_ui_urls (line 31) | def test_disallows_slashes_for_web_ui_urls(self):
  class IntegerTests (line 35) | class IntegerTests(unittest.TestCase):
    method _callFUT (line 36) | def _callFUT(self, arg):
    method test_converts_numeric (line 39) | def test_converts_numeric(self):
    method test_converts_numeric_overflowing_int (line 42) | def test_converts_numeric_overflowing_int(self):
    method test_raises_for_non_numeric (line 45) | def test_raises_for_non_numeric(self):
  class BooleanTests (line 48) | class BooleanTests(unittest.TestCase):
    method _callFUT (line 49) | def _callFUT(self, arg):
    method test_returns_true_for_truthy_values (line 52) | def test_returns_true_for_truthy_values(self):
    method test_returns_true_for_upper_truthy_values (line 56) | def test_returns_true_for_upper_truthy_values(self):
    method test_returns_false_for_falsy_values (line 60) | def test_returns_false_for_falsy_values(self):
    method test_returns_false_for_upper_falsy_values (line 64) | def test_returns_false_for_upper_falsy_values(self):
    method test_braises_value_error_for_bad_value (line 68) | def test_braises_value_error_for_bad_value(self):
  class ListOfStringsTests (line 72) | class ListOfStringsTests(unittest.TestCase):
    method _callFUT (line 73) | def _callFUT(self, arg):
    method test_returns_empty_list_for_empty_string (line 76) | def test_returns_empty_list_for_empty_string(self):
    method test_returns_list_of_strings_by_comma_split (line 79) | def test_returns_list_of_strings_by_comma_split(self):
    method test_returns_strings_with_whitespace_stripped (line 82) | def test_returns_strings_with_whitespace_stripped(self):
    method test_raises_value_error_when_comma_split_fails (line 85) | def test_raises_value_error_when_comma_split_fails(self):
  class ListOfIntsTests (line 89) | class ListOfIntsTests(unittest.TestCase):
    method _callFUT (line 90) | def _callFUT(self, arg):
    method test_returns_empty_list_for_empty_string (line 93) | def test_returns_empty_list_for_empty_string(self):
    method test_returns_list_of_ints_by_comma_split (line 96) | def test_returns_list_of_ints_by_comma_split(self):
    method test_returns_ints_even_if_whitespace_in_string (line 99) | def test_returns_ints_even_if_whitespace_in_string(self):
    method test_raises_value_error_when_comma_split_fails (line 102) | def test_raises_value_error_when_comma_split_fails(self):
    method test_raises_value_error_when_one_value_is_bad (line 106) | def test_raises_value_error_when_one_value_is_bad(self):
  class ListOfExitcodesTests (line 110) | class ListOfExitcodesTests(unittest.TestCase):
    method _callFUT (line 111) | def _callFUT(self, arg):
    method test_returns_list_of_ints_from_csv (line 114) | def test_returns_list_of_ints_from_csv(self):
    method test_returns_list_of_ints_from_one (line 117) | def test_returns_list_of_ints_from_one(self):
    method test_raises_for_invalid_exitcode_values (line 120) | def test_raises_for_invalid_exitcode_values(self):
  class DictOfKeyValuePairsTests (line 125) | class DictOfKeyValuePairsTests(unittest.TestCase):
    method _callFUT (line 126) | def _callFUT(self, arg):
    method test_returns_empty_dict_for_empty_str (line 129) | def test_returns_empty_dict_for_empty_str(self):
    method test_returns_dict_from_single_pair_str (line 133) | def test_returns_dict_from_single_pair_str(self):
    method test_returns_dict_from_multi_pair_str (line 138) | def test_returns_dict_from_multi_pair_str(self):
    method test_returns_dict_even_if_whitespace (line 143) | def test_returns_dict_even_if_whitespace(self):
    method test_returns_dict_even_if_newlines (line 148) | def test_returns_dict_even_if_newlines(self):
    method test_handles_commas_inside_apostrophes (line 153) | def test_handles_commas_inside_apostrophes(self):
    method test_handles_commas_inside_quotes (line 158) | def test_handles_commas_inside_quotes(self):
    method test_handles_newlines_inside_quotes (line 163) | def test_handles_newlines_inside_quotes(self):
    method test_handles_quotes_inside_quotes (line 168) | def test_handles_quotes_inside_quotes(self):
    method test_handles_empty_inside_quotes (line 178) | def test_handles_empty_inside_quotes(self):
    method test_handles_empty_inside_quotes_with_second_unquoted_pair (line 183) | def test_handles_empty_inside_quotes_with_second_unquoted_pair(self):
    method test_handles_unquoted_non_alphanum (line 188) | def test_handles_unquoted_non_alphanum(self):
    method test_allows_trailing_comma (line 196) | def test_allows_trailing_comma(self):
    method test_raises_value_error_on_too_short (line 201) | def test_raises_value_error_on_too_short(self):
    method test_raises_when_comma_is_missing (line 211) | def test_raises_when_comma_is_missing(self):
  class LogfileNameTests (line 216) | class LogfileNameTests(unittest.TestCase):
    method _callFUT (line 217) | def _callFUT(self, arg):
    method test_returns_none_for_none_values (line 220) | def test_returns_none_for_none_values(self):
    method test_returns_none_for_uppered_none_values (line 225) | def test_returns_none_for_uppered_none_values(self):
    method test_returns_automatic_for_auto_values (line 232) | def test_returns_automatic_for_auto_values(self):
    method test_returns_automatic_for_uppered_auto_values (line 237) | def test_returns_automatic_for_uppered_auto_values(self):
    method test_returns_syslog_for_syslog_values (line 244) | def test_returns_syslog_for_syslog_values(self):
    method test_returns_syslog_for_uppered_syslog_values (line 249) | def test_returns_syslog_for_uppered_syslog_values(self):
    method test_returns_existing_dirpath_for_other_values (line 256) | def test_returns_existing_dirpath_for_other_values(self):
  class RangeCheckedConversionTests (line 266) | class RangeCheckedConversionTests(unittest.TestCase):
    method _getTargetClass (line 267) | def _getTargetClass(self):
    method _makeOne (line 270) | def _makeOne(self, conversion, min=None, max=None):
    method test_below_lower_bound (line 273) | def test_below_lower_bound(self):
    method test_above_upper_lower_bound (line 277) | def test_above_upper_lower_bound(self):
    method test_passes (line 281) | def test_passes(self):
  class NameToGidTests (line 286) | class NameToGidTests(unittest.TestCase):
    method _callFUT (line 287) | def _callFUT(self, arg):
    method test_gets_gid_from_group_name (line 291) | def test_gets_gid_from_group_name(self):
    method test_gets_gid_from_group_id (line 296) | def test_gets_gid_from_group_id(self):
    method test_raises_for_bad_group_name (line 301) | def test_raises_for_bad_group_name(self):
    method test_raises_for_bad_group_id (line 305) | def test_raises_for_bad_group_id(self):
  class NameToUidTests (line 308) | class NameToUidTests(unittest.TestCase):
    method _callFUT (line 309) | def _callFUT(self, arg):
    method test_gets_uid_from_username (line 313) | def test_gets_uid_from_username(self):
    method test_gets_uid_from_user_id (line 318) | def test_gets_uid_from_user_id(self):
    method test_raises_for_bad_username (line 323) | def test_raises_for_bad_username(self):
    method test_raises_for_bad_user_id (line 327) | def test_raises_for_bad_user_id(self):
  class OctalTypeTests (line 330) | class OctalTypeTests(unittest.TestCase):
    method _callFUT (line 331) | def _callFUT(self, arg):
    method test_success (line 334) | def test_success(self):
    method test_raises_for_non_numeric (line 337) | def test_raises_for_non_numeric(self):
    method test_raises_for_unconvertable_numeric (line 345) | def test_raises_for_unconvertable_numeric(self):
  class ExistingDirectoryTests (line 353) | class ExistingDirectoryTests(unittest.TestCase):
    method _callFUT (line 354) | def _callFUT(self, arg):
    method test_dir_exists (line 357) | def test_dir_exists(self):
    method test_dir_does_not_exist (line 361) | def test_dir_does_not_exist(self):
    method test_not_a_directory (line 370) | def test_not_a_directory(self):
    method test_expands_home (line 379) | def test_expands_home(self):
  class ExistingDirpathTests (line 385) | class ExistingDirpathTests(unittest.TestCase):
    method _callFUT (line 386) | def _callFUT(self, arg):
    method test_returns_existing_dirpath (line 389) | def test_returns_existing_dirpath(self):
    method test_returns_dirpath_if_relative (line 392) | def test_returns_dirpath_if_relative(self):
    method test_raises_if_dir_does_not_exist (line 395) | def test_raises_if_dir_does_not_exist(self):
    method test_raises_if_exists_but_not_a_dir (line 405) | def test_raises_if_exists_but_not_a_dir(self):
    method test_expands_home (line 416) | def test_expands_home(self):
  class LoggingLevelTests (line 422) | class LoggingLevelTests(unittest.TestCase):
    method _callFUT (line 423) | def _callFUT(self, arg):
    method test_returns_level_from_name_case_insensitive (line 426) | def test_returns_level_from_name_case_insensitive(self):
    method test_raises_for_bad_level_name (line 430) | def test_raises_for_bad_level_name(self):
  class UrlTests (line 434) | class UrlTests(unittest.TestCase):
    method _callFUT (line 435) | def _callFUT(self, arg):
    method test_accepts_urlparse_recognized_scheme_with_netloc (line 438) | def test_accepts_urlparse_recognized_scheme_with_netloc(self):
    method test_rejects_urlparse_recognized_scheme_but_no_netloc (line 442) | def test_rejects_urlparse_recognized_scheme_but_no_netloc(self):
    method test_accepts_unix_scheme_with_path (line 446) | def test_accepts_unix_scheme_with_path(self):
    method test_rejects_unix_scheme_with_no_slashes_or_path (line 450) | def test_rejects_unix_scheme_with_no_slashes_or_path(self):
    method test_rejects_unix_scheme_with_slashes_but_no_path (line 454) | def test_rejects_unix_scheme_with_slashes_but_no_path(self):
  class InetStreamSocketConfigTests (line 458) | class InetStreamSocketConfigTests(unittest.TestCase):
    method _getTargetClass (line 459) | def _getTargetClass(self):
    method _makeOne (line 462) | def _makeOne(self, *args, **kw):
    method test_url (line 465) | def test_url(self):
    method test___str__ (line 469) | def test___str__(self):
    method test_repr (line 473) | def test_repr(self):
    method test_addr (line 479) | def test_addr(self):
    method test_port_as_string (line 484) | def test_port_as_string(self):
    method test_create_and_bind (line 489) | def test_create_and_bind(self):
    method test_same_urls_are_equal (line 497) | def test_same_urls_are_equal(self):
    method test_diff_urls_are_not_equal (line 503) | def test_diff_urls_are_not_equal(self):
    method test_diff_objs_are_not_equal (line 509) | def test_diff_objs_are_not_equal(self):
  class UnixStreamSocketConfigTests (line 515) | class UnixStreamSocketConfigTests(unittest.TestCase):
    method _getTargetClass (line 516) | def _getTargetClass(self):
    method _makeOne (line 519) | def _makeOne(self, *args, **kw):
    method test_url (line 522) | def test_url(self):
    method test___str__ (line 526) | def test___str__(self):
    method test_repr (line 530) | def test_repr(self):
    method test_get_addr (line 536) | def test_get_addr(self):
    method test_create_and_bind (line 541) | def test_create_and_bind(self):
    method test_create_and_bind_when_chown_fails (line 579) | def test_create_and_bind_when_chown_fails(self):
    method test_create_and_bind_when_chmod_fails (line 598) | def test_create_and_bind_when_chmod_fails(self):
    method test_same_paths_are_equal (line 617) | def test_same_paths_are_equal(self):
    method test_diff_paths_are_not_equal (line 623) | def test_diff_paths_are_not_equal(self):
    method test_diff_objs_are_not_equal (line 629) | def test_diff_objs_are_not_equal(self):
  class InetAddressTests (line 635) | class InetAddressTests(unittest.TestCase):
    method _callFUT (line 636) | def _callFUT(self, s):
    method test_no_port_number (line 639) | def test_no_port_number(self):
    method test_bad_port_number (line 642) | def test_bad_port_number(self):
    method test_default_host (line 645) | def test_default_host(self):
    method test_hostname_and_port (line 650) | def test_hostname_and_port(self):
    method test_ipv4_address_and_port (line 655) | def test_ipv4_address_and_port(self):
    method test_ipv6_address_and_port (line 660) | def test_ipv6_address_and_port(self):
  class SocketAddressTests (line 665) | class SocketAddressTests(unittest.TestCase):
    method _getTargetClass (line 666) | def _getTargetClass(self):
    method _makeOne (line 669) | def _makeOne(self, s):
    method test_unix_socket (line 672) | def test_unix_socket(self):
    method test_inet_socket (line 677) | def test_inet_socket(self):
  class ColonSeparatedUserGroupTests (line 682) | class ColonSeparatedUserGroupTests(unittest.TestCase):
    method _callFUT (line 683) | def _callFUT(self, arg):
    method test_ok_username (line 686) | def test_ok_username(self):
    method test_missinguser_username (line 689) | def test_missinguser_username(self):
    method test_missinguser_username_and_groupname (line 693) | def test_missinguser_username_and_groupname(self):
    method test_separated_user_group_returns_both (line 697) | def test_separated_user_group_returns_both(self):
    method test_separated_user_group_returns_user_only (line 712) | def test_separated_user_group_returns_user_only(self):
  class SignalNumberTests (line 724) | class SignalNumberTests(unittest.TestCase):
    method _callFUT (line 725) | def _callFUT(self, arg):
    method test_converts_number (line 728) | def test_converts_number(self):
    method test_converts_name (line 731) | def test_converts_name(self):
    method test_converts_signame (line 734) | def test_converts_signame(self):
    method test_raises_for_bad_number (line 737) | def test_raises_for_bad_number(self):
    method test_raises_for_bad_name (line 745) | def test_raises_for_bad_name(self):
  class AutoRestartTests (line 753) | class AutoRestartTests(unittest.TestCase):
    method _callFUT (line 754) | def _callFUT(self, arg):
    method test_converts_truthy (line 757) | def test_converts_truthy(self):
    method test_converts_falsy (line 762) | def test_converts_falsy(self):
    method test_converts_unexpected (line 766) | def test_converts_unexpected(self):
    method test_raises_for_bad_value (line 771) | def test_raises_for_bad_value(self):
  class ProfileOptionsTests (line 778) | class ProfileOptionsTests(unittest.TestCase):
    method _callFUT (line 779) | def _callFUT(self, arg):
    method test_empty (line 782) | def test_empty(self):
    method test_without_callers (line 787) | def test_without_callers(self):
    method test_with_callers (line 792) | def test_with_callers(self):

FILE: supervisor/tests/test_dispatchers.py
  class PDispatcherTests (line 12) | class PDispatcherTests(unittest.TestCase):
    method setUp (line 13) | def setUp(self):
    method tearDown (line 17) | def tearDown(self):
    method _getTargetClass (line 21) | def _getTargetClass(self):
    method _makeOne (line 25) | def _makeOne(self, process=None, channel='stdout', fd=0):
    method test_readable (line 28) | def test_readable(self):
    method test_writable (line 32) | def test_writable(self):
    method test_flush (line 36) | def test_flush(self):
  class POutputDispatcherTests (line 40) | class POutputDispatcherTests(unittest.TestCase):
    method setUp (line 41) | def setUp(self):
    method tearDown (line 45) | def tearDown(self):
    method _getTargetClass (line 49) | def _getTargetClass(self):
    method _makeOne (line 53) | def _makeOne(self, process, channel='stdout'):
    method test_writable (line 60) | def test_writable(self):
    method test_readable_open (line 67) | def test_readable_open(self):
    method test_readable_closed (line 75) | def test_readable_closed(self):
    method test_handle_write_event (line 83) | def test_handle_write_event(self):
    method test_handle_read_event (line 90) | def test_handle_read_event(self):
    method test_handle_read_event_no_data_closes (line 100) | def test_handle_read_event_no_data_closes(self):
    method test_handle_error (line 112) | def test_handle_error(self):
    method test_toggle_capturemode_sends_event (line 125) | def test_toggle_capturemode_sends_event(self):
    method test_removelogs (line 147) | def test_removelogs(self):
    method test_reopenlogs (line 159) | def test_reopenlogs(self):
    method test_record_output_log_non_capturemode (line 169) | def test_record_output_log_non_capturemode(self):
    method test_record_output_emits_stdout_event_when_enabled (line 186) | def test_record_output_emits_stdout_event_when_enabled(self):
    method test_record_output_does_not_emit_stdout_event_when_disabled (line 206) | def test_record_output_does_not_emit_stdout_event_when_disabled(self):
    method test_record_output_emits_stderr_event_when_enabled (line 223) | def test_record_output_emits_stderr_event_when_enabled(self):
    method test_record_output_does_not_emit_stderr_event_when_disabled (line 243) | def test_record_output_does_not_emit_stderr_event_when_disabled(self):
    method test_record_output_capturemode_string_longer_than_token (line 260) | def test_record_output_capturemode_string_longer_than_token(self):
    method test_record_output_capturemode_string_not_longer_than_token (line 279) | def test_record_output_capturemode_string_not_longer_than_token(self):
    method test_stdout_capturemode_single_buffer (line 294) | def test_stdout_capturemode_single_buffer(self):
    method test_stdout_capturemode_multiple_buffers (line 338) | def test_stdout_capturemode_multiple_buffers(self):
    method test_strip_ansi (line 408) | def test_strip_ansi(self):
    method test_ctor_no_logfiles (line 430) | def test_ctor_no_logfiles(self):
    method test_ctor_logfile_only (line 442) | def test_ctor_logfile_only(self):
    method test_ctor_capturelog_only (line 455) | def test_ctor_capturelog_only(self):
    method test_ctor_stdout_logfile_is_empty_string (line 468) | def test_ctor_stdout_logfile_is_empty_string(self):
    method test_ctor_stdout_logfile_none_and_stdout_syslog_false (line 480) | def test_ctor_stdout_logfile_none_and_stdout_syslog_false(self):
    method test_ctor_stdout_logfile_none_and_stdout_syslog_true (line 493) | def test_ctor_stdout_logfile_none_and_stdout_syslog_true(self):
    method test_ctor_stdout_logfile_str_and_stdout_syslog_false (line 511) | def test_ctor_stdout_logfile_str_and_stdout_syslog_false(self):
    method test_ctor_stdout_logfile_str_and_stdout_syslog_true (line 529) | def test_ctor_stdout_logfile_str_and_stdout_syslog_true(self):
    method test_repr (line 550) | def test_repr(self):
    method test_close (line 562) | def test_close(self):
  class PInputDispatcherTests (line 573) | class PInputDispatcherTests(unittest.TestCase):
    method _getTargetClass (line 574) | def _getTargetClass(self):
    method _makeOne (line 578) | def _makeOne(self, process):
    method test_writable_open_nodata (line 582) | def test_writable_open_nodata(self):
    method test_writable_open_withdata (line 589) | def test_writable_open_withdata(self):
    method test_writable_closed_nodata (line 596) | def test_writable_closed_nodata(self):
    method test_writable_closed_withdata (line 603) | def test_writable_closed_withdata(self):
    method test_readable (line 610) | def test_readable(self):
    method test_handle_write_event (line 615) | def test_handle_write_event(self):
    method test_handle_write_event_nodata (line 624) | def test_handle_write_event_nodata(self):
    method test_handle_write_event_epipe_raised (line 634) | def test_handle_write_event_epipe_raised(self):
    method test_handle_write_event_uncaught_raised (line 649) | def test_handle_write_event_uncaught_raised(self):
    method test_handle_write_event_over_os_limit (line 660) | def test_handle_write_event_over_os_limit(self):
    method test_handle_read_event (line 671) | def test_handle_read_event(self):
    method test_handle_error (line 676) | def test_handle_error(self):
    method test_repr (line 689) | def test_repr(self):
    method test_close (line 701) | def test_close(self):
  class PEventListenerDispatcherTests (line 711) | class PEventListenerDispatcherTests(unittest.TestCase):
    method setUp (line 712) | def setUp(self):
    method tearDown (line 716) | def tearDown(self):
    method _getTargetClass (line 720) | def _getTargetClass(self):
    method _makeOne (line 724) | def _makeOne(self, process):
    method test_writable (line 728) | def test_writable(self):
    method test_readable_open (line 735) | def test_readable_open(self):
    method test_readable_closed (line 743) | def test_readable_closed(self):
    method test_handle_write_event (line 751) | def test_handle_write_event(self):
    method test_handle_read_event_calls_handle_listener_state_change (line 758) | def test_handle_read_event_calls_handle_listener_state_change(self):
    method test_handle_read_event_nodata (line 774) | def test_handle_read_event_nodata(self):
    method test_handle_read_event_logging_nologs (line 786) | def test_handle_read_event_logging_nologs(self):
    method test_handle_read_event_logging_childlog (line 797) | def test_handle_read_event_logging_childlog(self):
    method test_handle_listener_state_change_from_unknown (line 809) | def test_handle_listener_state_change_from_unknown(self):
    method test_handle_listener_state_change_acknowledged_to_ready (line 822) | def test_handle_listener_state_change_acknowledged_to_ready(self):
    method test_handle_listener_state_change_acknowledged_gobbles (line 836) | def test_handle_listener_state_change_acknowledged_gobbles(self):
    method test_handle_listener_state_change_acknowledged_to_insufficient (line 852) | def test_handle_listener_state_change_acknowledged_to_insufficient(self):
    method test_handle_listener_state_change_acknowledged_to_unknown (line 866) | def test_handle_listener_state_change_acknowledged_to_unknown(self):
    method test_handle_listener_state_change_ready_to_unknown (line 884) | def test_handle_listener_state_change_ready_to_unknown(self):
    method test_handle_listener_state_change_busy_to_insufficient (line 902) | def test_handle_listener_state_change_busy_to_insufficient(self):
    method test_handle_listener_state_change_busy_to_acknowledged_procd (line 914) | def test_handle_listener_state_change_busy_to_acknowledged_procd(self):
    method test_handle_listener_state_change_busy_to_acknowledged_rejected (line 937) | def test_handle_listener_state_change_busy_to_acknowledged_rejected(se...
    method test_handle_listener_state_change_busy_to_unknown (line 960) | def test_handle_listener_state_change_busy_to_unknown(self):
    method test_handle_listener_state_busy_gobbles (line 991) | def test_handle_listener_state_busy_gobbles(self):
    method test_handle_result_accept (line 1020) | def test_handle_result_accept(self):
    method test_handle_result_rejectevent (line 1049) | def test_handle_result_rejectevent(self):
    method test_handle_result_exception (line 1080) | def test_handle_result_exception(self):
    method test_handle_error (line 1115) | def test_handle_error(self):
    method test_removelogs (line 1128) | def test_removelogs(self):
    method test_reopenlogs (line 1138) | def test_reopenlogs(self):
    method test_strip_ansi (line 1147) | def test_strip_ansi(self):
    method test_ctor_nologfiles (line 1169) | def test_ctor_nologfiles(self):
    method test_ctor_logfile_only (line 1179) | def test_ctor_logfile_only(self):
    method test_repr (line 1190) | def test_repr(self):
    method test_close (line 1202) | def test_close(self):
  class stripEscapeTests (line 1213) | class stripEscapeTests(unittest.TestCase):
    method _callFUT (line 1214) | def _callFUT(self, s):
    method test_zero_length_string (line 1218) | def test_zero_length_string(self):
    method test_ansi (line 1221) | def test_ansi(self):
    method test_noansi (line 1226) | def test_noansi(self):

FILE: supervisor/tests/test_end_to_end.py
  class EndToEndTests (line 20) | class EndToEndTests(BaseTestCase):
    method test_issue_291a_percent_signs_in_original_env_are_preserved (line 22) | def test_issue_291a_percent_signs_in_original_env_are_preserved(self):
    method test_issue_550 (line 38) | def test_issue_550(self):
    method test_issue_565 (line 54) | def test_issue_565(self):
    method test_issue_638 (line 71) | def test_issue_638(self):
    method test_issue_663 (line 90) | def test_issue_663(self):
    method test_issue_664 (line 101) | def test_issue_664(self):
    method test_issue_733 (line 121) | def test_issue_733(self):
    method test_issue_835 (line 132) | def test_issue_835(self):
    method test_issue_836 (line 148) | def test_issue_836(self):
    method test_issue_986_command_string_with_double_percent (line 169) | def test_issue_986_command_string_with_double_percent(self):
    method test_issue_1054 (line 178) | def test_issue_1054(self):
    method test_issue_1170a (line 195) | def test_issue_1170a(self):
    method test_issue_1170b (line 205) | def test_issue_1170b(self):
    method test_issue_1170c (line 216) | def test_issue_1170c(self):
    method test_issue_1224 (line 227) | def test_issue_1224(self):
    method test_issue_1231a (line 238) | def test_issue_1231a(self):
    method test_issue_1231b (line 255) | def test_issue_1231b(self):
    method test_issue_1231c (line 289) | def test_issue_1231c(self):
    method test_issue_1251 (line 313) | def test_issue_1251(self):
    method test_issue_1298 (line 330) | def test_issue_1298(self):
    method test_issue_1418_pidproxy_cmd_with_no_args (line 347) | def test_issue_1418_pidproxy_cmd_with_no_args(self):
    method test_issue_1418_pidproxy_cmd_with_args (line 356) | def test_issue_1418_pidproxy_cmd_with_args(self):
    method test_issue_1483a_identifier_default (line 365) | def test_issue_1483a_identifier_default(self):
    method test_issue_1483b_identifier_from_config_file (line 384) | def test_issue_1483b_identifier_from_config_file(self):
    method test_issue_1483c_identifier_from_command_line (line 403) | def test_issue_1483c_identifier_from_command_line(self):
    method test_pull_request_1578_echo_supervisord_conf (line 422) | def test_pull_request_1578_echo_supervisord_conf(self):
    method test_issue_1596_asyncore_close_does_not_crash (line 430) | def test_issue_1596_asyncore_close_does_not_crash(self):

FILE: supervisor/tests/test_events.py
  class EventSubscriptionNotificationTests (line 8) | class EventSubscriptionNotificationTests(unittest.TestCase):
    method setUp (line 9) | def setUp(self):
    method tearDown (line 13) | def tearDown(self):
    method test_subscribe (line 17) | def test_subscribe(self):
    method test_unsubscribe (line 22) | def test_unsubscribe(self):
    method test_clear (line 28) | def test_clear(self):
    method test_notify_true (line 34) | def test_notify_true(self):
    method test_notify_false (line 43) | def test_notify_false(self):
    method test_notify_via_subclass (line 54) | def test_notify_via_subclass(self):
  class TestEventTypes (line 66) | class TestEventTypes(unittest.TestCase):
    method test_ProcessLogEvent_attributes (line 67) | def test_ProcessLogEvent_attributes(self):
    method test_ProcessLogEvent_inheritance (line 74) | def test_ProcessLogEvent_inheritance(self):
    method test_ProcessLogStdoutEvent_attributes (line 81) | def test_ProcessLogStdoutEvent_attributes(self):
    method test_ProcessLogStdoutEvent_inheritance (line 89) | def test_ProcessLogStdoutEvent_inheritance(self):
    method test_ProcessLogStderrEvent_attributes (line 96) | def test_ProcessLogStderrEvent_attributes(self):
    method test_ProcessLogStderrEvent_inheritance (line 104) | def test_ProcessLogStderrEvent_inheritance(self):
    method test_ProcessCommunicationEvent_attributes (line 111) | def test_ProcessCommunicationEvent_attributes(self):
    method test_ProcessCommunicationEvent_inheritance (line 118) | def test_ProcessCommunicationEvent_inheritance(self):
    method test_ProcessCommunicationStdoutEvent_attributes (line 125) | def test_ProcessCommunicationStdoutEvent_attributes(self):
    method test_ProcessCommunicationStdoutEvent_inheritance (line 133) | def test_ProcessCommunicationStdoutEvent_inheritance(self):
    method test_ProcessCommunicationStderrEvent_attributes (line 141) | def test_ProcessCommunicationStderrEvent_attributes(self):
    method test_ProcessCommunicationStderrEvent_inheritance (line 149) | def test_ProcessCommunicationStderrEvent_inheritance(self):
    method test_RemoteCommunicationEvent_attributes (line 157) | def test_RemoteCommunicationEvent_attributes(self):
    method test_RemoteCommunicationEvent_inheritance (line 163) | def test_RemoteCommunicationEvent_inheritance(self):
    method test_EventRejectedEvent_attributes (line 170) | def test_EventRejectedEvent_attributes(self):
    method test_EventRejectedEvent_does_not_inherit_from_event (line 180) | def test_EventRejectedEvent_does_not_inherit_from_event(self):
    method test_all_SupervisorStateChangeEvents (line 187) | def test_all_SupervisorStateChangeEvents(self):
    method _test_one_SupervisorStateChangeEvent (line 196) | def _test_one_SupervisorStateChangeEvent(self, klass):
    method test_all_ProcessStateEvents (line 200) | def test_all_ProcessStateEvents(self):
    method _test_one_ProcessStateEvent (line 215) | def _test_one_ProcessStateEvent(self, klass):
    method test_all_TickEvents (line 227) | def test_all_TickEvents(self):
    method _test_one_TickEvent (line 237) | def _test_one_TickEvent(self, klass):
    method test_ProcessGroupAddedEvent_attributes (line 245) | def test_ProcessGroupAddedEvent_attributes(self):
    method test_ProcessGroupRemovedEvent_attributes (line 250) | def test_ProcessGroupRemovedEvent_attributes(self):
  class TestSerializations (line 255) | class TestSerializations(unittest.TestCase):
    method _deserialize (line 256) | def _deserialize(self, serialization):
    method test_plog_stdout_event (line 272) | def test_plog_stdout_event(self):
    method test_plog_stderr_event (line 287) | def test_plog_stderr_event(self):
    method test_pcomm_stdout_event (line 302) | def test_pcomm_stdout_event(self):
    method test_pcomm_stderr_event (line 317) | def test_pcomm_stderr_event(self):
    method test_remote_comm_event (line 332) | def test_remote_comm_event(self):
    method test_process_group_added_event (line 339) | def test_process_group_added_event(self):
    method test_process_group_removed_event (line 346) | def test_process_group_removed_event(self):
    method test_process_state_events_without_extra_values (line 353) | def test_process_state_events_without_extra_values(self):
    method test_process_state_events_with_pid (line 375) | def test_process_state_events_with_pid(self):
    method test_process_state_events_starting_and_backoff (line 400) | def test_process_state_events_starting_and_backoff(self):
    method test_process_state_exited_event_expected (line 431) | def test_process_state_exited_event_expected(self):
    method test_process_state_exited_event_unexpected (line 453) | def test_process_state_exited_event_unexpected(self):
    method test_supervisor_sc_event (line 475) | def test_supervisor_sc_event(self):
    method test_tick_events (line 482) | def test_tick_events(self):
  class TestUtilityFunctions (line 494) | class TestUtilityFunctions(unittest.TestCase):
    method test_getEventNameByType (line 495) | def test_getEventNameByType(self):
    method test_register (line 500) | def test_register(self):

FILE: supervisor/tests/test_http.py
  class HandlerTests (line 22) | class HandlerTests:
    method _makeOne (line 23) | def _makeOne(self, supervisord):
    method test_match (line 26) | def test_match(self):
  class LogtailHandlerTests (line 34) | class LogtailHandlerTests(HandlerTests, unittest.TestCase):
    method _getTargetClass (line 35) | def _getTargetClass(self):
    method test_handle_request_stdout_logfile_none (line 39) | def test_handle_request_stdout_logfile_none(self):
    method test_handle_request_stdout_logfile_missing (line 49) | def test_handle_request_stdout_logfile_missing(self):
    method test_handle_request (line 58) | def test_handle_request(self):
  class MainLogTailHandlerTests (line 76) | class MainLogTailHandlerTests(HandlerTests, unittest.TestCase):
    method _getTargetClass (line 77) | def _getTargetClass(self):
    method test_handle_request_stdout_logfile_none (line 81) | def test_handle_request_stdout_logfile_none(self):
    method test_handle_request_stdout_logfile_missing (line 88) | def test_handle_request_stdout_logfile_missing(self):
    method test_handle_request (line 96) | def test_handle_request(self):
  class TailFProducerTests (line 113) | class TailFProducerTests(unittest.TestCase):
    method _getTargetClass (line 114) | def _getTargetClass(self):
    method _makeOne (line 118) | def _makeOne(self, request, filename, head):
    method test_handle_more (line 121) | def test_handle_more(self):
    method test_handle_more_fd_closed (line 141) | def test_handle_more_fd_closed(self):
    method test_handle_more_follow_file_recreated (line 151) | def test_handle_more_follow_file_recreated(self):
    method test_handle_more_follow_file_gone (line 169) | def test_handle_more_follow_file_gone(self):
  class DeferringChunkedProducerTests (line 188) | class DeferringChunkedProducerTests(unittest.TestCase):
    method _getTargetClass (line 189) | def _getTargetClass(self):
    method _makeOne (line 193) | def _makeOne(self, producer, footers=None):
    method test_more_not_done_yet (line 196) | def test_more_not_done_yet(self):
    method test_more_string (line 201) | def test_more_string(self):
    method test_more_nodata (line 206) | def test_more_nodata(self):
    method test_more_nodata_footers (line 211) | def test_more_nodata_footers(self):
    method test_more_nodata_nofooters (line 216) | def test_more_nodata_nofooters(self):
    method test_more_noproducer (line 221) | def test_more_noproducer(self):
  class DeferringCompositeProducerTests (line 225) | class DeferringCompositeProducerTests(unittest.TestCase):
    method _getTargetClass (line 226) | def _getTargetClass(self):
    method _makeOne (line 230) | def _makeOne(self, producers):
    method test_more_not_done_yet (line 233) | def test_more_not_done_yet(self):
    method test_more_string (line 238) | def test_more_string(self):
    method test_more_nodata (line 246) | def test_more_nodata(self):
  class DeferringGlobbingProducerTests (line 251) | class DeferringGlobbingProducerTests(unittest.TestCase):
    method _getTargetClass (line 252) | def _getTargetClass(self):
    method _makeOne (line 256) | def _makeOne(self, producer, buffer_size=1<<16):
    method test_more_not_done_yet (line 259) | def test_more_not_done_yet(self):
    method test_more_string (line 264) | def test_more_string(self):
    method test_more_nodata (line 273) | def test_more_nodata(self):
  class DeferringHookedProducerTests (line 278) | class DeferringHookedProducerTests(unittest.TestCase):
    method _getTargetClass (line 279) | def _getTargetClass(self):
    method _makeOne (line 283) | def _makeOne(self, producer, function):
    method test_more_not_done_yet (line 286) | def test_more_not_done_yet(self):
    method test_more_string (line 291) | def test_more_string(self):
    method test_more_nodata (line 302) | def test_more_nodata(self):
    method test_more_noproducer (line 311) | def test_more_noproducer(self):
  class DeferringHttpRequestTests (line 315) | class DeferringHttpRequestTests(unittest.TestCase):
    method _getTargetClass (line 316) | def _getTargetClass(self):
    method _makeOne (line 320) | def _makeOne(
    method _makeChannel (line 333) | def _makeChannel(self):
    method test_done_http_10_nokeepalive (line 342) | def test_done_http_10_nokeepalive(self):
    method test_done_http_10_keepalive_no_content_length (line 348) | def test_done_http_10_keepalive_no_content_length(self):
    method test_done_http_10_keepalive_and_content_length (line 359) | def test_done_http_10_keepalive_and_content_length(self):
    method test_done_http_11_connection_close (line 371) | def test_done_http_11_connection_close(self):
    method test_done_http_11_unknown_transfer_encoding (line 381) | def test_done_http_11_unknown_transfer_encoding(self):
    method test_done_http_11_chunked_transfer_encoding (line 391) | def test_done_http_11_chunked_transfer_encoding(self):
    method test_done_http_11_use_chunked (line 401) | def test_done_http_11_use_chunked(self):
    method test_done_http_11_wo_content_length_no_te_no_use_chunked_close (line 412) | def test_done_http_11_wo_content_length_no_te_no_use_chunked_close(self):
    method test_done_http_09 (line 422) | def test_done_http_09(self):
  class DeferringHttpChannelTests (line 431) | class DeferringHttpChannelTests(unittest.TestCase):
    method _getTargetClass (line 432) | def _getTargetClass(self):
    method _makeOne (line 436) | def _makeOne(self):
    method test_defaults_delay_and_last_writable_check_time (line 443) | def test_defaults_delay_and_last_writable_check_time(self):
    method test_writable_with_delay_is_False_if_elapsed_lt_delay (line 448) | def test_writable_with_delay_is_False_if_elapsed_lt_delay(self):
    method test_writable_with_delay_is_False_if_elapsed_eq_delay (line 456) | def test_writable_with_delay_is_False_if_elapsed_eq_delay(self):
    method test_writable_with_delay_is_True_if_elapsed_gt_delay (line 464) | def test_writable_with_delay_is_True_if_elapsed_gt_delay(self):
    method test_writable_with_delay_is_True_if_system_time_goes_backwards (line 472) | def test_writable_with_delay_is_True_if_system_time_goes_backwards(self):
  class EncryptedDictionaryAuthorizedTests (line 482) | class EncryptedDictionaryAuthorizedTests(unittest.TestCase):
    method _getTargetClass (line 483) | def _getTargetClass(self):
    method _makeOne (line 487) | def _makeOne(self, dict):
    method test_authorize_baduser (line 490) | def test_authorize_baduser(self):
    method test_authorize_gooduser_badpassword (line 494) | def test_authorize_gooduser_badpassword(self):
    method test_authorize_gooduser_goodpassword (line 498) | def test_authorize_gooduser_goodpassword(self):
    method test_authorize_gooduser_goodpassword_with_colon (line 502) | def test_authorize_gooduser_goodpassword_with_colon(self):
    method test_authorize_gooduser_badpassword_sha (line 506) | def test_authorize_gooduser_badpassword_sha(self):
    method test_authorize_gooduser_goodpassword_sha (line 511) | def test_authorize_gooduser_goodpassword_sha(self):
  class SupervisorAuthHandlerTests (line 516) | class SupervisorAuthHandlerTests(unittest.TestCase):
    method _getTargetClass (line 517) | def _getTargetClass(self):
    method _makeOne (line 521) | def _makeOne(self, dict, handler):
    method test_ctor (line 524) | def test_ctor(self):
    method test_handle_request_authorizes_good_credentials (line 530) | def test_handle_request_authorizes_good_credentials(self):
    method test_handle_request_authorizes_good_password_with_colon (line 539) | def test_handle_request_authorizes_good_password_with_colon(self):
    method test_handle_request_does_not_authorize_bad_credentials (line 549) | def test_handle_request_does_not_authorize_bad_credentials(self):
  class LogWrapperTests (line 558) | class LogWrapperTests(unittest.TestCase):
    method _getTargetClass (line 559) | def _getTargetClass(self):
    method _makeOne (line 563) | def _makeOne(self, logger):
    method test_strips_trailing_newlines_from_msgs (line 566) | def test_strips_trailing_newlines_from_msgs(self):
    method test_logs_msgs_with_error_at_error_level (line 574) | def test_logs_msgs_with_error_at_error_level(self):
    method test_logs_other_messages_at_trace_level (line 583) | def test_logs_other_messages_at_trace_level(self):
  class TopLevelFunctionTests (line 592) | class TopLevelFunctionTests(unittest.TestCase):
    method _make_http_servers (line 593) | def _make_http_servers(self, sconfigs):
    method test_make_http_servers_socket_type_error (line 611) | def test_make_http_servers_socket_type_error(self):
    method test_make_http_servers_noauth (line 621) | def test_make_http_servers_noauth(self):
    method test_make_http_servers_withauth (line 651) | def test_make_http_servers_withauth(self):
  class DummyHandler (line 670) | class DummyHandler:
    method __init__ (line 671) | def __init__(self):
    method handle_request (line 674) | def handle_request(self, request):
  class DummyProducer (line 677) | class DummyProducer:
    method __init__ (line 678) | def __init__(self, *data):
    method more (line 681) | def more(self):

FILE: supervisor/tests/test_http_client.py
  class ListenerTests (line 8) | class ListenerTests(unittest.TestCase):
    method _getTargetClass (line 9) | def _getTargetClass(self):
    method _makeOne (line 13) | def _makeOne(self):
    method test_status (line 16) | def test_status(self):
    method test_error (line 20) | def test_error(self):
    method test_response_header (line 31) | def test_response_header(self):
    method test_done (line 35) | def test_done(self):
    method test_feed (line 39) | def test_feed(self):
    method test_close (line 50) | def test_close(self):
  class HTTPHandlerTests (line 54) | class HTTPHandlerTests(unittest.TestCase):
    method _getTargetClass (line 55) | def _getTargetClass(self):
    method _makeOne (line 59) | def _makeOne(self, listener=None, username='', password=None):
    method _makeListener (line 70) | def _makeListener(self):
    method test_get_url_not_None (line 74) | def test_get_url_not_None(self):
    method test_get_bad_scheme (line 79) | def test_get_bad_scheme(self):
    method test_get_implied_port_80 (line 88) | def test_get_implied_port_80(self):
    method test_get_explicit_port (line 99) | def test_get_explicit_port(self):
    method test_get_explicit_unix_domain_socket (line 110) | def test_get_explicit_unix_domain_socket(self):
    method test_close (line 120) | def test_close(self):
    method test_header (line 132) | def test_header(self):
    method test_handle_error_already_handled (line 140) | def test_handle_error_already_handled(self):
    method test_handle_error (line 145) | def test_handle_error(self):
    method test_handle_connect_no_password (line 159) | def test_handle_connect_no_password(self):
    method test_handle_connect_with_password (line 183) | def test_handle_connect_with_password(self):
    method test_feed (line 211) | def test_feed(self):
    method test_collect_incoming_data_part_is_body (line 216) | def test_collect_incoming_data_part_is_body(self):
    method test_collect_incoming_data_part_is_not_body (line 224) | def test_collect_incoming_data_part_is_not_body(self):
    method test_found_terminator (line 232) | def test_found_terminator(self):
    method test_ignore (line 241) | def test_ignore(self):
    method test_status_line_not_startswith_http (line 247) | def test_status_line_not_startswith_http(self):
    method test_status_line_200 (line 252) | def test_status_line_200(self):
    method test_status_line_not_200 (line 261) | def test_status_line_not_200(self):
    method test_headers_empty_line_nonchunked (line 277) | def test_headers_empty_line_nonchunked(self):
    method test_headers_empty_line_chunked (line 288) | def test_headers_empty_line_chunked(self):
    method test_headers_nonempty_line_no_name_no_value (line 295) | def test_headers_nonempty_line_no_name_no_value(self):
    method test_headers_nonempty_line_transfer_encoding (line 300) | def test_headers_nonempty_line_transfer_encoding(self):
    method test_headers_nonempty_line_content_length (line 309) | def test_headers_nonempty_line_content_length(self):
    method test_headers_nonempty_line_arbitrary (line 318) | def test_headers_nonempty_line_arbitrary(self):
    method test_response_header (line 326) | def test_response_header(self):
    method test_body (line 332) | def test_body(self):
    method test_done (line 340) | def test_done(self):
    method test_chunked_size_empty_line (line 345) | def test_chunked_size_empty_line(self):
    method test_chunked_size_zero_size (line 352) | def test_chunked_size_zero_size(self):
    method test_chunked_size_nonzero_size (line 360) | def test_chunked_size_nonzero_size(self):
    method test_chunked_body (line 371) | def test_chunked_body(self):
    method test_trailer_line_not_crlf (line 384) | def test_trailer_line_not_crlf(self):
    method test_trailer_line_crlf (line 389) | def test_trailer_line_crlf(self):
  class DummyListener (line 401) | class DummyListener(object):
    method __init__ (line 406) | def __init__(self):
    method close (line 409) | def close(self, url):
    method error (line 412) | def error(self, url, msg):
    method feed (line 416) | def feed(self, url, data):
    method status (line 419) | def status(self, url, int):
    method response_header (line 423) | def response_header(self, url, name, value):
    method done (line 427) | def done(self, url):
  class DummySocket (line 430) | class DummySocket(object):
    method close (line 432) | def close(self):

FILE: supervisor/tests/test_loggers.py
  class LevelTests (line 18) | class LevelTests(unittest.TestCase):
    method test_LOG_LEVELS_BY_NUM_doesnt_include_builtins (line 19) | def test_LOG_LEVELS_BY_NUM_doesnt_include_builtins(self):
  class HandlerTests (line 24) | class HandlerTests:
    method setUp (line 25) | def setUp(self):
    method tearDown (line 29) | def tearDown(self):
    method _makeOne (line 35) | def _makeOne(self, *arg, **kw):
    method _makeLogRecord (line 39) | def _makeLogRecord(self, msg):
  class BareHandlerTests (line 48) | class BareHandlerTests(HandlerTests, unittest.TestCase):
    method _getTargetClass (line 49) | def _getTargetClass(self):
    method test_flush_stream_flush_raises_IOError_EPIPE (line 53) | def test_flush_stream_flush_raises_IOError_EPIPE(self):
    method test_flush_stream_flush_raises_IOError_not_EPIPE (line 58) | def test_flush_stream_flush_raises_IOError_not_EPIPE(self):
    method test_close_already_closed (line 63) | def test_close_already_closed(self):
    method test_close_stream_fileno_above_3 (line 69) | def test_close_stream_fileno_above_3(self):
    method test_close_stream_fileno_below_3 (line 76) | def test_close_stream_fileno_below_3(self):
    method test_close_stream_handles_fileno_unsupported_operation (line 83) | def test_close_stream_handles_fileno_unsupported_operation(self):
    method test_close_stream_handles_fileno_ioerror (line 91) | def test_close_stream_handles_fileno_ioerror(self):
    method test_emit_gardenpath (line 100) | def test_emit_gardenpath(self):
    method test_emit_unicode_error (line 108) | def test_emit_unicode_error(self):
    method test_emit_other_error (line 116) | def test_emit_other_error(self):
  class FileHandlerTests (line 126) | class FileHandlerTests(HandlerTests, unittest.TestCase):
    method _getTargetClass (line 127) | def _getTargetClass(self):
    method test_ctor (line 131) | def test_ctor(self):
    method test_close (line 139) | def test_close(self):
    method test_close_raises (line 146) | def test_close_raises(self):
    method test_reopen (line 153) | def test_reopen(self):
    method test_reopen_raises (line 163) | def test_reopen_raises(self):
    method test_remove_exists (line 172) | def test_remove_exists(self):
    method test_remove_doesntexist (line 178) | def test_remove_doesntexist(self):
    method test_remove_raises (line 185) | def test_remove_raises(self):
    method test_emit_ascii_noerror (line 192) | def test_emit_ascii_noerror(self):
    method test_emit_unicode_noerror (line 200) | def test_emit_unicode_noerror(self):
    method test_emit_error (line 208) | def test_emit_error(self):
  class StdoutTests (line 230) | class StdoutTests(StdoutTestsBase):
    method test_ctor_with_dev_stdout (line 231) | def test_ctor_with_dev_stdout(self):
  class RotatingFileHandlerTests (line 240) | class RotatingFileHandlerTests(FileHandlerTests):
    method _getTargetClass (line 242) | def _getTargetClass(self):
    method test_ctor (line 246) | def test_ctor(self):
    method test_emit_does_rollover (line 253) | def test_emit_does_rollover(self):
    method test_current_logfile_removed (line 295) | def test_current_logfile_removed(self):
    method test_removeAndRename_destination_does_not_exist (line 312) | def test_removeAndRename_destination_does_not_exist(self):
    method test_removeAndRename_destination_exists (line 324) | def test_removeAndRename_destination_exists(self):
    method test_removeAndRename_remove_raises_ENOENT (line 336) | def test_removeAndRename_remove_raises_ENOENT(self):
    method test_removeAndRename_remove_raises_other_than_ENOENT (line 348) | def test_removeAndRename_remove_raises_other_than_ENOENT(self):
    method test_removeAndRename_rename_raises_ENOENT (line 357) | def test_removeAndRename_rename_raises_ENOENT(self):
    method test_removeAndRename_rename_raises_other_than_ENOENT (line 366) | def test_removeAndRename_rename_raises_other_than_ENOENT(self):
    method test_doRollover_maxbytes_lte_zero (line 375) | def test_doRollover_maxbytes_lte_zero(self):
  class BoundIOTests (line 382) | class BoundIOTests(unittest.TestCase):
    method _getTargetClass (line 383) | def _getTargetClass(self):
    method _makeOne (line 387) | def _makeOne(self, maxbytes, buf=''):
    method test_write_overflow (line 391) | def test_write_overflow(self):
    method test_getvalue (line 396) | def test_getvalue(self):
    method test_clear (line 400) | def test_clear(self):
    method test_close (line 405) | def test_close(self):
  class LoggerTests (line 410) | class LoggerTests(unittest.TestCase):
    method _getTargetClass (line 411) | def _getTargetClass(self):
    method _makeOne (line 415) | def _makeOne(self, level=None, handlers=None):
    method test_blather (line 419) | def test_blather(self):
    method test_trace (line 429) | def test_trace(self):
    method test_debug (line 439) | def test_debug(self):
    method test_info (line 449) | def test_info(self):
    method test_warn (line 459) | def test_warn(self):
    method test_error (line 469) | def test_error(self):
    method test_critical (line 479) | def test_critical(self):
    method test_close (line 486) | def test_close(self):
    method test_getvalue (line 493) | def test_getvalue(self):
  class MockSysLog (line 500) | class MockSysLog(mock.Mock):
    method __call__ (line 501) | def __call__(self, *args, **kwargs):
  class SyslogHandlerTests (line 510) | class SyslogHandlerTests(HandlerTests, unittest.TestCase):
    method setUp (line 511) | def setUp(self):
    method tearDown (line 514) | def tearDown(self):
    method _getTargetClass (line 517) | def _getTargetClass(self):
    method _makeOne (line 520) | def _makeOne(self):
    method test_emit_record_asdict_raises (line 523) | def test_emit_record_asdict_raises(self):
    method test_emit_ascii_noerror (line 536) | def test_emit_ascii_noerror(self):
    method test_close (line 546) | def test_close(self):
    method test_reopen (line 551) | def test_reopen(self):
    method test_emit_unicode_noerror (line 557) | def test_emit_unicode_noerror(self):
    method test_emit_unicode_witherror (line 563) | def test_emit_unicode_witherror(self):
    method test_emit_unicode_noerror (line 576) | def test_emit_unicode_noerror(self):
    method test_emit_unicode_witherror (line 581) | def test_emit_unicode_witherror(self):
  class DummyHandler (line 593) | class DummyHandler:
    method __init__ (line 595) | def __init__(self, level):
    method emit (line 598) | def emit(self, record):
    method close (line 600) | def close(self):

FILE: supervisor/tests/test_options.py
  class OptionTests (line 29) | class OptionTests(unittest.TestCase):
    method _getTargetClass (line 31) | def _getTargetClass(self):
    method _makeOptions (line 35) | def _makeOptions(self, read_error=False):
    method test_add_flag_not_None_handler_not_None (line 63) | def test_add_flag_not_None_handler_not_None(self):
    method test_add_flag_not_None_long_false_short_false (line 68) | def test_add_flag_not_None_long_false_short_false(self):
    method test_add_flag_not_None_short_endswith_colon (line 79) | def test_add_flag_not_None_short_endswith_colon(self):
    method test_add_flag_not_None_long_endswith_equal (line 90) | def test_add_flag_not_None_long_endswith_equal(self):
    method test_add_inconsistent_short_long_options (line 101) | def test_add_inconsistent_short_long_options(self):
    method test_add_short_option_startswith_dash (line 111) | def test_add_short_option_startswith_dash(self):
    method test_add_short_option_too_long (line 121) | def test_add_short_option_too_long(self):
    method test_add_duplicate_short_option_key (line 131) | def test_add_duplicate_short_option_key(self):
    method test_add_long_option_startswith_dash (line 142) | def test_add_long_option_startswith_dash(self):
    method test_add_duplicate_long_option_key (line 152) | def test_add_duplicate_long_option_key(self):
    method test_searchpaths (line 163) | def test_searchpaths(self):
    method test_options_and_args_order (line 173) | def test_options_and_args_order(self):
    method test_config_reload (line 192) | def test_config_reload(self):
    method test_config_reload_do_usage_false (line 200) | def test_config_reload_do_usage_false(self):
    method test_config_reload_do_usage_true (line 205) | def test_config_reload_do_usage_true(self):
    method test__set (line 215) | def test__set(self):
    method test_missing_default_config (line 230) | def test_missing_default_config(self):
    method test_default_config (line 241) | def test_default_config(self):
    method test_help (line 248) | def test_help(self):
  class ClientOptionsTests (line 260) | class ClientOptionsTests(unittest.TestCase):
    method _getTargetClass (line 261) | def _getTargetClass(self):
    method _makeOne (line 265) | def _makeOne(self):
    method test_no_config_file (line 268) | def test_no_config_file(self):
    method test_options (line 284) | def test_options(self):
    method test_options_ignores_space_prefixed_inline_comments (line 308) | def test_options_ignores_space_prefixed_inline_comments(self):
    method test_options_ignores_tab_prefixed_inline_comments (line 319) | def test_options_ignores_tab_prefixed_inline_comments(self):
    method test_options_parses_as_nonstrict_for_py2_py3_compat (line 330) | def test_options_parses_as_nonstrict_for_py2_py3_compat(self):
    method test_options_with_environment_expansions (line 343) | def test_options_with_environment_expansions(self):
    method test_options_supervisorctl_section_expands_here (line 373) | def test_options_supervisorctl_section_expands_here(self):
    method test_read_config_not_found (line 395) | def test_read_config_not_found(self):
    method test_read_config_unreadable (line 404) | def test_read_config_unreadable(self):
    method test_read_config_no_supervisord_section_raises_valueerror (line 416) | def test_read_config_no_supervisord_section_raises_valueerror(self):
    method test_options_unixsocket_cli (line 425) | def test_options_unixsocket_cli(self):
    method test_options_unixsocket_configfile (line 432) | def test_options_unixsocket_configfile(self):
  class ServerOptionsTests (line 442) | class ServerOptionsTests(unittest.TestCase):
    method _getTargetClass (line 443) | def _getTargetClass(self):
    method _makeOne (line 447) | def _makeOne(self):
    method test_version (line 450) | def test_version(self):
    method test_options (line 457) | def test_options(self):
    method test_options_ignores_space_prefixed_inline_comments (line 711) | def test_options_ignores_space_prefixed_inline_comments(self):
    method test_options_ignores_tab_prefixed_inline_comments (line 724) | def test_options_ignores_tab_prefixed_inline_comments(self):
    method test_options_parses_as_nonstrict_for_py2_py3_compat (line 736) | def test_options_parses_as_nonstrict_for_py2_py3_compat(self):
    method test_reload (line 751) | def test_reload(self):
    method test_reload_clears_parse_messages (line 819) | def test_reload_clears_parse_messages(self):
    method test_reload_clears_parse_infos (line 839) | def test_reload_clears_parse_infos(self):
    method test_read_config_not_found (line 855) | def test_read_config_not_found(self):
    method test_read_config_unreadable (line 864) | def test_read_config_unreadable(self):
    method test_read_config_malformed_config_file_raises_valueerror (line 876) | def test_read_config_malformed_config_file_raises_valueerror(self):
    method test_read_config_logfile_with_nonexistent_dirpath (line 889) | def test_read_config_logfile_with_nonexistent_dirpath(self):
    method test_read_config_no_supervisord_section_raises_valueerror (line 908) | def test_read_config_no_supervisord_section_raises_valueerror(self):
    method test_read_config_include_with_no_files_raises_valueerror (line 917) | def test_read_config_include_with_no_files_raises_valueerror(self):
    method test_read_config_include_with_no_matching_files_logs_warning (line 932) | def test_read_config_include_with_no_matching_files_logs_warning(self):
    method test_read_config_include_reads_extra_files (line 944) | def test_read_config_include_reads_extra_files(self):
    method test_read_config_include_reads_files_in_sorted_order (line 979) | def test_read_config_include_reads_files_in_sorted_order(self):
    method test_read_config_include_extra_file_malformed (line 1014) | def test_read_config_include_extra_file_malformed(self):
    method test_read_config_include_expands_host_node_name (line 1045) | def test_read_config_include_expands_host_node_name(self):
    method test_read_config_include_expands_here (line 1074) | def test_read_config_include_expands_here(self):
    method test_readFile_failed (line 1087) | def test_readFile_failed(self):
    method test_get_pid (line 1096) | def test_get_pid(self):
    method test_get_signal_delegates_to_signal_receiver (line 1100) | def test_get_signal_delegates_to_signal_receiver(self):
    method test_check_execv_args_cant_find_command (line 1108) | def test_check_execv_args_cant_find_command(self):
    method test_check_execv_args_notexecutable (line 1114) | def test_check_execv_args_notexecutable(self):
    method test_check_execv_args_isdir (line 1121) | def test_check_execv_args_isdir(self):
    method test_realize_positional_args_not_supported (line 1128) | def test_realize_positional_args_not_supported(self):
    method test_realize_getopt_error (line 1143) | def test_realize_getopt_error(self):
    method test_realize_prefers_identifier_from_args (line 1156) | def test_realize_prefers_identifier_from_args(self):
    method test_options_afunix (line 1166) | def test_options_afunix(self):
    method test_options_afunix_chxxx_values_valid (line 1190) | def test_options_afunix_chxxx_values_valid(self):
    method test_options_afunix_chmod_bad (line 1214) | def test_options_afunix_chmod_bad(self):
    method test_options_afunix_chown_bad (line 1231) | def test_options_afunix_chown_bad(self):
    method test_options_afunix_no_file (line 1248) | def test_options_afunix_no_file(self):
    method test_options_afunix_username_without_password (line 1264) | def test_options_afunix_username_without_password(self):
    method test_options_afunix_password_without_username (line 1286) | def test_options_afunix_password_without_username(self):
    method test_options_afunix_file_expands_here (line 1308) | def test_options_afunix_file_expands_here(self):
    method test_options_afinet_username_without_password (line 1332) | def test_options_afinet_username_without_password(self):
    method test_options_afinet_password_without_username (line 1354) | def test_options_afinet_password_without_username(self):
    method test_options_afinet_no_port (line 1374) | def test_options_afinet_no_port(self):
    method test_cleanup_afunix_unlink (line 1390) | def test_cleanup_afunix_unlink(self):
    method test_cleanup_afunix_nounlink (line 1404) | def test_cleanup_afunix_nounlink(self):
    method test_cleanup_afunix_ignores_oserror_enoent (line 1424) | def test_cleanup_afunix_ignores_oserror_enoent(self):
    method test_cleanup_removes_pidfile (line 1447) | def test_cleanup_removes_pidfile(self):
    method test_cleanup_pidfile_ignores_oserror_enoent (line 1465) | def test_cleanup_pidfile_ignores_oserror_enoent(self):
    method test_cleanup_does_not_remove_pidfile_from_another_supervisord (line 1471) | def test_cleanup_does_not_remove_pidfile_from_another_supervisord(self):
    method test_cleanup_closes_poller (line 1491) | def test_cleanup_closes_poller(self):
    method test_cleanup_fds_closes_5_upto_minfds (line 1511) | def test_cleanup_fds_closes_5_upto_minfds(self):
    method test_close_httpservers (line 1520) | def test_close_httpservers(self):
    method test_close_logger (line 1531) | def test_close_logger(self):
    method test_close_parent_pipes (line 1538) | def test_close_parent_pipes(self):
    method test_close_parent_pipes_ignores_fd_of_none (line 1549) | def test_close_parent_pipes_ignores_fd_of_none(self):
    method test_close_child_pipes (line 1559) | def test_close_child_pipes(self):
    method test_close_child_pipes_ignores_fd_of_none (line 1570) | def test_close_child_pipes_ignores_fd_of_none(self):
    method test_reopenlogs (line 1580) | def test_reopenlogs(self):
    method test_write_pidfile_ok (line 1589) | def test_write_pidfile_ok(self):
    method test_write_pidfile_fail (line 1612) | def test_write_pidfile_fail(self):
    method test_close_fd (line 1622) | def test_close_fd(self):
    method test_close_fd_ignores_oserror (line 1633) | def test_close_fd_ignores_oserror(self):
    method test_processes_from_section (line 1637) | def test_processes_from_section(self):
    method test_processes_from_section_environment_with_escaped_chars (line 1687) | def test_processes_from_section_environment_with_escaped_chars(self):
    method test_processes_from_section_host_node_name_expansion (line 1701) | def test_processes_from_section_host_node_name_expansion(self):
    method test_processes_from_section_process_num_expansion (line 1714) | def test_processes_from_section_process_num_expansion(self):
    method test_processes_from_section_numprocs_expansion (line 1741) | def test_processes_from_section_numprocs_expansion(self):
    method test_processes_from_section_expands_directory (line 1758) | def test_processes_from_section_expands_directory(self):
    method test_processes_from_section_environment_variables_expansion (line 1772) | def test_processes_from_section_environment_variables_expansion(self):
    method test_processes_from_section_expands_env_in_environment (line 1785) | def test_processes_from_section_expands_env_in_environment(self):
    method test_processes_from_section_redirect_stderr_with_filename (line 1799) | def test_processes_from_section_redirect_stderr_with_filename(self):
    method test_processes_from_section_rewrites_stdout_logfile_of_syslog (line 1816) | def test_processes_from_section_rewrites_stdout_logfile_of_syslog(self):
    method test_processes_from_section_rewrites_stderr_logfile_of_syslog (line 1834) | def test_processes_from_section_rewrites_stderr_logfile_of_syslog(self):
    method test_processes_from_section_redirect_stderr_with_auto (line 1852) | def test_processes_from_section_redirect_stderr_with_auto(self):
    method test_processes_from_section_accepts_number_for_stopsignal (line 1867) | def test_processes_from_section_accepts_number_for_stopsignal(self):
    method test_options_with_environment_expansions (line 1881) | def test_options_with_environment_expansions(self):
    method test_options_supervisord_section_expands_here (line 2015) | def test_options_supervisord_section_expands_here(self):
    method test_options_program_section_expands_env_from_supervisord_sect (line 2042) | def test_options_program_section_expands_env_from_supervisord_sect(self):
    method test_options_program_section_expands_env_from_program_sect (line 2067) | def test_options_program_section_expands_env_from_program_sect(self):
    method test_options_program_section_expands_here (line 2093) | def test_options_program_section_expands_here(self):
    method test_options_eventlistener_section_expands_here (line 2132) | def test_options_eventlistener_section_expands_here(self):
    method test_options_expands_combined_expansions (line 2172) | def test_options_expands_combined_expansions(self):
    method test_options_error_handler_shows_main_filename (line 2209) | def test_options_error_handler_shows_main_filename(self):
    method test_options_error_handler_shows_included_filename (line 2235) | def test_options_error_handler_shows_included_filename(self):
    method test_processes_from_section_bad_program_name_spaces (line 2271) | def test_processes_from_section_bad_program_name_spaces(self):
    method test_processes_from_section_bad_program_name_colons (line 2282) | def test_processes_from_section_bad_program_name_colons(self):
    method test_processes_from_section_no_procnum_in_processname (line 2293) | def test_processes_from_section_no_procnum_in_processname(self):
    method test_processes_from_section_no_command (line 2306) | def test_processes_from_section_no_command(self):
    method test_processes_from_section_missing_replacement_in_process_name (line 2321) | def test_processes_from_section_missing_replacement_in_process_name(se...
    method test_processes_from_section_bad_expression_in_process_name (line 2334) | def test_processes_from_section_bad_expression_in_process_name(self):
    method test_processes_from_section_bad_chars_in_process_name (line 2347) | def test_processes_from_section_bad_chars_in_process_name(self):
    method test_processes_from_section_stopasgroup_implies_killasgroup (line 2360) | def test_processes_from_section_stopasgroup_implies_killasgroup(self):
    method test_processes_from_section_killasgroup_mismatch_w_stopasgroup (line 2377) | def test_processes_from_section_killasgroup_mismatch_w_stopasgroup(self):
    method test_processes_from_section_unexpected_end_of_key_value_pairs (line 2392) | def test_processes_from_section_unexpected_end_of_key_value_pairs(self):
    method test_processes_from_section_shows_conf_filename_on_valueerror (line 2413) | def test_processes_from_section_shows_conf_filename_on_valueerror(self):
    method test_processes_from_section_autolog_without_rollover (line 2434) | def test_processes_from_section_autolog_without_rollover(self):
    method test_homogeneous_process_groups_from_parser (line 2458) | def test_homogeneous_process_groups_from_parser(self):
    method test_event_listener_pools_from_parser (line 2477) | def test_event_listener_pools_from_parser(self):
    method test_event_listener_pools_from_parser_with_environment_expansions (line 2523) | def test_event_listener_pools_from_parser_with_environment_expansions(...
    method test_event_listener_pool_disallows_buffer_size_zero (line 2575) | def test_event_listener_pool_disallows_buffer_size_zero(self):
    method test_event_listener_pool_disallows_redirect_stderr (line 2593) | def test_event_listener_pool_disallows_redirect_stderr(self):
    method test_event_listener_pool_with_event_result_handler (line 2612) | def test_event_listener_pool_with_event_result_handler(self):
    method test_event_listener_pool_result_handler_unimportable_ImportError (line 2630) | def test_event_listener_pool_result_handler_unimportable_ImportError(s...
    method test_event_listener_pool_result_handler_unimportable_AttributeError (line 2658) | def test_event_listener_pool_result_handler_unimportable_AttributeErro...
    method test_event_listener_pool_noeventsline (line 2686) | def test_event_listener_pool_noeventsline(self):
    method test_event_listener_pool_unknown_eventtype (line 2700) | def test_event_listener_pool_unknown_eventtype(self):
    method test_fcgi_programs_from_parser (line 2715) | def test_fcgi_programs_from_parser(self):
    method test_fcgi_programs_from_parser_with_environment_expansions (line 2804) | def test_fcgi_programs_from_parser_with_environment_expansions(self):
    method test_fcgi_program_no_socket (line 2868) | def test_fcgi_program_no_socket(self):
    method test_fcgi_program_unknown_socket_protocol (line 2882) | def test_fcgi_program_unknown_socket_protocol(self):
    method test_fcgi_program_rel_unix_sock_path (line 2897) | def test_fcgi_program_rel_unix_sock_path(self):
    method test_fcgi_program_bad_tcp_sock_format (line 2912) | def test_fcgi_program_bad_tcp_sock_format(self):
    method test_fcgi_program_bad_expansion_proc_num (line 2927) | def test_fcgi_program_bad_expansion_proc_num(self):
    method test_fcgi_program_socket_owner_set_for_tcp (line 2942) | def test_fcgi_program_socket_owner_set_for_tcp(self):
    method test_fcgi_program_socket_mode_set_for_tcp (line 2955) | def test_fcgi_program_socket_mode_set_for_tcp(self):
    method test_fcgi_program_bad_socket_owner (line 2968) | def test_fcgi_program_bad_socket_owner(self):
    method test_fcgi_program_bad_socket_mode (line 2981) | def test_fcgi_program_bad_socket_mode(self):
    method test_fcgi_program_bad_socket_backlog (line 2994) | def test_fcgi_program_bad_socket_backlog(self):
    method test_heterogeneous_process_groups_from_parser (line 3007) | def test_heterogeneous_process_groups_from_parser(self):
    method test_mixed_process_groups_from_parser1 (line 3030) | def test_mixed_process_groups_from_parser1(self):
    method test_mixed_process_groups_from_parser2 (line 3065) | def test_mixed_process_groups_from_parser2(self):
    method test_mixed_process_groups_from_parser3 (line 3095) | def test_mixed_process_groups_from_parser3(self):
    method test_ambiguous_process_in_heterogeneous_group (line 3131) | def test_ambiguous_process_in_heterogeneous_group(self):
    method test_unknown_program_in_heterogeneous_group (line 3148) | def test_unknown_program_in_heterogeneous_group(self):
    method test_rpcinterfaces_from_parser (line 3163) | def test_rpcinterfaces_from_parser(self):
    method test_rpcinterfaces_from_parser_factory_expansions (line 3183) | def test_rpcinterfaces_from_parser_factory_expansions(self):
    method test_rpcinterfaces_from_parser_factory_missing (line 3203) | def test_rpcinterfaces_from_parser_factory_missing(self):
    method test_rpcinterfaces_from_parser_factory_not_importable (line 3221) | def test_rpcinterfaces_from_parser_factory_not_importable(self):
    method test_clear_autochildlogdir (line 3247) | def test_clear_autochildlogdir(self):
    method test_clear_autochildlogdir_listdir_oserror (line 3268) | def test_clear_autochildlogdir_listdir_oserror(self):
    method test_clear_autochildlogdir_unlink_oserror (line 3275) | def test_clear_autochildlogdir_unlink_oserror(self):
    method test_openhttpservers_reports_friendly_usage_when_eaddrinuse (line 3291) | def test_openhttpservers_reports_friendly_usage_when_eaddrinuse(self):
    method test_openhttpservers_reports_socket_error_with_errno (line 3309) | def test_openhttpservers_reports_socket_error_with_errno(self):
    method test_openhttpservers_reports_other_socket_errors (line 3328) | def test_openhttpservers_reports_other_socket_errors(self):
    method test_openhttpservers_reports_value_errors (line 3347) | def test_openhttpservers_reports_value_errors(self):
    method test_openhttpservers_does_not_catch_other_exception_types (line 3365) | def test_openhttpservers_does_not_catch_other_exception_types(self):
    method test_drop_privileges_user_none (line 3378) | def test_drop_privileges_user_none(self):
    method test_drop_privileges_nonroot_same_user (line 3385) | def test_drop_privileges_nonroot_same_user(self):
    method test_drop_privileges_nonroot_different_user (line 3392) | def test_drop_privileges_nonroot_different_user(self):
    method test_daemonize_notifies_poller_before_and_after_fork (line 3397) | def test_daemonize_notifies_poller_before_and_after_fork(self):
    method test_options_environment_of_supervisord_with_escaped_chars (line 3405) | def test_options_environment_of_supervisord_with_escaped_chars(self):
  class ProcessConfigTests (line 3418) | class ProcessConfigTests(unittest.TestCase):
    method _getTargetClass (line 3419) | def _getTargetClass(self):
    method _makeOne (line 3423) | def _makeOne(self, *arg, **kw):
    method test_get_path_env_is_None_delegates_to_options (line 3442) | def test_get_path_env_is_None_delegates_to_options(self):
    method test_get_path_env_dict_with_no_PATH_delegates_to_options (line 3447) | def test_get_path_env_dict_with_no_PATH_delegates_to_options(self):
    method test_get_path_env_dict_with_PATH_uses_it (line 3452) | def test_get_path_env_dict_with_PATH_uses_it(self):
    method test_create_autochildlogs (line 3458) | def test_create_autochildlogs(self):
    method test_make_process (line 3468) | def test_make_process(self):
    method test_make_process_with_group (line 3476) | def test_make_process_with_group(self):
    method test_make_dispatchers_stderr_not_redirected (line 3484) | def test_make_dispatchers_stderr_not_redirected(self):
    method test_make_dispatchers_stderr_redirected (line 3505) | def test_make_dispatchers_stderr_redirected(self):
  class EventListenerConfigTests (line 3516) | class EventListenerConfigTests(unittest.TestCase):
    method _getTargetClass (line 3517) | def _getTargetClass(self):
    method _makeOne (line 3521) | def _makeOne(self, *arg, **kw):
    method test_make_dispatchers (line 3540) | def test_make_dispatchers(self):
  class FastCGIProcessConfigTests (line 3564) | class FastCGIProcessConfigTests(unittest.TestCase):
    method _getTargetClass (line 3565) | def _getTargetClass(self):
    method _makeOne (line 3569) | def _makeOne(self, *arg, **kw):
    method test_make_process (line 3588) | def test_make_process(self):
    method test_make_process_with_group (line 3593) | def test_make_process_with_group(self):
    method test_make_dispatchers (line 3601) | def test_make_dispatchers(self):
  class ProcessGroupConfigTests (line 3624) | class ProcessGroupConfigTests(unittest.TestCase):
    method _getTargetClass (line 3625) | def _getTargetClass(self):
    method _makeOne (line 3629) | def _makeOne(self, options, name, priority, pconfigs):
    method test_ctor (line 3632) | def test_ctor(self):
    method test_after_setuid (line 3640) | def test_after_setuid(self):
    method test_make_group (line 3647) | def test_make_group(self):
  class EventListenerPoolConfigTests (line 3655) | class EventListenerPoolConfigTests(unittest.TestCase):
    method _getTargetClass (line 3656) | def _getTargetClass(self):
    method _makeOne (line 3660) | def _makeOne(self, options, name, priority, process_configs, buffer_size,
    method test_after_setuid (line 3666) | def test_after_setuid(self):
    method test_make_group (line 3673) | def test_make_group(self):
  class FastCGIGroupConfigTests (line 3681) | class FastCGIGroupConfigTests(unittest.TestCase):
    method _getTargetClass (line 3682) | def _getTargetClass(self):
    method _makeOne (line 3686) | def _makeOne(self, *args, **kw):
    method test_ctor (line 3689) | def test_ctor(self):
    method test_same_sockets_are_equal (line 3699) | def test_same_sockets_are_equal(self):
    method test_diff_sockets_are_not_equal (line 3710) | def test_diff_sockets_are_not_equal(self):
    method test_make_group (line 3721) | def test_make_group(self):
  class SignalReceiverTests (line 3729) | class SignalReceiverTests(unittest.TestCase):
    method test_returns_None_initially (line 3730) | def test_returns_None_initially(self):
    method test_returns_signals_in_order_received (line 3735) | def test_returns_signals_in_order_received(self):
    method test_does_not_queue_duplicate_signals (line 3744) | def test_does_not_queue_duplicate_signals(self):
    method test_queues_again_after_being_emptied (line 3752) | def test_queues_again_after_being_emptied(self):
  class UnhosedConfigParserTests (line 3762) | class UnhosedConfigParserTests(unittest.TestCase):
    method _getTargetClass (line 3763) | def _getTargetClass(self):
    method _makeOne (line 3767) | def _makeOne(self, *args, **kw):
    method test_saneget_no_default (line 3770) | def test_saneget_no_default(self):
    method test_saneget_with_default (line 3777) | def test_saneget_with_default(self):
    method test_saneget_with_default_and_expand (line 3783) | def test_saneget_with_default_and_expand(self):
    method test_saneget_with_default_no_expand (line 3790) | def test_saneget_with_default_no_expand(self):
    method test_saneget_no_default_no_expand (line 3798) | def test_saneget_no_default_no_expand(self):
    method test_saneget_expands_instance_expansions (line 3804) | def test_saneget_expands_instance_expansions(self):
    method test_saneget_expands_arg_expansions (line 3811) | def test_saneget_expands_arg_expansions(self):
    method test_getdefault_does_saneget_with_mysection (line 3819) | def test_getdefault_does_saneget_with_mysection(self):
    method test_read_filenames_as_string (line 3824) | def test_read_filenames_as_string(self):
    method test_read_filenames_as_list (line 3832) | def test_read_filenames_as_list(self):
    method test_read_returns_ok_filenames_like_rawconfigparser (line 3840) | def test_read_returns_ok_filenames_like_rawconfigparser(self):
    method test_read_section_to_file_initially_empty (line 3849) | def test_read_section_to_file_initially_empty(self):
    method test_read_section_to_file_read_one_file (line 3853) | def test_read_section_to_file_read_one_file(self):
    method test_read_section_to_file_read_multiple_files (line 3861) | def test_read_section_to_file_read_multiple_files(self):
  class UtilFunctionsTests (line 3873) | class UtilFunctionsTests(unittest.TestCase):
    method test_make_namespec (line 3874) | def test_make_namespec(self):
    method test_split_namespec (line 3879) | def test_split_namespec(self):

FILE: supervisor/tests/test_pidproxy.py
  class PidProxyTests (line 4) | class PidProxyTests(unittest.TestCase):
    method _getTargetClass (line 5) | def _getTargetClass(self):
    method _makeOne (line 9) | def _makeOne(self, *arg, **kw):
    method test_ctor_parses_args (line 12) | def test_ctor_parses_args(self):

FILE: supervisor/tests/test_poller.py
  class BasePollerTests (line 15) | class BasePollerTests(unittest.TestCase):
    method _makeOne (line 16) | def _makeOne(self, options):
    method test_register_readable (line 20) | def test_register_readable(self):
    method test_register_writable (line 24) | def test_register_writable(self):
    method test_unregister_readable (line 28) | def test_unregister_readable(self):
    method test_unregister_writable (line 32) | def test_unregister_writable(self):
    method test_poll (line 36) | def test_poll(self):
    method test_before_daemonize (line 40) | def test_before_daemonize(self):
    method test_after_daemonize (line 44) | def test_after_daemonize(self):
  class SelectPollerTests (line 48) | class SelectPollerTests(unittest.TestCase):
    method _makeOne (line 50) | def _makeOne(self, options):
    method test_register_readable (line 53) | def test_register_readable(self):
    method test_register_writable (line 59) | def test_register_writable(self):
    method test_unregister_readable (line 65) | def test_unregister_readable(self):
    method test_unregister_writable (line 77) | def test_unregister_writable(self):
    method test_poll_returns_readables_and_writables (line 89) | def test_poll_returns_readables_and_writables(self):
    method test_poll_ignores_eintr (line 101) | def test_poll_ignores_eintr(self):
    method test_poll_ignores_ebadf (line 110) | def test_poll_ignores_ebadf(self):
    method test_poll_uncaught_exception (line 121) | def test_poll_uncaught_exception(self):
  class KQueuePollerTests (line 134) | class KQueuePollerTests(KQueuePollerTestsBase):
    method _makeOne (line 136) | def _makeOne(self, options):
    method test_register_readable (line 139) | def test_register_readable(self):
    method test_register_writable (line 148) | def test_register_writable(self):
    method test_unregister_readable (line 157) | def test_unregister_readable(self):
    method test_unregister_writable (line 173) | def test_unregister_writable(self):
    method test_poll_returns_readables_and_writables (line 189) | def test_poll_returns_readables_and_writables(self):
    method test_poll_ignores_eintr (line 202) | def test_poll_ignores_eintr(self):
    method test_register_readable_and_writable_ignores_ebadf (line 211) | def test_register_readable_and_writable_ignores_ebadf(self):
    method test_register_uncaught_exception (line 223) | def test_register_uncaught_exception(self):
    method test_poll_uncaught_exception (line 230) | def test_poll_uncaught_exception(self):
    method test_before_daemonize_closes_kqueue (line 238) | def test_before_daemonize_closes_kqueue(self):
    method test_after_daemonize_restores_kqueue (line 247) | def test_after_daemonize_restores_kqueue(self):
    method test_close_closes_kqueue (line 259) | def test_close_closes_kqueue(self):
    method assertReadEventAdded (line 268) | def assertReadEventAdded(self, kevent, fd):
    method assertWriteEventAdded (line 271) | def assertWriteEventAdded(self, kevent, fd):
    method assertReadEventDeleted (line 274) | def assertReadEventDeleted(self, kevent, fd):
    method assertWriteEventDeleted (line 277) | def assertWriteEventDeleted(self, kevent, fd):
    method assertKevent (line 280) | def assertKevent(self, kevent, ident, filter, flags):
  class PollerPollTests (line 290) | class PollerPollTests(PollerPollTestsBase):
    method _makeOne (line 292) | def _makeOne(self, options):
    method test_register_readable (line 295) | def test_register_readable(self):
    method test_register_writable (line 303) | def test_register_writable(self):
    method test_poll_returns_readables_and_writables (line 310) | def test_poll_returns_readables_and_writables(self):
    method test_poll_ignores_eintr (line 325) | def test_poll_ignores_eintr(self):
    method test_poll_uncaught_exception (line 334) | def test_poll_uncaught_exception(self):
    method test_poll_ignores_and_unregisters_closed_fd (line 342) | def test_poll_ignores_and_unregisters_closed_fd(self):
  class DummySelect (line 353) | class DummySelect(object):
    method __init__ (line 357) | def __init__(self, result=None, error=None):
    method select (line 363) | def select(self, r, w, x, timeout):
  class DummySelectPoll (line 368) | class DummySelectPoll(object):
    method __init__ (line 372) | def __init__(self, result=None, error=None):
    method register (line 379) | def register(self, fd, eventmask):
    method unregister (line 387) | def unregister(self, fd):
    method poll (line 390) | def poll(self, timeout):
  class DummyKQueue (line 396) | class DummyKQueue(object):
    method __init__ (line 400) | def __init__(self, result=None, raise_errno_poll=None, raise_errno_reg...
    method control (line 407) | def control(self, kevents, max_events, timeout=None):
    method raise_error (line 417) | def raise_error(self, err):
    method build_result (line 423) | def build_result(self):
    method assert_max_events_on_poll (line 426) | def assert_max_events_on_poll(self, max_events):
    method assert_max_events_on_register (line 431) | def assert_max_events_on_register(self, max_events):
  class FakeKEvent (line 435) | class FakeKEvent(object):
    method __init__ (line 436) | def __init__(self, ident, filter):

FILE: supervisor/tests/test_process.py
  class SubprocessTests (line 26) | class SubprocessTests(unittest.TestCase):
    method _getTargetClass (line 27) | def _getTargetClass(self):
    method _makeOne (line 31) | def _makeOne(self, *arg, **kw):
    method tearDown (line 34) | def tearDown(self):
    method test_getProcessStateDescription (line 38) | def test_getProcessStateDescription(self):
    method test_ctor (line 45) | def test_ctor(self):
    method test_repr (line 65) | def test_repr(self):
    method test_reopenlogs (line 73) | def test_reopenlogs(self):
    method test_removelogs (line 83) | def test_removelogs(self):
    method test_drain (line 93) | def test_drain(self):
    method test_get_execv_args_bad_command_extraquote (line 105) | def test_get_execv_args_bad_command_extraquote(self):
    method test_get_execv_args_bad_command_empty (line 111) | def test_get_execv_args_bad_command_empty(self):
    method test_get_execv_args_bad_command_whitespaceonly (line 117) | def test_get_execv_args_bad_command_whitespaceonly(self):
    method test_get_execv_args_abs_missing (line 123) | def test_get_execv_args_abs_missing(self):
    method test_get_execv_args_abs_withquotes_missing (line 130) | def test_get_execv_args_abs_withquotes_missing(self):
    method test_get_execv_args_rel_missing (line 137) | def test_get_execv_args_rel_missing(self):
    method test_get_execv_args_rel_withquotes_missing (line 144) | def test_get_execv_args_rel_withquotes_missing(self):
    method test_get_execv_args_abs (line 151) | def test_get_execv_args_abs(self):
    method test_get_execv_args_rel (line 161) | def test_get_execv_args_rel(self):
    method test_get_execv_args_rel_searches_using_pconfig_path (line 171) | def test_get_execv_args_rel_searches_using_pconfig_path(self):
    method test_record_spawnerr (line 183) | def test_record_spawnerr(self):
    method test_spawn_already_running (line 191) | def test_spawn_already_running(self):
    method test_spawn_fail_check_execv_args (line 203) | def test_spawn_fail_check_execv_args(self):
    method test_spawn_fail_make_pipes_emfile (line 226) | def test_spawn_fail_make_pipes_emfile(self):
    method test_spawn_fail_make_pipes_other (line 252) | def test_spawn_fail_make_pipes_other(self):
    method test_spawn_fail_make_dispatchers_eisdir (line 277) | def test_spawn_fail_make_dispatchers_eisdir(self):
    method test_spawn_fork_fail_eagain (line 304) | def test_spawn_fork_fail_eagain(self):
    method test_spawn_fork_fail_other (line 331) | def test_spawn_fork_fail_other(self):
    method test_spawn_as_child_setuid_ok (line 358) | def test_spawn_as_child_setuid_ok(self):
    method test_spawn_as_child_setuid_fail (line 380) | def test_spawn_as_child_setuid_fail(self):
    method test_spawn_as_child_cwd_ok (line 400) | def test_spawn_as_child_cwd_ok(self):
    method test_spawn_as_child_sets_umask (line 423) | def test_spawn_as_child_sets_umask(self):
    method test_spawn_as_child_cwd_fail (line 440) | def test_spawn_as_child_cwd_fail(self):
    method test_spawn_as_child_execv_fail_oserror (line 463) | def test_spawn_as_child_execv_fail_oserror(self):
    method test_spawn_as_child_execv_fail_runtime_error (line 483) | def test_spawn_as_child_execv_fail_runtime_error(self):
    method test_spawn_as_child_uses_pconfig_environment (line 503) | def test_spawn_as_child_uses_pconfig_environment(self):
    method test_spawn_as_child_environment_supervisor_envvars (line 514) | def test_spawn_as_child_environment_supervisor_envvars(self):
    method test_spawn_as_child_stderr_redirected (line 536) | def test_spawn_as_child_stderr_redirected(self):
    method test_spawn_as_parent (line 559) | def test_spawn_as_parent(self):
    method test_spawn_redirect_stderr (line 581) | def test_spawn_redirect_stderr(self):
    method test_write (line 595) | def test_write(self):
    method test_write_dispatcher_closed (line 610) | def test_write_dispatcher_closed(self):
    method test_write_stdin_fd_none (line 623) | def test_write_stdin_fd_none(self):
    method test_write_dispatcher_flush_raises_epipe (line 640) | def test_write_dispatcher_flush_raises_epipe(self):
    method _dont_test_spawn_and_kill (line 654) | def _dont_test_spawn_and_kill(self):
    method test_stop (line 697) | def test_stop(self):
    method test_stop_not_in_stoppable_state_error (line 716) | def test_stop_not_in_stoppable_state_error(self):
    method test_stop_report_logs_nothing_if_not_stopping_state (line 732) | def test_stop_report_logs_nothing_if_not_stopping_state(self):
    method test_stop_report_logs_throttled_by_laststopreport (line 744) | def test_stop_report_logs_throttled_by_laststopreport(self):
    method test_stop_report_laststopreport_in_future (line 761) | def test_stop_report_laststopreport_in_future(self):
    method test_give_up (line 795) | def test_give_up(self):
    method test_kill_nopid (line 813) | def test_kill_nopid(self):
    method test_kill_from_starting (line 822) | def test_kill_from_starting(self):
    method test_kill_from_running (line 841) | def test_kill_from_running(self):
    method test_kill_from_running_error (line 860) | def test_kill_from_running_error(self):
    method test_kill_from_running_error_ESRCH (line 887) | def test_kill_from_running_error_ESRCH(self):
    method test_kill_from_stopping (line 912) | def test_kill_from_stopping(self):
    method test_kill_from_backoff (line 929) | def test_kill_from_backoff(self):
    method test_kill_from_stopping_w_killasgroup (line 945) | def test_kill_from_stopping_w_killasgroup(self):
    method test_stopasgroup (line 962) | def test_stopasgroup(self):
    method test_signal_from_stopped (line 983) | def test_signal_from_stopped(self):
    method test_signal_from_running (line 994) | def test_signal_from_running(self):
    method test_signal_from_running_error_ESRCH (line 1007) | def test_signal_from_running_error_ESRCH(self):
    method test_signal_from_running_error (line 1030) | def test_signal_from_running_error(self):
    method test_finish_stopping_state (line 1055) | def test_finish_stopping_state(self):
    method test_finish_running_state_exit_expected (line 1086) | def test_finish_running_state_exit_expected(self):
    method test_finish_starting_state_laststart_in_future (line 1118) | def test_finish_starting_state_laststart_in_future(self):
    method test_finish_starting_state_exited_too_quickly (line 1159) | def test_finish_starting_state_exited_too_quickly(self):
    method test_finish_running_state_exited_too_quickly_due_to_clock_rollback (line 1193) | def test_finish_running_state_exited_too_quickly_due_to_clock_rollback...
    method test_finish_running_state_laststart_in_future (line 1226) | def test_finish_running_state_laststart_in_future(self):
    method test_finish_with_current_event_sends_rejected (line 1263) | def test_finish_with_current_event_sends_rejected(self):
    method test_set_uid_no_uid (line 1286) | def test_set_uid_no_uid(self):
    method test_set_uid (line 1293) | def test_set_uid(self):
    method test_cmp_bypriority (line 1301) | def test_cmp_bypriority(self):
    method test_transition_stopped_to_starting_supervisor_stopping (line 1323) | def test_transition_stopped_to_starting_supervisor_stopping(self):
    method test_transition_stopped_to_starting_supervisor_running (line 1340) | def test_transition_stopped_to_starting_supervisor_running(self):
    method test_transition_exited_to_starting_supervisor_stopping (line 1362) | def test_transition_exited_to_starting_supervisor_stopping(self):
    method test_transition_exited_to_starting_uncond_supervisor_running (line 1383) | def test_transition_exited_to_starting_uncond_supervisor_running(self):
    method test_transition_exited_to_starting_condit_supervisor_running (line 1406) | def test_transition_exited_to_starting_condit_supervisor_running(self):
    method test_transition_exited_to_starting_condit_fls_supervisor_running (line 1430) | def test_transition_exited_to_starting_condit_fls_supervisor_running(s...
    method test_transition_backoff_to_starting_supervisor_stopping (line 1448) | def test_transition_backoff_to_starting_supervisor_stopping(self):
    method test_transition_backoff_to_starting_supervisor_running (line 1466) | def test_transition_backoff_to_starting_supervisor_running(self):
    method test_transition_backoff_to_starting_supervisor_running_notyet (line 1490) | def test_transition_backoff_to_starting_supervisor_running_notyet(self):
    method test_transition_starting_to_running (line 1508) | def test_transition_starting_to_running(self):
    method test_transition_starting_to_running_laststart_in_future (line 1544) | def test_transition_starting_to_running_laststart_in_future(self):
    method test_transition_backoff_to_starting_delay_in_future (line 1600) | def test_transition_backoff_to_starting_delay_in_future(self):
    method test_transition_backoff_to_fatal (line 1639) | def test_transition_backoff_to_fatal(self):
    method test_transition_stops_unkillable_notyet (line 1674) | def test_transition_stops_unkillable_notyet(self):
    method test_transition_stops_unkillable (line 1690) | def test_transition_stops_unkillable(self):
    method test_change_state_doesnt_notify_if_no_state_change (line 1713) | def test_change_state_doesnt_notify_if_no_state_change(self):
    method test_change_state_sets_backoff_and_delay (line 1720) | def test_change_state_sets_backoff_and_delay(self):
  class FastCGISubprocessTests (line 1730) | class FastCGISubprocessTests(unittest.TestCase):
    method _getTargetClass (line 1731) | def _getTargetClass(self):
    method _makeOne (line 1735) | def _makeOne(self, *arg, **kw):
    method tearDown (line 1738) | def tearDown(self):
    method test_no_group (line 1742) | def test_no_group(self):
    method test_no_socket_manager (line 1749) | def test_no_socket_manager(self):
    method test_prepare_child_fds (line 1757) | def test_prepare_child_fds(self):
    method test_prepare_child_fds_stderr_redirected (line 1774) | def test_prepare_child_fds_stderr_redirected(self):
    method test_before_spawn_gets_socket_ref (line 1790) | def test_before_spawn_gets_socket_ref(self):
    method test_after_finish_removes_socket_ref (line 1802) | def test_after_finish_removes_socket_ref(self):
    method test_finish_override (line 1812) | def test_finish_override(self):
    method test_spawn_override_success (line 1834) | def test_spawn_override_success(self):
    method test_spawn_error (line 1850) | def test_spawn_error(self):
  class ProcessGroupBaseTests (line 1864) | class ProcessGroupBaseTests(unittest.TestCase):
    method _getTargetClass (line 1865) | def _getTargetClass(self):
    method _makeOne (line 1869) | def _makeOne(self, *args, **kw):
    method test_get_unstopped_processes (line 1872) | def test_get_unstopped_processes(self):
    method test_before_remove (line 1883) | def test_before_remove(self):
    method test_stop_all (line 1893) | def test_stop_all(self):
    method test_get_dispatchers (line 1923) | def test_get_dispatchers(self):
    method test_reopenlogs (line 1938) | def test_reopenlogs(self):
    method test_removelogs (line 1949) | def test_removelogs(self):
    method test_ordering_and_comparison (line 1960) | def test_ordering_and_comparison(self):
  class ProcessGroupTests (line 1982) | class ProcessGroupTests(ProcessGroupBaseTests):
    method _getTargetClass (line 1983) | def _getTargetClass(self):
    method test_repr (line 1987) | def test_repr(self):
    method test_transition (line 1995) | def test_transition(self):
  class FastCGIProcessGroupTests (line 2006) | class FastCGIProcessGroupTests(unittest.TestCase):
    method _getTargetClass (line 2007) | def _getTargetClass(self):
    method _makeOne (line 2011) | def _makeOne(self, config, **kwargs):
    method test___init__without_socket_error (line 2015) | def test___init__without_socket_error(self):
    method test___init__with_socket_error (line 2025) | def test___init__with_socket_error(self):
  class EventListenerPoolTests (line 2040) | class EventListenerPoolTests(ProcessGroupBaseTests):
    method setUp (line 2041) | def setUp(self):
    method tearDown (line 2045) | def tearDown(self):
    method _getTargetClass (line 2049) | def _getTargetClass(self):
    method test_ctor (line 2053) | def test_ctor(self):
    method test_before_remove_unsubscribes_from_events (line 2068) | def test_before_remove_unsubscribes_from_events(self):
    method test__eventEnvelope (line 2080) | def test__eventEnvelope(self):
    method test_handle_rejected_no_overflow (line 2100) | def test_handle_rejected_no_overflow(self):
    method test_handle_rejected_event_buffer_overflowed (line 2119) | def test_handle_rejected_event_buffer_overflowed(self):
    method test_dispatch_pipe_error (line 2147) | def test_dispatch_pipe_error(self):
    method test__acceptEvent_attaches_pool_serial_and_serial (line 2169) | def test__acceptEvent_attaches_pool_serial_and_serial(self):
    method test_repr (line 2184) | def test_repr(self):
    method test_transition_nobody_ready (line 2192) | def test_transition_nobody_ready(self):
    method test_transition_event_proc_not_running (line 2209) | def test_transition_event_proc_not_running(self):
    method test_transition_event_proc_running (line 2228) | def test_transition_event_proc_running(self):
    method test_transition_event_proc_running_with_dispatch_throttle_notyet (line 2251) | def test_transition_event_proc_running_with_dispatch_throttle_notyet(s...
    method test_transition_event_proc_running_with_dispatch_throttle_ready (line 2272) | def test_transition_event_proc_running_with_dispatch_throttle_ready(se...
    method test_transition_event_proc_running_with_dispatch_throttle_last_dispatch_in_future (line 2297) | def test_transition_event_proc_running_with_dispatch_throttle_last_dis...
    method test__dispatchEvent_notready (line 2323) | def test__dispatchEvent_notready(self):
    method test__dispatchEvent_proc_write_raises_non_EPIPE_OSError (line 2335) | def test__dispatchEvent_proc_write_raises_non_EPIPE_OSError(self):
  class test_new_serial (line 2355) | class test_new_serial(unittest.TestCase):
    method _callFUT (line 2356) | def _callFUT(self, inst):
    method test_inst_serial_is_maxint (line 2360) | def test_inst_serial_is_maxint(self):
    method test_inst_serial_is_not_maxint (line 2370) | def test_inst_serial_is_not_maxint(self):

FILE: supervisor/tests/test_rpcinterfaces.py
  class TestBase (line 22) | class TestBase(unittest.TestCase):
    method setUp (line 23) | def setUp(self):
    method tearDown (line 26) | def tearDown(self):
    method _assertRPCError (line 29) | def _assertRPCError(self, code, callable, *args, **kw):
  class MainXMLRPCInterfaceTests (line 38) | class MainXMLRPCInterfaceTests(TestBase):
    method _getTargetClass (line 40) | def _getTargetClass(self):
    method _makeOne (line 44) | def _makeOne(self, *args, **kw):
    method test_ctor (line 47) | def test_ctor(self):
    method test_traverse (line 51) | def test_traverse(self):
  class SupervisorNamespaceXMLRPCInterfaceTests (line 66) | class SupervisorNamespaceXMLRPCInterfaceTests(TestBase):
    method _getTargetClass (line 67) | def _getTargetClass(self):
    method _makeOne (line 71) | def _makeOne(self, *args, **kw):
    method test_update (line 74) | def test_update(self):
    method test_getAPIVersion (line 85) | def test_getAPIVersion(self):
    method test_getAPIVersion_aliased_to_deprecated_getVersion (line 93) | def test_getAPIVersion_aliased_to_deprecated_getVersion(self):
    method test_getSupervisorVersion (line 98) | def test_getSupervisorVersion(self):
    method test_getIdentification (line 107) | def test_getIdentification(self):
    method test_getState (line 114) | def test_getState(self):
    method test_getPID (line 125) | def test_getPID(self):
    method test_readLog_aliased_to_deprecated_readMainLog (line 132) | def test_readLog_aliased_to_deprecated_readMainLog(self):
    method test_readLog_unreadable (line 137) | def test_readLog_unreadable(self):
    method test_readLog_badargs (line 144) | def test_readLog_badargs(self):
    method test_readLog (line 160) | def test_readLog(self):
    method test_clearLog_unreadable (line 180) | def test_clearLog_unreadable(self):
    method test_clearLog_unremoveable (line 186) | def test_clearLog_unremoveable(self):
    method test_clearLog (line 197) | def test_clearLog(self):
    method test_shutdown (line 209) | def test_shutdown(self):
    method test_restart (line 216) | def test_restart(self):
    method test_reloadConfig (line 223) | def test_reloadConfig(self):
    method test_reloadConfig_process_config_raises_ValueError (line 237) | def test_reloadConfig_process_config_raises_ValueError(self):
    method test_addProcessGroup (line 247) | def test_addProcessGroup(self):
    method test_removeProcessGroup (line 270) | def test_removeProcessGroup(self):
    method test_removeProcessGroup_bad_name (line 285) | def test_removeProcessGroup_bad_name(self):
    method test_removeProcessGroup_still_running (line 299) | def test_removeProcessGroup_still_running(self):
    method test_startProcess_already_started (line 314) | def test_startProcess_already_started(self):
    method test_startProcess_unknown_state (line 326) | def test_startProcess_unknown_state(self):
    method test_startProcess_bad_group_name (line 342) | def test_startProcess_bad_group_name(self):
    method test_startProcess_bad_process_name (line 351) | def test_startProcess_bad_process_name(self):
    method test_startProcess_file_not_found (line 360) | def test_startProcess_file_not_found(self):
    method test_startProcess_bad_command (line 372) | def test_startProcess_bad_command(self):
    method test_startProcess_file_not_executable (line 384) | def test_startProcess_file_not_executable(self):
    method test_startProcess_spawnerr (line 396) | def test_startProcess_spawnerr(self):
    method test_startProcess (line 412) | def test_startProcess(self):
    method test_startProcess_spawnerr_in_onwait (line 427) | def test_startProcess_spawnerr_in_onwait(self):
    method test_startProcess_success_in_onwait (line 446) | def test_startProcess_success_in_onwait(self):
    method test_startProcess_nowait (line 462) | def test_startProcess_nowait(self):
    method test_startProcess_abnormal_term_process_not_running (line 475) | def test_startProcess_abnormal_term_process_not_running(self):
    method test_startProcess_splat_calls_startProcessGroup (line 497) | def test_startProcess_splat_calls_startProcessGroup(self):
    method test_startProcessGroup (line 512) | def test_startProcessGroup(self):
    method test_startProcessGroup_nowait (line 546) | def test_startProcessGroup_nowait(self):
    method test_startProcessGroup_badname (line 574) | def test_startProcessGroup_badname(self):
    method test_startAllProcesses (line 582) | def test_startAllProcesses(self):
    method test_startAllProcesses_nowait (line 618) | def test_startAllProcesses_nowait(self):
    method test_stopProcess (line 646) | def test_stopProcess(self):
    method test_stopProcess_nowait (line 665) | def test_stopProcess_nowait(self):
    method test_stopProcess_success_in_onwait (line 679) | def test_stopProcess_success_in_onwait(self):
    method test_stopProcess_NDY_in_onwait (line 696) | def test_stopProcess_NDY_in_onwait(self):
    method test_stopProcess_bad_name (line 714) | def test_stopProcess_bad_name(self):
    method test_stopProcess_not_running (line 721) | def test_stopProcess_not_running(self):
    method test_stopProcess_failed (line 731) | def test_stopProcess_failed(self):
    method test_stopProcessGroup (line 740) | def test_stopProcessGroup(self):
    method test_stopProcessGroup_nowait (line 776) | def test_stopProcessGroup_nowait(self):
    method test_stopProcessGroup_badname (line 803) | def test_stopProcessGroup_badname(self):
    method test_stopProcess_splat_calls_stopProcessGroup (line 810) | def test_stopProcess_splat_calls_stopProcessGroup(self):
    method test_stopAllProcesses (line 825) | def test_stopAllProcesses(self):
    method test_stopAllProcesses_nowait (line 861) | def test_stopAllProcesses_nowait(self):
    method test_signalProcess_with_signal_number (line 887) | def test_signalProcess_with_signal_number(self):
    method test_signalProcess_with_signal_name (line 902) | def test_signalProcess_with_signal_name(self):
    method test_signalProcess_stopping (line 921) | def test_signalProcess_stopping(self):
    method test_signalProcess_badsignal (line 936) | def test_signalProcess_badsignal(self):
    method test_signalProcess_notrunning (line 948) | def test_signalProcess_notrunning(self):
    method test_signalProcess_signal_returns_message (line 961) | def test_signalProcess_signal_returns_message(self):
    method test_signalProcess_withgroup (line 979) | def test_signalProcess_withgroup(self):
    method test_signalProcessGroup_with_signal_number (line 1014) | def test_signalProcessGroup_with_signal_number(self):
    method test_signalProcessGroup_with_signal_name (line 1046) | def test_signalProcessGroup_with_signal_name(self):
    method test_signalProcessGroup_nosuchgroup (line 1072) | def test_signalProcessGroup_nosuchgroup(self):
    method test_signalAllProcesses_with_signal_number (line 1087) | def test_signalAllProcesses_with_signal_number(self):
    method test_signalAllProcesses_with_signal_name (line 1120) | def test_signalAllProcesses_with_signal_name(self):
    method test_getAllConfigInfo (line 1145) | def test_getAllConfigInfo(self):
    method test_getAllConfigInfo_filters_types_not_compatible_with_xmlrpc (line 1221) | def test_getAllConfigInfo_filters_types_not_compatible_with_xmlrpc(self):
    method test__interpretProcessInfo (line 1245) | def test__interpretProcessInfo
Condensed preview — 135 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,813K chars).
[
  {
    "path": ".github/workflows/main.yml",
    "chars": 5280,
    "preview": "name: Run all tests\n\non: [push, pull_request]\n\nenv:\n  PIP: \"env PIP_DISABLE_PIP_VERSION_CHECK=1\n            PYTHONWARNIN"
  },
  {
    "path": ".gitignore",
    "chars": 187,
    "preview": "*~\n*.egg\n*.egg-info\n*.log\n*.pyc\n*.pyo\n*.swp\n*.pss\n.DS_Store\n.coverage*\n.eggs/\n.pytest_cache/\n.tox/\nbuild/\ndocs/.build/\nd"
  },
  {
    "path": ".readthedocs.yaml",
    "chars": 578,
    "preview": "# .readthedocs.yaml\n# Read the Docs configuration file\n# See https://docs.readthedocs.io/en/stable/config-file/v2.html f"
  },
  {
    "path": "CHANGES.rst",
    "chars": 86254,
    "preview": "4.4.0.dev0 (Next Release)\n-------------------------\n\n- Fixed a bug where ``supervisord`` would wait 1 second on startup "
  },
  {
    "path": "COPYRIGHT.txt",
    "chars": 244,
    "preview": "Supervisor is Copyright (c) 2006-2015 Agendaless Consulting and Contributors.\n(http://www.agendaless.com), All Rights Re"
  },
  {
    "path": "LICENSES.txt",
    "chars": 5152,
    "preview": "Supervisor is licensed under the following license:\n\n  A copyright notice accompanies this license document that identif"
  },
  {
    "path": "MANIFEST.in",
    "chars": 379,
    "preview": "include CHANGES.rst\ninclude COPYRIGHT.txt\ninclude LICENSES.txt\ninclude README.rst\ninclude tox.ini\ninclude supervisor/ver"
  },
  {
    "path": "README.rst",
    "chars": 1257,
    "preview": "Supervisor\n==========\n\nSupervisor is a client/server system that allows its users to\ncontrol a number of processes on UN"
  },
  {
    "path": "docs/.static/repoze.css",
    "chars": 509,
    "preview": "@import url('default.css');\nbody {\n    background-color: #006339;\n}\n \ndiv.document {\n    background-color: #dad3bd;\n}\n\nd"
  },
  {
    "path": "docs/Makefile",
    "chars": 2272,
    "preview": "# Makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line.\nSPHINXOPTS    =\nSPHINXBUILD "
  },
  {
    "path": "docs/api.rst",
    "chars": 13256,
    "preview": ".. _xml_rpc:\n\nXML-RPC API Documentation\n=========================\n\nTo use the XML-RPC interface, first make sure you hav"
  },
  {
    "path": "docs/conf.py",
    "chars": 5998,
    "preview": "# -*- coding: utf-8 -*-\n#\n# Supervisor documentation build configuration file\n#\n# This file is execfile()d with the curr"
  },
  {
    "path": "docs/configuration.rst",
    "chars": 48023,
    "preview": "Configuration File\n==================\n\nThe Supervisor configuration file is conventionally named\n:file:`supervisord.conf"
  },
  {
    "path": "docs/development.rst",
    "chars": 3298,
    "preview": "Resources and Development\n=========================\n\nBug Tracker\n-----------\n\nSupervisor has a bugtracker where you may "
  },
  {
    "path": "docs/events.rst",
    "chars": 31263,
    "preview": ".. _events:\n\nEvents\n======\n\nEvents are an advanced feature of Supervisor introduced in version\n3.0.  You don't need to u"
  },
  {
    "path": "docs/faq.rst",
    "chars": 1348,
    "preview": "Frequently Asked Questions\n==========================\n\nQ\n  My program never starts and supervisor doesn't indicate any e"
  },
  {
    "path": "docs/glossary.rst",
    "chars": 833,
    "preview": ".. _glossary:\n\nGlossary\n========\n\n.. glossary::\n   :sorted:\n\n   daemontools\n     A `process control system by D.J. Berns"
  },
  {
    "path": "docs/index.rst",
    "chars": 1083,
    "preview": "Supervisor: A Process Control System\n====================================\n\nSupervisor is a client/server system that all"
  },
  {
    "path": "docs/installing.rst",
    "chars": 5691,
    "preview": "Installing\n==========\n\nInstallation instructions depend whether the system on which\nyou're attempting to install Supervi"
  },
  {
    "path": "docs/introduction.rst",
    "chars": 6767,
    "preview": "Introduction\n============\n\nOverview\n--------\n\nSupervisor is a client/server system that allows its users to control\na nu"
  },
  {
    "path": "docs/logging.rst",
    "chars": 9678,
    "preview": "Logging\n=======\n\nOne of the main tasks that :program:`supervisord` performs is logging.\n:program:`supervisord` logs an a"
  },
  {
    "path": "docs/plugins.rst",
    "chars": 11512,
    "preview": "Third Party Applications and Libraries\n======================================\n\nThere are a number of third party applica"
  },
  {
    "path": "docs/running.rst",
    "chars": 12622,
    "preview": ".. _running:\n\nRunning Supervisor\n==================\n\nThis section makes reference to a :envvar:`BINDIR` when explaining "
  },
  {
    "path": "docs/subprocess.rst",
    "chars": 11021,
    "preview": "Subprocesses\n============\n\n:program:`supervisord`'s primary purpose is to create and manage\nprocesses based on data in i"
  },
  {
    "path": "docs/upgrading.rst",
    "chars": 3185,
    "preview": "Upgrading Supervisor 2 to 3\n===========================\n\nThe following is true when upgrading an installation from Super"
  },
  {
    "path": "docs/xmlrpc.rst",
    "chars": 2391,
    "preview": "Extending Supervisor's XML-RPC API\n==================================\n\nSupervisor can be extended with new XML-RPC APIs."
  },
  {
    "path": "setup.cfg",
    "chars": 340,
    "preview": "[easy_install]\nzip_ok = false\n\n;Marking a wheel as universal with \"universal = 1\" was deprecated\n;in Setuptools 75.1.0. "
  },
  {
    "path": "setup.py",
    "chars": 4234,
    "preview": "##############################################################################\n#\n# Copyright (c) 2006-2015 Agendaless Co"
  },
  {
    "path": "supervisor/__init__.py",
    "chars": 20,
    "preview": "# this is a package\n"
  },
  {
    "path": "supervisor/childutils.py",
    "chars": 2561,
    "preview": "import sys\nimport time\n\nfrom supervisor.compat import xmlrpclib\nfrom supervisor.compat import long\nfrom supervisor.compa"
  },
  {
    "path": "supervisor/compat.py",
    "chars": 6230,
    "preview": "from __future__ import absolute_import\n\nimport sys\n\nPY2 = sys.version_info[0] == 2\n\nif PY2: # pragma: no cover\n    long "
  },
  {
    "path": "supervisor/confecho.py",
    "chars": 243,
    "preview": "import sys\nfrom supervisor.compat import as_string\nfrom supervisor.compat import resource_filename\n\n\ndef main(out=sys.st"
  },
  {
    "path": "supervisor/datatypes.py",
    "chars": 13414,
    "preview": "import grp\nimport os\nimport pwd\nimport signal\nimport socket\nimport shlex\n\nfrom supervisor.compat import shlex_posix_work"
  },
  {
    "path": "supervisor/dispatchers.py",
    "chars": 19293,
    "preview": "import errno\nfrom supervisor.medusa.asynchat_25 import find_prefix_at_end\nfrom supervisor.medusa.asyncore_25 import comp"
  },
  {
    "path": "supervisor/events.py",
    "chars": 7235,
    "preview": "from supervisor.states import getProcessStateDescription\nfrom supervisor.compat import as_string\n\ncallbacks = []\n\ndef su"
  },
  {
    "path": "supervisor/http.py",
    "chars": 31882,
    "preview": "import os\nimport stat\nimport time\nimport sys\nimport socket\nimport errno\nimport weakref\nimport traceback\n\ntry:\n    import"
  },
  {
    "path": "supervisor/http_client.py",
    "chars": 7030,
    "preview": "# this code based on Daniel Krech's RDFLib HTTP client code (see rdflib.dev)\n\nimport sys\nimport socket\n\nfrom supervisor."
  },
  {
    "path": "supervisor/loggers.py",
    "chars": 13311,
    "preview": "\"\"\"\nLogger implementation loosely modeled on PEP 282.  We don't use the\nPEP 282 logger implementation in the stdlib ('lo"
  },
  {
    "path": "supervisor/medusa/CHANGES.txt",
    "chars": 3635,
    "preview": "PATCHES MADE ONLY TO THIS MEDUSA PACKAGE BUNDLED WITH SUPERVISOR\n* Re-added asyncore.py as asyncore_25.py and asynchat.p"
  },
  {
    "path": "supervisor/medusa/LICENSE.txt",
    "chars": 1526,
    "preview": "Medusa was once distributed under a 'free for non-commercial use'\nlicense, but in May of 2000 Sam Rushing changed the li"
  },
  {
    "path": "supervisor/medusa/README.txt",
    "chars": 1740,
    "preview": "Medusa is a 'server platform' -- it provides a framework for\nimplementing asynchronous socket-based servers (TCP/IP and "
  },
  {
    "path": "supervisor/medusa/TODO.txt",
    "chars": 357,
    "preview": "Things to do\n============\n\nBring remaining code up to current standards\nTranslate docs to RST\nWrite README, INSTALL, doc"
  },
  {
    "path": "supervisor/medusa/__init__.py",
    "chars": 121,
    "preview": "\"\"\"medusa.__init__\n\"\"\"\n\n# created 2002/03/19, AMK\n\n__revision__ = \"$Id: __init__.py,v 1.2 2002/03/19 22:49:34 amk Exp $\""
  },
  {
    "path": "supervisor/medusa/asynchat_25.py",
    "chars": 10828,
    "preview": "# -*- Mode: Python; tab-width: 4 -*-\n#       Id: asynchat.py,v 2.26 2000/09/07 22:29:26 rushing Exp\n#       Author: Sam "
  },
  {
    "path": "supervisor/medusa/asyncore_25.py",
    "chars": 17090,
    "preview": "# -*- Mode: Python -*-\n#   Id: asyncore.py,v 2.51 2000/09/07 22:29:26 rushing Exp\n#   Author: Sam Rushing <rushing@night"
  },
  {
    "path": "supervisor/medusa/auth_handler.py",
    "chars": 4990,
    "preview": "# -*- Mode: Python -*-\n#\n#       Author: Sam Rushing <rushing@nightmare.com>\n#       Copyright 1996-2000 by Sam Rushing\n"
  },
  {
    "path": "supervisor/medusa/counter.py",
    "chars": 1508,
    "preview": "# -*- Mode: Python -*-\n\n# It is tempting to add an __int__ method to this class, but it's not\n# a good idea.  This class"
  },
  {
    "path": "supervisor/medusa/default_handler.py",
    "chars": 6355,
    "preview": "# -*- Mode: Python -*-\n#\n#       Author: Sam Rushing <rushing@nightmare.com>\n#       Copyright 1997 by Sam Rushing\n#    "
  },
  {
    "path": "supervisor/medusa/docs/README.html",
    "chars": 8118,
    "preview": "<html>\n<body>\n\n<h1> What is Medusa? </h1>\n<hr>\n\n<p>\nMedusa is an architecture for very-high-performance TCP/IP servers\n("
  },
  {
    "path": "supervisor/medusa/docs/async_blurbs.txt",
    "chars": 2382,
    "preview": "\n[from the win32 sdk named pipe documentation]\n\n==================================================\nThe simplest server p"
  },
  {
    "path": "supervisor/medusa/docs/data_flow.html",
    "chars": 3773,
    "preview": "\n<h1>Data Flow in Medusa</h1>\n\n<img src=\"data_flow.gif\">\n\n<p>Data flow, both input and output, is asynchronous.  This is"
  },
  {
    "path": "supervisor/medusa/docs/programming.html",
    "chars": 27753,
    "preview": "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\n<html>\n  <head>\n    <title>Programming in Python with Medusa and the Asyn"
  },
  {
    "path": "supervisor/medusa/docs/proxy_notes.txt",
    "chars": 1774,
    "preview": "\n# we can build 'promises' to produce external data.  Each producer\n# contains a 'promise' to fetch external data (or an"
  },
  {
    "path": "supervisor/medusa/docs/threads.txt",
    "chars": 2117,
    "preview": "# -*- Mode: Text; tab-width: 4 -*-\n\n[note, a better solution is now available, see the various modules in\n the 'thread' "
  },
  {
    "path": "supervisor/medusa/docs/tkinter.txt",
    "chars": 911,
    "preview": "\nHere are some notes on combining the Tk Event loop with the async lib\nand/or Medusa.  Many thanks to Aaron Rhodes (alrh"
  },
  {
    "path": "supervisor/medusa/filesys.py",
    "chars": 11368,
    "preview": "# -*- Mode: Python -*-\n#       $Id: filesys.py,v 1.9 2003/12/24 16:10:56 akuchling Exp $\n#       Author: Sam Rushing <ru"
  },
  {
    "path": "supervisor/medusa/http_date.py",
    "chars": 3223,
    "preview": "# -*- Mode: Python -*-\n\nimport re\nimport time\n\ndef concat (*args):\n    return ''.join (args)\n\ndef join (seq, field=' '):"
  },
  {
    "path": "supervisor/medusa/http_server.py",
    "chars": 29555,
    "preview": "# -*- Mode: Python -*-\n#\n#       Author: Sam Rushing <rushing@nightmare.com>\n#       Copyright 1996-2000 by Sam Rushing\n"
  },
  {
    "path": "supervisor/medusa/logger.py",
    "chars": 7075,
    "preview": "# -*- Mode: Python -*-\n\nimport supervisor.medusa.asynchat_25 as asynchat\nimport socket\nimport time         # these three"
  },
  {
    "path": "supervisor/medusa/producers.py",
    "chars": 8993,
    "preview": "# -*- Mode: Python -*-\n\nRCS_ID = '$Id: producers.py,v 1.9 2004/04/21 13:56:28 akuchling Exp $'\n\n\"\"\"\nA collection of prod"
  },
  {
    "path": "supervisor/medusa/util.py",
    "chars": 1354,
    "preview": "from supervisor.compat import escape\n\ndef html_repr (object):\n    so = escape (repr (object))\n    if hasattr (object, 'h"
  },
  {
    "path": "supervisor/medusa/xmlrpc_handler.py",
    "chars": 3135,
    "preview": "# -*- Mode: Python -*-\n\n# See http://www.xml-rpc.com/\n#     http://www.pythonware.com/products/xmlrpc/\n\n# Based on \"xmlr"
  },
  {
    "path": "supervisor/options.py",
    "chars": 88332,
    "preview": "import socket\nimport getopt\nimport os\nimport sys\nimport tempfile\nimport errno\nimport signal\nimport re\nimport pwd\nimport "
  },
  {
    "path": "supervisor/pidproxy.py",
    "chars": 2006,
    "preview": "#!/usr/bin/env python -u\n\n\"\"\"pidproxy -- run command and proxy signals to it via its pidfile.\n\nThis executable runs a co"
  },
  {
    "path": "supervisor/poller.py",
    "chars": 6703,
    "preview": "import select\nimport errno\n\nclass BasePoller:\n\n    def __init__(self, options):\n        self.options = options\n        s"
  },
  {
    "path": "supervisor/process.py",
    "chars": 39444,
    "preview": "import errno\nimport functools\nimport os\nimport signal\nimport shlex\nimport time\nimport traceback\n\nfrom supervisor.compat "
  },
  {
    "path": "supervisor/rpcinterface.py",
    "chars": 38053,
    "preview": "import os\nimport time\nimport datetime\nimport errno\nimport types\n\nfrom supervisor.compat import as_string\nfrom supervisor"
  },
  {
    "path": "supervisor/skel/sample.conf",
    "chars": 10607,
    "preview": "; Sample supervisor config file.\n;\n; For more information on the config file, please see:\n; http://supervisord.org/confi"
  },
  {
    "path": "supervisor/socket_manager.py",
    "chars": 3095,
    "preview": "import socket\n\nclass Proxy:\n    \"\"\" Class for wrapping a shared resource object and getting\n        notified when it's d"
  },
  {
    "path": "supervisor/states.py",
    "chars": 1791,
    "preview": "# This module must not depend on any other non-stdlib module to prevent\n# circular import problems.\n\nclass ProcessStates"
  },
  {
    "path": "supervisor/supervisorctl.py",
    "chars": 54885,
    "preview": "#!/usr/bin/env python -u\n\n\"\"\"supervisorctl -- control applications run by supervisord from the cmd line.\n\nUsage: %s [opt"
  },
  {
    "path": "supervisor/supervisord.py",
    "chars": 15444,
    "preview": "#!/usr/bin/env python\n\n\"\"\"supervisord -- run a set of applications as daemons.\n\nUsage: %s [options]\n\nOptions:\n-c/--confi"
  },
  {
    "path": "supervisor/templating.py",
    "chars": 47081,
    "preview": "# This file was originally based on the meld3 package version 2.0.0\n# (https://pypi.org/project/meld3/2.0.0/).  The meld"
  },
  {
    "path": "supervisor/tests/__init__.py",
    "chars": 20,
    "preview": "# this is a package\n"
  },
  {
    "path": "supervisor/tests/base.py",
    "chars": 35855,
    "preview": "_NOW = 1151365354\n_TIMEFORMAT = '%b %d %I:%M %p'\n\nimport functools\n\nfrom supervisor.compat import Fault\nfrom supervisor."
  },
  {
    "path": "supervisor/tests/fixtures/donothing.conf",
    "chars": 237,
    "preview": "[supervisord]\nlogfile=/tmp/donothing.log ; (main log file;default $CWD/supervisord.log)\npidfile=/tmp/donothing.pid ; (su"
  },
  {
    "path": "supervisor/tests/fixtures/example/included.conf",
    "chars": 37,
    "preview": "[supervisord]\nchildlogdir = %(here)s\n"
  },
  {
    "path": "supervisor/tests/fixtures/hello.sh",
    "chars": 120,
    "preview": "#!/bin/bash\nn=0\nwhile [ $n -lt 10 ]; do\n    let n=n+1\n    echo \"The Øresund bridge ends in Malmö - $n\"\n    sleep 1\ndone\n"
  },
  {
    "path": "supervisor/tests/fixtures/include.conf",
    "chars": 76,
    "preview": "[include]\nfiles = ./example/included.conf\n\n[supervisord]\nlogfile = %(here)s\n"
  },
  {
    "path": "supervisor/tests/fixtures/issue-1054.conf",
    "chars": 434,
    "preview": "[supervisord]\nloglevel = debug\nlogfile=/tmp/issue-1054.log\npidfile=/tmp/issue-1054.pid\nnodaemon = true\n\n[unix_http_serve"
  },
  {
    "path": "supervisor/tests/fixtures/issue-1170a.conf",
    "chars": 470,
    "preview": "[supervisord]\nnodaemon=true                ; start in foreground if true; default false\nloglevel=debug                ; "
  },
  {
    "path": "supervisor/tests/fixtures/issue-1170b.conf",
    "chars": 515,
    "preview": "[supervisord]\nnodaemon=true                ; start in foreground if true; default false\nloglevel=debug                ; "
  },
  {
    "path": "supervisor/tests/fixtures/issue-1170c.conf",
    "chars": 558,
    "preview": "[supervisord]\nnodaemon=true                ; start in foreground if true; default false\nloglevel=debug                ; "
  },
  {
    "path": "supervisor/tests/fixtures/issue-1224.conf",
    "chars": 168,
    "preview": "[supervisord]\nnodaemon = true\npidfile = /tmp/issue-1224.pid\nnodaemon = true\nlogfile = /dev/stdout\nlogfile_maxbytes = 0\n\n"
  },
  {
    "path": "supervisor/tests/fixtures/issue-1231a.conf",
    "chars": 657,
    "preview": "[supervisord]\nloglevel=info                ; log level; default info; others: debug,warn,trace\nlogfile=/tmp/issue-1231a."
  },
  {
    "path": "supervisor/tests/fixtures/issue-1231b.conf",
    "chars": 657,
    "preview": "[supervisord]\nloglevel=info                ; log level; default info; others: debug,warn,trace\nlogfile=/tmp/issue-1231b."
  },
  {
    "path": "supervisor/tests/fixtures/issue-1231c.conf",
    "chars": 657,
    "preview": "[supervisord]\nloglevel=info                ; log level; default info; others: debug,warn,trace\nlogfile=/tmp/issue-1231c."
  },
  {
    "path": "supervisor/tests/fixtures/issue-1298.conf",
    "chars": 419,
    "preview": "[supervisord]\nnodaemon=true                ; start in foreground if true; default false\n\n[rpcinterface:supervisor]\nsuper"
  },
  {
    "path": "supervisor/tests/fixtures/issue-1483a.conf",
    "chars": 507,
    "preview": "[supervisord]\nloglevel=info                ; log level; default info; others: debug,warn,trace\nlogfile=/tmp/issue-1483a."
  },
  {
    "path": "supervisor/tests/fixtures/issue-1483b.conf",
    "chars": 535,
    "preview": "[supervisord]\nloglevel=info                ; log level; default info; others: debug,warn,trace\nlogfile=/tmp/issue-1483b."
  },
  {
    "path": "supervisor/tests/fixtures/issue-1483c.conf",
    "chars": 535,
    "preview": "[supervisord]\nloglevel=info                ; log level; default info; others: debug,warn,trace\nlogfile=/tmp/issue-1483c."
  },
  {
    "path": "supervisor/tests/fixtures/issue-1596.conf",
    "chars": 535,
    "preview": "[supervisord]\nloglevel=info                ; log level; default info; others: debug,warn,trace\nlogfile=/tmp/issue-1596.l"
  },
  {
    "path": "supervisor/tests/fixtures/issue-291a.conf",
    "chars": 408,
    "preview": "[supervisord]\nloglevel=debug               ; log level; default info; others: debug,warn,trace\nlogfile=/tmp/issue-291a.l"
  },
  {
    "path": "supervisor/tests/fixtures/issue-550.conf",
    "chars": 743,
    "preview": "[supervisord]\nloglevel=info                ; log level; default info; others: debug,warn,trace\nlogfile=/tmp/issue-550.lo"
  },
  {
    "path": "supervisor/tests/fixtures/issue-565.conf",
    "chars": 822,
    "preview": "[supervisord]\nloglevel=info                ; log level; default info; others: debug,warn,trace\nlogfile=/tmp/issue-565.lo"
  },
  {
    "path": "supervisor/tests/fixtures/issue-638.conf",
    "chars": 420,
    "preview": "[supervisord]\nloglevel=debug               ; log level; default info; others: debug,warn,trace\nlogfile=/tmp/issue-638.lo"
  },
  {
    "path": "supervisor/tests/fixtures/issue-663.conf",
    "chars": 207,
    "preview": "[supervisord]\nloglevel=debug\nlogfile=/tmp/issue-663.log\npidfile=/tmp/issue-663.pid\nnodaemon=true\n\n[eventlistener:listene"
  },
  {
    "path": "supervisor/tests/fixtures/issue-664.conf",
    "chars": 454,
    "preview": "[supervisord]\nloglevel=debug\nlogfile=/tmp/issue-664.log\npidfile=/tmp/issue-664.pid\nnodaemon=true\n\n[rpcinterface:supervis"
  },
  {
    "path": "supervisor/tests/fixtures/issue-733.conf",
    "chars": 1234,
    "preview": "[supervisord]\nloglevel=debug               ; log level; default info; others: debug,warn,trace\nlogfile=/tmp/issue-733.lo"
  },
  {
    "path": "supervisor/tests/fixtures/issue-835.conf",
    "chars": 358,
    "preview": "[supervisord]\nloglevel = debug\nlogfile=/tmp/issue-835.log\npidfile=/tmp/issue-835.pid\nnodaemon = true\n\n[rpcinterface:supe"
  },
  {
    "path": "supervisor/tests/fixtures/issue-836.conf",
    "chars": 457,
    "preview": "[supervisord]\nloglevel = debug\nlogfile=/tmp/supervisord.log\npidfile=/tmp/supervisord.pid\nnodaemon = true\n\n[rpcinterface:"
  },
  {
    "path": "supervisor/tests/fixtures/issue-986.conf",
    "chars": 724,
    "preview": "[supervisord]\nloglevel=debug               ; log level; default info; others: debug,warn,trace\nlogfile=/tmp/issue-986.lo"
  },
  {
    "path": "supervisor/tests/fixtures/listener.py",
    "chars": 935,
    "preview": "\nimport sys\n\ndef write_and_flush(stream, s):\n    stream.write(s)\n    stream.flush()\n\ndef write_stdout(s):\n    # only eve"
  },
  {
    "path": "supervisor/tests/fixtures/print_env.py",
    "chars": 83,
    "preview": "#!<<PYTHON>>\nimport os\n\nfor k, v in os.environ.items():\n    print(\"%s=%s\" % (k,v))\n"
  },
  {
    "path": "supervisor/tests/fixtures/spew.py",
    "chars": 186,
    "preview": "#!<<PYTHON>>\nimport sys\nimport time\n\ncounter = 0\n\nwhile counter < 30000:\n    sys.stdout.write(\"more spewage %d\\n\" % coun"
  },
  {
    "path": "supervisor/tests/fixtures/test_1231.py",
    "chars": 487,
    "preview": "# -*- coding: utf-8 -*-\nimport logging\nimport random\nimport sys\nimport time\n\ndef main():\n    logging.basicConfig(level=l"
  },
  {
    "path": "supervisor/tests/fixtures/unkillable_spew.py",
    "chars": 186,
    "preview": "#!<<PYTHON>>\nimport time\nimport signal\nsignal.signal(signal.SIGTERM, signal.SIG_IGN)\n\ncounter = 0\n\nwhile 1:\n   time.slee"
  },
  {
    "path": "supervisor/tests/test_childutils.py",
    "chars": 5334,
    "preview": "from io import BytesIO\nimport sys\nimport time\nimport unittest\nfrom supervisor.compat import StringIO\nfrom supervisor.com"
  },
  {
    "path": "supervisor/tests/test_confecho.py",
    "chars": 389,
    "preview": "\"\"\"Test suite for supervisor.confecho\"\"\"\n\nimport unittest\nfrom supervisor.compat import StringIO\nfrom supervisor import "
  },
  {
    "path": "supervisor/tests/test_datatypes.py",
    "chars": 28505,
    "preview": "\"\"\"Test suite for supervisor.datatypes\"\"\"\n\nimport os\nimport signal\nimport socket\nimport tempfile\nimport unittest\n\nfrom s"
  },
  {
    "path": "supervisor/tests/test_dispatchers.py",
    "chars": 53561,
    "preview": "import unittest\nimport os\n\nfrom supervisor.compat import as_bytes\n\nfrom supervisor.tests.base import DummyOptions\nfrom s"
  },
  {
    "path": "supervisor/tests/test_end_to_end.py",
    "chars": 23297,
    "preview": "# ~*~ coding: utf-8 ~*~\nfrom __future__ import unicode_literals\n\nimport os\nimport signal\nimport sys\nimport unittest\nfrom"
  },
  {
    "path": "supervisor/tests/test_events.py",
    "chars": 20760,
    "preview": "import unittest\n\nfrom supervisor.tests.base import DummyOptions\nfrom supervisor.tests.base import DummyPConfig\nfrom supe"
  },
  {
    "path": "supervisor/tests/test_http.py",
    "chars": 25508,
    "preview": "import base64\nimport os\nimport stat\nimport socket\nimport tempfile\nimport unittest\n\nfrom supervisor.compat import as_byte"
  },
  {
    "path": "supervisor/tests/test_http_client.py",
    "chars": 13819,
    "preview": "import socket\nimport sys\nimport unittest\n\nfrom supervisor.compat import as_bytes\nfrom supervisor.compat import StringIO\n"
  },
  {
    "path": "supervisor/tests/test_loggers.py",
    "chars": 21288,
    "preview": "# -*- coding: utf-8 -*-\nimport errno\nimport sys\nimport unittest\nimport tempfile\nimport shutil\nimport os\nimport syslog\n\nf"
  },
  {
    "path": "supervisor/tests/test_options.py",
    "chars": 148442,
    "preview": "\"\"\"Test suite for supervisor.options\"\"\"\n\nimport os\nimport sys\nimport tempfile\nimport socket\nimport unittest\nimport signa"
  },
  {
    "path": "supervisor/tests/test_pidproxy.py",
    "chars": 592,
    "preview": "import os\nimport unittest\n\nclass PidProxyTests(unittest.TestCase):\n    def _getTargetClass(self):\n        from superviso"
  },
  {
    "path": "supervisor/tests/test_poller.py",
    "chars": 16533,
    "preview": "import unittest\nimport errno\nimport select\nfrom supervisor.tests.base import Mock\n\nfrom supervisor.poller import SelectP"
  },
  {
    "path": "supervisor/tests/test_process.py",
    "chars": 105894,
    "preview": "import errno\nimport os\nimport signal\nimport tempfile\nimport time\nimport unittest\n\nfrom supervisor.compat import as_bytes"
  },
  {
    "path": "supervisor/tests/test_rpcinterfaces.py",
    "chars": 106577,
    "preview": "# -*- coding: utf-8 -*-\nimport unittest\nimport operator\nimport os\nimport time\nimport errno\n\nfrom supervisor.tests.base i"
  },
  {
    "path": "supervisor/tests/test_socket_manager.py",
    "chars": 8434,
    "preview": "\"\"\"Test suite for supervisor.socket_manager\"\"\"\n\nimport gc\nimport os\nimport unittest\nimport socket\nimport tempfile\n\ntry:\n"
  },
  {
    "path": "supervisor/tests/test_states.py",
    "chars": 2113,
    "preview": "\"\"\"Test suite for supervisor.states\"\"\"\n\nimport unittest\nfrom supervisor import states\n\nclass TopLevelProcessStateTests(u"
  },
  {
    "path": "supervisor/tests/test_supervisorctl.py",
    "chars": 82395,
    "preview": "import unittest\nfrom supervisor import xmlrpc\nfrom supervisor.compat import StringIO\nfrom supervisor.compat import xmlrp"
  },
  {
    "path": "supervisor/tests/test_supervisord.py",
    "chars": 34607,
    "preview": "import unittest\nimport time\nimport signal\nimport sys\nimport os\nimport tempfile\nimport shutil\n\nfrom supervisor.states imp"
  },
  {
    "path": "supervisor/tests/test_templating.py",
    "chars": 63487,
    "preview": "# This file was originally based on the meld3 package version 2.0.0\n# (https://pypi.org/project/meld3/2.0.0/).  The meld"
  },
  {
    "path": "supervisor/tests/test_web.py",
    "chars": 7013,
    "preview": "import unittest\n\nfrom supervisor.tests.base import DummySupervisor\nfrom supervisor.tests.base import DummyRequest\n\nclass"
  },
  {
    "path": "supervisor/tests/test_xmlrpc.py",
    "chars": 35802,
    "preview": "import unittest\n\nfrom supervisor.tests.base import DummySupervisor\nfrom supervisor.tests.base import DummyRequest\nfrom s"
  },
  {
    "path": "supervisor/ui/status.html",
    "chars": 2366,
    "preview": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n   \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.d"
  },
  {
    "path": "supervisor/ui/stylesheets/supervisor.css",
    "chars": 3430,
    "preview": "/* =ORDER\n 1. display\n 2. float and position\n 3. width and height\n 4. Specific element properties\n 5. margin\n 6. border\n"
  },
  {
    "path": "supervisor/ui/tail.html",
    "chars": 630,
    "preview": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n   \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.d"
  },
  {
    "path": "supervisor/version.txt",
    "chars": 11,
    "preview": "4.4.0.dev0\n"
  },
  {
    "path": "supervisor/web.py",
    "chars": 24318,
    "preview": "import os\nimport re\nimport time\nimport traceback\nimport datetime\n\nfrom supervisor import templating\n\nfrom supervisor.com"
  },
  {
    "path": "supervisor/xmlrpc.py",
    "chars": 21438,
    "preview": "import datetime\nimport re\nimport socket\nimport sys\nimport time\nimport traceback\nimport types\nfrom xml.etree.ElementTree "
  },
  {
    "path": "tox.ini",
    "chars": 1384,
    "preview": "[tox]\nenvlist =\n    cover,cover3,docs,py27,py34,py35,py36,py37,py38,py39,py310,py311,py312,py313,py314\n\n[testenv]\ndeps ="
  }
]

About this extraction

This page contains the full source code of the Supervisor/supervisor GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 135 files (1.7 MB), approximately 397.7k tokens, and a symbol index with 3224 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!