Add a WoL Manager service
This commit is contained in:
@@ -296,6 +296,11 @@ RUN \
|
|||||||
&& sed -i 's/^Categories=.*$/Categories=System;/' /usr/share/applications/thunar-bulk-rename.desktop \
|
&& sed -i 's/^Categories=.*$/Categories=System;/' /usr/share/applications/thunar-bulk-rename.desktop \
|
||||||
&& sed -i 's/^Categories=.*$/Categories=System;/' /usr/share/applications/org.gnome.gedit.desktop \
|
&& sed -i 's/^Categories=.*$/Categories=System;/' /usr/share/applications/org.gnome.gedit.desktop \
|
||||||
&& \
|
&& \
|
||||||
|
echo "**** Install WoL Manager requirements ****" \
|
||||||
|
&& apt-get install -y \
|
||||||
|
tcpdump \
|
||||||
|
xprintidle \
|
||||||
|
&& \
|
||||||
echo "**** Section cleanup ****" \
|
echo "**** Section cleanup ****" \
|
||||||
&& apt-get clean autoclean -y \
|
&& apt-get clean autoclean -y \
|
||||||
&& apt-get autoremove -y \
|
&& apt-get autoremove -y \
|
||||||
@@ -551,7 +556,8 @@ ENV \
|
|||||||
ENABLE_STEAM="true" \
|
ENABLE_STEAM="true" \
|
||||||
STEAM_ARGS="-silent" \
|
STEAM_ARGS="-silent" \
|
||||||
ENABLE_SUNSHINE="true" \
|
ENABLE_SUNSHINE="true" \
|
||||||
ENABLE_EVDEV_INPUTS="false"
|
ENABLE_EVDEV_INPUTS="false" \
|
||||||
|
ENABLE_WOL_POWER_MANAGER="false"
|
||||||
|
|
||||||
# Configure required ports
|
# Configure required ports
|
||||||
ENV \
|
ENV \
|
||||||
|
|||||||
@@ -1,26 +1,32 @@
|
|||||||
|
|
||||||
# Configure dbus
|
# Configure dbus
|
||||||
echo "**** Configure container dbus ****";
|
echo "**** Configure container dbus ****";
|
||||||
if [[ "${HOST_DBUS}" == "true" ]]; then
|
|
||||||
echo "Container configured to use the host dbus";
|
if ([ "${MODE}" != "s" ] && [ "${MODE}" != "secondary" ]); then
|
||||||
# Disable supervisord script
|
if [[ "${HOST_DBUS}" == "true" ]]; then
|
||||||
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/dbus.ini
|
echo "Container configured to use the host dbus";
|
||||||
|
# Disable supervisord script
|
||||||
|
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/dbus.ini
|
||||||
|
else
|
||||||
|
echo "Container configured to run its own dbus";
|
||||||
|
# Enable supervisord script
|
||||||
|
sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/dbus.ini
|
||||||
|
# Configure dbus to run as USER
|
||||||
|
sed -i "/ <user>/c\ <user>${USER}</user>" /usr/share/dbus-1/system.conf
|
||||||
|
# Remove old dbus session
|
||||||
|
rm -rf ${USER_HOME}/.dbus/session-bus/* 2> /dev/null
|
||||||
|
# Remove old dbus pids
|
||||||
|
mkdir -p /var/run/dbus
|
||||||
|
chown -R ${PUID}:${PGID} /var/run/dbus/
|
||||||
|
chmod -R 770 /var/run/dbus/
|
||||||
|
# Generate a dbus machine ID
|
||||||
|
dbus-uuidgen > /var/lib/dbus/machine-id
|
||||||
|
# Remove old lockfiles
|
||||||
|
find /var/run/dbus -name "pid" -exec rm -f {} \;
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
echo "Container configured to run its own dbus";
|
echo "Dbus service not available when container is run in 'secondary' mode."
|
||||||
# Enable supervisord script
|
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/dbus.ini
|
||||||
sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/dbus.ini
|
|
||||||
# Configure dbus to run as USER
|
|
||||||
sed -i "/ <user>/c\ <user>${USER}</user>" /usr/share/dbus-1/system.conf
|
|
||||||
# Remove old dbus session
|
|
||||||
rm -rf ${USER_HOME}/.dbus/session-bus/* 2> /dev/null
|
|
||||||
# Remove old dbus pids
|
|
||||||
mkdir -p /var/run/dbus
|
|
||||||
chown -R ${PUID}:${PGID} /var/run/dbus/
|
|
||||||
chmod -R 770 /var/run/dbus/
|
|
||||||
# Generate a dbus machine ID
|
|
||||||
dbus-uuidgen > /var/lib/dbus/machine-id
|
|
||||||
# Remove old lockfiles
|
|
||||||
find /var/run/dbus -name "pid" -exec rm -f {} \;
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "DONE"
|
echo "DONE"
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
|
|
||||||
echo "**** Configure pulseaudio ****"
|
echo "**** Configure pulseaudio ****"
|
||||||
|
|
||||||
|
# Always enable the pulseaudio service
|
||||||
|
echo "Enable pulseaudio service."
|
||||||
|
sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/pulseaudio.ini
|
||||||
|
|
||||||
if [ "${MODE}" == "s" ] | [ "${MODE}" == "secondary" ]; then
|
if [ "${MODE}" == "s" ] | [ "${MODE}" == "secondary" ]; then
|
||||||
echo "Configure pulseaudio as simple dummy audio"
|
echo "Configure pulseaudio as simple dummy audio"
|
||||||
sed -i 's|^; autospawn.*$|autospawn = no|' /etc/pulse/client.conf
|
sed -i 's|^; autospawn.*$|autospawn = no|' /etc/pulse/client.conf
|
||||||
|
|||||||
12
overlay/etc/cont-init.d/70-configure_desktop.sh
Normal file
12
overlay/etc/cont-init.d/70-configure_desktop.sh
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
|
||||||
|
echo "**** Configure Desktop ****"
|
||||||
|
|
||||||
|
if ([ "${MODE}" != "s" ] && [ "${MODE}" != "secondary" ]); then
|
||||||
|
echo "Enable Desktop service."
|
||||||
|
sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/desktop.ini
|
||||||
|
else
|
||||||
|
echo "Desktop service not available when container is run in 'secondary' mode."
|
||||||
|
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/desktop.ini
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "DONE"
|
||||||
@@ -94,6 +94,9 @@ function configure_x_server {
|
|||||||
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/xorg.ini
|
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/xorg.ini
|
||||||
# Enable xvfb supervisord script
|
# Enable xvfb supervisord script
|
||||||
sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/xvfb.ini
|
sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/xvfb.ini
|
||||||
|
else
|
||||||
|
echo "Configure container with no X server"
|
||||||
|
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/xorg.ini
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Enable KB/Mouse input capture with Xorg if configured
|
# Enable KB/Mouse input capture with Xorg if configured
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ if [ "${ENABLE_STEAM:-}" = "true" ]; then
|
|||||||
echo "Enable Steam auto-start script"
|
echo "Enable Steam auto-start script"
|
||||||
mkdir -p "${USER_HOME:?}/.config/autostart"
|
mkdir -p "${USER_HOME:?}/.config/autostart"
|
||||||
echo "${steam_autostart_desktop:?}" > "${USER_HOME:?}/.config/autostart/Steam.desktop"
|
echo "${steam_autostart_desktop:?}" > "${USER_HOME:?}/.config/autostart/Steam.desktop"
|
||||||
|
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/steam.ini
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
echo "Disable Steam service"
|
echo "Disable Steam service"
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ echo "Configure pulseaudio encoded stream port '${PORT_AUDIO_STREAM}'"
|
|||||||
|
|
||||||
if ([ "${MODE}" != "s" ] && [ "${MODE}" != "secondary" ]); then
|
if ([ "${MODE}" != "s" ] && [ "${MODE}" != "secondary" ]); then
|
||||||
|
|
||||||
if [ ${WEB_UI_MODE} = "vnc" ]; then
|
if [ "${WEB_UI_MODE:-}" = "vnc" ]; then
|
||||||
echo "Enable VNC server"
|
echo "Enable VNC server"
|
||||||
sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/vnc.ini
|
sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/vnc.ini
|
||||||
|
|
||||||
@@ -72,9 +72,13 @@ if ([ "${MODE}" != "s" ] && [ "${MODE}" != "secondary" ]); then
|
|||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
echo "Disable VNC server"
|
echo "Disable VNC server"
|
||||||
|
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/vnc.ini
|
||||||
|
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/vnc-audio.ini
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
echo "VNC server not available when container is run in 'secondary' mode"
|
echo "VNC server not available when container is run in 'secondary' mode"
|
||||||
|
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/vnc.ini
|
||||||
|
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/vnc-audio.ini
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "DONE"
|
echo "DONE"
|
||||||
|
|||||||
@@ -1,34 +0,0 @@
|
|||||||
if [ "${MODE}" == "s" ] | [ "${MODE}" == "secondary" ]; then
|
|
||||||
echo "Configure container as secondary"
|
|
||||||
# Disable dbus
|
|
||||||
echo " - Disable dbus"
|
|
||||||
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/dbus.ini
|
|
||||||
# Disable desktop
|
|
||||||
echo " - Disable desktop"
|
|
||||||
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/desktop.ini
|
|
||||||
# Disable vnc
|
|
||||||
echo " - Disable vnc"
|
|
||||||
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/vnc.ini
|
|
||||||
# Disable vnc
|
|
||||||
echo " - Disable vnc"
|
|
||||||
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/vnc.ini
|
|
||||||
# Disable vnc-audio
|
|
||||||
echo " - Disable vnc audio stream"
|
|
||||||
echo " - Disable vnc audio websock"
|
|
||||||
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/vnc-audio.ini
|
|
||||||
# Disable xorg
|
|
||||||
echo " - Disable xorg"
|
|
||||||
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/xorg.ini
|
|
||||||
|
|
||||||
# Enable pulseaudio
|
|
||||||
echo " - Enable pulseaudio"
|
|
||||||
sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/pulseaudio.ini
|
|
||||||
# Enable steam
|
|
||||||
echo " - Enable steam"
|
|
||||||
sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/steam.ini
|
|
||||||
# Enable udev
|
|
||||||
echo " - Enable udev"
|
|
||||||
sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/udev.ini
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "DONE"
|
|
||||||
34
overlay/etc/cont-init.d/95-setup_wol.sh
Normal file
34
overlay/etc/cont-init.d/95-setup_wol.sh
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
###
|
||||||
|
# File: 10-setup_user.sh
|
||||||
|
# Project: cont-init.d
|
||||||
|
# File Created: Tuesday, 5th September 2023 6:15:12 pm
|
||||||
|
# Author: Josh.5 (jsunnex@gmail.com)
|
||||||
|
# -----
|
||||||
|
# Last Modified: Tuesday, 5th September 2023 6:39:32 pm
|
||||||
|
# Modified By: Josh.5 (jsunnex@gmail.com)
|
||||||
|
###
|
||||||
|
|
||||||
|
echo "**** Configure WoL Manager ****"
|
||||||
|
|
||||||
|
if ([ "${MODE}" != "s" ] && [ "${MODE}" != "secondary" ]); then
|
||||||
|
if [ "${ENABLE_WOL_POWER_MANAGER:-}" = "true" ]; then
|
||||||
|
if [ -f "/tmp/.wol-monitor" ]; then
|
||||||
|
echo "Container started in WoL Manager mode. Disabling all other services."
|
||||||
|
for init_config in /etc/supervisor.d/*.ini ; do
|
||||||
|
init_config_basename=$(basename "${init_config:?}")
|
||||||
|
init_name="${init_config_basename%.*}"
|
||||||
|
[ "${init_name:?}" = "wol-power-manager" ] && continue
|
||||||
|
echo " - Disable ${init_name:?}"
|
||||||
|
sed -i 's|^autostart.*=.*$|autostart=false|' "${init_config:?}"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
echo "Enable WoL Manager service."
|
||||||
|
sed -i 's|^autostart.*=.*$|autostart=true|' /etc/supervisor.d/wol-power-manager.ini
|
||||||
|
else
|
||||||
|
echo "Disable WoL Manager service."
|
||||||
|
sed -i 's|^autostart.*=.*$|autostart=false|' /etc/supervisor.d/wol-power-manager.ini
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "WoL Manager service not available when container is run in 'secondary' mode."
|
||||||
|
fi
|
||||||
15
overlay/etc/supervisor.d/wol-power-manager.ini
Normal file
15
overlay/etc/supervisor.d/wol-power-manager.ini
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
|
||||||
|
[program:wol-power-manager]
|
||||||
|
priority=60
|
||||||
|
autostart=false
|
||||||
|
autorestart=true
|
||||||
|
user=root
|
||||||
|
command=/usr/bin/steam-headless-wol-power-manager
|
||||||
|
environment=HOME="/home/%(ENV_USER)s",USER="%(ENV_USER)s"
|
||||||
|
stopsignal=INT
|
||||||
|
stdout_logfile=/home/%(ENV_USER)s/.cache/log/wol-power-manager.log
|
||||||
|
stdout_logfile_maxbytes=10MB
|
||||||
|
stdout_logfile_backups=7
|
||||||
|
stderr_logfile=/home/%(ENV_USER)s/.cache/log/wol-power-manager.err.log
|
||||||
|
stderr_logfile_maxbytes=10MB
|
||||||
|
stderr_logfile_backups=7
|
||||||
84
overlay/usr/bin/steam-headless-wol-power-manager
Executable file
84
overlay/usr/bin/steam-headless-wol-power-manager
Executable file
@@ -0,0 +1,84 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
###
|
||||||
|
# File: steam-headless-wol-power-manager
|
||||||
|
# Project: bin
|
||||||
|
# File Created: Tuesday, 5th September 2023 5:35:38 pm
|
||||||
|
# Author: Josh.5 (jsunnex@gmail.com)
|
||||||
|
# -----
|
||||||
|
# Last Modified: Tuesday, 5th September 2023 5:35:38 pm
|
||||||
|
# Modified By: Josh.5 (jsunnex@gmail.com)
|
||||||
|
###
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Function to execute restart to WoL monitor
|
||||||
|
restart_to_wol_monitor() {
|
||||||
|
# Create WoL monitor lock file. This will be read during the next restart and will trigger a singluar WoL monitor service.
|
||||||
|
touch /tmp/.wol-monitor
|
||||||
|
|
||||||
|
# Stop all processes inside the container by sending a SIGINT to the main supervisord process (PID 1)
|
||||||
|
kill -2 1
|
||||||
|
|
||||||
|
# Exit script
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to execute restart to Desktop
|
||||||
|
restart_to_desktop_mode() {
|
||||||
|
# Remove WoL monitor lock file.
|
||||||
|
rm -f /tmp/.wol-monitor
|
||||||
|
|
||||||
|
# Stop all processes inside the container by sending a SIGINT to the main supervisord process (PID 1)
|
||||||
|
kill -2 1
|
||||||
|
|
||||||
|
# Exit script
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to monitor for no user input
|
||||||
|
start_idle_monitor() {
|
||||||
|
# Set the idle timeout in milliseconds (60 minutes = 3600000 milliseconds)
|
||||||
|
local idle_timeout=3600000
|
||||||
|
|
||||||
|
# Monitor input. After an hour of no input
|
||||||
|
echo "Starting idle inputs monitor service..."
|
||||||
|
while true; do
|
||||||
|
# Sleep for a short interval (e.g., 1 minute) before checking
|
||||||
|
sleep 60
|
||||||
|
|
||||||
|
# Get the current idle time in milliseconds using xprintidle
|
||||||
|
idle_time=$(xprintidle)
|
||||||
|
|
||||||
|
# Check if the idle time exceeds the specified timeout
|
||||||
|
if [ "${idle_time:?}" -ge "${idle_timeout:?}" ]; then
|
||||||
|
# TODO: Check if any sessions exist in sunshine
|
||||||
|
|
||||||
|
# Execute restart to WoL monitor function
|
||||||
|
echo "No user activity for over 60 minutes. Entering WoL Monitor Mode."
|
||||||
|
restart_to_wol_monitor
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to monitor for WoL events
|
||||||
|
start_wol_monitor() {
|
||||||
|
# Specify port to listen to (9 is the default WoL port).
|
||||||
|
listen_port=9
|
||||||
|
|
||||||
|
# Start the WoL monitor service
|
||||||
|
echo "Starting WoL monitor service..."
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
# Listen for WoL magic packets on the specified port
|
||||||
|
tcpdump -i any -n -l -c 1 -q "udp port $listen_port and (udp[8:4] = 0xFFFFFFFF)"
|
||||||
|
|
||||||
|
# Execute restart to desktop function
|
||||||
|
echo "WoL event received. Entering Desktop Mode."
|
||||||
|
restart_to_desktop_mode
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ -f "/tmp/.wol-monitor" ]; then
|
||||||
|
start_wol_monitor
|
||||||
|
else
|
||||||
|
start_idle_monitor
|
||||||
|
fi
|
||||||
Reference in New Issue
Block a user