diff options
-rw-r--r-- | gnu/machine/digital-ocean.scm | 52 |
1 files changed, 40 insertions, 12 deletions
diff --git a/gnu/machine/digital-ocean.scm b/gnu/machine/digital-ocean.scm index bc8dadc147..dc89862ca2 100644 --- a/gnu/machine/digital-ocean.scm +++ b/gnu/machine/digital-ocean.scm @@ -22,6 +22,7 @@ #:use-module (gnu machine ssh) #:use-module (gnu machine) #:use-module (gnu services) + #:use-module (gnu services base) #:use-module (gnu services networking) #:use-module (gnu system) #:use-module (gnu system pam) @@ -188,11 +189,24 @@ an environment type of 'digital-ocean-environment-type'." ;;; System deployment. ;;; +;; XXX Copied from (gnu services base) +(define* (ip+netmask->cidr ip netmask #:optional (family AF_INET)) + "Return the CIDR notation (a string) for @var{ip} and @var{netmask}, two +@var{family} address strings, where @var{family} is @code{AF_INET} or +@code{AF_INET6}." + (let* ((netmask (inet-pton family netmask)) + (bits (logcount netmask))) + (string-append ip "/" (number->string bits)))) + ;; The following script was adapted from the guide available at ;; <https://wiki.pantherx.org/Installation-digital-ocean/>. (define (guix-infect network) "Given NETWORK, an alist describing the Droplet's public IPv4 network interface, return a Bash script that will install the Guix system." + (define cidr + (ip+netmask->cidr + (assoc-ref network "ip_address") + (assoc-ref network "netmask"))) (format #f "#!/bin/bash apt-get update @@ -229,7 +243,7 @@ export GUIX_LOCPATH=\"$HOME/.guix-profile/lib/locale\" guix package -i openssl cat > /etc/bootstrap-config.scm << EOF (use-modules (gnu)) -(use-service-modules networking ssh) +(use-service-modules base networking ssh) (operating-system (host-name \"gnu-bootstrap\") @@ -244,10 +258,17 @@ cat > /etc/bootstrap-config.scm << EOF (type \"ext4\")) %base-file-systems)) (services - (append (list (static-networking-service \"eth0\" \"~a\" - #:netmask \"~a\" - #:gateway \"~a\" - #:name-servers '(\"84.200.69.80\" \"84.200.70.40\")) + (append (list (service static-networking-service-type + (list (static-networking + (addresses + (list (network-address + (device \"eth0\") + (value \"~a\")))) + (routes + (list (network-route + (destination \"default\") + (gateway \"~a\")))) + (name-servers '(\"84.200.69.80\" \"84.200.70.40\"))))) (simple-service 'guile-load-path-in-global-env session-environment-service-type \\`((\"GUILE_LOAD_PATH\" @@ -268,8 +289,7 @@ mv /etc /old-etc mkdir /etc cp -r /old-etc/{passwd,group,shadow,gshadow,mtab,guix,bootstrap-config.scm} /etc/ guix system reconfigure /etc/bootstrap-config.scm" - (assoc-ref network "ip_address") - (assoc-ref network "netmask") + cidr (assoc-ref network "gateway"))) (define (machine-wait-until-available machine) @@ -301,11 +321,19 @@ named DROPLET-NAME." configuration for the public IPv4 network described by the alist NETWORK." (operating-system (inherit (machine-operating-system target)) - (services (cons* (static-networking-service "eth0" - (assoc-ref network "ip_address") - #:netmask (assoc-ref network "netmask") - #:gateway (assoc-ref network "gateway") - #:name-servers '("84.200.69.80" "84.200.70.40")) + (services (cons* (service static-networking-service-type + (list (static-networking + (addresses + (list (network-address + (device "eth0") + (value (ip+netmask->cidr + (assoc-ref network "ip_address") + (assoc-ref network "netmask")))))) + (routes + (list (network-route + (destination "default") + (gateway (assoc-ref network "gateway"))))) + (name-servers '("84.200.69.80" "84.200.70.40"))))) (simple-service 'guile-load-path-in-global-env session-environment-service-type `(("GUILE_LOAD_PATH" |