summaryrefslogtreecommitdiff
path: root/sys-apps/shepherd
diff options
context:
space:
mode:
Diffstat (limited to 'sys-apps/shepherd')
-rw-r--r--sys-apps/shepherd/files/shepherd.scm85
-rw-r--r--sys-apps/shepherd/metadata.xml3
-rw-r--r--sys-apps/shepherd/shepherd-1.0.9.ebuild44
3 files changed, 125 insertions, 7 deletions
diff --git a/sys-apps/shepherd/files/shepherd.scm b/sys-apps/shepherd/files/shepherd.scm
new file mode 100644
index 0000000..b88cdb0
--- /dev/null
+++ b/sys-apps/shepherd/files/shepherd.scm
@@ -0,0 +1,85 @@
+(use-modules
+ (shepherd service)
+ (shepherd system)
+ (srfi srfi-1)
+ (srfi srfi-26)
+ (ice-9 ftw)
+ (ice-9 exceptions))
+
+(define %shepherd-service-directory
+ "/etc/shepherd/services")
+
+(define %shepherd-enabled-directory
+ "/etc/shepherd/enabled")
+
+(define (scm-file? file)
+ (string-suffix? ".scm" file))
+
+(define (service-file-name file)
+ (string-append %shepherd-service-directory "/" file))
+
+(define (enabled-service-name file)
+ (let ((name (basename file)))
+ (if (string-suffix? ".scm" name)
+ (substring name 0 (- (string-length name) 4))
+ name)))
+
+(define (load-service-file file)
+ (let ((path (service-file-name file)))
+ (catch #t
+ (lambda ()
+ (format #t "Loading Shepherd service: ~a~%" path)
+ (load path))
+ (lambda args
+ (format (current-error-port)
+ "Shepherd: failed to load service file ~a~%"
+ path)
+ (format (current-error-port)
+ "Shepherd error: ~s~%"
+ args)))))
+
+(define (load-service-directory)
+ (when (file-exists? %shepherd-service-directory)
+ (for-each
+ load-service-file
+ (sort
+ (filter scm-file?
+ (scandir %shepherd-service-directory))
+ string<?))))
+
+(define (enabled-service? name)
+ (let ((path (string-append %shepherd-enabled-directory "/" name)))
+ (or (file-exists? path)
+ (file-exists?
+ (string-append path ".scm")))))
+
+(define (registered-service? name)
+ (catch #t
+ (lambda ()
+ (lookup-service name)
+ #t)
+ (lambda _
+ #f)))
+
+(define (start-enabled-services)
+ (when (file-exists? %shepherd-enabled-directory)
+ (for-each
+ (lambda (file)
+ (let ((name (enabled-service-name file)))
+ (when (and (not (string=? name ""))
+ (registered-service? (string->symbol name)))
+ (format #t "Starting enabled Shepherd service: ~a~%"
+ name)
+ (start-service
+ (lookup-service (string->symbol name))))))
+ (sort
+ (filter
+ (lambda (file)
+ (and (not (string=? file "."))
+ (not (string=? file ".."))))
+ (scandir %shepherd-enabled-directory))
+ string<?))))
+
+(load-service-directory)
+
+(start-enabled-services)
diff --git a/sys-apps/shepherd/metadata.xml b/sys-apps/shepherd/metadata.xml
index 7917355..b047490 100644
--- a/sys-apps/shepherd/metadata.xml
+++ b/sys-apps/shepherd/metadata.xml
@@ -5,6 +5,9 @@
<flag name="service-files">
Overlay-manager provided service files.
</flag>
+ <flag name="sysv-utils">
+ Install Shepherd's SysV-style halt, reboot, and shutdown utilities.
+ </flag>
</use>
<upstream>
diff --git a/sys-apps/shepherd/shepherd-1.0.9.ebuild b/sys-apps/shepherd/shepherd-1.0.9.ebuild
index 434142c..709be29 100644
--- a/sys-apps/shepherd/shepherd-1.0.9.ebuild
+++ b/sys-apps/shepherd/shepherd-1.0.9.ebuild
@@ -8,7 +8,7 @@ LICENSE="GPL-3+"
SLOT="0"
KEYWORDS="~amd64 ~arm64 ~x86"
-IUSE="service-files test"
+IUSE="service-files sysv-utils test"
DEPEND="
dev-scheme/guile:3.0
@@ -45,18 +45,48 @@ src_test() {
src_install() {
emake DESTDIR="${D}" install GUILE_AUTO_COMPILE=0
+ if ! use sysv-utils; then
+ rm -f \
+ "${D}/sbin/halt" \
+ "${D}/sbin/reboot" \
+ "${D}/sbin/shutdown" \
+ "${D}/usr/sbin/halt" \
+ "${D}/usr/sbin/reboot" \
+ "${D}/usr/sbin/shutdown"
+
+ rm -f \
+ "${D}/usr/share/man/man8/halt.8" \
+ "${D}/usr/share/man/man8/halt.8.bz2" \
+ "${D}/usr/share/man/man8/halt.8.gz" \
+ "${D}/usr/share/man/man8/halt.8.xz" \
+ "${D}/usr/share/man/man8/reboot.8" \
+ "${D}/usr/share/man/man8/reboot.8.bz2" \
+ "${D}/usr/share/man/man8/reboot.8.gz" \
+ "${D}/usr/share/man/man8/reboot.8.xz" \
+ "${D}/usr/share/man/man8/shutdown.8" \
+ "${D}/usr/share/man/man8/shutdown.8.bz2" \
+ "${D}/usr/share/man/man8/shutdown.8.gz" \
+ "${D}/usr/share/man/man8/shutdown.8.xz"
+ fi
+
dodoc AUTHORS NEWS README THANKS
insinto /usr/share/licenses/${PN}
doins COPYING
- insinto /etc
- newins "${FILESDIR}/shepherd.scm" shepherd.scm
+ if use service-files; then
+ insinto /etc/shepherd
- newinitd "${FILESDIR}/shepherd.initd" shepherd
+ if [[ -f "${FILESDIR}/shepherd.scm" ]]; then
+ doins "${FILESDIR}/shepherd.scm"
+ fi
- if use service-files; then
- insinto /etc/shepherd/services
- doins "${FILESDIR}"/services/*.scm
+ if [[ -d "${FILESDIR}/services" ]]; then
+ insinto /etc/shepherd/services
+ for service in "${FILESDIR}"/services/*.scm; do
+ [[ -f "${service}" ]] || continue
+ doins "${service}"
+ done
+ fi
fi
}