Correction : {etc,var}/ -> "${tool}"/{etc,var}/ .
[lhc/ateliers.git] / vm_hosted
index cbc6776..62bd86e 100755 (executable)
--- a/vm_hosted
+++ b/vm_hosted
@@ -1,6 +1,10 @@
 #!/bin/sh
 set -e -f ${DRY_RUN:+-n} -u
-tool=${0%/*}
+tool=$0
+while test -L "$tool"
+ do tool=$(readlink "$tool")
+ done
+tool=${tool%/*}
 . "$tool"/lib/rule.sh
 . "$tool"/etc/vm.sh
 
@@ -22,11 +26,15 @@ rule_help () { # SYNTAX: [--hidden]
                EOF
  }
 
-rule_git_config () {
+rule_git_configure () {
        (
        cd "$tool"
        git config --replace branch.master.remote .
        git config --replace branch.master.merge refs/remotes/master
+       local tool
+       tool=$(cd "$tool"; cd -)
+       sudo ln -fns "$tool"/vm_hosted /usr/local/sbin/
+       sudo ln -fns "$tool"/vm_hosted /usr/local/sbin/vm
        )
  }
 rule_git_reset () {
@@ -38,14 +46,7 @@ rule_git_reset () {
  }
 
 rule_apt_get_install () { # SYNTAX: $package
-       case $(dpkg -s "$1" 2>/dev/null | grep '^Status: ') in
-               ("Status: install ok installed");;
-               (*)
-               test ! -x /usr/bin/etckeeper ||
-               ! sudo etckeeper unclean ||
-               warn "/etc unclean: etckeeper may force you to \`etckeeper commit'; then you can run your $0 command again."
-               sudo apt-get install "$@";;
-        esac
+       sudo apt-get install "$@"
  }
 
 rule__chrooted_configure () { # NOTE: est-ce bien utile à un moment ?
@@ -55,13 +56,13 @@ rule__chrooted_configure () { # NOTE: est-ce bien utile à un moment ?
  }
 
 rule_apt_configure () {
-       sudo install -m 660 -u root -g root /dev/stdin /etc/apt/sources.list <<-EOF
+       sudo install -m 660 -o root -g root /dev/stdin /etc/apt/sources.list <<-EOF
                deb http://ftp.fr.debian.org/debian $vm_lsb_name main contrib non-free
                EOF
-       sudo install -m 660 -u root -g root /dev/stdin /etc/apt/$vm_lsb_name-backports.list <<-EOF
+       sudo install -m 660 -o root -g root /dev/stdin /etc/apt/$vm_lsb_name-backports.list <<-EOF
                #deb http://backports.debian.org/debian-backports $vm_lsb_name-backports main contrib non-free
                EOF
-       sudo install -m 660 -u root -g root /dev/stdin /etc/apt/preferences <<-EOF
+       sudo install -m 660 -o root -g root /dev/stdin /etc/apt/preferences <<-EOF
                Package: *
                Pin: release a=$vm_lsb_name
                Pin-Priority: 170
@@ -70,13 +71,12 @@ rule_apt_configure () {
                Pin: release a=$vm_lsb_name-backports
                Pin-Priority: 200
                EOF
-       sudo install -m 660 -u root -g root /dev/stdin /etc/apt/sources.list.d/openerp.list <<-EOF
+       sudo install -m 660 -o root -g root /dev/stdin /etc/apt/sources.list.d/openerp.list <<-EOF
                deb http://nightly.openerp.com/trunk/nightly/deb/ ./
                EOF
- }
-rule_apticron_configure () {
+       sudo apt-get update
        rule apt_get_install apticron
-       sudo install -m 644 -u root -g root /dev/stdin /etc/apticron/apticron.conf <<-EOF
+       sudo install -m 644 -o root -g root /dev/stdin /etc/apticron/apticron.conf <<-EOF
                EMAIL="admin@$vm_domainname"
                # DIFF_ONLY="1"
                # LISTCHANGES_PROFILE="apticron"
@@ -95,9 +95,9 @@ rule_apticron_configure () {
 rule_boot_configure () {
        warn "lors de l'installation Debian, surtout n'installer GRUB sur AUCUN disque proposé !"
        rule apt_get_install grub-pc
-       sudo install -d -m 644 -u root -g root /boot/grub
+       sudo install -d -m 644 -o root -g root /boot/grub
        rule apt_get_install linux-image-$vm_arch
-       sudo install -m 644 -u root -g root /dev/stdin /etc/default/grub <<-EOF
+       sudo install -m 644 -o root -g root /dev/stdin /etc/default/grub <<-EOF
                GRUB_DEFAULT=0
                GRUB_TIMEOUT=5
                GRUB_DISTRIBUTOR=\`lsb_release -i -s 2> /dev/null || echo Debian\`
@@ -106,7 +106,7 @@ rule_boot_configure () {
                GRUB_DISABLE_RECOVERY="true"
                #GRUB_PRELOAD_MODULES="lvm"
                EOF
-       sudo install -m 644 -u root -g root /dev/stdin /boot/grub/device.map <<-EOF
+       sudo install -m 644 -o root -g root /dev/stdin /boot/grub/device.map <<-EOF
                (hd0)   /dev/xvda
                (hd0)   /dev/mapper/domU-$(printf %s $vm_fqdn-disk | sed -e 's/-/--/g')
                EOF
@@ -195,7 +195,7 @@ rule_dovecot_configure () {
        sudo service dovecot restart
  }
 rule_etckeeper_configure () {
-       sudo install -m 644 -u root -g root /dev/stdin /etc/etckeeper/etckeeper.conf <<-EOF
+       sudo install -m 644 -o root -g root /dev/stdin /etc/etckeeper/etckeeper.conf <<-EOF
                VCS=git
                GIT_COMMIT_OPTIONS=""
                AVOID_DAILY_AUTOCOMMITS=1
@@ -204,10 +204,13 @@ rule_etckeeper_configure () {
                HIGHLEVEL_PACKAGE_MANAGER=apt
                LOWLEVEL_PACKAGE_MANAGER=dpkg
                EOF
+       sudo install -m 644 -o root -g root \
+        "$tool"/etc/etckeeper/prompt.sh \
+               /etc/etckeeper/prompt.sh
        rule apt_get_install etckeeper
  }
 rule_filesystem_configure () {
-       sudo install -m 644 -u root -g root /dev/stdin /etc/fstab <<-EOF
+       sudo install -m 644 -o root -g root /dev/stdin /etc/fstab <<-EOF
                # <file system> <mount point> <type> <options> <dump> <pass>
                LABEL=${vm_lvm_lv}_boot /boot ext2 defaults 0 0
                proc /proc proc defaults 0 0
@@ -219,31 +222,31 @@ rule_filesystem_configure () {
                # NOTE: barrier=1 réduit drastiquement les performances d'écriture, mais garantit la cohérence du système de fichiers.
                /dev/mapper/${vm_lvm_lv}_swap_deciphered swap swap sw 0 0
                EOF
-       sudo install -m 644 -u root -g root /dev/stdin /etc/crypttab <<-EOF
+       sudo install -m 644 -o root -g root /dev/stdin /etc/crypttab <<-EOF
                # <target name> <source device> <key file> <options>
                ${vm_lvm_lv}_root_deciphered /dev/$vm_lvm_vg/${vm_lvm_lv}_root none                         luks,lvm=$vm_lvm_vg
                ${vm_lvm_lv}_var_deciphered  /dev/$vm_lvm_vg/${vm_lvm_lv}_var  ${vm_lvm_lv}_root_deciphered luks,lvm=$vm_lvm_vg,keyscript=/lib/cryptsetup/scripts/decrypt_derived
                ${vm_lvm_lv}_home_deciphered /dev/$vm_lvm_vg/${vm_lvm_lv}_home ${vm_lvm_lv}_root_deciphered luks,lvm=$vm_lvm_vg,keyscript=/lib/cryptsetup/scripts/decrypt_derived
                ${vm_lvm_lv}_swap_deciphered /dev/$vm_lvm_vg/${vm_lvm_lv}_swap ${vm_lvm_lv}_root_deciphered luks,lvm=$vm_lvm_vg,keyscript=/lib/cryptsetup/scripts/decrypt_derived
                EOF
-       sudo install -m 644 -u root -g root /dev/stdin /etc/sysctl.d/local-swap.conf <<-EOF
+       sudo install -m 644 -o root -g root /dev/stdin /etc/sysctl.d/local-swap.conf <<-EOF
                vm.swappiness = 10 # NOTE: n'utilise le swap qu'en cas d'absolue nécessité
                vm.vfs_cache_pressure=50
                EOF
  }
 rule_initramfs_configure () {
-       sudo install -m 644 -u root -g root /dev/stdin /etc/initramfs-tools/initramfs.conf <<-EOF
+       sudo install -m 644 -o root -g root /dev/stdin /etc/initramfs-tools/initramfs.conf <<-EOF
                MODULES=most
                BUSYBOX=y
                KEYMAP=y
                COMPRESS=gzip
                DEVICE=eth0
                EOF
-       sudo install -m 644 -u root -g root /dev/stdin /etc/modprobe.d/xen-pv.conf <<-EOF
+       sudo install -m 644 -o root -g root /dev/stdin /etc/modprobe.d/xen-pv.conf <<-EOF
                alias eth0 xennet
                alias scsi_hostadapter xenblk
                EOF
-       sudo install -m 644 -u root -g root /dev/stdin /etc/modules <<-EOF
+       sudo install -m 644 -o root -g root /dev/stdin /etc/modules <<-EOF
                sha1_generic
                sha256_generic
                sha512_generic
@@ -252,7 +255,7 @@ rule_initramfs_configure () {
                # NOTE: pour Xen en mode HVM :
                #modprobe xen-platform-pci
                EOF
-       sudo install -m 644 -u root -g root /dev/stdin /etc/initramfs-tools/modules <<-EOF
+       sudo install -m 644 -o root -g root /dev/stdin /etc/initramfs-tools/modules <<-EOF
                EOF
        sudo sed -e '/^configure_networking /s/ &$//' \
         -i /usr/share/initramfs-tools/scripts/init-premount/dropbear
@@ -269,7 +272,7 @@ rule_initramfs_configure () {
         /etc/initramfs-tools/etc/dropbear/dropbear_rsa_host_key
         }
        # NOTE: ne se préoccupe pas de dropbear_dss_host_key ; Debian la génère et l'utilise néamoins.
-       sudo install -d -m 640 -u root -g root \
+       sudo install -d -m 640 -o root -g root \
         /etc/initramfs-tools/root \
         /etc/initramfs-tools/root/.ssh
        getent group sudo |
@@ -281,7 +284,7 @@ rule_initramfs_configure () {
                        cat "$home"/etc/ssh/authorized_keys
                 done
         done |
-       sudo install -m 644 -u root -g root /dev/stdin /etc/initramfs-tools/root/.ssh/authorized_keys
+       sudo install -m 644 -o root -g root /dev/stdin /etc/initramfs-tools/root/.ssh/authorized_keys
        sudo rm -f \
         /etc/initramfs-tools/root/.ssh/id_rsa.dropbear \
         /etc/initramfs-tools/root/.ssh/id_rsa.pub \
@@ -290,23 +293,23 @@ rule_initramfs_configure () {
        sudo update-initramfs -u
  }
 rule_locale_configure () {
-       sudo install -m 644 -u root -g root /dev/stdin /etc/locale.gen <<-EOF
+       sudo install -m 644 -o root -g root /dev/stdin /etc/locale.gen <<-EOF
                fr_FR.UTF-8 UTF-8
                EOF
        sudo update-locale
  }
 rule_login_configure () {
        grep -q '^hvc0$' /etc/securetty ||
-       sudo install -m 644 -u root -g root /dev/stdin /etc/securetty <<-EOF
+       sudo install -m 644 -o root -g root /dev/stdin /etc/securetty <<-EOF
                $(cat /etc/securetty)
                hvc0
                EOF
        grep -q '^xvc0$' /etc/securetty ||
-       sudo install -m 644 -u root -g root /dev/stdin /etc/securetty <<-EOF
+       sudo install -m 644 -o root -g root /dev/stdin /etc/securetty <<-EOF
                $(cat /etc/securetty)
                xvc0
                EOF
-       sudo install -m 644 -u root -g root /dev/stdin /etc/inittab <<-EOF
+       sudo install -m 644 -o root -g root /dev/stdin /etc/inittab <<-EOF
                # /etc/inittab: init(8) configuration.
                
                # The default runlevel.
@@ -349,7 +352,7 @@ rule_login_configure () {
                hvc:2345:respawn:/sbin/getty 38400 hvc0
                #xvc:2345:respawn:/sbin/getty 38400 xvc0
                EOF
-       sudo install -m 644 -u root -g root /dev/stdin /etc/login.defs <<-EOF
+       sudo install -m 644 -o root -g root /dev/stdin /etc/login.defs <<-EOF
                MAIL_DIR         /var/mail
                FAILLOG_ENAB     yes
                LOG_UNKFAIL_ENAB no
@@ -387,7 +390,7 @@ rule_login_configure () {
                ENCRYPT_METHOD   SHA512
                EOF
        grep -q '^session optional pam_umask.so\>' /etc/pam.d/common-session ||
-       sudo install -m 644 -u root -g root /dev/stdin /etc/pam.d/common-session <<-EOF
+       sudo install -m 644 -o root -g root /dev/stdin /etc/pam.d/common-session <<-EOF
                $(cat /etc/pam.d/common-session)
                session optional pam_umask.so
                EOF
@@ -412,6 +415,9 @@ rule_postfix_configure () {
        assert "test -f /etc/postfix/$vm_domainname/smtpd/x509/key.pem" hint
        warn "lors de l'installation Debian, ne sélectionner aucune configuration pour postfix"
        rule apt_get_install postfix
+       sudo install -m 640 -o root -g root /dev/stdin /etc/postfix/.gitignore <<-EOF
+               *.db
+               EOF
        sudo install -d -m 770 -o root -g root \
         /etc/postfix/$vm_domainname/ \
         /etc/postfix/$vm_domainname/smtp \
@@ -432,25 +438,25 @@ rule_postfix_configure () {
         ../crt+crl.self-signed.pem \
         /etc/postfix/$vm_domainname/smtpd/x509/ca/crt.pem
        sudo install -m 400 -o root -g root \
-                  var/pub/x509/service/smtpd/crt+crl.self-signed.pem \
+            "$tool"/var/pub/x509/service/smtpd/crt+crl.self-signed.pem \
         /etc/postfix/$vm_domainname/smtpd/x509/crt+crl.self-signed.pem
        sudo install -m 400 -o root -g root \
-                  var/pub/x509/service/smtpd/crt.pem \
+            "$tool"/var/pub/x509/service/smtpd/crt.pem \
         /etc/postfix/$vm_domainname/smtpd/x509/crt.pem
        sudo install -m 400 -o root -g root \
-            var/pub/x509/service/smtpd/crt+root.pem \
+            "$tool"/var/pub/x509/service/smtpd/crt+root.pem \
         /etc/postfix/$vm_domainname/smtpd/x509/crt+root.pem
        sudo install -m 400 -o root -g root \
-                  var/pub/x509/service/smtpd/crt+crl.self-signed.pem \
+            "$tool"/var/pub/x509/service/smtpd/crt+crl.self-signed.pem \
         /etc/postfix/$vm_domainname/smtpd/x509/crt+crl.self-signed.pem
        sudo install -m 660 -o root -g root \
-         etc/postfix/$vm_domainname/header_checks \
-        /etc/postfix/$vm_domainname/header_checks
+        "$tool"/etc/postfix/$vm_domainname/header_checks \
+               /etc/postfix/$vm_domainname/header_checks
        sudo install -m 664 -o root -g root \
-         etc/aliases \
-        /etc/aliases
-       sudo newaliases
-       cat /dev/stdin etc/postfix/main.cf <<-EOF |
+        "$tool"/etc/postfix/aliases \
+               /etc/postfix/aliases
+       sudo newaliases -oA/etc/postfix/aliases
+       cat /dev/stdin "$tool"/etc/postfix/main.cf <<-EOF |
                mydomain      = $vm_domainname
                myorigin      = \$mydomain
                myhostname    = $vm_hostname.\$mydomain
@@ -460,34 +466,34 @@ rule_postfix_configure () {
        sudo install -m 664 -o root -g root /dev/stdin \
         /etc/postfix/main.cf
        sudo install -m 664 -o root -g root \
-         etc/postfix/master.cf \
-        /etc/postfix/master.cf
+        "$tool"/etc/postfix/master.cf \
+               /etc/postfix/master.cf
        sudo install -m 660 -o root -g root \
-         etc/postfix/$vm_domainname/smtp/x509/policy \
-        /etc/postfix/$vm_domainname/smtp/x509/policy
+        "$tool"/etc/postfix/$vm_domainname/smtp/x509/policy \
+               /etc/postfix/$vm_domainname/smtp/x509/policy
        sudo postmap hash:/etc/postfix/$vm_domainname/smtp/x509/policy
        sudo install -m 660 -o root -g root \
-         etc/postfix/$vm_domainname/smtp/header_checks \
-        /etc/postfix/$vm_domainname/smtp/header_checks
+        "$tool"/etc/postfix/$vm_domainname/smtp/header_checks \
+               /etc/postfix/$vm_domainname/smtp/header_checks
        sudo install -m 660 -o root -g root \
-         etc/postfix/$vm_domainname/smtpd/sender_access \
-        /etc/postfix/$vm_domainname/smtpd/sender_access
+        "$tool"/etc/postfix/$vm_domainname/smtpd/sender_access \
+               /etc/postfix/$vm_domainname/smtpd/sender_access
        sudo postmap hash:/etc/postfix/$vm_domainname/smtpd/sender_access
        sudo install -m 660 -o root -g root \
-         etc/postfix/$vm_domainname/smtpd/client_blacklist \
-        /etc/postfix/$vm_domainname/smtpd/client_blacklist
+        "$tool"/etc/postfix/$vm_domainname/smtpd/client_blacklist \
+               /etc/postfix/$vm_domainname/smtpd/client_blacklist
        sudo postmap hash:/etc/postfix/$vm_domainname/smtpd/client_blacklist
        sudo install -m 660 -o root -g root \
-         etc/postfix/$vm_domainname/smtpd/relay_clientcerts \
-        /etc/postfix/$vm_domainname/smtpd/relay_clientcerts
+        "$tool"/etc/postfix/$vm_domainname/smtpd/relay_clientcerts \
+               /etc/postfix/$vm_domainname/smtpd/relay_clientcerts
        sudo postmap hash:/etc/postfix/$vm_domainname/smtpd/relay_clientcerts
        sudo install -m 660 -o root -g root \
-         etc/postfix/$vm_domainname/transport \
-        /etc/postfix/$vm_domainname/transport
+        "$tool"/etc/postfix/$vm_domainname/transport \
+               /etc/postfix/$vm_domainname/transport
        sudo postmap hash:/etc/postfix/$vm_domainname/transport
        sudo install -m 660 -o root -g root \
-         etc/postfix/$vm_domainname/virtual_alias \
-        /etc/postfix/$vm_domainname/virtual_alias
+        "$tool"/etc/postfix/$vm_domainname/virtual_alias \
+               /etc/postfix/$vm_domainname/virtual_alias
        sudo postmap hash:/etc/postfix/$vm_domainname/virtual_alias
        sudo service postfix restart
  }
@@ -498,15 +504,15 @@ rule_mail_configure () {
        rule dovecot_configure
  }
 rule_network_configure () {
-       sudo install -m 644 -u root -g root /dev/stdin /etc/hostname <<-EOF
+       sudo install -m 644 -o root -g root /dev/stdin /etc/hostname <<-EOF
                $vm
                EOF
        grep -q " $vm\$" /etc/hosts ||
-       sudo install -m 644 -u root -g root /dev/stdin /etc/hosts <<-EOF
+       sudo install -m 644 -o root -g root /dev/stdin /etc/hosts <<-EOF
                $(cat /etc/hosts)
                127.0.0.1 $vm_fqdn $vm
                EOF
-       sudo install -m 644 -u root -g root /dev/stdin /etc/network/interfaces <<-EOF
+       sudo install -m 644 -o root -g root /dev/stdin /etc/network/interfaces <<-EOF
                auto lo
                iface lo inet loopback
                
@@ -538,18 +544,7 @@ rule_network_configure () {
                    pre-down  ip address delete $vm_ipv4/32 dev \$IFACE
                EOF
  }
-rule_user_configure () {
-       sudo install -d -m 750 -u root -g adm \
-        /etc/skel/etc \
-        /etc/skel/etc/ssh
-       sudo install -d -m 770 -u root -g adm \
-        /etc/skel/etc/apache2 \
-        /etc/skel/var \
-        /etc/skel/var/log \
-        /etc/skel/var/cache \
-        /etc/skel/var/cache/ssh
-       sudo ln -fns etc/ssh /etc/skel/.ssh
-       sudo ln -fns etc/gpg /etc/skel/.gnupg
+rule_ssh_configure () {
        ssh-keygen -F "$vm_fqdn" -f "$tool"/etc/openssh/known_hosts |
        ( while IFS= read -r line
         do case $line in (*" RSA") return 0; break;; esac
@@ -561,7 +556,7 @@ rule_user_configure () {
         /etc/ssh/ssh_host_ecdsa_key \
         /etc/ssh/ssh_host_ecdsa_key.pub
         # NOTE: clefs générées par Debian
-       sudo install -m 644 -u root -g root /dev/stdin  /etc/ssh/sshd_config <<-EOF
+       sudo install -m 644 -o root -g root /dev/stdin  /etc/ssh/sshd_config <<-EOF
                Port 22
                ListenAddress $vm_ipv4
                #ListenAddress ::
@@ -638,10 +633,10 @@ rule_user_configure () {
                  case \$(/usr/bin/passwd --status "\$SUDO_USER") in \\
                    ("\$SUDO_USER L "*) /usr/bin/passwd \$SUDO_USER;; esac
                EOF
-       sudo install -m 640 -u root -g root /dev/stdin /etc/sudoers.d/etckeeper-unclean <<-EOF
+       sudo install -m 640 -o root -g root /dev/stdin /etc/sudoers.d/etckeeper-unclean <<-EOF
                %sudo ALL=(ALL) NOPASSWD: /usr/sbin/etckeeper unclean
                EOF
-       sudo install -m 640 -u root -g root /dev/stdin /etc/sudoers.d/env_keep <<-EOF
+       sudo install -m 640 -o root -g root /dev/stdin /etc/sudoers.d/env_keep <<-EOF
                Defaults env_keep = " \\
                  EDITOR \\
                  GIT_AUTHOR_NAME \\
@@ -656,9 +651,15 @@ rule_user_configure () {
                sudo /bin/sh -e -f -u -c \
                  'case \$(/usr/bin/passwd --status "\$SUDO_USER") in ("\$SUDO_USER L "*) /usr/bin/passwd \$SUDO_USER;; esac'
                EOF
+       sudo install -m 644 -o root -g root \
+        "$tool"/etc/bash.bashrc \
+               /etc/bash.bashrc
+       sudo install -m 644 -o root -g root \
+        "$tool"/etc/screenrc \
+               /etc/screenrc
  }
 rule_user_root_configure () {
-       sudo install -d -m 750 -u root -g adm \
+       sudo install -d -m 750 -o root -g adm \
         /root/etc \
         /root/etc/ssh \
         /root/etc/gpg
@@ -673,26 +674,24 @@ rule_user_root_configure () {
                        cat "$home"/etc/ssh/authorized_keys
                 done
         done |
-       sudo install -m 640 -u root -g root /dev/stdin /root/etc/ssh/authorized_keys
+       sudo install -m 640 -o root -g root /dev/stdin /root/etc/ssh/authorized_keys
        local key; local -; set +f
        for key in "$tool"/var/pub/openpgp/*.key
         do sudo gpg --import "$key"
         done
  }
-rule_bin_configure () {
-       sudo ln -fns "$tool"/vm_hosted /usr/local/sbin/
- }
 rule_configure () {
+       rule apt_configure
+       rule git_configure
        rule etckeeper_configure
        rule locale_configure
        rule network_configure
-       rule apt_configure
        rule filesystem_configure
        rule login_configure
+       rule ssh_configure
        rule user_root_configure
        rule boot_configure
-       rule apticron_configure
-       rule bin_configure
+       rule user_configure
  }
 
 rule_luks_key_change () {