/etc/sudoers.d/novaboot-server
-/lib/systemd/system/novaboot-power-off@.target
+/lib/systemd/system/novaboot-power-off@.service
/lib/systemd/system/novaboot-power-off@.timer
/lib/systemd/system/novaboot-power@.service
-/usr/bin/novaboot-power
+/usr/sbin/novaboot-power
/usr/bin/novaboot-shell
/usr/lib/systemd/user/novaboot-power-off.service
/usr/lib/sysusers.d/novaboot-server.conf
install -D -m 755 -t $(DESTDIR)$(PREFIX)/sbin adduser-novaboot
install -D -m 644 -t $(DESTDIR)$(PREFIX)/share/man/man8 adduser-novaboot.8
install -D -m 644 -t $(DESTDIR)$(PREFIX)/lib/sysusers.d sysusers.d/novaboot-server.conf
- install -D -m 644 -t $(DESTDIR)/lib/systemd/system systemd/novaboot-power-off@.target
+ install -D -m 644 -t $(DESTDIR)/lib/systemd/system systemd/novaboot-power-off@.service
install -D -m 644 -t $(DESTDIR)/lib/systemd/system systemd/novaboot-power-off@.timer
install -D -m 644 -t $(DESTDIR)/lib/systemd/system systemd/novaboot-power@.service
install -D -m 644 -t $(DESTDIR)/usr/lib/systemd/user systemd/novaboot-power-off.service
install -D -m 440 systemd/sudoers.novaboot-server $(DESTDIR)/etc/sudoers.d/novaboot-server
- install -D -m 755 -t $(DESTDIR)$(PREFIX)/bin systemd/novaboot-power
+ install -D -m 755 -t $(DESTDIR)$(PREFIX)/sbin systemd/novaboot-power
--- /dev/null
+#!/bin/sh
+
+if [ -z "$SUDO_USER" ]; then
+ echo >&2 "$0 must be invoked via sudo"
+ exit 1
+fi
+
+case "$1" in
+ on)
+ exec systemctl start "novaboot-power@${SUDO_USER}.service";;
+ off)
+ exec systemctl stop "novaboot-power@${SUDO_USER}.service";;
+ delayed-off)
+ systemctl start "novaboot-power-off@${SUDO_USER}.timer"
+ # || systemd-run --on-active="$2" --unit="novaboot-power-off@${SUDO_USER}.target"
+ ;;
+ *)
+ echo >&2 "Invalid argument"
+ exit 1;;
+esac
--- /dev/null
+[Unit]
+Description=Delayed power-off of the novaboot target
+ConditionGroup=novaboot
+ConditionFileNotEmpty=%h/.novaboot-shell
+Before=shutdown.target
+DefaultDependencies=no
+
+[Service]
+Type=oneshot
+ExecStart=/usr/bin/sudo novaboot-power delayed-off
+
+[Install]
+WantedBy=shutdown.target
--- /dev/null
+[Unit]
+Description=Power off novaboot target %i
+Conflicts=novaboot-power@%i.service
+After=novaboot-power@%i.service
+
+[Service]
+Type=oneshot
+# We don't need to execute anything. It's sufficient to Conflict
+# novaboot-power. But units without Exec* are invalid. And we don't
+# want tu use target unit (that don't need Exec*), because these don't
+# have RemainAfterExit=no.
+ExecStart=true
--- /dev/null
+[Timer]
+OnActiveSec=10min
+Unit=novaboot-power-off@%i.service
+RemainAfterElapse=no
--- /dev/null
+[Unit]
+Description=Power on/off novaboot target %i
+
+[Service]
+Type=oneshot
+RemainAfterExit=true
+ExecStartPre=systemctl stop novaboot-power-off@%i.timer
+ExecStart=/usr/bin/novaboot-shell on
+ExecStop=/usr/bin/novaboot-shell off
+User=%i
--- /dev/null
+# sudoers file for novaboot-server
+
+%novaboot ALL = NOPASSWD: /usr/sbin/novaboot-power