A socket proxy with wake-on-lan and IPMI power control feature.
It can forward TCP(bidirectional) and UDP(send-only) traffic from local machine to remote machine, and:
- send a magic packet to wake it (wake-on-lan)
- invoke IPMI power on to wake it
before forwarding traffic if the remote machine does not respond to ICMP ping or some HTTP URL.
Python 3.12+
The remote machine must accept and respond to ICMP ping requests if you use ping method.
You can install it from PyPI or use a prebuilt docker image.
Simply install it:
pip install wolsocketproxy
Then create a config file:
cp wolsocketproxy.conf.example /etc/wolsocketproxy.conf
Modify the config file as your requirements.
Finally, run it:
wolsocketproxy
See docker/docker-compose.yml for more details.
The wolsocketproxy.conf has the following structure:
{
// NOTE: Comments are not allowed in actual config file
// Define machines
"machines": {
"some-server": {
"ip_address": "192.168.1.124", // the IP address of this machine, optional
"mac_address": "11:22:33:44:55:66", // The MAC address of this machine, optional
"wake_up_method": "ipmi", // How to wake up this machine
// "ipmi" - You must specify "ipmi_config_name"
// "wol" - You must specify "mac_address"
"ipmi_config_name": "some-server-ipmi", // IPMI config of this machine, must match what defined in "ipmi_configs"
"online_check_method": "http", // How to check this machine is online
// "http" - You must specify "online_check_http_url"
// "ping" - You must specify "ip_address"
"online_check_http_url": "http://192.168.1.124/health", // The URL used to check if machine is online, optional
"online_check_timeout": 300, // Timeout when checking machine is online, seconds, optional, default is 60
"online_check_http_expected_code": 200, // Expected HTTP status code when using "http" method, optional, default is 200
"ipmi_force_reset_if_power_up_failed": true, // Use IPMI power reset if this machine is not online after timeout, optional, default is false
"ipmi_max_reset_try_count": 3, // Max IPMI power reset retry count before giving-up, optional, default is 3
"keep_alive_mode": true, // Indicates whether this machine has a keep-alive daemon, optional, default is false
// If you enable this, wolsocketproxy will send a request when there is any traffic
"keep_alive_mode_base_url": "http://192.168.1.124:8080", // Keep-alive daemon provided URL, optional
"scheduled_power_up_times": [ // Scheduled power-up times, optional
{
"cron": "0 7 * * 1-5", // Cron expression for auto power-up
"keep_alive_time": 7200 // Send keep-alive requests for N seconds after power-up
}
]
},
// ... more machines ...
},
// Define forwarding routes
"routes": [
{
"local_address": "0.0.0.0", // The local address to listen
"local_port": 12345, // The local port to listen
"target_machine_name": "some-server", // The target machine name, must match what defined in "machines"
"target_address": "192.168.1.124", // The target address forwarding to
"target_port": 12345, // The target port forwarding to
"protocol": "tcp" // The protocol to use, can choose "tcp" or "udp"
},
// ... more routes ...
],
// Define IPMI configs, optional
"ipmi_configs": [
{
"name": "some-server-ipmi", // IPMI config name
"redfish_url": "https://192.168.1.123/", // IPMI Redfish API base URL (should not contain /redfish/v1)
"username": "admin", // IPMI Redfish API login username
"password": "123456" // IPMI Redfish API login password
},
// ... more IPMI configs ...
]
}This mode is used for running on target machine with auto-suspend (e.g. running circadian or similar), to keep the target
machine from auto suspending when running tasks.
Use the following command on the target machine to enter this mode:
wolsocketproxy -kThe config file wolsocketproxy.conf should look like the following:
// Keep-alive daemon mode
{
"listen_address": "0.0.0.0", // The address to listen for HTTP server, default is 127.0.0.1
"listen_port": 18080, // The port to listen for HTTP server, default is 18080
"watchdog_feed_interval": 60, // Watchdog feed interval, seconds, default is 600
"keep_alive_method": "special_process", // How to keep target machine alive, default is "special_process"
// "special_process" - Fork a child process with specified name
"special_process_name": "wsp-keepalive", // The display name of the forked child process, default is "wsp-keepalive"
}You need to periodically send an HTTP GET request to /watchdog/feed at the listen_port in watchdog_feed_interval time,
or the special process will be killed.
You can combine this mode with circadian's process_block config to keep it from auto-suspending.
If you enable keep_alive_mode in proxy mode's config, the proxy will send requests to /watchdog/feed of this machine whenever there is any traffic towards this machine through it.
You can configure scheduled_power_up_times in each machine entry to automatically power up the machine at specified times using
a cron expression. After the machine comes online, the proxy sends keep-alive requests to the machine's keep-alive daemon
(for the duration specified by keep_alive_time) to prevent it from auto-suspending during the expected usage window.
Each entry in scheduled_power_up_times contains:
cron: A standard 5-field cron expression (e.g."0 7 * * 1-5"for weekdays at 7:00)keep_alive_time: Duration in seconds to send keep-alive requests after power-up (e.g.7200for 2 hours)
If multiple entries overlap in time, the keep-alive period is automatically extended to cover the longest window, and no duplicate keep-alive requests are sent.