summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAhmed Abdelhalim <[email protected]>2026-07-03 11:00:17 +0200
committerAhmed Abdelhalim <[email protected]>2026-07-03 11:00:17 +0200
commite2e2fd3a111dc307fb8e54dae9689ff901e7e9c1 (patch)
tree9e36d5afa874fb50f05c9ce81ad7d5e475272103
parent16c2395a58db566337224837df8dbe75d062baf6 (diff)
Update ethtool to handle laptop lid suspend issues
When using WoL with laptops (ex Lenovo) closing the lid suspends the laptop and breaks WoL, this is to allow configuring the lid behavior
-rw-r--r--host_vars/pve.local.ymlbin848 -> 880 bytes
-rw-r--r--host_vars/pve.local.yml.example3
-rw-r--r--roles/ethtool/README.md9
-rw-r--r--roles/ethtool/defaults/main.yml1
-rw-r--r--roles/ethtool/handlers/main.yml6
-rw-r--r--roles/ethtool/meta/argument_specs.yml12
-rw-r--r--roles/ethtool/tasks/main.yml15
-rw-r--r--roles/ethtool/templates/logind.conf.j22
8 files changed, 46 insertions, 2 deletions
diff --git a/host_vars/pve.local.yml b/host_vars/pve.local.yml
index a9e89f47..74e4714a 100644
--- a/host_vars/pve.local.yml
+++ b/host_vars/pve.local.yml
Binary files differ
diff --git a/host_vars/pve.local.yml.example b/host_vars/pve.local.yml.example
index fa59020a..182eb39e 100644
--- a/host_vars/pve.local.yml.example
+++ b/host_vars/pve.local.yml.example
@@ -16,3 +16,6 @@ restic_version: "0.19.0"
pve_admin_user: "admin"
pve_admin_password: "changeme"
+
+ethtool_wol_interface: "eth0"
+ethtool_lid_ac_action: "ignore"
diff --git a/roles/ethtool/README.md b/roles/ethtool/README.md
index c1902568..69f987ee 100644
--- a/roles/ethtool/README.md
+++ b/roles/ethtool/README.md
@@ -5,7 +5,8 @@ Installs ethtool and configures Wake-on-LAN (WoL) via a systemd service.
## Variables
```yaml
-ethtool_wol_interface: "eth0" # Network interface to enable WoL on
+ethtool_wol_interface: "eth0" # Network interface to enable WoL on
+ethtool_lid_ac_action: "suspend" # HandleLidSwitchExternalPower (ignore/suspend/hibernate/lock/poweroff)
```
## Usage
@@ -38,7 +39,11 @@ Enables WoL on the NIC via ethtool on every boot. Add to your play with the corr
ethtool_wol_interface: "enp0s25"
```
-### 3. Suspend the host
+### 3. Lid behavior (laptops)
+
+Role configures `HandleLidSwitchExternalPower` via `ethtool_lid_ac_action` (default: `suspend`). Set to `ignore` for WoL use case — lid close on AC won't re-suspend after wake. No effect on desktops.
+
+### 4. Suspend the host
WoL is most reliable from suspend (S3). Shutdown (S5) requires BIOS "WoL from S5" support.
diff --git a/roles/ethtool/defaults/main.yml b/roles/ethtool/defaults/main.yml
index 61cfd43e..8da62da2 100644
--- a/roles/ethtool/defaults/main.yml
+++ b/roles/ethtool/defaults/main.yml
@@ -1,2 +1,3 @@
---
ethtool_wol_interface: "eth0"
+ethtool_lid_ac_action: "suspend"
diff --git a/roles/ethtool/handlers/main.yml b/roles/ethtool/handlers/main.yml
index 3360d709..88cc1a15 100644
--- a/roles/ethtool/handlers/main.yml
+++ b/roles/ethtool/handlers/main.yml
@@ -3,3 +3,9 @@
become: true
ansible.builtin.systemd_service:
daemon_reload: true
+
+- name: "Reload systemd-logind"
+ become: true
+ ansible.builtin.systemd_service:
+ name: "systemd-logind"
+ state: "restarted"
diff --git a/roles/ethtool/meta/argument_specs.yml b/roles/ethtool/meta/argument_specs.yml
index 8f6ce206..ef5aefad 100644
--- a/roles/ethtool/meta/argument_specs.yml
+++ b/roles/ethtool/meta/argument_specs.yml
@@ -6,3 +6,15 @@ argument_specs:
type: "str"
description: "Network interface to enable Wake-on-LAN on"
default: "eth0"
+ ethtool_lid_ac_action:
+ type: "str"
+ description: "HandleLidSwitchExternalPower value"
+ default: "suspend"
+ choices:
+ - "ignore"
+ - "suspend"
+ - "hibernate"
+ - "hybrid-sleep"
+ - "suspend-then-hibernate"
+ - "lock"
+ - "poweroff"
diff --git a/roles/ethtool/tasks/main.yml b/roles/ethtool/tasks/main.yml
index 9d2dac60..d1832d0b 100644
--- a/roles/ethtool/tasks/main.yml
+++ b/roles/ethtool/tasks/main.yml
@@ -22,3 +22,18 @@
enabled: true
state: "started"
daemon_reload: true
+
+- name: "Ensure /etc/systemd/logind.conf.d exists"
+ become: true
+ ansible.builtin.file:
+ path: "/etc/systemd/logind.conf.d"
+ state: "directory"
+ mode: "0755"
+
+- name: "Configure lid switch on AC power"
+ become: true
+ ansible.builtin.template:
+ src: "logind.conf.j2"
+ dest: "/etc/systemd/logind.conf.d/wol.conf"
+ mode: "0644"
+ notify: "Reload systemd-logind"
diff --git a/roles/ethtool/templates/logind.conf.j2 b/roles/ethtool/templates/logind.conf.j2
new file mode 100644
index 00000000..722e3a8a
--- /dev/null
+++ b/roles/ethtool/templates/logind.conf.j2
@@ -0,0 +1,2 @@
+[Login]
+HandleLidSwitchExternalPower={{ ethtool_lid_ac_action }}