Finished configuring the init/shell commands
This commit is contained in:
parent
235ec69321
commit
c60fe9493f
9 changed files with 456 additions and 49 deletions
87
Makefile.am
Normal file
87
Makefile.am
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
bin_SCRIPTS = scripts/msg
|
||||||
|
|
||||||
|
# Handle substitution of fully-expanded Autoconf variables.
|
||||||
|
do_subst = $(SED) \
|
||||||
|
-e 's,[@]GUILE[@],$(GUILE),g' \
|
||||||
|
-e 's,[@]guilemoduledir[@],$(guilemoduledir),g' \
|
||||||
|
-e 's,[@]guileobjectdir[@],$(guileobjectdir),g' \
|
||||||
|
-e 's,[@]localedir[@],$(localedir),g'
|
||||||
|
|
||||||
|
nodist_noinst_SCRIPTS = pre-inst-env
|
||||||
|
|
||||||
|
GOBJECTS = $(SOURCES:%.scm=%.go)
|
||||||
|
|
||||||
|
moddir=$(prefix)/share/guile/site/$(GUILE_EFFECTIVE_VERSION)
|
||||||
|
godir=$(libdir)/guile/$(GUILE_EFFECTIVE_VERSION)/site-ccache
|
||||||
|
ccachedir=$(libdir)/guile/$(GUILE_EFFECTIVE_VERSION)/site-ccache
|
||||||
|
|
||||||
|
nobase_dist_mod_DATA = $(filter-out $(BUILT_SOURCES),$(SOURCES)) $(NOCOMP_SOURCES)
|
||||||
|
nobase_nodist_mod_DATA = $(BUILT_SOURCES)
|
||||||
|
nobase_go_DATA = $(GOBJECTS)
|
||||||
|
|
||||||
|
# Make sure source files are installed first, so that the mtime of
|
||||||
|
# installed compiled files is greater than that of installed source
|
||||||
|
# files. See
|
||||||
|
# <http://lists.gnu.org/archive/html/guile-devel/2010-07/msg00125.html>
|
||||||
|
# for details.
|
||||||
|
guile_install_go_files = install-nobase_goDATA
|
||||||
|
$(guile_install_go_files): install-nobase_dist_modDATA
|
||||||
|
|
||||||
|
GUILE_WARNINGS = -Wunbound-variable -Warity-mismatch -Wformat
|
||||||
|
SUFFIXES = .scm .go
|
||||||
|
.scm.go:
|
||||||
|
$(AM_V_GEN)$(top_builddir)/pre-inst-env $(GUILE_TOOLS) compile $(GUILE_TARGET) $(GUILE_WARNINGS) -o "$@" "$<"
|
||||||
|
|
||||||
|
SOURCES = msg.scm \
|
||||||
|
msg/machine.scm \
|
||||||
|
msg/hconfig.scm \
|
||||||
|
msg/shell.scm \
|
||||||
|
msg/helpers.scm
|
||||||
|
|
||||||
|
TESTS =
|
||||||
|
|
||||||
|
TEST_EXTENSIONS = .scm
|
||||||
|
SCM_LOG_DRIVER = \
|
||||||
|
$(top_builddir)/pre-inst-env \
|
||||||
|
$(GUILE) --no-auto-compile -e main \
|
||||||
|
$(top_srcdir)/build-aux/test-driver.scm
|
||||||
|
|
||||||
|
# Tell 'build-aux/test-driver.scm' to display only source file names,
|
||||||
|
# not indivdual test names.
|
||||||
|
AM_SCM_LOG_DRIVER_FLAGS = --brief=yes
|
||||||
|
|
||||||
|
AM_SCM_LOG_FLAGS = --no-auto-compile -L "$(top_srcdir)"
|
||||||
|
|
||||||
|
AM_TESTS_ENVIRONMENT = abs_top_srcdir="$(abs_top_srcdir)"
|
||||||
|
|
||||||
|
info_TEXINFOS = doc/msg.texi \
|
||||||
|
doc/version.texi
|
||||||
|
|
||||||
|
EXTRA_DIST = README.org \
|
||||||
|
README \
|
||||||
|
HACKING \
|
||||||
|
COPYING \
|
||||||
|
doc/.dirstamp \
|
||||||
|
doc/msg.info \
|
||||||
|
doc/stamp-vti \
|
||||||
|
NEWS \
|
||||||
|
AUTHORS \
|
||||||
|
ChangeLog \
|
||||||
|
guix.scm \
|
||||||
|
.gitignore \
|
||||||
|
hall.scm \
|
||||||
|
build-aux/test-driver.scm \
|
||||||
|
$(TESTS)
|
||||||
|
|
||||||
|
ACLOCAL_AMFLAGS = -I m4
|
||||||
|
|
||||||
|
AM_DISTCHECK_DVI_TARGET = info # Disable DVI as part of distcheck
|
||||||
|
|
||||||
|
clean-go:
|
||||||
|
-$(RM) $(GOBJECTS)
|
||||||
|
.PHONY: clean-go
|
||||||
|
|
||||||
|
CLEANFILES = \
|
||||||
|
$(BUILT_SOURCES) \
|
||||||
|
$(GOBJECTS) \
|
||||||
|
$(TESTS:tests/%.scm=%.log)
|
179
build-aux/test-driver.scm
Normal file
179
build-aux/test-driver.scm
Normal file
|
@ -0,0 +1,179 @@
|
||||||
|
;;;; test-driver.scm - Guile test driver for Automake testsuite harness
|
||||||
|
|
||||||
|
(define script-version "2019-01-15.13") ;UTC
|
||||||
|
|
||||||
|
;;; Copyright © 2015, 2016 Mathieu Lirzin <mthl@gnu.org>
|
||||||
|
;;; Copyright © 2019 Alex Sassmannshausen <alex@pompo.co>
|
||||||
|
;;;
|
||||||
|
;;; This program is free software; you can redistribute it and/or modify it
|
||||||
|
;;; under the terms of the GNU General Public License as published by
|
||||||
|
;;; the Free Software Foundation; either version 3 of the License, or (at
|
||||||
|
;;; your option) any later version.
|
||||||
|
;;;
|
||||||
|
;;; This program is distributed in the hope that it will be useful, but
|
||||||
|
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
;;; GNU General Public License for more details.
|
||||||
|
;;;
|
||||||
|
;;; You should have received a copy of the GNU General Public License
|
||||||
|
;;; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
;;;; Commentary:
|
||||||
|
;;;
|
||||||
|
;;; This script provides a Guile test driver using the SRFI-64 Scheme API for
|
||||||
|
;;; test suites. SRFI-64 is distributed with Guile since version 2.0.9.
|
||||||
|
;;;
|
||||||
|
;;; This script is a lightly modified version of the orignal written by
|
||||||
|
;;; Matthieu Lirzin. The changes make it suitable for use as part of the
|
||||||
|
;;; guile-hall infrastructure.
|
||||||
|
;;;
|
||||||
|
;;;; Code:
|
||||||
|
|
||||||
|
(use-modules (ice-9 getopt-long)
|
||||||
|
(ice-9 pretty-print)
|
||||||
|
(srfi srfi-26)
|
||||||
|
(srfi srfi-64))
|
||||||
|
|
||||||
|
(define (show-help)
|
||||||
|
(display "Usage:
|
||||||
|
test-driver --test-name=NAME --log-file=PATH --trs-file=PATH
|
||||||
|
[--expect-failure={yes|no}] [--color-tests={yes|no}]
|
||||||
|
[--enable-hard-errors={yes|no}] [--brief={yes|no}}] [--]
|
||||||
|
TEST-SCRIPT [TEST-SCRIPT-ARGUMENTS]
|
||||||
|
The '--test-name', '--log-file' and '--trs-file' options are mandatory.
|
||||||
|
"))
|
||||||
|
|
||||||
|
(define %options
|
||||||
|
'((test-name (value #t))
|
||||||
|
(log-file (value #t))
|
||||||
|
(trs-file (value #t))
|
||||||
|
(color-tests (value #t))
|
||||||
|
(expect-failure (value #t)) ;XXX: not implemented yet
|
||||||
|
(enable-hard-errors (value #t)) ;not implemented in SRFI-64
|
||||||
|
(brief (value #t))
|
||||||
|
(help (single-char #\h) (value #f))
|
||||||
|
(version (single-char #\V) (value #f))))
|
||||||
|
|
||||||
|
(define (option->boolean options key)
|
||||||
|
"Return #t if the value associated with KEY in OPTIONS is 'yes'."
|
||||||
|
(and=> (option-ref options key #f) (cut string=? <> "yes")))
|
||||||
|
|
||||||
|
(define* (test-display field value #:optional (port (current-output-port))
|
||||||
|
#:key pretty?)
|
||||||
|
"Display 'FIELD: VALUE\n' on PORT."
|
||||||
|
(if pretty?
|
||||||
|
(begin
|
||||||
|
(format port "~A:~%" field)
|
||||||
|
(pretty-print value port #:per-line-prefix "+ "))
|
||||||
|
(format port "~A: ~S~%" field value)))
|
||||||
|
|
||||||
|
(define* (result->string symbol #:key colorize?)
|
||||||
|
"Return SYMBOL as an upper case string. Use colors when COLORIZE is #t."
|
||||||
|
(let ((result (string-upcase (symbol->string symbol))))
|
||||||
|
(if colorize?
|
||||||
|
(string-append (case symbol
|
||||||
|
((pass) "[0;32m") ;green
|
||||||
|
((xfail) "[1;32m") ;light green
|
||||||
|
((skip) "[1;34m") ;blue
|
||||||
|
((fail xpass) "[0;31m") ;red
|
||||||
|
((error) "[0;35m")) ;magenta
|
||||||
|
result
|
||||||
|
"[m") ;no color
|
||||||
|
result)))
|
||||||
|
|
||||||
|
(define* (test-runner-gnu test-name #:key color? brief? out-port trs-port)
|
||||||
|
"Return an custom SRFI-64 test runner. TEST-NAME is a string specifying the
|
||||||
|
file name of the current the test. COLOR? specifies whether to use colors,
|
||||||
|
and BRIEF?, well, you know. OUT-PORT and TRS-PORT must be output ports. The
|
||||||
|
current output port is supposed to be redirected to a '.log' file."
|
||||||
|
|
||||||
|
(define (test-on-test-begin-gnu runner)
|
||||||
|
;; Procedure called at the start of an individual test case, before the
|
||||||
|
;; test expression (and expected value) are evaluated.
|
||||||
|
(let ((result (cute assq-ref (test-result-alist runner) <>)))
|
||||||
|
(format #t "test-name: ~A~%" (result 'test-name))
|
||||||
|
(format #t "location: ~A~%"
|
||||||
|
(string-append (result 'source-file) ":"
|
||||||
|
(number->string (result 'source-line))))
|
||||||
|
(test-display "source" (result 'source-form) #:pretty? #t)))
|
||||||
|
|
||||||
|
(define (test-on-test-end-gnu runner)
|
||||||
|
;; Procedure called at the end of an individual test case, when the result
|
||||||
|
;; of the test is available.
|
||||||
|
(let* ((results (test-result-alist runner))
|
||||||
|
(result? (cut assq <> results))
|
||||||
|
(result (cut assq-ref results <>)))
|
||||||
|
(unless brief?
|
||||||
|
;; Display the result of each test case on the console.
|
||||||
|
(format out-port "~A: ~A - ~A~%"
|
||||||
|
(result->string (test-result-kind runner) #:colorize? color?)
|
||||||
|
test-name (test-runner-test-name runner)))
|
||||||
|
(when (result? 'expected-value)
|
||||||
|
(test-display "expected-value" (result 'expected-value)))
|
||||||
|
(when (result? 'expected-error)
|
||||||
|
(test-display "expected-error" (result 'expected-error) #:pretty? #t))
|
||||||
|
(when (result? 'actual-value)
|
||||||
|
(test-display "actual-value" (result 'actual-value)))
|
||||||
|
(when (result? 'actual-error)
|
||||||
|
(test-display "actual-error" (result 'actual-error) #:pretty? #t))
|
||||||
|
(format #t "result: ~a~%" (result->string (result 'result-kind)))
|
||||||
|
(newline)
|
||||||
|
(format trs-port ":test-result: ~A ~A~%"
|
||||||
|
(result->string (test-result-kind runner))
|
||||||
|
(test-runner-test-name runner))))
|
||||||
|
|
||||||
|
(define (test-on-group-end-gnu runner)
|
||||||
|
;; Procedure called by a 'test-end', including at the end of a test-group.
|
||||||
|
(let ((fail (or (positive? (test-runner-fail-count runner))
|
||||||
|
(positive? (test-runner-xpass-count runner))))
|
||||||
|
(skip (or (positive? (test-runner-skip-count runner))
|
||||||
|
(positive? (test-runner-xfail-count runner)))))
|
||||||
|
;; XXX: The global results need some refinements for XPASS.
|
||||||
|
(format trs-port ":global-test-result: ~A~%"
|
||||||
|
(if fail "FAIL" (if skip "SKIP" "PASS")))
|
||||||
|
(format trs-port ":recheck: ~A~%"
|
||||||
|
(if fail "yes" "no"))
|
||||||
|
(format trs-port ":copy-in-global-log: ~A~%"
|
||||||
|
(if (or fail skip) "yes" "no"))
|
||||||
|
(when brief?
|
||||||
|
;; Display the global test group result on the console.
|
||||||
|
(format out-port "~A: ~A~%"
|
||||||
|
(result->string (if fail 'fail (if skip 'skip 'pass))
|
||||||
|
#:colorize? color?)
|
||||||
|
test-name))
|
||||||
|
#f))
|
||||||
|
|
||||||
|
(let ((runner (test-runner-null)))
|
||||||
|
(test-runner-on-test-begin! runner test-on-test-begin-gnu)
|
||||||
|
(test-runner-on-test-end! runner test-on-test-end-gnu)
|
||||||
|
(test-runner-on-group-end! runner test-on-group-end-gnu)
|
||||||
|
(test-runner-on-bad-end-name! runner test-on-bad-end-name-simple)
|
||||||
|
runner))
|
||||||
|
|
||||||
|
;;;
|
||||||
|
;;; Entry point.
|
||||||
|
;;;
|
||||||
|
|
||||||
|
(define (main . args)
|
||||||
|
(let* ((opts (getopt-long (command-line) %options))
|
||||||
|
(option (cut option-ref opts <> <>)))
|
||||||
|
(cond
|
||||||
|
((option 'help #f) (show-help))
|
||||||
|
((option 'version #f) (format #t "test-driver.scm ~A" script-version))
|
||||||
|
(else
|
||||||
|
(let ((log (open-file (option 'log-file "") "w0"))
|
||||||
|
(trs (open-file (option 'trs-file "") "wl"))
|
||||||
|
(out (duplicate-port (current-output-port) "wl")))
|
||||||
|
(redirect-port log (current-output-port))
|
||||||
|
(redirect-port log (current-warning-port))
|
||||||
|
(redirect-port log (current-error-port))
|
||||||
|
(test-with-runner
|
||||||
|
(test-runner-gnu (option 'test-name #f)
|
||||||
|
#:color? (option->boolean opts 'color-tests)
|
||||||
|
#:brief? (option->boolean opts 'brief)
|
||||||
|
#:out-port out #:trs-port trs)
|
||||||
|
(load-from-path (option 'test-name #f)))
|
||||||
|
(close-port log)
|
||||||
|
(close-port trs)
|
||||||
|
(close-port out))))
|
||||||
|
(exit 0)))
|
39
configure.ac
Normal file
39
configure.ac
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
dnl -*- Autoconf -*-
|
||||||
|
|
||||||
|
AC_INIT(msg, 0.1)
|
||||||
|
AC_SUBST(HVERSION, "\"0.1\"")
|
||||||
|
AC_SUBST(AUTHOR, "\"Chad Nelson\"")
|
||||||
|
AC_SUBST(COPYRIGHT, "'(2023)")
|
||||||
|
AC_SUBST(LICENSE, gpl3+)
|
||||||
|
AC_CONFIG_SRCDIR(msg.scm)
|
||||||
|
AC_CONFIG_AUX_DIR([build-aux])
|
||||||
|
AM_INIT_AUTOMAKE([1.12 gnu silent-rules subdir-objects color-tests parallel-tests -Woverride -Wno-portability])
|
||||||
|
AM_SILENT_RULES([yes])
|
||||||
|
|
||||||
|
AC_CONFIG_FILES([Makefile])
|
||||||
|
AC_CONFIG_FILES([pre-inst-env], [chmod +x pre-inst-env])
|
||||||
|
AC_CONFIG_FILES([scripts/msg],[chmod +x scripts/msg])
|
||||||
|
dnl Search for 'guile' and 'guild'. This macro defines
|
||||||
|
dnl 'GUILE_EFFECTIVE_VERSION'.
|
||||||
|
GUILE_PKG([3.0 2.2 2.0])
|
||||||
|
GUILE_PROGS
|
||||||
|
GUILE_SITE_DIR
|
||||||
|
if test "x$GUILD" = "x"; then
|
||||||
|
AC_MSG_ERROR(['guild' binary not found; please check your guile-2.x installation.])
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$cross_compiling" != no; then
|
||||||
|
GUILE_TARGET="--target=$host_alias"
|
||||||
|
AC_SUBST([GUILE_TARGET])
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl Hall auto-generated guile-module dependencies
|
||||||
|
|
||||||
|
|
||||||
|
dnl Installation directories for .scm and .go files.
|
||||||
|
guilemoduledir="${datarootdir}/guile/site/$GUILE_EFFECTIVE_VERSION"
|
||||||
|
guileobjectdir="${libdir}/guile/$GUILE_EFFECTIVE_VERSION/site-ccache"
|
||||||
|
AC_SUBST([guilemoduledir])
|
||||||
|
AC_SUBST([guileobjectdir])
|
||||||
|
|
||||||
|
AC_OUTPUT
|
1
hall.scm
1
hall.scm
|
@ -18,6 +18,7 @@
|
||||||
"msg"
|
"msg"
|
||||||
((scheme-file "machine")
|
((scheme-file "machine")
|
||||||
(scheme-file "hconfig")
|
(scheme-file "hconfig")
|
||||||
|
(scheme-file "shell")
|
||||||
(scheme-file "helpers")))))
|
(scheme-file "helpers")))))
|
||||||
(tests ((directory "tests" ())))
|
(tests ((directory "tests" ())))
|
||||||
(programs ((directory "scripts" ((in-file "msg")))))
|
(programs ((directory "scripts" ((in-file "msg")))))
|
||||||
|
|
|
@ -4,8 +4,7 @@
|
||||||
#:use-module (ice-9 rdelim)
|
#:use-module (ice-9 rdelim)
|
||||||
#:use-module (system foreign)
|
#:use-module (system foreign)
|
||||||
#:export (directory-exists?
|
#:export (directory-exists?
|
||||||
run-shell-command
|
run-shell-command))
|
||||||
start-command-in-background))
|
|
||||||
|
|
||||||
(define (directory-exists? path)
|
(define (directory-exists? path)
|
||||||
(catch 'system-error
|
(catch 'system-error
|
||||||
|
@ -16,6 +15,6 @@
|
||||||
(define (run-shell-command command)
|
(define (run-shell-command command)
|
||||||
(let* ((port (open-input-pipe command))
|
(let* ((port (open-input-pipe command))
|
||||||
(str (read-line port)))
|
(str (read-line port)))
|
||||||
;;(close-pipe port)
|
(close-pipe port)
|
||||||
port))
|
str))
|
||||||
|
|
||||||
|
|
171
msg/machine.scm
171
msg/machine.scm
|
@ -17,63 +17,144 @@
|
||||||
(("reinit")
|
(("reinit")
|
||||||
(clear-install)
|
(clear-install)
|
||||||
(init))
|
(init))
|
||||||
|
(("start")
|
||||||
|
(start))
|
||||||
|
(("stop")
|
||||||
|
(stop))
|
||||||
(_
|
(_
|
||||||
(display "Please enter a valid command or -h for help.\n"))))
|
(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)
|
(define* (help)
|
||||||
(display "\nHere are the available commands:\n\n")
|
(display "\nHere are the available commands:\n\n")
|
||||||
(display "start: Start the MSG envrionment.\n"))
|
(display "start: Start the MSG envrionment.\n"))
|
||||||
|
|
||||||
(define* (clear-install)
|
(define* (clear-install)
|
||||||
(display "This is a destructive command and will remove your entire guix instance. Proceed? (y/n)\n")
|
(let loop ()
|
||||||
(define response (read-line))
|
(display "This is a destructive command and will remove your entire Guix instance. Proceed? (y/n)\n")
|
||||||
(if (string=? response "y")
|
(define response (read-line))
|
||||||
(begin
|
(cond
|
||||||
(system "rm -r ~/.guix"))
|
((string=? response "y")
|
||||||
(display "Please enter a valid response.")))
|
(system "rm -r ~/.guix"))
|
||||||
|
((string=? response "n")
|
||||||
(define* (init)
|
(display "Operation canceled.\n")
|
||||||
(define home-path (getenv "HOME"))
|
(exit 0))
|
||||||
(define arch (run-shell-command "uname -m"))
|
(else
|
||||||
|
(display "Please enter a valid response.\n")
|
||||||
|
(loop)))))
|
||||||
|
|
||||||
|
(define* (start)
|
||||||
(if (not (directory-exists? (format #f "~a/.guix" home-path)))
|
(if (not (directory-exists? (format #f "~a/.guix" home-path)))
|
||||||
(begin
|
(begin
|
||||||
(system "mkdir -p $HOME/.guix/qemu $HOME/.guix/home $HOME/.guix/ssh-cert")
|
(display "MSG not initialized. Please run `msg machine init` to continue.")
|
||||||
;; Get msg image
|
(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 &"))
|
||||||
|
((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/")
|
||||||
|
;; (system "/usr/local/bin/qemu-system-x86_64 \
|
||||||
|
;; -machine type=q35,accel=hvf \
|
||||||
|
;; -smp 4 \
|
||||||
|
;; -hda $HOME/.guix/qemu/guix-user.qcow2 \
|
||||||
|
;; -m 4G \
|
||||||
|
;; -display none \
|
||||||
|
;; -cpu Nehalem \
|
||||||
|
;; -virtfs local,path=$HOME/.guix,security_model=mapped,mount_tag=macos \
|
||||||
|
;; -device virtio-net,netdev=vmnic \
|
||||||
|
;; -netdev user,id=vmnic,hostfwd=tcp:127.0.0.1:9001-:22")
|
||||||
|
(display "x86_64 is not currently supported")
|
||||||
|
(exit 0)))
|
||||||
|
(display "MSG has been started")
|
||||||
|
)
|
||||||
|
|
||||||
(cond ((string=? arch "arm64")
|
(define* (stop)
|
||||||
(system "/opt/homebrew/bin/wget https://objectstorage.us-phoenix-1.oraclecloud.com/n/axfgkze2xif1/b/guix-system/o/msg-system-aarch64guix-user.qcow2.tar.gz -O $HOME/.guix/qemu/guix.qcow2.tar.gz")
|
(system "ssh -o StrictHostKeyChecking=no -i $HOME/.guix/ssh-cert/msg_rsa admin@127.0.0.1 -p 9001 'sudo shutdown'"))
|
||||||
(system "tar -xvzf $HOME/.guix/qemu/guix.qcow2.tar.gz -C $HOME/.guix/qemu/")
|
|
||||||
(define pid (run-shell-command "/opt/homebrew/bin/qemu-system-aarch64 \
|
(define* (init)
|
||||||
-machine virt,highmem=on \
|
(if (not (directory-exists? (format #f "~a/.guix" home-path)))
|
||||||
-accel hvf \
|
(begin
|
||||||
-cpu host \
|
;; Grab ssh cert for installer
|
||||||
-smp 4 \
|
(system "mkdir -p $HOME/.guix/qemu $HOME/.guix/home $HOME/.guix/ssh-cert")
|
||||||
-display none \
|
(system "ssh-keygen -R \"[127.0.0.1]:9001\"")
|
||||||
-hda $HOME/.guix/qemu/guix-user.qcow2 \
|
|
||||||
-m 4G \
|
;; Download system image and and start vm
|
||||||
-virtfs local,path=$HOME/.guix/home,security_model=mapped,mount_tag=macos \
|
(cond
|
||||||
-bios /opt/homebrew/opt/qemu/share/qemu/edk2-aarch64-code.fd \
|
((string=? arch "arm64")
|
||||||
-device virtio-net,netdev=vmnic \
|
(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")
|
||||||
-netdev user,id=vmnic,hostfwd=tcp:127.0.0.1:9001-:22 &"))
|
(system "tar -xvzf $HOME/.guix/qemu/guix.qcow2.tar.gz -C $HOME/.guix/qemu/")
|
||||||
(display pid))
|
(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")
|
||||||
((string=? arch "x86_64")
|
(system "/opt/homebrew/bin/qemu-system-aarch64 \
|
||||||
(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")
|
-machine virt,highmem=on \
|
||||||
(system "tar -xvzf $HOME/.guix/qemu/guix.qcow2.tar.gz -C $HOME/.guix/qemu/")
|
-accel hvf \
|
||||||
(system "/usr/local/bin/qemu-system-x86_64 \
|
-cpu host \
|
||||||
-machine type=q35,accel=hvf \
|
-smp 8 \
|
||||||
-smp 4 \
|
-display none \
|
||||||
-hda $HOME/.guix/qemu/guix-user.qcow2 \
|
-hda $HOME/.guix/qemu/guix-user.qcow2 \
|
||||||
-m 4G \
|
-m 8G \
|
||||||
-display none \
|
-virtfs local,path=$HOME/.guix/home,security_model=mapped,mount_tag=macos \
|
||||||
-cpu Nehalem \
|
-bios /opt/homebrew/opt/qemu/share/qemu/edk2-aarch64-code.fd \
|
||||||
-virtfs local,path=$HOME/.guix,security_model=mapped,mount_tag=macos \
|
-device virtio-net,netdev=vmnic \
|
||||||
-device virtio-net,netdev=vmnic \
|
-netdev user,id=vmnic,hostfwd=tcp:127.0.0.1:9001-:22 &"))
|
||||||
-netdev user,id=vmnic,hostfwd=tcp:127.0.0.1:9001-:22")
|
((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/")
|
||||||
|
;; (system "/usr/local/bin/qemu-system-x86_64 \
|
||||||
|
;; -machine type=q35,accel=hvf \
|
||||||
|
;; -smp 4 \
|
||||||
|
;; -hda $HOME/.guix/qemu/guix-user.qcow2 \
|
||||||
|
;; -m 4G \
|
||||||
|
;; -display none \
|
||||||
|
;; -cpu Nehalem \
|
||||||
|
;; -virtfs local,path=$HOME/.guix,security_model=mapped,mount_tag=macos \
|
||||||
|
;; -device virtio-net,netdev=vmnic \
|
||||||
|
;; -netdev user,id=vmnic,hostfwd=tcp:127.0.0.1:9001-:22")
|
||||||
|
(display "x86_64 is not currently supported")
|
||||||
|
(exit 0)))
|
||||||
|
|
||||||
;; Get msg ssh-key
|
;; 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 "/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 "ssh -o StrictHostKeychecking=no -i $HOME/.guix/ssh-cert/msg_rsa root@127.0.0.1 -p 9001 'guix'"))
|
(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'")
|
||||||
|
(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 \"s/\\$UID/$(id -u)/g\" ~/.guix/home/config.scm")
|
||||||
|
(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'"))
|
||||||
|
|
5
msg/shell.scm
Normal file
5
msg/shell.scm
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
(define-module (msg shell)
|
||||||
|
#:export (shell))
|
||||||
|
|
||||||
|
(define* (shell)
|
||||||
|
(system "ssh -o StrictHostKeyChecking=no -X -i $HOME/.guix/ssh-cert/msg_rsa admin@127.0.0.1 -p 9001"))
|
13
pre-inst-env.in
Normal file
13
pre-inst-env.in
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
abs_top_srcdir="`cd "@abs_top_srcdir@" > /dev/null; pwd`"
|
||||||
|
abs_top_builddir="`cd "@abs_top_builddir@" > /dev/null; pwd`"
|
||||||
|
|
||||||
|
GUILE_LOAD_COMPILED_PATH="$abs_top_builddir${GUILE_LOAD_COMPILED_PATH:+:}$GUILE_LOAD_COMPILED_PATH"
|
||||||
|
GUILE_LOAD_PATH="$abs_top_builddir:$abs_top_srcdir${GUILE_LOAD_PATH:+:}:$GUILE_LOAD_PATH"
|
||||||
|
export GUILE_LOAD_COMPILED_PATH GUILE_LOAD_PATH
|
||||||
|
|
||||||
|
PATH="$abs_top_builddir/scripts:$PATH"
|
||||||
|
export PATH
|
||||||
|
|
||||||
|
exec "$@"
|
|
@ -3,6 +3,7 @@
|
||||||
!#
|
!#
|
||||||
|
|
||||||
(use-modules (msg machine)
|
(use-modules (msg machine)
|
||||||
|
(msg shell)
|
||||||
(ice-9 match))
|
(ice-9 match))
|
||||||
|
|
||||||
(define* (main #:optional (args (command-line)))
|
(define* (main #:optional (args (command-line)))
|
||||||
|
@ -11,6 +12,8 @@
|
||||||
(match clean-args
|
(match clean-args
|
||||||
(("machine" rest ...)
|
(("machine" rest ...)
|
||||||
(machine rest))
|
(machine rest))
|
||||||
|
(("shell" rest ...)
|
||||||
|
(shell))
|
||||||
(("-h")
|
(("-h")
|
||||||
(help))
|
(help))
|
||||||
(_
|
(_
|
||||||
|
|
Loading…
Add table
Reference in a new issue