summaryrefslogtreecommitdiff
path: root/px/services/enterprise.scm
blob: 998092b1db5e2ca91fe99bf1231010f2ff15de35 (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
(define-module (px services enterprise)
  #:use-module (gnu packages bash)
  #:use-module (gnu packages databases)
  #:use-module (gnu services)
  #:use-module (gnu services shepherd)
  #:use-module (guix gexp)
  #:use-module (guix records)
  #:use-module (ice-9 match)
  #:export (px-channel-migration-configuration
            px-channel-migration-service-type))

;;;
;;; Channel Migration Service
;;;

(define-record-type* <px-channel-migration-configuration>
  px-channel-migration-configuration make-px-channel-migration-configuration
  px-channel-migration-configuration?
  (profile  px-channel-migration-configuration-profile  ;; path to profile we want to migrate (root)
            (default "/root/.config/guix/current"))
  (config   px-channel-migration-configuration-config   ;; path to system configuration file
            (default "/etc/system.scm"))
  (channels px-channel-migration-configuration-channels ;; path to channels file
            (default "/etc/guix/channels.scm"))
  (branch   px-channel-migration-configuration-branch)  ;; target branch that we want to migrate to
  (timeout  px-channel-migration-configuration-timeout  ;; timeout before start the migration
            (default 60)))


(define (px-channel-migration->script config)
  (match config
    (($ <px-channel-migration-configuration> profile config channels branch timeout)
     (computed-file
      "px-channel-migration.sh"
      #~(begin
          (call-with-output-file #$output
            (lambda (port)
              (format port "# AUTO GENERATED BY: px-channel-migration-service
GUIX_PROFILE=~a
SYSTEM_CONFIG=~a
SYSTEM_CHANNELS=~a
TARGET_BRANCH=~a
START_TIMEOUT=~a
RETRY_TIMEOUT=15
echo \"--------------------------------------------\"
echo \">>> service started\"
echo \">>> Sleep for $START_TIMEOUT\"
sleep $START_TIMEOUT

UPGRADE_FILE=/etc/last_unattended_upgrade.txt

if [ -f $UPGRADE_FILE ]; then
  BOOT_TIME=$(cat /proc/stat | grep btime | awk '{print $2}')
  LAST_UPGRADE=$(cat $UPGRADE_FILE)
  if [ $BOOT_TIME -lt $LAST_UPGRADE ]; then
    echo 'Migration ran once since last reboot. Exiting...'
    exit 0
  fi
fi

echo \">>> Profile Path: $GUIX_PROFILE\"
. \"$GUIX_PROFILE/etc/profile\"

echo \">>> System status:\"
guix describe
current_branch=$(guix describe --format=recutils | ~a -e \"name='guix'\" -P 'branch')
# if [ \"$current_branch\" == \"$TARGET_BRANCH\" ]; then
#   echo \"Machine already migrated\"
#   exit 0
# fi

echo \">>> Pull latest changes\"
guix pull --allow-downgrades --disable-authentication
if [ $? -ne 0 ]; then
  echo 'ERROR: Pull Failed'
  exit 1
fi

echo \">>> Start system reconfigure\"
function perform_reconfigure {
  guix time-machine --disable-authentication --channels=$SYSTEM_CHANNELS \
    -- system reconfigure --allow-downgrades $SYSTEM_CONFIG
}
perform_reconfigure
while [ $? -ne 0 ]; do
  echo \"ERROR: reconfigure failed. retry in $RETRY_TIMEOUT seconds.\"
  sleep $RETRY_TIMEOUT
  perform_reconfigure
done

guix describe
echo $(date +'%s') > $UPGRADE_FILE
echo \">>> Device channels migrated successfully.\"
" #$profile #$config #$channels #$branch #$timeout #$(file-append recutils "/bin/recsel")))))))))


(define (px-channel-migration-shepherd-service config)
  (match config
    (($ <px-channel-migration-configuration> ...)
     (let ((script (px-channel-migration->script config)))
       (list (shepherd-service
              (provision '(px-channel-migration))
              (documentation "Migrate device channels to new references")
              (requirement '(networking user-processes))
              (one-shot? #t)
              (start #~(make-forkexec-constructor
                        (list (string-append #$bash "/bin/bash")
                              #$script)
                        #: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))
                        #:log-file "/var/log/px-channel-migration.log"))
              (stop #~(make-kill-destructor))))))))


(define px-channel-migration-service-type
  (service-type
   (name 'px-channel-migration)
   (description "Migrate device channels to new references")
   (extensions (list (service-extension shepherd-root-service-type
                                        px-channel-migration-shepherd-service)))))