supvisors 0.19.1
A Control System for Distributed Applications
Requires Python: >=3.6

# **Supvisors**
[![PyPI version][pypi-image]][pypi-url]
[![Python Versions][pypi-python-versions]][pypi-url]
[![License][license-image]][license-url]
[![Build Status][ci-image]][ci-url]
[![Coverage Status][coveralls-image]][coveralls-url]
[![Documentation Status][docs-image]][docs-url]
[![Downloads][downloads-image]][downloads-url]


**Supvisors** is a Control System for Distributed Applications, based on multiple instances of Supervisor
running over multiple nodes.

**Supvisors** works as a Supervisor plugin and its main features are:
* a new web-based dashboard that replaces the default dashboard of Supervisor and allows to control
  all the Supervisor instances declared,
* an extended XML-RPC API to control applications and processes over the multiple Supervisor instances,
* a notification interface to get the events from multiple Supervisor instances on a `websocket` or on a `PyZmq` socket.

A set of application and program rules can be added to manage:
* the starting sequence of the applications,
* the stopping sequence of the applications,
* the starting strategy of the processes,
* the strategy to apply when a process crashes or when a node shuts down,
* the strategy to apply when conflicts are detected.

The Supervisor program `supervisorctl` has been extended to include the additional XML-RPC API.

Also provided in the scope of this project:
* a `JAVA` client with a full implementation of the Supervisor and **Supvisors** XML-RPC API ;
* a `Flask-RESTX` application that exposes the Supervisor and **Supvisors** XML-RPC API through a REST API.

![Image of Supvisors' Dashboard](https://github.com/julien6387/supvisors/blob/master/docs/images/supvisors_address_process_section.png)

## Supervisor Enhancements

**Supvisors** proposes a contribution to the following Supervisor issues:
* [#122 - supervisord Starts All Processes at the Same Time](https://github.com/Supervisor/supervisor/issues/122)
* [#177 - Dynamic numproc change](https://github.com/Supervisor/supervisor/issues/177)
* [#456 - Add the ability to set different "restart policies" on process workers](https://github.com/Supervisor/supervisor/issues/456)
* [#520 - allow a program to wait for another to stop before being stopped?](https://github.com/Supervisor/supervisor/issues/520)
* [#591 - New Feature: disable/enable](https://github.com/Supervisor/supervisor/issues/591)
* [#712 - shutdown supervisord once one of the programs is killed](https://github.com/Supervisor/supervisor/issues/712)
* [#723 - Restart waits for all processes to stop before starting any](https://github.com/Supervisor/supervisor/issues/723)
* [#763 - unexpected exit not easy to read in status or getProcessInfo](https://github.com/Supervisor/supervisor/issues/763)
* [#874 - Bring down one process when other process gets killed in a group](https://github.com/Supervisor/supervisor/issues/874)
* [#1023 - Pass arguments to program when starting a job?](https://github.com/Supervisor/supervisor/issues/1023)
* [#1150 - Why do event listeners not report the process exit status when stopped/crashed?](https://github.com/Supervisor/supervisor/issues/1150)
* [#1455 - using supervisorctl with -s does not provide access to the extended API](https://github.com/Supervisor/supervisor/issues/1455)
* [#1504 - Web interface: Add stop group Action](https://github.com/Supervisor/supervisor/issues/1504)


## Supported Platforms

**Supvisors** has been tested and is known to run on Linux (Rocky 8, RedHat 8, Ubuntu 20 to 24).
It will likely work fine on most UNIX systems.

**Supvisors** will not run at all under any version of Windows.

**Supvisors** works with `Python 3.9` to `Python 3.14`.

Due to the lack of support of `Python 3.6` and `Python 3.7` in the Ubuntu releases provided in the Standard
GitHub-hosted runners, **Supvisors** is now based on the minimal `Python` release provided in RedHat 9,
i.e., `Python 3.9`.

**Supvisors** 0.18.7 is therefore the last version supporting `Python 3.6` to `Python 3.8`.

## Dependencies

**Supvisors** has dependencies on:

| Package                                            | Optional | Minimal release |
|----------------------------------------------------|----------|-----------------|
| [Supervisor](http://supervisord.org)               |          | 4.2.4           |
| [psutil](https://pypi.python.org/pypi/psutil)      | X        | 5.9.0           |
| [matplotlib](http://matplotlib.org)                | X        | 3.5.1           |
| [lxml](http://lxml.de)                             | X        | 4.8.0           |
| [Flask-RESTX](https://flask-restx.readthedocs.io)  | X        | 1.2.0           |
| [PyZMQ](http://pyzmq.readthedocs.io)               | X        | 25.1.1          |
| [websockets](https://websockets.readthedocs.io)    | X        | 11.0.3          |

Please note that some of these dependencies may have their own dependencies.

Versions are given for information.
Although **Supvisors** has been developed and tested with these releases, the minimal release of each dependency
is unknown. Other releases are likely working as well.


## Installation

Supvisors can be installed with `pip install`:

```bash
   # minimal install (including only Supervisor and its dependencies)
   [bash] > pip install supvisors

   # extra install for all optional dependencies
   [bash] > pip install supvisors[all]
```

## Documentation

You can view the current **Supvisors** documentation on [Read the Docs](http://supvisors.readthedocs.io).

You will find detailed installation and configuration documentation.

## Reporting Bugs and Viewing the Source Repository

Please report bugs in the [GitHub issue tracker](https://github.com/julien6387/supvisors/issues).

You can view the [source repository](https://github.com/julien6387/supvisors) for Supvisors.

## Contributing

Not opened yet.

[pypi-image]: https://badge.fury.io/py/supvisors.svg
[pypi-python-versions]: https://img.shields.io/pypi/pyversions/supvisors.svg
[pypi-url]: https://badge.fury.io/py/supvisors

[license-image]: https://img.shields.io/badge/License-Apache_2.0-blue.svg
[license-url]: https://opensource.org/licenses/Apache-2.0

[ci-image]: https://github.com/julien6387/supvisors/actions/workflows/ci.yml/badge.svg?branch=master
[ci-url]: https://github.com/julien6387/supvisors/actions/workflows/ci.yml

[coveralls-image]: https://coveralls.io/repos/github/julien6387/supvisors/badge.svg?branch=master
[coveralls-url]: https://coveralls.io/github/julien6387/supvisors?branch=master

[docs-image]: https://readthedocs.org/projects/supvisors/badge/?version=master
[docs-url]: https://supvisors.readthedocs.io/en/master

[downloads-image]: https://static.pepy.tech/badge/supvisors/month
[downloads-url]: https://pepy.tech/project/supvisors


# Change Log

## 0.19.1 (2026-02-01)

* Fix [Issue #134](https://github.com/julien6387/supvisors/issues/134).
  Reload the **Supvisors** process configuration after Supervisor is updated.

* Fix the distribution logic when multiple applications are in the same starting stage, especially when `LESS_LOADED`
  or `MOST_LOADED` strategies are used.

* Fix `get_network_info` when used with a **Supvisors** nickname.

* Consider the case where process events are received and ignored during the **Supvisors** handshake.

* In the application rules of a **Supvisors** rules file, in combination with the use of an application `pattern`,
  allow the use of stereotypes and aliases associated with the hashtag symbol '#' in the application `identifiers`.

* Set the local **Supvisors** nickname with the Supervisor identifier when available.

* Prevent a **Supvisors** instance to be internally registered more than once at node level.

* Add the XML-RPC `get_core_identifiers` to return the resolved **Supvisors** core instances.

* Set the lower limit of the option `synchro_timeout` to 0 instead of 15 (Default value remains unchanged).

* Speed-up the entry in SYNCHRONIZATION state.

* Strengthen robustness against `psutil` issues related to certain operating systems.

* Review HTTP error codes returned by the REST API in `supvisorsflask`.

* CI target added for Python 3.14.


## 0.19 (2025-07-21)

* Python 3.9 becomes the minimal version.
  Python 3.6 to Python 3.8 are not supported anymore.

* Fix the statistics compiler, so that it manages the **Supvisors** instances discovered.

* Refactoring of the **Supvisors** internal state machine.
  The state `INITIALIZATION` has been renamed as `SYNCHRONIZATION` and a new state `ELECTION` has been added
  to get more stability in the *Master* election.

* Implement the enhancement requested through the [Pull Request #120](https://github.com/julien6387/supvisors/pull/120).
  **Supvisors** uses the `ioctl` functions to get the relevant network data on all network interfaces and matches
  the local instance on the whole information available.
  During the handshake, the local network data is shared with the other **Supvisors** instances using the new XML-RPC
  `get_network_info`.

* Take into account the network data in the **Supvisors** Web UI, so that the same network interface is used
  when navigating to another node.

* Constraint the handshake in time, so that late notifications are not considered.

* Check the strategy consistency in the handshake.
  If the options `auto_fence`, `starting_strategy`, `conciliation_strategy` and `supvisors_failure_strategy` are not
  strictly identical, the local and remote Supvisors instances will isolate each other.

* Add a session cookie to the **Supvisors** Web UI client.
  All statistics images served by the **Supvisors** Web UI are renamed to allow multiple auto-refreshed views
  in the browser tabs. 

* Rework the XML-RPC `restart_sequence` logic, so that it does not require a **Supvisors** state change.

* Add the XML-RPCs `get_instance_state_modes` and `get_all_instances_state_modes` in support of getting detailed state
  and modes information from a single **Supvisors** instance.
  This information has been removed from the XML-RPCs `get_instance_info` and `get_all_instances_info`.

* Update the `stop_process` command, so that the XML-RPC request is sent only to running-like processes.

* Update the `get_master_identifier` XML-RPC, so that it returns both the identifier and its nickname in a dictionary.
  The `master` command is updated accordingly.

* Add a new option `supvisors_failure_strategy` to decide what to do when the initial conditions are not met anymore.

* Add a new option `css_files` to allow user CSS in the **Supvisors** Web UI.

* Remove the **Supvisors** instance state `UNKNOWN`, and rename `SILENT` as `STOPPED` (default value).
  **Supvisors** instances are `STOPPED` when created.

* Add the process PID to the process statistics event.

* Add a timestamp to the events of the **Supvisors** event interface.
  This timestamp is also added to the XML-RPCs `get_supvisors_state`, `get_instance_state_modes`,
  `get_all_instances_state_modes`, `get_application_info`, `get_all_applications_info`, `get_process_info`,
  `get_all_process_info`.
  The `last_event_time` in the Process status event is renamed as `last_event_mtime`.

* Update the upper-left hyperlink of the **Supvisors** instance box in the main **Supvisors** Web page,
  so that it leads to the same page, as provided by the other **Supvisors** instance, instead of leading
  to the Supervisor page of the other **Supvisors** instance. 

* Cancel individual subscriptions from the Supervisor events rather than perform a global clear.

* Consider variable CPU frequency value returned by `psutil`.

* Apply the XML-RPC updates on the JAVA client and the Flask interface.

* CI target added for Python 3.13.


## 0.18.7 (2025-01-10)

* Last **Supvisors** version supporting Python 3.6 to Python 3.8.

* Fix a random Python crash due to an I/O exception when the Supervisor log file is rolling over.

* Fix a possible race condition in the Supervisor proxies management.


## 0.18.6 (2024-08-20)

* Completion of fix about process CPU statistics when using SOLARIS mode.

* Add a grid to statistics plots in the **Supvisors** Web UI.


## 0.18.5 (2024-08-19)

* Fix process CPU statistics when using SOLARIS mode.
  Issue introduced in **Supvisors** 0.18 with statistics refactoring.


## 0.18.4 (2024-07-13)

* Fix `supervisord` uptime in the **Supvisors** Web UI.
  Issue introduced in **Supvisors** 0.18 with monotonic time consideration.

* Set a default warning message to state that Supvisors rules don't apply on the Supervisor page
  of the **Supvisors** Web UI.

* Emphasize the selected Supervisor instance and Application in the navigation of the **Supvisors** Web UI.

* In discovery mode, clarify the logs in the event where the **Supvisors** nick identifier is not unique.

* Add a section about multicast in documentation troubleshooting.


## 0.18.3 (2024-06-05)

* Recreate the internal proxy to the local Supervisor if older than 20 minutes, in order to palliate the closure
  of all channels inactive during 30 minutes in the Supervisor HTTP server.
  This fixes a rare bug that has been introduced in **Supvisors** 0.17, and whose occurrence has greatly
  increased after the refactoring of the **Supvisors** 0.18 internal communications.

* Swap Memory and Network statistics cards in the **Supvisors** Web UI.


## 0.18.2 (2024-05-27)

* Handle the `PermissionError` exception when trying to get disk usage.

* Update CSS for overflow parts in the **Supvisors** Web UI.


## 0.18.1 (2024-05-26)

* Fix the different perception of **Supvisors** instances about a process whose state is forced.

* Fix regression using the `SINGLE_NODE` distribution rule.

* Share the configuration of `stdout` and `stderr` log files between all **Supvisors** instances. 
  `has_stdout` and `has_stderr` are added to the result of the XML-RPC `get_local_process_info`.

* When the `software_name` option is set, it is used as a prefix in all log traces.

* Add disk usage and read/write statistics to the **Supvisors** Web UI.
  Disk statistics are published to the event interface and the JAVA client has been updated accordingly.

* In the Application page of the **Supvisors** Web UI, add the possibility to expand the process information
  from all **Supvisors** instances where it is configured.
  In the event of a process conflict, a `Conciliate` button is displayed instead od a list of **Supvisors** instances.
  Clicking on this button displays the Conciliation page.

* Split the Main and Conciliation pages of the **Supvisors** Web UI.

* The conflicting processes are highlighted in the Main page of the **Supvisors** Web UI.

* Change the access of the Conciliation page of the **Supvisors** Web UI, by clicking on the `CONCILIATION` state.
  A click on the **Supvisors** logo always brings back the Main page.

* Fix the renaming of `DEPLOYMENT` state as `DISTRIBUTION` in the JAVA client.


## 0.18 (2024-05-02)

* Refactoring of the **Supvisors** internal communications.
  The `internal_port` of the **Supvisors** section in the Supervisor configuration file is no longer needed.
  As a consequence, the `supvisors_list` option is simplified as follows: `<identifier>host_name:http_port`. 
  The transitional `SupvisorsInstanceStates.ISOLATING` state has been removed.
  The remote **Supvisors** instance becomes `SILENT` as soon as the event publication fails due to a transport issue.

* Implement [Issue #50](https://github.com/julien6387/supvisors/issues/50).
  A new tag `operational_status` in the Application rules allows to declare the formula applicable to evaluate the
  application operational status.
  `status_formula` is added to the result of the XML-RPC `get_application_rules`.

* Implement [Issue #15](https://github.com/julien6387/supvisors/issues/15).
  A `StarterModel` has been added to **Supvisors** to give a prediction of the application distribution when started.
  The command is available through the new XML-RPCs `test_start_application` and `test_start_process` and have been
  added to `supervisorctl`.

* The **Supvisors** `core_identifiers` option and the **Supvisors** rules can now accept indifferently Supervisor
  identifiers or keys with the `host:http_port` format.

* Update the `get_instance_info` XML-RPC so that the function accepts a stereotype as parameter.
  As a consequence, it now returns a list of dictionaries.

* Add a `lazy` attribute to the `update_numprocs` XML-RPC, so that when set combined to a numprocs decrease,
  **Supvisors** defers the obsolete processes deletion from the Supervisor configuration only when the processes stop
  (exit, crash or later user request) instead of stopping them immediately.

* Add monotonic time in internal model and exchanges to cope with time updates while **Supvisors** is running.
  Impact on the XML-RPC `get_instance_info`, `get_process_info` and on the event interface for instance status
  and process event.

* Add new `get_statistics_status`, `enable_host_statistics`, `enable_process_statistics`, `update_collecting_period`
  XML-RPCs to support the possibility to get and update the collection of host and process statistics.
  The corresponding commands `stats_status`, `enable_stats` and `stats_period` have been added to `supervisorctl`.
  The JAVA client includes the new XML-RPCs.

* Add new `get_all_inner_process_info` and `get_inner_process_info` XML-RPCs to support debug investigation.
  They return internal information on the processes declared on a **Supvisors** instance.

* Move the host statistics collector to the statistics collector process. 
  The option `stats_collecting_period` is now applicable to host statistics collector.

* Re-apply the eventual process `extra_args` when restarting the application.

* In the Supervisors navigation menu of the Web UI, add a red light to Supervisor instances having raised a failure.

* Allow the display of a software name and icon at the top of the **Supvisors** Web UI.
  The options `software_name` and `software_icon` have been added to the **Supvisors** section of the Supervisor
  configuration file.

* All internal identifiers are now based on the `host:http_port` format.

* Rename the `DEPLOYMENT` state as `DISTRIBUTION` state to lift ambiguity ("deployment" is rather connoted when dealing
  with the orchestration domain).

* Rework **Supvisors** `RPCInterface` exceptions.

* Rework the style of the **Supvisors** Web UI.


## 0.17.4 (2024-03-24)

* Fix bug that was randomly blocking **Supvisors** on restart or shutdown, due to a stdout flush hanging in
  multiprocessing bowels. The statistics Process is now started before any other thread.

* `guest` time removed from because CPU calculation because it is already accounted in `user` time on Linux.

* Fix process CPU so that it corresponds to the Linux `top` result.

* Use the latest versions of Sphinx-related modules for documentation, as `sphinx-5.0` is now the minimal dependency.


## 0.17.3 (2023-12-14)

* Fix regression when displaying the Network statistics in the **Supvisors** Web UI.

* Add restrictions to `flask-restx` dependencies.


## 0.17.2 (2023-12-04)

* Fix rare I/O exception by joining the `SupervisorsProxy` thread before exiting the `SupvisorsMainLoop`.

* Fix rare exception when host network statistics are prepared for display in the **Supvisors** Web UI in the event
  where network interfaces have different history sizes.

* Fix the **Supvisors** identifier possibilities when using the distribution rule `SINGLE_INSTANCE`.

* Update the process statistics collector thread so that it exits by itself when `supervisord` is killed.

* Improve the node selection when using the distribution rule `SINGLE_NODE`.

* Use an asynchronous server in the **Supvisors** internal communications.
  The refactoring fixes an issue with the TCP server that sometimes wouldn't bind despite the `SO_REUSEADDR` set.

* Restore the `action` class in the HTML of the **Supvisors** Web UI.

* CI targets added for Python 3.11 and 3.12.


## 0.17 (2023-08-17)

* Fix [Issue #112](https://github.com/julien6387/supvisors/issues/112).
  Write the disabilities file even if no call to `disable` and `enable` XML-RPCs have been done.
  Try to create the folder at startup if it does not exist.

* Fix a case where the `Starter` would block if the process reaches the expected state without reception
  of the corresponding event.

* Fix typo for `zmq` requirement when installing **Supvisors** from `pypi`.

* Fix `flask-restx` dependency in setup according to Python version.

* Fix uncaught exception the request to start a process is rejected due to a lack of resources.
  The exception was dependent from the Python version (absent in 3.6 but raised in 3.9).

* Monkeypatch fix of [Supervisor Issue #1596](https://github.com/Supervisor/supervisor/issues/1596).
  Shutdown of the asyncore socket before it is closed.

* Improve robustness against network failures. All Supervisor events are applied to the local **Supvisors** instance
  before they are published, so that it remains functional despite a network failure.
  The internal TCP sockets are rebound when a network interface becomes up (requires `psutil`).

* Provide a discovery mode where the **Supvisors** instances are added on-the-fly without declaring them in
  the `supvisors_list` option. The function relies on a Multicast Group definition (options `multicast_group`,
  `multicast_interface` and `multicast_ttl` added to that purpose).
  The attribute `discovery_mode` is added to the `get_state` and `get_instance_info` XML-RPCs.

* Add a new option `stereotypes` to support the discovery mode. The `identifiers` of the Application and Program rules
  can now reference a **Supvisors** stereotype in addition to identifiers and aliases.
  By extension, it is made available to the non-discovery mode.

* Add a new option `syncho_options` to enable the user to choose the conditions putting an end to the **Supvisors**
  synchronization phase.
  More particularly when using the new `USER` condition, the **Supvisors** Web UI provides a means to end the
  `INITIALIZATION` state, with optional *Master* selection. The command is also available as an XML-RPC `end_synchro`
  and has been added to `supervisorctl`.

* The new item `@` in the `identifiers` of the Program rules takes the behavior of the item `#` as it was
  before **Supvisors** version 0.13, i.e. the assignment is strictly limited by the length of the `identifiers` list,
  without roll-over.
  NOTE: This is not available for Application rules.

* Use host aliases when looking for the local **Supvisors** instance.

* Use IP address rather than host identification when dealing with `SINGLE_NODE` starting strategy. 

* To prevent the situation that led the `Starter` to block, a new state `CHECKED` is added to `SupvisorsInstanceStates`,
  which is actually a pre-`RUNNING` state.
  Such a **Supvisors** instance is considered active and is updated with received events but cannot be part of any
  starting sequence until all starting jobs in progress are completed.

* Limit the consideration of the process forced state to display in the Application page of the **Supvisors** Web UI,
  so that it does not interfere with the real process state.

* Add `master_identifier` to the output of the XML-RPCs `get_supvisors_state` and `get_instances_info`.
  The `supervisorctl` commands `sstate` and `instance_status` have also been updated.

* Monkeypatch **Supervisor** on-the-fly so that its logger is thread-safe and add log traces in **Supvisors** threads.

* Simplify the **Supvisors** state machine and replace the states `RESTART` and `SHUTDOWN` by a single state `FINAL`.

* Highlight the process line hovered by the cursor in the **Supvisors** Web UI.

* Remove the figures from the **Supvisors** Web UI when `matplotlib` is not installed.

* Add RPC `changeLogLevel` to the JAVA client.

* Do not catch XmlRpc exceptions in the JAVA client.

* Refactoring of the **Supvisors** internal communications.


## 0.16 (2023-03-12)

* Add `websockets` as an option to the **Supvisors** event listener (Python 3.7+ only).

* Re-design the `PyZMQ` event listener using the `zmq.asyncio` support for better commonalities
  with the `wesockets` solution.

* Re-design the statistics collection and compilation.

* The option `stats_enabled` takes additional values to control host and process statistics independently.

* The option `stats_collecting_period` has been added to set the minimum time between process statistics collection.

* The option `stats_periods` accepts float values, not necessarily multiples of 5.

* Fix [Issue #54](https://github.com/julien6387/supvisors/issues/54).
  Add host and process statistics to the **Supvisors** event interface.

* Fix children process CPU times in statistics.

* Fix Solaris mode not taken into account for the process mean CPU value in the **Supvisors** Web UI.

* Fix Flask `start_args` to pass the extra arguments in the URL attributes rather than in the route.

* Only one **Supvisors** instance is running when both `unix_http_server` and `inet_http_server` sections are defined
  in the supervisor configuration file.

* The local **Supvisors** instance is identified as the item having the same fully qualified domain name
  (as returned by `socket.gethostaddr` and `socket.getfqdn`) among the items of the `supvisors_list` option. 

* Use the HTTP server port to help the identification of the local **Supvisors** instance when multiple items
  of the `supvisors_list` option fit and identifier is not set.

* The attribute `process_failure` is added to the `get_instance_info` XML-RPC to inform if there is a process failure
  in the **Supvisors** instance. The attribute is also provided in the event interface and in the `instance_status`
  option of the `supervisorctl` command. 

* Raise an exception when the matching **Supvisors** instance in the `supvisors_list` option is inconsistent
  with the local configuration.

* Add a **Supvisors** logo.


## 0.15 (2022-11-20)

* Publish / Subscribe pattern implemented for **Supvisors** internal communication.
  `PyZmq` is now only used for the optional external publication interface.

* Make **Supvisors** robust to `addProcessGroup` / `removeProcessGroup` / `reloadConfig` Supervisor XML-RPCs.

* Fix process CPU times in statistics so that children processes are all taken into account.

* Fix regression in `supervisorctl application_rules` where the former `distributed` entry was still used
  instead of `distribution`. 

* Fix uncaught exception when an unknown host name or IP address is used in the `supvisors_list` option.

* Fix `ProcessEvent` publication when no resource is available to start a process. 

* Fix `SupvisorsStatus` event in JAVA ZMQ client.

* Manage the `RuntimeError` exception that could be raised by matplotlib when saving a graph.

* Add `all_start` and `all_start_args` to the list of `supervisorctl` commands. These commands respectively invoke
  `supervisor.startProcess` and `supvisors.start_args` on all running **Supvisors** instances.

* Add `tail_limit` and `tailf_limit` options to override the default 1024 bytes used by Supervisor to display
  the Tail pages of the Web UI.

* Inactive Log Clear / Stdout / Stderr buttons in the Web UI if no stdout / stderr is configured. 

* Add resolution to `ProcessStatus` time information and store event time, so that forced state is correctly considered.

* A process is not considered disabled anymore when process rules don't allow any candidate **Supvisors** instance.

* When `psutil` is not installed on a host, the statistics-related options of the Process and Host pages
  of the Web UI are not displayed, just as if the option `stats_enabled` was set to `False`.

* Clarify the exceptions that could be raised in **Supvisors** startup.

* Add a FAQ to the documentation.


## 0.14 (2022-05-01)

* Implement [Supervisor Issue #1054](https://github.com/Supervisor/supervisor/issues/1054).
  Start / Stop / Restart buttons have been added to groups in the Supervisor page of the Web UI so that it is possible
  to start / stop / restart all the processes of the group at once.
  The application state and description have been removed from this table as the information was confusing.

* Fix issue where starting strategies would not work as expected when multiple **Supvisors** instances run on the same
  node but their `host_name` is identified differently in the option `supvisors_list`.

* Replace on-the-fly the Supervisor `gettags` function so that the XML-RPC `system.methodSignature` works with both
  Supervisor and **Supvisors**.

* Use `socket.gethostaddr` to validate the host names provided in the option `supvisors_list`.

* In the Application page of the Web UI, apply a *disabled* status to programs that are disabled on all their possible
  **Supvisors** instances (according to rules and configuration).

* Maintain the auto-refresh set on the **Supvisors** `restart` / `shutdown` actions of the Web UI.

* Change the style of the *matplotlib* graphs.


## 0.13 (2022-02-27)

* Implement [Supervisor Issue #591](https://github.com/Supervisor/supervisor/issues/591).
  It is possible to disable/enable programs using the new `disable` and `enable` XML-RPCs. 
  A new option `disabilities_file` has been added to support the persistence.
  The `disabled` status of the processes is made available through the `supvisors.get_local_process_info` XML-RPC and
  in the process table of the Web UI.

* Fix issue where **Supvisors** may be blocked in the `DEPLOYMENT` phase due to late process events.

* Add a new `start_any_process` XML-RPC that starts one process whose namespec matches the regular expression.

* Add a `wait` parameter to the `update_numprocs` XML-RPC.

* Add the principle of **Supvisors** modes to the output of the XML-RPCs `get_supvisors_state` and `get_instance_info`.
  The modes are linked to the existence of jobs in progress in `Starter` and `Stopper`.

* The **Supvisors** modes are displayed to the Main page of the Web UI and the **Supvisors** instance modes are
  displayed to the Process and Host pages of the Web UI. In the navigation menu, the local **Supvisors** instance
  points out the **Supvisors** instances where the modes are activated, and the applications involved in its own
  `Starter` or `Stopper`.

* When using the item `#` in the `identifiers` of the Application or Program rules and with a number of candidate
  applications or processes greater than the candidate `identifiers`, the assignment is performed by rolling over
  the `identifiers` list. 

* Add pid and uptime information to the `supervisord` entry of the process table in the Web UI.

* The application rules of a **Supvisors** rules file can be inserted in any order.

* Protect the Supervisor thread against any exception that could be raised by **Supvisors** when processing a Supervisor
  event.

* Provide a Flask server that can be added as a Supervisor program to interact with **Supvisors** using a REST API.

* Update the CSS style of the inactive buttons in the Web UI.

* Fix CSS resources table cell height with recent versions of Firefox.

* Update the Web UI to allow multiple processes per line in the **Supvisors** instance boxes.

* Remove support to deprecated option `distributed` and to the possibility to have the `program` element directly
  under the `application element` in a **Supvisors** rules file.


## 0.12 (2022-01-26)

* Fix crash following a `supervisorctl update` as the group added doesn't include `extra_args` and `command_ref`
  attributes in the Supervisor internal structure.

* Fix crash when the state of the **Supvisors** master is received before any **Supvisors** instance has been confirmed.

* Fix crash when receiving process state events from a **Supvisors** instance that has been checked while it was in a
  `RESTARTING` state.

* Fix regression in **Supvisors** restarting / shutting down as the *Master* would actually restart / shut down
  before notifying the other **Supvisors** instances of its state. The new **Supvisors** state `RESTART` has been
  introduced. 

* Add `supervisord` entry to the process table of the **Supvisors** instance in the Web UI.
  This entry provides process statistics and the possibility to view the Supervisor logs.

* Fix issue in Web UI with the Solaris mode not applied to the process CPU plot.

* Fix CSS for Supvisors instance boxes (table headers un-stickied) in the Main page of the Web UI.

* Fix process children CPU times counted twice in statistics.

* Add regex support to the `pattern` attribute of the `application` and `program` elements of the **Supvisors** rules
  file.

* The `distribution` option has been added to replace the `distributed` option in the **Supvisors** rules file.
  The `distributed` option is deprecated and will be removed in the next version.

* Update the starting strategies so that the node load is considered in the event where multiple **Supvisors** instances
  are running on the same node. The `LESS_LOADED_NODE` and `MOST_LOADED_NODE` starting strategies have been added.

* Update the `RunningFailureHandler` so that `Starter` and `Stopper` actions are all stored before they are actually 
  triggered.

* Add the `RESTART` and `SHUTDOWN` strategies to the `running_failure_strategy` option.

* Update `Starter` and `Stopper` so that event timeouts are based on ticks rather than time.

* Update `InfanticideStrategy` and `SenicideStrategy` so that the conciliation uses the `Stopper`.
  This avoids duplicated conciliation requests when entering the `CONCILIATION` state.

* When receiving a forced state due to a `Starter` or `Stopper` timeout, check if the expected process state has been
  reached before actually forcing the state. Events may have crossed.

* The `programs` section has been added in the `application` section of the **Supvisors** rules file.
  All `program` definitions should be placed in this section rather than directly in the `application` section.
  The intention is for the next **Supvisors** version to be able to declare application options in any order.
  Note that having `program` sections directly in the `application` section is still supported but deprecated
  and will be removed in the next version.

* Add the `starting_failure_strategy` option in the `program` section of the **Supvisors** rules file.
  It supersedes the values eventually set in the `application` section.

* Add the `inactivity_ticks` option to the **Supvisors** section of the Supervisor configuration file to enable more
  flexibility in a congested system.

* Add `node_name` and `port` information to the result of the `get_instance_info` XML-RPC and to the instance status
  of the **Supvisors** event listener.

* In the Process page of the Web UI, add buttons to shrink / expand all applications.

* Use a different gradient in the Web UI for running processes that have ever crashed.

* Fix CSS process table cell height with recent versions of Firefox.

* Use hexadecimal strings for the `shex` attribute in the Web UI URL. 

* Add `action` class to the start/stop/restart/shutdown buttons in the headers of the **Supvisors** web pages.

* Move PyZmq sockets creation to the main thread so that a bind error is made explicit in log traces.

* Remove support to deprecated options, attributes and XML-RPCs (`address_list`, `force_synchro_if`, `rules_file`,
  `address_name`, `addresses`, `get_master_address`, `get_address_info` and `get_all_addresses_info`).


## 0.11 (2022-01-02)

* Fix [Issue #99](https://github.com/julien6387/supvisors/issues/99).
  Update the **Supvisors** design so that it can be used to supervise multiple Supervisor instances on multiple nodes.
  This update had a major impact on the source code. More particularly:
  - The XML-RPCs `get_master_identifier`, `get_instance_info` and `get_all_instances_info` have been added to replace
    `get_master_address`, `get_address_info` and `get_all_addresses_info`.
  - The `supervisorctl` command `instance_status` has been added to replace `address_status`.
  - The XML-RPCs that would return attributes `address_name` and `addresses` are now returning `identifier` and
    `identifiers` respectively. This impacts the following XML-RPCs (and related `supervisorctl` commands):
    - `get_application_info`
    - `get_all_application_info`
    - `get_application_rules`
    - `get_address_info`
    - `get_all_addresses_info`
    - `get_all_process_info`
    - `get_process_info`
    - `get_process_rules`
    - `get_conflicts`.
  - The `supvisors_list` option has been added to replace `address_list` in the **Supvisors** section of the Supervisor
    configuration file. This option accepts a more complex definition: `<identifier>host_name:http_port:internal_port`.
    Note that the simple `host_name` is still supported in the event where **Supvisors** doesn't have to deal
    with multiple Supervisor instances on the same node.
  - The `core_identifiers` option has been added to replace `force_synchro_if` in the **Supvisors** section of the
    Supervisor configuration file. It targets the names deduced from the `supvisors_list` option.
  - The `identifiers` option has been added to replace the `addresses` option in the **Supvisors** rules file.
    This option targets the names deduced from the `supvisors_list` option.
  - The `address`-like attributes, XML-RPCs and options are deprecated and will be removed in the next version.

* Fix [Issue #98](https://github.com/julien6387/supvisors/issues/98).
  Move the heartbeat emission to the Supvisors thread to avoid being impacted by a Supervisor momentary freeze.
  On the heartbeat reception part, consider that the node is `SILENT` based on a number of ticks instead of time.

* Fix issue with `supvisors.stop_process` XML-RPC that wouldn't stop all processes when any of the targeted processes
  is already stopped.

* Fix exception when authorization is received from a node that is not in `CHECKING` state. 

* Fix regression (missing disconnect) on node isolation when fencing is activated.

* Fix issue in statistics compiler when network interfaces are dynamically created / removed.

* Refactoring of `Starter` and `Stopper`.

* The module `rpcrequests` has been removed because useless.
  The function `getRPCInterface` of th module `supervisor.childutils` does the job.

* The `startsecs` and `stopwaitsecs` program options have been added to the results of `get_all_local_process_info` and
  `get_local_process_info`.

* The option `rules_file` is updated to `rules_files` and supports multiple files for **Supvisors** rules.
  The option `rules_file` is thus deprecated and will be removed in the next version.

* Add a new `restart_sequence` XML-RPC to trigger a full application start sequence.

* Update the `restart_application` and `restart_process` XML-RPC so that processes can restart themselves using them.

* Add `expected_exit` to the output of `supervisorctl sstatus` when the process is `EXITED`.

* Add the new option `stats_enabled` to enable/disable the statistics function.

* Update `start_process`, `stop_process`, `restart_process`, `process_rules` in `supervisorctl` so that calls are made
  on each individually process rather than process group when `all` is used as parameter.

* Add exit codes to erroneous **Supvisors** calls in `supervisorctl`.

* When aborting jobs when re-entering the `INITIALIZATION` state, clear the structure holding the jobs in progress.
  It has been found to stick **Supvisors** in the `DEPLOYMENT` state in the event where the *Master* node is temporarily
 `SILENT`.

* Restrict the use of the XML-RPCs `start_application`, `stop_application`, `restart_application` to *Managed*
  applications only.

* Review the logic of the refresh button in the Web UI.

* Add node time to the node boxes in the Main page of the Web UI.

* Sort alphabetically the entries of the application menu of the Web UI.

* Update the mouse point