diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b645e4b9..dd20ddfb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -59,7 +59,7 @@ jobs: build_type: Release build_deb: true defines: "" - + - name: "macos-11" os: "macos-11" generator: "Unix Makefiles" @@ -79,7 +79,7 @@ jobs: build_type: Release build_deb: false defines: "" - + steps: - uses: FranzDiebold/github-env-vars-action@v2 @@ -206,7 +206,7 @@ jobs: jobs: 4 build_type: Release build_deb: true - defines: "-DENABLE_CLANG_TIDY=ON" + defines: "-DENABLE_CLANG_TIDY=ON -DINSTALL_SYSTEMD_SERVICE=ON" ccov: false - name: "ubuntu_22.04" @@ -218,7 +218,7 @@ jobs: jobs: 4 build_type: Release build_deb: true - defines: "-DENABLE_CLANG_TIDY=ON" + defines: "-DENABLE_CLANG_TIDY=ON -DINSTALL_SYSTEMD_SERVICE=ON" ccov: false - name: "ubuntu_20.04 (debug+ccov)" @@ -242,7 +242,7 @@ jobs: jobs: 3 build_type: Release build_deb: true - defines: "" + defines: " -DINSTALL_SYSTEMD_SERVICE=ON" ccov: false - name: "raspberrypios_arm64" @@ -254,7 +254,7 @@ jobs: jobs: 3 build_type: Release build_deb: true - defines: "" + defines: "-DINSTALL_SYSTEMD_SERVICE=ON" ccov: false - name: "macos-11" diff --git a/server/CMakeLists.txt b/server/CMakeLists.txt index dd9ec3cf..c30a1d21 100644 --- a/server/CMakeLists.txt +++ b/server/CMakeLists.txt @@ -395,6 +395,10 @@ install(TARGETS traintastic-server RUNTIME DESTINATION "/opt/traintastic/bin/" ) +if(INSTALL_SYSTEMD_SERVICE) + install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/debian/traintastic-server.service DESTINATION "/lib/systemd/system") +endif() + ### TEST ### include(CTest) @@ -430,5 +434,6 @@ set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Reinder Feenstra") set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://traintastic.org") set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON) set(CPACK_DEBIAN_PACKAGE_DEPENDS "traintastic-data (>= ${CPACK_PACKAGE_VERSION})") +set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${CMAKE_CURRENT_SOURCE_DIR}/debian/postinst") include(CPack) diff --git a/server/debian/postinst b/server/debian/postinst new file mode 100755 index 00000000..09a67edc --- /dev/null +++ b/server/debian/postinst @@ -0,0 +1,53 @@ +#!/bin/sh + +set -e + +# create traintastic group if it doesn't exist: +if ! getent group traintastic >/dev/null; then + addgroup --system traintastic +fi + +# create traintastic user if it doesn't exist: +if ! getent passwd traintastic >/dev/null; then + adduser --system \ + --ingroup traintastic \ + --home /var/opt/traintastic \ + --no-create-home \ + --gecos "traintastic-server daemon" \ + traintastic + usermod -a -G dialout,plugdev traintastic +fi + +if [ ! -e /var/opt/traintastic ]; then + mkdir -p /var/opt/traintastic + chown traintastic:traintastic /var/opt/traintastic +fi + +# Based on output by dh_installsystemd/13.6ubuntu1 (not auto generated due to CPack being used) +if [ "$1" = "configure" ] || [ "$1" = "abort-upgrade" ] || [ "$1" = "abort-deconfigure" ] || [ "$1" = "abort-remove" ] ; then + # This will only remove masks created by d-s-h on package removal. + deb-systemd-helper unmask 'traintastic-server.service' >/dev/null || true + + # was-enabled defaults to true, so new installations run enable. + if deb-systemd-helper --quiet was-enabled 'traintastic-server.service'; then + # Enables the unit on first installation, creates new + # symlinks on upgrades if the unit file has changed. + deb-systemd-helper enable 'traintastic-server.service' >/dev/null || true + else + # Update the statefile to add new symlinks (if any), which need to be + # cleaned up on purge. Also remove old symlinks. + deb-systemd-helper update-state 'traintastic-server.service' >/dev/null || true + fi +fi + +if [ "$1" = "configure" ] || [ "$1" = "abort-upgrade" ] || [ "$1" = "abort-deconfigure" ] || [ "$1" = "abort-remove" ] ; then + if [ -d /run/systemd/system ]; then + systemctl --system daemon-reload >/dev/null || true + if [ -n "$2" ]; then + _dh_action=restart + else + _dh_action=start + fi + deb-systemd-invoke $_dh_action 'traintastic-server.service' >/dev/null || true + fi +fi diff --git a/server/debian/traintastic-server.service b/server/debian/traintastic-server.service new file mode 100644 index 00000000..7528f276 --- /dev/null +++ b/server/debian/traintastic-server.service @@ -0,0 +1,12 @@ +[Unit] +Description = Traintastic server daemon +After = network.target + +[Service] +Type = forking +PIDFile = /run/traintastic-server.pid +ExecStart = /opt/traintastic/bin/traintastic-server -d -u traintastic -g traintastic -D /var/opt/traintastic -P +Restart = on-abort + +[Install] +WantedBy = multi-user.target