diff options
Diffstat (limited to 'vps-builder.scm')
-rw-r--r-- | vps-builder.scm | 68 |
1 files changed, 53 insertions, 15 deletions
diff --git a/vps-builder.scm b/vps-builder.scm index 7c4b60f..5a6dcdb 100644 --- a/vps-builder.scm +++ b/vps-builder.scm @@ -136,9 +136,17 @@ ;; a chroot (mount essential filesystems). (define (with-running-system root-dir thunk) (dynamic-wind - (lambda () (run* (chroot ,root-dir mount /proc))) + (lambda () + (run* (chroot ,root-dir mount /proc)) + ;; Don't run daemons in the chroot upon apt-get install + (install-file root-dir "assets/chroot-helpers/policy-rc.d" + "/usr/sbin/policy-rc.d" "root" "root" #o755) + (setenv "DEBIAN_FRONTEND" "noninteractive")) (lambda () (thunk)) - (lambda () (run* (chroot ,root-dir umount /proc))))) + (lambda () + (unsetenv "DEBIAN_FRONTEND") + (delete-file* (make-pathname root-dir "/usr/sbin/policy-rc.d")) + (run* (chroot ,root-dir umount /proc))))) (define (install-basic-system target-dir package-list) (let ((include (sprintf "--include=~A" @@ -166,7 +174,11 @@ (change-file-mode full-path mode))) (define (install-packages root-dir . packages) - (run* (chroot ,root-dir apt-get install -y ,@packages))) + (run* (chroot ,root-dir + apt-get install -y + -o Dpkg::Options=--force-confdef + -o Dpkg::Options=--force-confold + ,@packages))) (define (configure-basic-system root-dir) ;;;; Configure apt, FS and disable console bleeping (just in case) @@ -188,7 +200,12 @@ (define (update-packages root-dir) (run* (chroot ,root-dir apt-get update)) - (run* (chroot ,root-dir apt-get upgrade -y))) + (run* (chroot ,root-dir apt-get upgrade -y + -o Dpkg::Options=--force-confdef + -o Dpkg::Options=--force-confold)) + (run* (chroot ,root-dir apt-get autoremove -y)) + (run* (chroot ,root-dir apt-get clean)) + (run* (chroot ,root-dir apt-get autoclean))) (define (make-bootable root-dir) @@ -214,19 +231,37 @@ (install-file root-dir "assets/firewall/ferm.conf" "/etc/ferm/ferm.conf" "root" "adm" #o644)) + ;; No proper monitoring solution yet, but at least vnstat is useful + ;; for keeping an eye on traffic even if we don't automate it yet. + (define (setup-monitoring root-dir) + (install-packages root-dir "vnstat")) + + ;; Create a more convenient default environment. This is highly + ;; dependent on taste so you might want to change this. + (define (customize-environment root-dir) + (install-file root-dir "assets/zsh/zshrc" "/etc/skel/.zshrc" + "root" "root" #o644) + (install-file root-dir "assets/default/useradd" + "/etc/default/useradd" "root" "root" #o644) + (install-packages root-dir "zsh")) + + ;; Create user and copy matching users/*:* file to .ssh/authorized_keys (define (create-users root-dir) - (for-each (lambda (pubkey) - (let* ((fn (pathname-strip-directory pubkey ":")) - (user+cs-groups (string-split fn)) - (user (car user+cs-groups)) - (cs-groups (cadr user+cs-groups)) - (.ssh (make-pathname `("/" "home" ,user) ".ssh")) - (keys (make-pathname .ssh "authorized_keys"))) - (run* (chroot ,root-dir useradd -m -G ,cs-groups ,user)) - (install-directory root-dir .ssh user user #o700) - (install-file root-dir pubkey keys user user #o600))) - (glob "users/*:*"))) + (for-each + (lambda (pubkey) + (let* ((fn (pathname-strip-directory pubkey)) + (user+cs-groups (string-split fn ":")) + (user (car user+cs-groups)) + (cs-groups (cadr user+cs-groups)) + (~ (make-pathname `("/" "home") user)) + (~/.ssh (make-pathname ~ ".ssh"))) + (run* (chroot ,root-dir useradd -m -G ,cs-groups ,user)) + (install-directory root-dir ~/.ssh user user #o700) + (install-file root-dir pubkey + (make-pathname ~/.ssh "authorized_keys") + user user #o600))) + (glob "users/*:*"))) (define (build-image image-base-name size-in-gb) (let ((raw-image (make-pathname '() image-base-name ".raw")) @@ -254,6 +289,9 @@ (setup-firewall mountpoint) + (setup-monitoring mountpoint) + + (customize-environment mountpoint) (create-users mountpoint))))) (finalize-filesystem dev))) |