From 53ca0ea21450a9aaa3b08dfbcb6a01cbd93c49f0 Mon Sep 17 00:00:00 2001 From: Matthias Reichl Date: Fri, 7 Apr 2017 15:27:13 +0200 Subject: [PATCH] lirc: use upstream method to configure and run lirc Add helper scripts for lircd and lircd-uinput so that we can override lirc_options.conf and lircd.conf via files in /storage/.config Use separate systemd units for lircd and lircd-uinput, like in upstream, and just add a ConditionPathExists to enable/disable the services. The lirc socket is managed by systemd via lircd.socket, like in upstream. Remove udev file for enabling lirc, this is now handled via systemd only. --- packages/sysutils/lirc/package.mk | 7 ++ packages/sysutils/lirc/scripts/lircd_helper | 52 +++---------- .../sysutils/lirc/scripts/lircd_uinput_helper | 24 ++++++ .../lirc/system.d/lircd-defaults.service | 11 --- .../lirc/system.d/lircd-uinput.service | 12 +++ packages/sysutils/lirc/system.d/lircd.service | 12 +++ packages/sysutils/lirc/system.d/lircd.socket | 6 ++ .../sysutils/lirc/system.d/lircd@.service | 16 ---- packages/sysutils/lirc/udev.d/98-lircd.rules | 74 ------------------- 9 files changed, 72 insertions(+), 142 deletions(-) create mode 100755 packages/sysutils/lirc/scripts/lircd_uinput_helper delete mode 100644 packages/sysutils/lirc/system.d/lircd-defaults.service create mode 100644 packages/sysutils/lirc/system.d/lircd-uinput.service create mode 100644 packages/sysutils/lirc/system.d/lircd.service create mode 100644 packages/sysutils/lirc/system.d/lircd.socket delete mode 100644 packages/sysutils/lirc/system.d/lircd@.service delete mode 100644 packages/sysutils/lirc/udev.d/98-lircd.rules diff --git a/packages/sysutils/lirc/package.mk b/packages/sysutils/lirc/package.mk index 761c40bed1..6ee2fb5b5f 100644 --- a/packages/sysutils/lirc/package.mk +++ b/packages/sysutils/lirc/package.mk @@ -59,6 +59,7 @@ post_makeinstall_target() { mkdir -p $INSTALL/usr/lib/libreelec cp $PKG_DIR/scripts/lircd_helper $INSTALL/usr/lib/libreelec + cp $PKG_DIR/scripts/lircd_uinput_helper $INSTALL/usr/lib/libreelec mkdir -p $INSTALL/usr/lib/udev cp $PKG_DIR/scripts/lircd_wakeup_enable $INSTALL/usr/lib/udev @@ -66,3 +67,9 @@ post_makeinstall_target() { mkdir -p $INSTALL/usr/share/services cp -P $PKG_DIR/default.d/*.conf $INSTALL/usr/share/services } + +post_install() { + enable_service lircd.socket + enable_service lircd.service + enable_service lircd-uinput.service +} diff --git a/packages/sysutils/lirc/scripts/lircd_helper b/packages/sysutils/lirc/scripts/lircd_helper index d36ce21e03..b65b85d250 100755 --- a/packages/sysutils/lirc/scripts/lircd_helper +++ b/packages/sysutils/lirc/scripts/lircd_helper @@ -1,61 +1,31 @@ #!/bin/sh ################################################################################ -# This file is part of OpenELEC - http://www.openelec.tv -# Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) +# This file is part of LibreELEC - https://libreelec.tv +# Copyright (C) 2017 Matthias Reichl (hias@horus.com) # -# OpenELEC is free software: you can redistribute it and/or modify +# LibreELEC is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # -# OpenELEC is distributed in the hope that it will be useful, +# LibreELEC is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with OpenELEC. If not, see . +# along with LibreELEC. If not, see . ################################################################################ -DEVICE=$(echo "$1" | cut -f1 -d:) -DRIVER=$(echo "$1" | cut -f2 -d:) -CONFIG=$(echo "$1" | cut -f3 -d:) - -if [ "x$DRIVER" = "x" ]; then - exit 1; +if [ -e "/storage/.config/lirc_options.conf" ] ; then + LIRCD_OPTIONS="-O /storage/.config/lirc_options.conf" fi -mkdir -p '/run/lirc' - -LIRCD="/usr/sbin/lircd" -LIRCD_UINPUT="/usr/sbin/lircd-uinput" -LIRCD_CONFIG="--driver=$DRIVER --device=/dev/$DEVICE" -LIRCD_CONFIG="$LIRCD_CONFIG --output=/run/lirc/lircd-$DEVICE" -LIRCD_CONFIG="$LIRCD_CONFIG --pidfile=/run/lirc/lircd-$DEVICE.pid" -LIRCD_CONFIG="$LIRCD_CONFIG --release=_LIRCUP" - -if [ -e "/storage/.config/lircd.conf" ]; then - LIRCD_CONFIG="$LIRCD_CONFIG /storage/.config/lircd.conf" -elif [ -n "$CONFIG" ]; then - if [ -e "/storage/.config/$CONFIG" ]; then - LIRCD_CONFIG="$LIRCD_CONFIG /storage/.config/$CONFIG" - elif [ -e "/etc/lirc/$CONFIG" ]; then - LIRCD_CONFIG="$LIRCD_CONFIG /etc/lirc/$CONFIG" - else - echo "No device specific $CONFIG file found" - echo "You need to provide your own $CONFIG file" - echo "Place it in /storage/.config/$CONFIG" - exit 0 - fi +if [ -e "/storage/.config/lircd.conf" ] ; then + LIRCD_CONF="/storage/.config/lircd.conf" else - echo "No lircd.conf file found" - echo "You need to provide your own lircd.conf file" - echo "Place it in /storage/.config/lircd.conf" - exit 0 + LIRCD_CONF="/etc/lirc/lircd.conf" fi -# lircd daemonizes but lircd-uinput doesn't so we need to fork it to the background -$LIRCD $LIRCD_CONFIG -$LIRCD_UINPUT --release=_LIRCUP /run/lirc/lircd-$DEVICE & -exit 0 +exec /usr/sbin/lircd $LIRCD_OPTIONS "$@" $LIRCD_CONF diff --git a/packages/sysutils/lirc/scripts/lircd_uinput_helper b/packages/sysutils/lirc/scripts/lircd_uinput_helper new file mode 100755 index 0000000000..dde6ce154b --- /dev/null +++ b/packages/sysutils/lirc/scripts/lircd_uinput_helper @@ -0,0 +1,24 @@ +#!/bin/sh +################################################################################ +# This file is part of LibreELEC - https://libreelec.tv +# Copyright (C) 2017 Matthias Reichl (hias@horus.com) +# +# LibreELEC is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# LibreELEC is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with LibreELEC. If not, see . +################################################################################ + +if [ -e "/storage/.config/lirc_options.conf" ] ; then + LIRCD_OPTIONS="-O /storage/.config/lirc_options.conf" +fi + +exec /usr/sbin/lircd-uinput $LIRCD_OPTIONS "$@" diff --git a/packages/sysutils/lirc/system.d/lircd-defaults.service b/packages/sysutils/lirc/system.d/lircd-defaults.service deleted file mode 100644 index 31b77757ec..0000000000 --- a/packages/sysutils/lirc/system.d/lircd-defaults.service +++ /dev/null @@ -1,11 +0,0 @@ -[Unit] -Description=Lirc defaults -After=local-fs.target - -ConditionPathExists=!/storage/.cache/services/lircd.conf -ConditionPathExists=!/storage/.cache/services/lircd.disabled - -[Service] -Type=oneshot -ExecStart=/bin/sh -c 'cp /usr/share/services/lircd.conf /storage/.cache/services/' -RemainAfterExit=yes diff --git a/packages/sysutils/lirc/system.d/lircd-uinput.service b/packages/sysutils/lirc/system.d/lircd-uinput.service new file mode 100644 index 0000000000..9728f55f4e --- /dev/null +++ b/packages/sysutils/lirc/system.d/lircd-uinput.service @@ -0,0 +1,12 @@ +[Unit] +Documentation=http://lirc.org/html/configure.html +Description=Forward LIRC button presses as uinput events +ConditionPathExists=/storage/.cache/services/lircd.conf +After=lircd.service + +[Service] +Type=simple +ExecStart=/usr/lib/libreelec/lircd_uinput_helper + +[Install] +WantedBy=multi-user.target diff --git a/packages/sysutils/lirc/system.d/lircd.service b/packages/sysutils/lirc/system.d/lircd.service new file mode 100644 index 0000000000..092c0b9be2 --- /dev/null +++ b/packages/sysutils/lirc/system.d/lircd.service @@ -0,0 +1,12 @@ +[Unit] +Documentation=http://lirc.org/html/configure.html +Description=Flexible IR remote input/output application support +ConditionPathExists=/storage/.cache/services/lircd.conf +After=network.target + +[Service] +Type=simple +ExecStart=/usr/lib/libreelec/lircd_helper --nodaemon --release + +[Install] +WantedBy=multi-user.target diff --git a/packages/sysutils/lirc/system.d/lircd.socket b/packages/sysutils/lirc/system.d/lircd.socket new file mode 100644 index 0000000000..03a5c1bd5b --- /dev/null +++ b/packages/sysutils/lirc/system.d/lircd.socket @@ -0,0 +1,6 @@ +[Socket] +ListenStream=/run/lirc/lircd.socket + +[Install] +WantedBy=sockets.target +Also=lircd.service diff --git a/packages/sysutils/lirc/system.d/lircd@.service b/packages/sysutils/lirc/system.d/lircd@.service deleted file mode 100644 index c377ab528a..0000000000 --- a/packages/sysutils/lirc/system.d/lircd@.service +++ /dev/null @@ -1,16 +0,0 @@ -[Unit] -Description=Lirc with %I -After=lircd-defaults.service -Requires=lircd-defaults.service - -ConditionPathExists=/storage/.cache/services/lircd.conf - -[Service] -Type=forking -ExecStart=/usr/lib/libreelec/lircd_helper %I -TimeoutStopSec=1 -RemainAfterExit=yes - -[Install] -WantedBy=multi-user.target - diff --git a/packages/sysutils/lirc/udev.d/98-lircd.rules b/packages/sysutils/lirc/udev.d/98-lircd.rules deleted file mode 100644 index 7d3af8b8a9..0000000000 --- a/packages/sysutils/lirc/udev.d/98-lircd.rules +++ /dev/null @@ -1,74 +0,0 @@ -################################################################################ -# An example udev rules file for lircd. -################################################################################ - -# lircd_helper only does something for "add" and "remove" actions. -ACTION!="add|remove", GOTO="end" - -KERNEL=="hiddev[0-9]*", SUBSYSTEM=="usb", SUBSYSTEMS=="usb", GOTO="begin" -KERNEL=="ttyACM[0-9]*", SUBSYSTEM=="tty", SUBSYSTEMS=="usb", GOTO="begin" -KERNEL=="lirc[0-9]*", SUBSYSTEM=="lirc", SUBSYSTEMS=="i2c", GOTO="begin" -KERNEL=="lirc[0-9]*", SUBSYSTEM=="lirc", SUBSYSTEMS=="usb", GOTO="begin" -KERNEL=="lirc[0-9]*", SUBSYSTEM=="lirc", SUBSYSTEMS=="platform", GOTO="begin" -KERNEL=="lirc[0-9]*", SUBSYSTEM=="lirc", SUBSYSTEMS=="pnp", GOTO="begin" -KERNEL=="lirc[0-9]*", SUBSYSTEM=="lirc", SUBSYSTEMS=="rc", GOTO="begin" -GOTO="end" -LABEL="begin" - -#------------------------------------------------------------------------------- -# Ask lircd_helper to lirc devices. -#------------------------------------------------------------------------------- - -SUBSYSTEM=="lirc", \ - ENV{lircd_driver}="default", \ - ENV{lircd_conf}="lircd.conf" - -### Microsoft Xbox DVD dongle -SUBSYSTEM=="lirc", DRIVERS=="lirc_xbox", \ - ENV{lircd_driver}="default", \ - ENV{lircd_conf}="lircd.conf.xbox" - -### RPi GPIO IR Receiver -SUBSYSTEM=="lirc", DRIVERS=="lirc_rpi", \ - ENV{lircd_driver}="default", \ - ENV{lircd_conf}="lircd.conf.rpi" - -### Odroid AMLogic IR Receiver -SUBSYSTEMS=="platform", DRIVERS=="meson-ir", \ - ENV{lircd_driver}="default", \ - ENV{lircd_conf}="lircd.conf.amremote" - -#------------------------------------------------------------------------------- -# Ask lircd_helper to handle USB devices that do not show up as lirc devices -# and are supported by lircd. Remote controls that are USB HID devices that show -# up as event devices are not included as as they are handled by eventlircd. -#------------------------------------------------------------------------------- -SUBSYSTEMS=="usb", GOTO="begin-usb" -GOTO="end-usb" - -LABEL="begin-usb" - -ENV{ID_USB_INTERFACES}=="", IMPORT{builtin}="usb_id" - -ENV{ID_VENDOR_ID}=="04d8", ENV{ID_MODEL_ID}=="fd08", \ - ENV{lircd_driver}="usb_irtoy", \ - ENV{lircd_conf}="lircd.conf" - -ENV{ID_VENDOR_ID}=="0fe9", ENV{ID_MODEL_ID}=="9010", \ - ENV{lircd_driver}="dvico", \ - ENV{lircd_conf}="lircd.conf" - -ENV{ID_VENDOR_ID}=="04d8", ENV{ID_MODEL_ID}=="f844", \ - ENV{lircd_driver}="irman", \ - ENV{lircd_conf}="lircd.conf" - -LABEL="end-usb" - -ENV{lircd_driver}=="?*", ENV{lircd_conf}=="?*", ACTION=="add", \ - TAG+="systemd", ENV{SYSTEMD_WANTS}+="lircd@$name:$env{lircd_driver}:$env{lircd_conf}.service", \ - RUN+="lircd_wakeup_enable" - -ENV{lircd_driver}=="?*", ENV{lircd_conf}=="?*", ACTION=="remove", \ - RUN+="/usr/bin/systemctl stop lircd@$name:$env{lircd_driver}:$env{lircd_conf}.service" - -LABEL="end"