summary refs log tree commit diff
path: root/gnu/machine.scm
blob: 4fde7d5c010c8765098606d3b38d3085254762cd (plain) (blame)
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
(define-module (gnu machine)
  #:use-module ((gnu packages package-management) #:select (guix))
  #:use-module (gnu system)
  #:use-module (guix derivations)
  #:use-module (guix inferior)
  #:use-module (guix packages)
  #:use-module (guix ssh)
  #:use-module (guix store)
  #:use-module (oop goops)
  #:use-module (ssh session)
  #:export (<machine>
            system
            display-name
            build-os
            deploy-os
            remote-eval

            <sshable-machine>
            host-name
            ssh-port
            ssh-user))

(define-class <machine> ()
  (system #:getter system #:init-keyword #:system))

(define-method (display-name (machine <machine>))
  (operating-system-host-name (system machine)))

(define-method (build-os (machine <machine>) store)
  (let* ((guixdrv (run-with-store store (package->derivation guix)))
         (guixdir (and (build-derivations store (list guixdrv))
                       (derivation->output-path guixdrv)))
         (osdrv (run-with-store store (operating-system-derivation
                                       (system machine)))))
    (and (build-derivations store (list osdrv))
         (list (derivation-file-name osdrv)
               (derivation->output-path osdrv)))))

(define-method (deploy-os (machine <machine>) store osdrv)
  (error "not implemented"))

(define-method (remote-eval (machine <machine>) exp)
  (error "not implemented"))

(define-class <sshable-machine> (<machine>)
  (host-name #:getter host-name #:init-keyword #:host-name)
  (ssh-port #:getter ssh-port #:init-keyword #:ssh-port #:init-form 22)
  (ssh-user #:getter ssh-user #:init-keyword #:ssh-user #:init-form "root")
  ;; ??? - SSH key config?
  )

(define-method (deploy-os (machine <sshable-machine>) store osdrvs)
  (let ((session (open-ssh-session (host-name machine)
                                   #:user (ssh-user machine)
                                   #:port (ssh-port machine))))
    (with-store store (send-files store osdrvs
                                  (connect-to-remote-daemon session)
                                  #:recursive? #t))
    #t))