aboutsummaryrefslogtreecommitdiff
path: root/etc/guix-daemon.service.in
blob: 407cdd199c8304d769b5fca8df9623f62077e2e7 (about) (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# This is a "service unit file" for the systemd init system to launch
# 'guix-daemon'.  Drop it in /etc/systemd/system or similar to have
# 'guix-daemon' automatically started.

[Unit]
Description=Build daemon for GNU Guix

[Service]
ExecStart=@localstatedir@/guix/profiles/per-user/root/current-guix/bin/guix-daemon --build-users-group=guixbuild
Environment='GUIX_LOCPATH=@localstatedir@/guix/profiles/per-user/root/guix-profile/lib/locale' LC_ALL=en_US.utf8
RemainAfterExit=yes
StandardOutput=syslog
StandardError=syslog

# See <https://lists.gnu.org/archive/html/guix-devel/2016-04/msg00608.html>.
# Some package builds (for example, go@1.8.1) may require even more than
# 1024 tasks.
TasksMax=8192

[Install]
WantedBy=multi-user.target
/a> 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 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222
;;; SPDX-License-Identifier: CC0-1.0
;;;
;;; Copyright (C) 2023, 2024 Wojtek Kosior <koszko@koszko.org>

(use-modules ((scheme base) #:select (bytevector-copy string->utf8))
             ((srfi srfi-8) #:select (receive))
             ((srfi srfi-26) #:select (cut))
             ((srfi srfi-34) #:select (guard raise))
             ((ice-9 safe-r5rs) #:select (null-environment))
             ((ice-9 format) #:select (format))
             ((web client) #:select (open-socket-for-uri http-get))
             ((web response) #:prefix rsp:)
             ((web uri) #:prefix uri:)
             ((myra-test-utils) #:prefix tu:))

(define (make-env)
  (let ((env (null-environment 5)))
    (module-use! env (resolve-interface '(guile)))
    env))

(define (test-env name)
  (resolve-module `(cantius-test ,name)))

(define (open-socket-with-timeout uri timeout)
  (let ((start-time (current-time)))
    (let loop ()
      (guard (cnd ((> (current-time) (+ start-time timeout))
                   (raise cnd))
                  (#t
                   (sleep 1)
                   (loop)))
        (open-socket-for-uri uri)))))

(tu:test-group "nonfree-site"
  (tu:test-assert
   (or (eval '(begin
                (define-module (cantius-test nonfree-site)
                  #:use-module ((srfi srfi-18) #:select
                                (make-thread thread-terminate! thread-yield!
                                 thread-start!))
                  #:use-module ((ice-9 format) #:select (format))
                  #:use-module ((ice-9 textual-ports) #:select (get-string-all))
                  #:use-module (cantius))

                (define sock-port
                  #f))
             (make-env))))

  (tu:test-assert
   (or (eval '(begin
                (define %my-endset
                  (endset))

                (define-endpoint %my-endset about-ms
                  ("cool-companies" "ms" "about") '()
                  "Microsoft is my favorite company.  I started using
 Microsoft at the age of...")

                (define-endpoint %my-endset broken
                  ("cool-companies" "ms" "product-list") '()
                  (/ 1 0))

                (define-endpoint %my-endset drm-wiki
                  ("drm-wiki" ,(string-append "dev" "ices") . some-path) '()
                  (values (build-response*)
                          (format #f "~@{~@?~%~^~}"
                                  "full page path1: ~a" (%current-path-string)
                                  "full page path2: ~{/~a~}" (%current-path)
                                  "device page path: ~{/~a~}" some-path)))

                (define-endpoint %my-endset about-google
                  ,(list "cool-companies" "google" "about")
                  `((,%redirect/normalize-path? . #f)
                    (,%redirect/remove-query? . #f))
                  (values (build-response*)
                          "Google provides the best services in the world..."))

                (define-endpoint %my-endset static-files
                  ("static" . file-path)
                  `((,%resource-root-path
                     . ,(dirname (search-path %load-path "cantius" ".scm")))
                    (,%default-headers
                     . ((content-type
                         . (text/formatted (charset . "Windows-1252"))))))
                  (call-with-input-file
                      (find-resource-file (string-join file-path "/"))
                    get-string-all))

                (define server-sock
                  (socket PF_INET SOCK_STREAM 0))

                (bind server-sock AF_INET INADDR_LOOPBACK 0)

                (define sock-port
                  (sockaddr:port (getsockname server-sock)))

                (define server-thread
                  (make-thread
                   (lambda ()
                     (run-cantius %my-endset #:socket server-sock))))

                (thread-start! server-thread)

                (thread-yield!))
             (test-env 'nonfree-site))
       #t))

  (define (get path)
    (false-if-exception
     (let* ((sock-port (eval 'sock-port (test-env 'nonfree-site)))
            (client-sock (open-socket-with-timeout
                          (format #f "http://localhost:~a" sock-port)
                          5)))
       (dynamic-wind
         (const #f)
         (lambda ()
           (receive (response response-body)
               (http-get (string-append "http://dummy" path) #:port client-sock)
             (list response response-body)))
         (lambda ()
           (close client-sock))))))

  (tu:test-group "ms-about"
    (define ms-result
      (get "/cool-companies/ms/about"))

    (tu:test-eqv 200 (rsp:response-code (car ms-result)))

    (tu:test-equal '(text/plain (charset . "utf-8"))
                   (rsp:response-content-type (car ms-result)))

    (tu:test-assert (string-prefix? "Microsoft is my favorite company"
                                    (cadr ms-result))))

  (for-each
   (lambda (path)
     (tu:test-group "ms-about-auto-redirect"
       (define ms-redirect-result
         (get path))

       (tu:test-eqv 301 (rsp:response-code (car ms-redirect-result)))

       (tu:test-equal "/cool-companies/ms/about"
                      (uri:uri-path
                       (rsp:response-location (car ms-redirect-result))))))
   '("/cool-companies//ms/about" "/cool-companies/ms/about?a=b"))

  (tu:test-group "error-500"
    (define error-500-result
      (get "/cool-companies/ms/product-list"))

    (tu:test-eqv 500 (rsp:response-code (car error-500-result)))

    (tu:test-assert (string-contains (cadr error-500-result) "Backtrace")))

  (tu:test-group "error-404"
    (define error-404-result
      (get "/cool-companies/amazon//about?c=d"))

    (tu:test-eqv 404 (rsp:response-code (car error-404-result))))

  (tu:test-group "drm-wiki"
    (define ipad-result
      (get "/drm-wiki/devices/apple/ipad"))

    (tu:test-equal (format #f "~@{~a~%~}"
                           "full page path1: /drm-wiki/devices/apple/ipad"
                           "full page path2: /drm-wiki/devices/apple/ipad"
                           "device page path: /apple/ipad")
                   (cadr ipad-result)))

  (tu:test-group "about-google"
    (define google-result
      (get "/cool-companies///google/about?e=f"))

    (tu:test-eqv 200 (rsp:response-code (car google-result)))

    (tu:test-assert (string-prefix? "Google provides" (cadr google-result))))

  (tu:test-group "valid-static-resources"
    (define valid-resource-result
      (get "/static/cantius.scm"))

    (tu:test-eqv 200 (rsp:response-code (car valid-resource-result)))

    (tu:test-equal '(text/formatted (charset . "Windows-1252"))
                   (rsp:response-content-type (car valid-resource-result)))

    (tu:test-assert (string-prefix? ";;; " (cadr valid-resource-result))))

  (tu:test-group "illegal-static-resources"
    (for-each (lambda (resource-path)
                (define illegal-resource-result
                  (get resource-path))

                (tu:test-eqv 403
                             (rsp:response-code (car illegal-resource-result)))

                ;; Default handler for illegal resource accesses is expected to
                ;; ignore the value of the `%default-headers` parameter.
                (tu:test-equal '(text/plain (charset . "utf-8"))
                               (rsp:response-content-type
                                (car illegal-resource-result))))

              '("/static/../../../../../etc/passwd"
                "/static/stylesheets/."
                "/static/nonfree/../scripts/main.js")))

  (tu:test-group "missing-static-resources"
    (define missing-resource-result
      (get "/static/i'm-not-here!!!"))

    (tu:test-eqv 404 (rsp:response-code (car missing-resource-result)))

    ;; Default handler for missing resource accesses is expected to ignore the
    ;; value of the `%default-headers` parameter.
    (tu:test-equal '(text/plain (charset . "utf-8"))
                   (rsp:response-content-type (car missing-resource-result))))

  (tu:test-assert (eval '(begin (thread-terminate! server-thread)
                                (close server-sock))
                        (test-env 'nonfree-site))))