From 15218de0755616b96f855ba0bc1dce25601dc5fe Mon Sep 17 00:00:00 2001 From: Chad Nelson Date: Sun, 26 Nov 2023 16:53:25 -0700 Subject: [PATCH] Added new config module for setting/retrieving vm configs --- Makefile.am | 1 + hall.scm | 3 +- msg/config.scm | 51 +++++++++++++++++++++++++++++ msg/machine.scm | 86 +++++++++++++++++++++++++++++-------------------- 4 files changed, 105 insertions(+), 36 deletions(-) create mode 100644 msg/config.scm diff --git a/Makefile.am b/Makefile.am index e1d3e71..f5abf14 100644 --- a/Makefile.am +++ b/Makefile.am @@ -33,6 +33,7 @@ SUFFIXES = .scm .go $(AM_V_GEN)$(top_builddir)/pre-inst-env $(GUILE_TOOLS) compile $(GUILE_TARGET) $(GUILE_WARNINGS) -o "$@" "$<" SOURCES = msg.scm \ + msg/config.scm \ msg/machine.scm \ msg/hconfig.scm \ msg/shell.scm \ diff --git a/hall.scm b/hall.scm index a306c42..41dd848 100644 --- a/hall.scm +++ b/hall.scm @@ -16,7 +16,8 @@ ((scheme-file "msg") (directory "msg" - ((scheme-file "machine") + ((scheme-file "config") + (scheme-file "machine") (scheme-file "hconfig") (scheme-file "shell") (scheme-file "helpers"))))) diff --git a/msg/config.scm b/msg/config.scm new file mode 100644 index 0000000..715cf29 --- /dev/null +++ b/msg/config.scm @@ -0,0 +1,51 @@ +(define-module (msg config) + #:use-module (ice-9 ftw) + #:use-module (ice-9 rdelim) + #:declarative? #f + #:export (manage-config)) +(define config-data #f) + +;;; Function to load a config file +(define (load-config config-file) + (if (file-exists? config-file) + (call-with-input-file config-file + (lambda (port) + (read port))) + (begin + (display "Config file not found, creating default config") + (newline) + ;; Return a default value (in this case, #f) + (values #f)))) + +;;; Function to save a config file +(define (save-config filename config) + (with-output-to-file filename + (lambda () + (display (format #f "~A" config))))) + +;;; Function to create a default config +(define (create-default-config ) + '( ;; Default configuration values + (cpu . "4") + (mem . "4") + ;; Add more default key-value pairs as needed + )) + +(define (manage-config filename) + (let* ((config (load-config filename)) + (default-config (create-default-config))) + (cond + ((eq? config #f) + (begin + (display "Creating default config...\n") + (save-config filename default-config) + (set! config default-config) + (values config))) + ((unspecified? config) + (begin + (display "Invalid config file. Reverting to default config...\n") + (save-config filename default-config) + (set! config default-config) + (values config))) + (else + (values config))))) diff --git a/msg/machine.scm b/msg/machine.scm index 893276a..b7bd4bf 100644 --- a/msg/machine.scm +++ b/msg/machine.scm @@ -4,28 +4,47 @@ #: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") - (init)) + (("init" rest ...) + (init rest)) (("reinit") (clear-install) (init)) - (("start") - (start)) + (("start" rest ...) + (start rest)) (("stop") (stop)) (_ (display "Please enter a valid command or -h for help.\n")))) -(define home-path (getenv "HOME")) -(define arch (run-shell-command "uname -m")) + + (define* (help) (display "\nHere are the available commands:\n\n") @@ -37,7 +56,8 @@ (define response (read-line)) (cond ((string=? response "y") - (system "rm -r ~/.guix")) + (system "rm -r ~/.guix") + ) ((string=? response "n") (display "Operation canceled.\n") (exit 0)) @@ -45,25 +65,26 @@ (display "Please enter a valid response.\n") (loop))))) -(define* (start) +(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.") + (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 "/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=/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 &")) + (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=$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 &" cpu-conf mem-conf))) ((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-user-x86.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/") @@ -85,31 +106,22 @@ (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) + +(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") - (system "/opt/homebrew/bin/qemu-system-aarch64 \ - -machine virt,highmem=on \ - -accel hvf \ - -cpu host \ - -smp 8 \ - -display none \ - -hda $HOME/.guix/qemu/guix-user.qcow2 \ - -m 8G \ - -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 &")) + (start) + ) ((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-user-x86.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/") @@ -142,6 +154,10 @@ (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'") + (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."))