Skip to content
Python daemon for controlling/sequentially executing commands to PDUs (Power Distribution Units)
Python Shell
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.


Python daemon for controlling/sequentially executing commands to PDUs (Power Distribution Units)

Why is this needed?


Most PDUs have a very low power microprocessor, or low quality software, which cannot handle multiple requests at the same time. This quickly becomes an issue in environments that use power control frequently, such as board farms, and gets worse on PDUs that have a large number of controllable ports.


Every PDU manufacturer has a different way of controlling their PDUs. Though many support SNMP, there's still no single simple way to communicate with all PDUs if you have a mix of brands.

Supported devices list

APC, Devantech and ACME are well supported, however there is no official list yet. The file is a good place to see all the current drivers.


Debian packages are on the way, hopefully. For now, make sure the requirements are met and then:

python3 install

There is an official Docker container updated from tip:

$ docker pull pdudaemon/pdudaemon:latest
$ vi pdudaemon.conf

To create a config file, use share/pdudaemon.conf as a base, then mount your config file on top of the default:

$ docker run -v `pwd`/pdudaemon.conf:/config/pdudaemon.conf pdudaemon/pdudaemon:latest

Or you can build your own:

$ git clone
$ cd pdudaemon
$ vi share/pdudaemon.conf
	- configure your PDUs
$ sudo docker build -t pdudaemon --build-arg HTTP_PROXY=$http_proxy -f Dockerfile.dockerhub .
$ docker run --rm -it -e http_proxy=$http_proxy -e https_proxy=$https_proxy -e NO_PROXY="$no_proxy" --net="host" pdudaemon:latest

Config file

To be added.

Making a power control request

  • HTTP The daemon can accept requests over plain HTTP. The port is configurable, but defaults to 16421 There is no encryption or authentication, consider yourself warned. To enable, change the 'listener' setting in the 'daemon' section of the config file to 'http'. This will break 'pduclient' requests. An HTTP request URL has the following syntax:



    • pdudaemon-hostname is the hostname or IP address where pdudaemon is running (e.g.: localhost)
    • pdudaemon-port is the port used by pdudaemon (e.g.: 16421)
    • command is an action for the PDU to execute:
      • on: power on
      • off: power off
      • reboot: reboot
    • query-string can have 3 parameters (same as pduclient, see below)
      • hostname: the PDU hostname or IP address used in the configuration file (e.g.: "")
      • port: the PDU port number
      • delay: delay before a command runs (optional, by default 5 seconds)

    Some example requests would be:

    $ curl "http://localhost:16421/power/control/on?hostname="
    $ curl "http://localhost:16421/power/control/off?hostname="
    $ curl "http://localhost:16421/power/control/reboot?hostname="

    Return Codes

    • HTTP 200 - Request Accepted
    • HTTP 503 - Invalid Request, Request not accepted
  • TCP (legacy pduclient) The bundled client is used when PDUDaemon is configured to listen to 'tcp' requests. TCP support is considered legacy but will remain functional.

Usage: pduclient --daemon deamonhostname --hostname pduhostname --port pduportnum --command pducommand

PDUDaemon client

  -h, --help            show this help message and exit
                        PDUDaemon listener hostname (ex: localhost)
                        PDU Hostname (ex: pdu05)
  --port=PDUPORTNUM     PDU Portnumber (ex: 04)
  --command=PDUCOMMAND  PDU command (ex: reboot|on|off)
  --delay=PDUDELAY      Delay before command runs, or between off/on when
                        rebooting (ex: 5)
  • non-daemon (also called drive) If you would just like to use pdudaemon as an executable to drive a PDU without needing to run a daemon, you can use the --drive option. Configure the PDU in the config file as usual, then launch pdudaemon with the following options
$ pdudaemon --conf=share/pdudaemon.conf --drive --hostname pdu01 --port 1 --request reboot

Adding drivers

PDUDaemon was written to accept "plugin" style driver files. There's no official example yet, so take a look in the drivers directory and see if you can adapt one.

Why can't PDUDaemon do $REQUIREMENT?

Patches welcome, as long as it keeps the system simple and lightweight.


#pdudaemon on Freenode

You can’t perform that action at this time.