summaryrefslogtreecommitdiff
path: root/vps-builder.scm
diff options
context:
space:
mode:
authorPeter Bex <peter@more-magic.net>2016-02-21 15:57:50 +0100
committerPeter Bex <peter@more-magic.net>2016-02-21 15:57:50 +0100
commitc7c1112de63c1512fb90c97b2f228d9dfb5ff91f (patch)
treee6a1c80ae31f41b144daf6929e6ede7ec5349bef /vps-builder.scm
parente0f806a2f44bc08ff8931f8e5dab09579850154d (diff)
downloadvps-builder-c7c1112de63c1512fb90c97b2f228d9dfb5ff91f.tar.gz
Make installation completely non-interactive, add environment config.
- Fix apt-get calls to avoid getting a prompt for "ferm" or other tools. - Install zsh with zshrc into skel dir - Temporarily put rc.d policy file in place to avoid starting daemons on install. - Install vnstat to allow (manual) monitoring of network activity.
Diffstat (limited to 'vps-builder.scm')
-rw-r--r--vps-builder.scm68
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)))