From 2b4de877765c9d907d84e7f73f2e1ac34b041339 Mon Sep 17 00:00:00 2001 From: Chad Nelson Date: Thu, 27 Feb 2025 21:51:18 -0700 Subject: [PATCH] updated to test --- Makefile.am | 3 +- hall.scm | 3 +- msg/machine2.scm | 203 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 207 insertions(+), 2 deletions(-) create mode 100644 msg/machine2.scm diff --git a/Makefile.am b/Makefile.am index 0accd21..5d73be0 100644 --- a/Makefile.am +++ b/Makefile.am @@ -28,7 +28,8 @@ SOURCES = msg/config.scm \ msg/machine.scm \ msg/hconfig.scm \ msg/shell.scm \ - msg/helpers.scm + msg/helpers.scm \ + msg/machine2.scm TESTS = diff --git a/hall.scm b/hall.scm index 9cf9775..315f7d4 100644 --- a/hall.scm +++ b/hall.scm @@ -23,7 +23,8 @@ (scheme-file "machine") (scheme-file "hconfig") (scheme-file "shell") - (scheme-file "helpers"))))) + (scheme-file "helpers") + (scheme-file "machine2"))))) (tests ()) (programs ((directory "scripts" ((in-file "msg"))))) (documentation diff --git a/msg/machine2.scm b/msg/machine2.scm new file mode 100644 index 0000000..3d7c37a --- /dev/null +++ b/msg/machine2.scm @@ -0,0 +1,203 @@ +(define-module (msg machine2) + #:use-module (ice-9 match) + #:use-module (ice-9 rdelim) + #:use-module (ice-9 textual-ports) + #:use-module (system foreign) + #:use-module (msg helpers) + #:use-module (msg config) + #:export (machine)) + + +(define home-path (getenv "HOME")) +(define arch (run-shell-command "uname -m")) + + +(define cpu-conf #f) +(define mem-conf #f) + +(define* (load-config #:optional args) + (define config-file (format #f "~a/.guix/qemu/config.scm" home-path)) + (define loaded-config (manage-config config-file)) + (if (not (null? loaded-config)) + (begin + (set! cpu-conf (cdr (assoc 'cpu loaded-config))) + (set! mem-conf (cdr (assoc 'mem loaded-config))) + #t) + #f)) + + +(define* (machine #:optional (args (command-line))) + ;;(define clean-args (cdr args)) + (match args + (("-h") + (help)) + (("init" rest ...) + (init rest)) + (("reinit") + (stop) + (clear-install) + (init)) + (("start" rest ...) + (start rest)) + (("stop") + (stop)) + (("rm") + (stop) + (clear-install)) + (_ + (display "Please enter a valid command or -h for help.\n")))) + + + + +(define* (help) + (display "\nHere are the available commands:\n\n") + (display "start: Start the MSG envrionment.\n")) + +(define* (clear-install) + (let loop () + (display "This is a destructive command and will remove your entire Guix instance. Proceed? (y/n)\n") + (define response (read-line)) + (cond + ((string=? response "y") + (system "rm -r ~/.guix") + ) + ((string=? response "n") + (display "Operation canceled.\n") + (exit 0)) + (else + (display "Please enter a valid response.\n") + (loop))))) + +(define* (start #:optional args) + (define config (load-config)) + (if (not (directory-exists? (format #f "~a/.guix" home-path))) + (begin + (display "MSG not initialized. Please run `msg machine init` to continue. If you already tried to install and are receiving this message, try running `msg machine reinit`") + (exit 0))) + (cond + ((string=? arch "arm64") + (system (format #f "/opt/homebrew/bin/qemu-system-aarch64 \ + -machine virt,highmem=on \ + -accel hvf \ + -cpu host \ + -smp ~a \ + -display none \ + -hda $HOME/.guix/qemu/guix-user.qcow2 \ + -m ~aG \ + -virtfs local,path=/Users,security_model=mapped,mount_tag=macos \ + -bios /opt/homebrew/opt/qemu/share/qemu/edk2-aarch64-code.fd \ + -device virtio-net,netdev=vmnic \ + -netdev user,id=vmnic,hostfwd=tcp:127.0.0.1:9001-:22 &" cpu-conf mem-conf))) + ((string=? arch "x86_64") + (system (format #f "/usr/local/bin/qemu-system-x86_64 \ + -machine type=q35,accel=hvf \ + -smp ~a \ + -hda $HOME/.guix/qemu/guix-user.qcow2 \ + -m ~aG \ + -display none \ + -cpu Nehalem \ + -virtfs local,path=/Users,security_model=mapped,mount_tag=macos \ + -device virtio-net,netdev=vmnic \ + -netdev user,id=vmnic,hostfwd=tcp:127.0.0.1:9001-:22 &" cpu-conf mem-conf)))) + (display "MSG has been started") + ) + +(define* (stop) + (system "ssh -o StrictHostKeyChecking=no -i $HOME/.guix/ssh-cert/msg_rsa admin@127.0.0.1 -p 9001 'sudo shutdown'")) + + +(define* (init #:optional args) + + (if (not (directory-exists? (format #f "~a/.guix" home-path))) + (begin + ;; Grab ssh cert for installer + (system "mkdir -p $HOME/.guix/qemu $HOME/.guix/home $HOME/.guix/ssh-cert") + (system "ssh-keygen -R \"[127.0.0.1]:9001\"") + ;; Download system image and and start vm + (cond + ((string=? arch "arm64") + (system "/opt/homebrew/bin/wget https://objectstorage.us-phoenix-1.oraclecloud.com/n/axfgkze2xif1/b/guix-system/o/msg-system-aarch64guix-installer.qcow2.tar.gz -O $HOME/.guix/qemu/guix.qcow2.tar.gz") + (system "tar -xvzf $HOME/.guix/qemu/guix.qcow2.tar.gz -C $HOME/.guix/qemu/") + (system "/opt/homebrew/bin/wget https://objectstorage.us-phoenix-1.oraclecloud.com/n/axfgkze2xif1/b/guix-system/o/msg-system-aarch64config.scm -O $HOME/.guix/home/config.scm") + ;; Get msg ssh-key + (system "/opt/homebrew/bin/wget https://objectstorage.us-phoenix-1.oraclecloud.com/n/axfgkze2xif1/b/guix-system/o/msg_rsa -O $HOME/.guix/ssh-cert/msg_rsa") + (system "chmod 400 ~/.guix/ssh-cert/msg_rsa ") + (system "/opt/homebrew/bin/qemu-system-aarch64 \ + -machine virt,highmem=on \ + -accel hvf \ + -cpu host \ + -smp 4 \ + -display none \ + -hda $HOME/.guix/qemu/guix-user.qcow2 \ + -m 4G \ + -virtfs local,path=$HOME/.guix/home,security_model=mapped,mount_tag=macos \ + -bios /opt/homebrew/opt/qemu/share/qemu/edk2-aarch64-code.fd \ + -device virtio-net,netdev=vmnic \ + -netdev user,id=vmnic,hostfwd=tcp:127.0.0.1:9001-:22 &") + (sleep 5) + (update-uid) + + (build-msg) + + (system "ssh -o StrictHostKeyChecking=no -i $HOME/.guix/ssh-cert/msg_rsa root@127.0.0.1 -p 9001 'shutdown'") + (system "ssh-keygen -R \"[127.0.0.1]:9001\"") + (sleep 30) + (system "rm ~/.guix/qemu/guix-user.qcow2") + (system "mv ~/.guix/home/guix-user.qcow2 ~/.guix/qemu/") + (start) + (sleep 15) + (system "ssh -o StrictHostKeyChecking=no -i $HOME/.guix/ssh-cert/msg_rsa admin@127.0.0.1 -p 9001 'sudo mkdir /Users /boot/efi'") + (system "ssh -o StrictHostKeyChecking=no -i $HOME/.guix/ssh-cert/msg_rsa admin@127.0.0.1 -p 9001 'sudo mount /dev/vda1 /boot/efi'")) + ((string=? arch "x86_64") + (system "/usr/local/bin/wget https://objectstorage.us-phoenix-1.oraclecloud.com/n/axfgkze2xif1/b/guix-system/o/msg-system-x86_64guix-installer.qcow2.tar.gz -O $HOME/.guix/qemu/guix.qcow2.tar.gz") + (system "tar -xvzf $HOME/.guix/qemu/guix.qcow2.tar.gz -C $HOME/.guix/qemu/") + (system "/usr/local/bin/wget https://objectstorage.us-phoenix-1.oraclecloud.com/n/axfgkze2xif1/b/guix-system/o/msg-system-x86_64config.scm -O $HOME/.guix/home/config.scm") + ;; Get msg ssh-key + (system "/usr/local/bin/wget https://objectstorage.us-phoenix-1.oraclecloud.com/n/axfgkze2xif1/b/guix-system/o/msg_rsa -O $HOME/.guix/ssh-cert/msg_rsa") + (system "chmod 400 ~/.guix/ssh-cert/msg_rsa ") + (system "/usr/local/bin/qemu-system-x86_64 \ + -machine type=q35,accel=hvf \ + -smp 4 \ + -hda $HOME/.guix/qemu/guix-installer.qcow2 \ + -m 4G \ + -display none \ + -cpu Nehalem \ + -virtfs local,path=$HOME/.guix/home,security_model=mapped,mount_tag=macos \ + -device virtio-net,netdev=vmnic \ + -netdev user,id=vmnic,hostfwd=tcp:127.0.0.1:9001-:22 &") + (sleep 5) + (update-uid) + + (build-msg) + + (system "ssh -o StrictHostKeyChecking=no -i $HOME/.guix/ssh-cert/msg_rsa root@127.0.0.1 -p 9001 'shutdown'") + (system "ssh-keygen -R \"[127.0.0.1]:9001\"") + (sleep 30) + (system "rm ~/.guix/qemu/guix-installer.qcow2") + (system "mv ~/.guix/home/guix-user.qcow2 ~/.guix/qemu/") + (start) + (sleep 15) + (system "ssh -o StrictHostKeyChecking=no -i $HOME/.guix/ssh-cert/msg_rsa admin@127.0.0.1 -p 9001 'sudo mkdir /Users'"))) + + + + (newline) + (display "Reconfiguring MSG, this may take a few minutes...") + (system "ssh -o StrictHostKeyChecking=no -i $HOME/.guix/ssh-cert/msg_rsa admin@127.0.0.1 -p 9001 'sudo guix system reconfigure --allow-downgrades /etc/config.scm'") + (system "ssh -o StrictHostKeyChecking=no -i $HOME/.guix/ssh-cert/msg_rsa admin@127.0.0.1 -p 9001 'sudo shutdown'") + (display "\nMSG is ready to be started. Run 'msg machine start' to begin.\n")) + (display "MSG already initialized. Please run `msg machine reinit` if you would like to recreate it.")) + + + ) + +(define (build-msg) + ;; Build MSG + (define* filename (run-shell-command "ssh -o StrictHostKeyChecking=no -i $HOME/.guix/ssh-cert/msg_rsa root@127.0.0.1 -p 9001 'guix system image -t qcow2 --save-provenance --image-size=100G /etc/config.scm'")) + (system (format #f "ssh -o StrictHostKeyChecking=no -i $HOME/.guix/ssh-cert/msg_rsa root@127.0.0.1 -p 9001 'cp ~a /mnt/macos/guix-user.qcow2'" filename))) + +(define (update-uid) + ;; Update UID for msg image + (system "sed -i.bak \"s/\\$UID/$(id -u)/g\" ~/.guix/home/config.scm && rm ~/.guix/home/config.scm.bak") + (system "ssh -o StrictHostKeyChecking=no -i $HOME/.guix/ssh-cert/msg_rsa root@127.0.0.1 -p 9001 'cp /mnt/macos/config.scm /etc/config.scm'"))