summaryrefslogtreecommitdiff
path: root/sys-apps/shepherd
diff options
context:
space:
mode:
authorcoast <coasteen@proton.me>2026-10-02 05:16:38 +0330
committercoast <coasteen@proton.me>2026-10-02 05:16:38 +0330
commitc8e755ce1d4dd5d4b215516c4561000743152ae9 (patch)
treec7e6aedefced48320840ed4489fb72dbbf85d683 /sys-apps/shepherd
parentae27153d0b1bd5650240e5f94c8c71a2f5f97861 (diff)
added shepherd.scm
Diffstat (limited to 'sys-apps/shepherd')
-rw-r--r--sys-apps/shepherd/files/shepherd.scm85
1 files changed, 85 insertions, 0 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)