home · contact · privacy
Add backlight.py and udev magic to make it work without sudo.
authorChristian Heller <c.heller@plomlompom.de>
Sun, 6 Sep 2026 16:55:42 +0000 (16:55 +0000)
committerChristian Heller <c.heller@plomlompom.de>
Sun, 6 Sep 2026 16:55:42 +0000 (16:55 +0000)
90-backlight.rules [new file with mode: 0644]
backlight.py [new file with mode: 0755]
setup_luksvg.sh
start_root.sh

diff --git a/90-backlight.rules b/90-backlight.rules
new file mode 100644 (file)
index 0000000..8adfb73
--- /dev/null
@@ -0,0 +1,3 @@
+SUBSYSTEM=="backlight", ACTION=="add", \
+    RUN+="/bin/chgrp video $sys$devpath/brightness", \
+    RUN+="/bin/chmod g+w $sys$devpath/brightness"
diff --git a/backlight.py b/backlight.py
new file mode 100755 (executable)
index 0000000..6273512
--- /dev/null
@@ -0,0 +1,37 @@
+#!/usr/bin/env python3
+'Simple wrapper for manipulating backlight device brightness file(s).'
+from argparse import ArgumentError, ArgumentParser
+from pathlib import Path
+
+FILENAME_MAX = 'max_brightness'
+FILENAME_TARGET = 'brightness'
+PATH_BACKLIGHTS = '/sys/class/backlight'
+PERCENTAGE_MIN = 0
+PERCENTAGE_MAX = 100
+
+APP_DESC = 'Set backlight strength.'
+ARG_NAME = 'strength'
+ARG_HELP = f'percentage of possible maximum (default: {PERCENTAGE_MAX})'
+ARG_ERR_RANGE = f'must be >={PERCENTAGE_MIN}, <={PERCENTAGE_MAX}'
+
+if __name__ == '__main__':
+    parser = ArgumentParser(description=APP_DESC)
+    arg = parser.add_argument(
+            ARG_NAME,
+            metavar=ARG_NAME.upper(),
+            type=int,
+            nargs='?',
+            default=PERCENTAGE_MAX,
+            help=ARG_HELP
+            )
+    args = parser.parse_args()
+    target_percentage = getattr(args, ARG_NAME)
+    if not PERCENTAGE_MIN <= target_percentage <= PERCENTAGE_MAX:
+        parser.error(str(ArgumentError(arg, ARG_ERR_RANGE)))
+    for path_backlight in Path(PATH_BACKLIGHTS).iterdir():
+        path_max = Path(path_backlight).joinpath(FILENAME_MAX)
+        path_target = Path(path_backlight).joinpath(FILENAME_TARGET)
+        brightness_max = int(path_max.read_text(encoding='utf8'))
+        target_abs = int((target_percentage / 100) * brightness_max)
+        path_target.write_text(f'{target_abs}\n', encoding='utf8')
+        print(f'set {path_backlight} to {target_percentage}% ({target_abs})')
index 9b7d99e8eedf199a243fc93678757b0e9da0f9f8..2b93587c1cef541fce70c12779503b9e605ad5a0 100755 (executable)
@@ -6,7 +6,7 @@ usage $# "partition"
 PARTITION=$1
 
 # constants we might want to change at some point
-CONFIG_FILES_TO_COPY="start_root.sh start_home.sh _lib.sh"
+TO_COPY="90-backlight.rules backlight.py start_root.sh start_home.sh _lib.sh"
 
 # constants derived from changeables
 PATH_LUKS_MAPPER=$(path_luks_mapper "${NAME_LUKSVG}")
@@ -47,8 +47,8 @@ mkfs.ext4 -q "${PATH_VG_DATA}"
 # place config setup scripts
 mount_privately "${PATH_VG_DATA}" "${PATH_MNT_DATA}"
 mkdir "${PATH_MNT_DATA_CONFIG}"
-msg 'Copying config setup scripts …'
-for FNAME in ${CONFIG_FILES_TO_COPY}; do
+msg 'Copying setup files …'
+for FNAME in ${TO_COPY}; do
     cp "${FNAME}" "${PATH_MNT_DATA_CONFIG}/"
 done
 msg 'Unmounting …'
index f87a1fbf5b603ae88f3aa64c5c8ea05aa37277d8..95082225693ac871f7acaab53bdcca369680dd1b 100755 (executable)
@@ -6,8 +6,10 @@ FNAME_START_HOME=start_home.sh
 PATH_DEFAULT_LOCALE=/etc/default/locale
 PATH_SYSCTL_PRINTK=/etc/sysctl.d/60-printk-console.conf
 PATH_TLP_THRESH_CONF=/etc/tlp.conf.d/60-thresholds.conf
+PATH_UDEV_RULES=/etc/udev/rules.d
 
 # constants we might want to change at some point
+FNAME_UDEV_RULES_BACKLIGHT=90-backlight.rules
 LOCALE=C.UTF-8
 TO_INSTALL="ack man-db ntpsec-ntpdate sudo sway tlp vim-gtk3 xwayland"
 USERNAME=plom
@@ -39,9 +41,14 @@ printf 'START_CHARGE_THRESH_BAT0=%s\nSTOP_CHARGE_THRESH_BAT0=%s\n' \
     "${TLP_THRESH_START}" "${TLP_THRESH_STOP}" >| "${PATH_TLP_THRESH_CONF}"
 tlp start
 
+msg 'Making backlight devices available to user-run backlight.py script …'
+cp "${FNAME_UDEV_RULES_BACKLIGHT}" "${PATH_UDEV_RULES}/"
+udevadm control --reload-rules
+udevadm trigger --action=add --subsystem-match=backlight
+
 msg 'Setting up user: %s' "${USERNAME}"
 adduser --comment "" "${USERNAME}"
-usermod -a -G sudo "${USERNAME}"
+usermod -a -G sudo,video "${USERNAME}"
 
 msg 'Synchronizing clock …'
 ntpdate-debian