Skip to content

Commit

Permalink
Uses a more specific signal handler to detect reboot/shutdown
Browse files Browse the repository at this point in the history
  • Loading branch information
adriangranados committed Oct 6, 2024
1 parent 9aa9287 commit dc2c4d9
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 72 deletions.
7 changes: 7 additions & 0 deletions debian/changelog
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
wlanpi-fpms (1.4.4) unstable; urgency=medium

* Fixes "Reboot in progress" message shown when not rebooting
* Shows "Shutdown in progress" message when shutdown is triggered outside FPMS

-- Adrian Granados <adrian@intuitibits.com> Sun, 06 Oct 2024 00:00:00 -0500

wlanpi-fpms (1.4.3) unstable; urgency=medium

* Adds option System > Settings > Rotate Display
Expand Down
98 changes: 26 additions & 72 deletions fpms/fpms.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,54 +116,34 @@ def log_to_syslog(message, level=syslog.LOG_INFO):
syslog.closelog()


# Central function to detect reboot signals
def detect_reboot_target(args):
"""
This function checks if reboot.target or related unit paths are in the signal arguments.
If detected, it triggers the shutdown handler.
"""
# log_to_syslog(f"Checking arguments for reboot.target: {args}")

for arg in args:
# Check for reboot.target or its systemd path
if isinstance(arg, str) and ("reboot" in arg):
handle_shutdown()
return True # Stop further processing if reboot is detected
return False # No reboot detected


def handle_shutdown():
def handle_reboot_or_shutdown(shutdown=False):
global g_vars
log_to_syslog(f"shutdown_in_progress: {g_vars['shutdown_in_progress']}")
if not g_vars['shutdown_in_progress']:
g_vars['shutdown_in_progress'] = True
log_to_syslog("Drawing reboot image")
oled.drawImage(Image.open(IMAGE_DIR + '/reboot.png').convert(DISPLAY_MODE))
log_to_syslog("Reboot image drawn")
log_to_syslog("Drawing shutdown/reboot image")
if shutdown == True:
oled.drawImage(g_vars['shutdown_image'])
else:
oled.drawImage(g_vars['reboot_image'])
log_to_syslog("Shutdown/reboot image drawn")


# Handler for PrepareForShutdown signal
def handle_prepare_for_shutdown(reboot_arg):
def handle_prepare_for_shutdown(arg):
log_to_syslog("PrepareForShutdown signal received")
handle_shutdown()

handle_reboot_or_shutdown()

# # Handler for Manager signals
# def handle_systemd_manager_signal(*args):
# log_to_syslog("Systemd Manager signal received")
# detect_reboot_target(args)


# # Handler for unit-specific signals
# def handle_systemd_unit_signal(*args):
# log_to_syslog("Systemd unit signal received")
# detect_reboot_target(args)


# Generic handler for all signals
def handle_any_signal(*args):
# log_to_syslog("Generic D-Bus signal received")
detect_reboot_target(args)
# Handler for UnitNew signal
def handle_unitnew(*args):
log_to_syslog("UnitNew signal received")
for arg in args:
if isinstance(arg, str):
if ("reboot.target" in arg):
handle_reboot_or_shutdown()
elif ("halt.target" in arg) or ("poweroff.target" in arg):
handle_reboot_or_shutdown(True)


def run_dbus_loop():
Expand All @@ -179,7 +159,8 @@ def run_dbus_loop():
# Take an inhibitor lock to receive the PrepareForShutdown signal
fd = login1.Inhibit("shutdown", "fpms", "Delaying shutdown", "delay")

# Add a signal receiver for the "PrepareForShutdown" signal
# Add a signal receiver for the "PrepareForShutdown" signal from login1.Manager
# Handles systemctl reboot
bus.add_signal_receiver(
handle_prepare_for_shutdown,
signal_name="PrepareForShutdown",
Expand All @@ -188,41 +169,14 @@ def run_dbus_loop():
path="/org/freedesktop/login1"
)

# # Add signal receiver for high-level systemd Manager signals (JobNew, UnitNew, etc.)
# bus.add_signal_receiver(
# handle_systemd_manager_signal,
# dbus_interface="org.freedesktop.systemd1.Manager", # Systemd Manager interface
# signal_name=None, # Capture any signal (JobNew, JobRemoved, etc.)
# bus_name="org.freedesktop.systemd1", # Systemd bus name
# path="/org/freedesktop/systemd1", # Path to the Manager interface
# )

# # Add signal receiver for specific unit signals from reboot.target
# bus.add_signal_receiver(
# handle_systemd_unit_signal,
# dbus_interface="org.freedesktop.systemd1.Unit", # Unit interface
# signal_name=None, # Capture any signal related to the unit
# bus_name="org.freedesktop.systemd1",
# path="/org/freedesktop/systemd1/unit/reboot_2etarget" # Path to reboot.target unit
# )

# # Add signal receiver for specific unit signals from systemd-reboot.service
# bus.add_signal_receiver(
# handle_systemd_unit_signal,
# dbus_interface="org.freedesktop.systemd1.Unit", # Unit interface
# signal_name=None, # Capture any signal related to the unit
# bus_name="org.freedesktop.systemd1",
# path="/org/freedesktop/systemd1/unit/systemd_2dreboot_2eservice" # Path to systemd-reboot.service
# )

# Add a generic handler for all signals
# Add a signal receiver for UnitNew signal from systemd1.Manager
# Handles (legacy) reboot
bus.add_signal_receiver(
handle_any_signal, # Callback for any signal
None, # Signal name (None = all signals)
None, # dbus_interface (None = all interfaces)
None, # bus_name (None = any sender)
None # path (None = all paths)
handle_unitnew,
dbus_interface="org.freedesktop.systemd1.Manager",
signal_name="UnitNew"
)

log_to_syslog(f"event handlers added")

# Run indefinitely to handle D-Bus signals
Expand Down

0 comments on commit dc2c4d9

Please sign in to comment.