summaryrefslogtreecommitdiff
path: root/px/services/networking.scm
blob: 05de25d9bac6fe14aa0b3bbf45e5553158872b65 (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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
(define-module (px services networking)
  #:use-module (gnu)
  #:use-module (gnu packages admin)
  #:use-module (gnu packages base)
  #:use-module (gnu packages linux)
  #:use-module (gnu packages ntp)
  #:use-module (gnu packages screen)
  #:use-module (gnu services admin)
  #:use-module (gnu services shepherd)
  #:use-module (gnu system)
  #:use-module (gnu system shadow)
  #:use-module (guix gexp)
  #:use-module (guix records)
  #:use-module (ice-9 match)
  #:use-module (ice-9 pretty-print)
  #:use-module (px packages networking)
  #:use-module (srfi srfi-1)

  #:export (chrony-service-configuration 
            chrony-service-type
            nebula-configuration
            nebula-configuration-package
            nebula-configuration-provision
            nebula-configuration-config-path
            %default-nebula-configuration
            nebula-service-type))

;;
;; Chrony SERVICE
;;

(define-record-type* <chrony-service-configuration>
                     chrony-service-configuration
                     make-chrony-service-configuration
  chrony-service-configuration?
  (package
    chrony-service-configuration-package
    (default chrony))
  (user chrony-service-configuration-user
        (default "root"))
  (config chrony-service-configuration-config
          (default "server 0.pool.ntp.org iburst
server 1.pool.ntp.org iburst
server 2.pool.ntp.org iburst
server 3.pool.ntp.org iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
logdir /var/log/chrony")))

(define (chrony-service-config-file config)
  "Return the chorny configuration file corresponding to CONFIG."
  (computed-file "chrony.conf"
                 (with-imported-modules '((guix build utils))
                                        #~(begin
                                            (use-modules (guix build utils))
                                            (call-with-output-file #$output
                                              (lambda (port)
                                                (format port
                                                        #$config)))))))

(define chrony-shepherd-service
  (match-lambda
    (($ <chrony-service-configuration> package user config)
     (list (shepherd-service (provision '(chrony))
                             (documentation "Run chrony as a daemon")
                             (requirement '(networking))
                             (start #~(make-forkexec-constructor (list (string-append #$package
                                                                        "/sbin/chronyd")
                                                                       "-n"
                                                                       "-u"
                                                                       #$user
                                                                       "-f"
                                                                       #$(chrony-service-config-file
                                                                          config))))
                             (stop #~(make-kill-destructor)))))))

(define chrony-service-type
  (service-type (name "chrony")
                (description "Chrony service")
                (extensions (list (service-extension
                                   shepherd-root-service-type
                                   chrony-shepherd-service)))
                (default-value (chrony-service-configuration))))

;;
;; Nebula SERVICE
;;

(define-record-type* <nebula-configuration> nebula-configuration
                     make-nebula-configuration
  nebula-configuration?
  (package
    nebula-configuration-package
    (default nebula))
  (provision nebula-configuration-provision)
  (config-path nebula-configuration-config-path))

(define nebula-profile-packages
  (lambda (configurations)
    (fold (lambda (config prv)
            (let ((pkg (nebula-configuration-package config)))
              (if (memq pkg prv) prv
                  (cons pkg prv))))
          '() configurations)))

(define (nebula-shepherd-service config)
  (match config
    (($ <nebula-configuration> package provision config-path)
     (let ((log-path (string-append "/var/log/"
                                    (symbol->string (car provision)) ".log")))
       (shepherd-service (provision provision)
                         (documentation
                          "Run configured instance of nebula on system start")
                         (requirement '(networking user-processes))
                         (start #~(make-forkexec-constructor (list (string-append #$package
                                                                    "/bin/nebula")
                                                                   "-config"
                                                                   #$config-path)
                                                             #:log-file #$log-path
                                                             #:environment-variables
                                                             (cons*
                                                              "HOME=/root"
                                                              "XDG_DATA_HOME=/root/.local/share"
                                                              "XDG_CONFIG_HOME=/root/.config"
                                                              "SSL_CERT_DIR=/run/current-system/profile/etc/ssl/certs"
                                                              "SSL_CERT_FILE=/run/current-system/profile/etc/ssl/certs/ca-certificates.crt"
                                                              (default-environment-variables))))
                         (stop #~(make-kill-destructor)))))))

(define (nebula-shepherd-services configurations)
  (map nebula-shepherd-service configurations))

(define %default-nebula-configuration
  (nebula-configuration (provision '(nebula))
                        (config-path "/etc/nebula/config.yml")))

(define %nebula-log-rotations
  (list (log-rotation (files (list "/var/log/nebula.log")))))

(define nebula-service-type
  (service-type (name 'nebula)
                (extensions (list (service-extension
                                   shepherd-root-service-type
                                   nebula-shepherd-services)
                                  (service-extension profile-service-type
                                                     nebula-profile-packages)
                                  (service-extension rottlog-service-type
                                                     (const
                                                      %nebula-log-rotations))))
                (default-value (list %default-nebula-configuration))
                (description
                 "Run configured instance of nebula on system start")))