summaryrefslogtreecommitdiff
path: root/px/services/enterprise.scm
diff options
context:
space:
mode:
Diffstat (limited to 'px/services/enterprise.scm')
-rw-r--r--px/services/enterprise.scm126
1 files changed, 126 insertions, 0 deletions
diff --git a/px/services/enterprise.scm b/px/services/enterprise.scm
new file mode 100644
index 0000000..998092b
--- /dev/null
+++ b/px/services/enterprise.scm
@@ -0,0 +1,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)))))