#  -*- Mode: rpm-spec; indent-tabs-mode: nil -*- */
#  SPDX-License-Identifier: LGPL-2.1-or-later
#
#  This file is part of systemd.
#  Copyright © 2018 Neal Gompa

# The contents of this are an example to be copied into systemd.spec.
#
# Minimum rpm version supported: 4.14.0

%transfiletriggerin -P 900900 -p <lua> -- {{SYSTEM_DATA_UNIT_DIR}} /etc/systemd/system
-- This script will run after any package is initially installed or
-- upgraded. We care about the case where a package is initially
-- installed, because other cases are covered by the *un scriptlets,
-- so sometimes we will reload needlessly.
if posix.access("/run/systemd/system") then
    pid = posix.fork()
    if pid == 0 then
        assert(posix.exec("%{_bindir}/systemctl", "daemon-reload"))
    elseif pid > 0 then
        posix.wait(pid)
    end

    pid = posix.fork()
    if pid == 0 then
        assert(posix.exec("%{_bindir}/systemctl", "reload-or-restart", "--marked"))
    elseif pid > 0 then
        posix.wait(pid)
    end
end

%transfiletriggerpostun -P 1000100 -p <lua> -- {{SYSTEM_DATA_UNIT_DIR}} /etc/systemd/system
-- On removal, we need to run daemon-reload after any units have been
-- removed.
-- On upgrade, we need to run daemon-reload after any new unit files
-- have been installed, but before %postun scripts in packages get
-- executed.
if posix.access("/run/systemd/system") then
    pid = posix.fork()
    if pid == 0 then
        assert(posix.exec("%{_bindir}/systemctl", "daemon-reload"))
    elseif pid > 0 then
        posix.wait(pid)
    end
end

%transfiletriggerpostun -P 10000 -p <lua> -- {{SYSTEM_DATA_UNIT_DIR}} /etc/systemd/system
-- We restart remaining services that should be restarted here.
if posix.access("/run/systemd/system") then
    pid = posix.fork()
    if pid == 0 then
        assert(posix.exec("%{_bindir}/systemctl", "reload-or-restart", "--marked"))
    elseif pid > 0 then
        posix.wait(pid)
    end
end

%transfiletriggerin -P 100700 -p <lua> -- {{SYSUSERS_DIR}}
-- This script will process files installed in {{SYSUSERS_DIR}} to create
-- specified users automatically. The priority is set such that it
-- will run before the tmpfiles file trigger.
pid = posix.fork()
if pid == 0 then
    assert(posix.exec("%{_bindir}/systemd-sysusers"))
elseif pid > 0 then
    posix.wait(pid)
end

%transfiletriggerin -P 1000700 udev -p <lua> -- {{UDEV_HWDB_DIR}}
-- This script will automatically invoke hwdb update if files have been
-- installed or updated in {{UDEV_HWDB_DIR}}.
pid = posix.fork()
if pid == 0 then
    assert(posix.exec("%{_bindir}/systemd-hwdb", "update"))
elseif pid > 0 then
    posix.wait(pid)
end

%transfiletriggerin -P 1000700 -p <lua> -- {{SYSTEMD_CATALOG_DIR}}
-- This script will automatically invoke journal catalog update if files
-- have been installed or updated in {{SYSTEMD_CATALOG_DIR}}.
pid = posix.fork()
if pid == 0 then
    assert(posix.exec("%{_bindir}/journalctl", "--update-catalog"))
elseif pid > 0 then
    posix.wait(pid)
end

%transfiletriggerin -P 1000700 -p <lua> -- {{BINFMT_DIR}}
-- This script will automatically apply binfmt rules if files have been
-- installed or updated in {{BINFMT_DIR}}.
if posix.access("/run/systemd/system") then
    pid = posix.fork()
    if pid == 0 then
        assert(posix.exec("{{ROOTLIBEXECDIR}}/systemd-binfmt"))
    elseif pid > 0 then
        posix.wait(pid)
    end
end

%transfiletriggerin -P 1000600 -p <lua> -- {{TMPFILES_DIR}}
-- This script will process files installed in {{TMPFILES_DIR}} to create
-- tmpfiles automatically. The priority is set such that it will run
-- after the sysusers file trigger, but before any other triggers.
if posix.access("/run/systemd/system") then
    pid = posix.fork()
    if pid == 0 then
        assert(posix.exec("%{_bindir}/systemd-tmpfiles", "--create"))
    elseif pid > 0 then
        posix.wait(pid)
    end
end

%transfiletriggerin -P 1000600 udev -p <lua> -- {{UDEV_RULES_DIR}}
-- This script will automatically update udev with new rules if files
-- have been installed or updated in {{UDEV_RULES_DIR}}.
if posix.access("/run/systemd/system") then
    pid = posix.fork()
    if pid == 0 then
        assert(posix.exec("%{_bindir}/udevadm", "control", "--reload"))
    elseif pid > 0 then
        posix.wait(pid)
    end
end

%transfiletriggerin -P 1000500 -p <lua> -- {{SYSCTL_DIR}}
-- This script will automatically apply sysctl rules if files have been
-- installed or updated in {{SYSCTL_DIR}}.
if posix.access("/run/systemd/system") then
    pid = posix.fork()
    if pid == 0 then
        assert(posix.exec("{{ROOTLIBEXECDIR}}/systemd-sysctl"))
    elseif pid > 0 then
        posix.wait(pid)
    end
end
