msg-cli/msg/machine.scm
Chad Nelson 55dc43c035 init push
Finished configuring the init/shell commands

Updated readme

Fixed issue with missing /boot/efi directory

Added new config module for setting/retrieving vm configs

Updated machine setup

Fixed issue with missing files

added config to docs section

added x86_64 support

fixed issue with x86_64 update and updated README

Added some content to README

Added markdown export of org file

Updated readme to reflect the need for guile-next

Removed guile from install example

exported changes to md

Updated README

fixed issue with sed compatibility (bsd/gnu)

regenerated readme markdown

Removed readme markdown file for org alternative

Updated project license

updated autocompile to include for now

updated script

updated script

updated script

updated msg script

updated license

updated to test

testing

testing

testing

testing

testing

testing

testing

testing

testing

testing

testing
2025-02-28 10:17:59 -07:00

204 lines
8.3 KiB
Scheme

(define-module (msg machine)
#: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'"))