summaryrefslogtreecommitdiff
path: root/sys-apps/shepherd/files/shepherd.scm
blob: b88cdb0695f78782ae734e061a6cec0fc787656d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
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)