#!/bin/sh set -e -f ${DRY_RUN:+-n} -u tool=$0 while test -L "$tool" do tool=$(readlink "$tool") done tool=${tool%/*} . "$tool"/lib/rule.sh . "$tool"/etc/vm.sh export TRACE=1 cd / rule_help () { # SYNTAX: [--hidden] local hidden; [ ${1:+set} ] || hidden=set cat >&2 <<-EOF DESCRIPTION: ce script regroupe des règles pour administrer la VM ($vm_fqdn) _depuis_ la VM hébergée ($vm_fqdn) ; il sert à la fois d'outil (aisément bidouillable) et de documentation (préçise). Voir \`$tool/vm_host' pour les règles côté machine hôte ($vm_host). SYNTAX: $0 \$RULE \${RULE}_SYNTAX RULES: $(sed -ne "s/^rule_\(${hidden:+[^_]}[^ ]*\) () {\( *#.*\|\)/ \1\2/p" "$tool"/etc/vm.sh "$0") ENVIRONMENT: TRACE # affiche les commandes avant leur exécution $(sed -ne 's/^readonly \([^ ][^ =]*\).*}\( *#.*\|\)$/\t$\1\2/p' "$tool"/etc/vm.sh "$0") EOF } 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 -) install -m 770 /dev/stdin .git/hooks/post-update <<-EOF #!/bin/sh -efux case \$1 in (refs/remotes/master) cd .. git --git-dir=\$PWD/.git checkout -f -B master remotes/master git --git-dir=\$PWD/.git clean -f -d -x ;; esac EOF ) } rule_git_reset () { ( cd "$tool" git checkout -f -B master remotes/master git clean -f -d -x ) } rule_adduser () { local user="$1"; shift getent passwd "$user" >/dev/null || sudo adduser "$@" "$user" } rule_apt_get_install () { # SYNTAX: $package sudo DEBIAN_FRONTEND=noninteractive apt-get install --yes "$@" } rule_dpkg_reconfigure () { # SYNTAX: $package sudo DEBIAN_FRONTEND=noninteractive dpkg-reconfigure "$@" } rule__chrooted_configure () { # NOTE: est-ce bien utile à un moment ? export LANG=C export LC_CTYPE=C . /etc/profile } rule_apache2_configure () { # XXX: cette règle n'est pas testée/mise-à-jour local -; set +f rule apt_get_install \ apache2-mpm-itk \ libapache2-mod-php5 # VOIR: http://serverfault.com/questions/383526/how-do-i-select-which-apache-mpm-to-use/383634#383634 # VOIR: http://jkroon.blogs.uls.co.za/it/security/using-php-fpm-and-mod_proxy_fcgi-to-optimize-and-secure-lamp-servers # NOTE: apache2-mpm-itk semble le plus sécurisé, # car on est certain que tout est exécuté avec les uid/gid # assignés au VirtualHost/Directory/Location # néamoins il se peut qu'une combinaison du genre : # apache2-mpm-{worker,event} + mod_proxy_fcgi + apache2-suexec-custom + php-fpm # soit plus performante (threads et pas forks), # cependant l'usage de suexec impose des forks il semble.. # et mod_proxy_fcgi n'apparaît que dans apache 2.4 ; # donc pour l'instant : apache2-mpm-itk sudo rm -rf \ /etc/apache2/site.d sudo install -d -m 770 -o www -g www \ /etc/apache2 \ /etc/apache2/site.d \ /etc/apache2/x509.d cat /dev/stdin "$tool"/etc/apache2/apache2.conf <<-EOF | ServerName "$vm_fqdn" EOF sudo install -m 660 -o root -g root /dev/stdin \ /etc/apache2/apache2.conf sudo install -m 660 -o root -g root \ "$tool"/etc/apache2/envvars \ /etc/apache2/envvars sudo install -m 660 -o root -g root \ "$tool"/etc/apache2/httpd.conf \ /etc/apache2/httpd.conf #sudo install -m 660 -o root -g root /dev/stdin \ # /etc/apache2/suexec/www-data <<-EOF # /home # pub/www/cgi # EOF sudo install -m 660 -o root -g root \ "$tool"/etc/apache2/ports.conf \ /etc/apache2/ports.conf sudo a2enmod actions sudo a2enmod headers sudo a2enmod rewrite sudo a2enmod ssl sudo a2enmod userdir local conf sudo a2dissite "*" sudo ln -fns \ /etc/apache2 \ /home/www/etc/apache2 for conf in "$tool"/etc/apache2/site.d/*/VirtualHost.conf do conf=${conf#"$tool"/etc/apache2/site.d/} local site=${conf%/VirtualHost.conf} case $site in (*-tls) local hint="run vm_remote apache2_key_send before" assert "sudo test -f /etc/apache2/site.d/\"$site\"/x509/key.pem" hint sudo install -d -m 770 -o www-"$site" -g www-"$site" \ /etc/apache2 \ /etc/apache2/site.d/"$site" \ /etc/apache2/x509.d/"$site" \ /etc/apache2/x509.d/"$site"/ca \ /etc/apache2/x509.d/"$site"/empty \ /etc/apache2/x509.d/"$site"/rvk \ /etc/apache2/x509.d/"$site"/usr sudo install -m 664 -o www -g www \ "$tool"/var/pub/x509/"$site"/crt.self-signed.pem \ /etc/apache2/x509.d/"$site"/crt.self-signed.pem #sudo install -m 664 -o www-"$site" -g www-"$site" \ # "$tool"/var/pub/x509/"$site"/rvk.pem \ # /etc/apache2/x509.d/"$site"/rvk.pem sudo install -m 664 -o www -g www \ "$tool"/var/pub/x509/"$site"/ca/crt.self-signed.pem \ /etc/apache2/x509.d/"$site"/ca/crt.pem sudo install -m 664 -o www -g www \ "$tool"/var/pub/x509/"$site"/crt.pem \ /etc/apache2/x509.d/"$site"/crt.pem ;; esac case $site in (*-tls) cat <<-EOF AssignUserID www-$site www-$site BrowserMatch "MSIE [2-6]" ssl-unclean-shutdown nokeepalive downgrade-1.0 force-response-1.0 BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown CustomLog "|/usr/sbin/rotatelogs /home/www/log/$site/apache2/access/%Y-%m-%d.log 86400 60" Combined #CustomLog "/dev/null" Combined DocumentRoot /home/www/pub/$site ErrorLog "|/usr/sbin/rotatelogs /home/www/log/$site/apache2/error/%Y-%m-%d.log 86400 60" #ErrorLog "/dev/null" LogLevel Warn SSLCACertificateFile /etc/apache2/x509.d/$site/crt.self-signed.pem SSLCACertificatePath /etc/apache2/x509.d/$site/usr/ #SSLCARevocationFile /etc/apache2/x509.d/$site/rvk.pem SSLCADNRequestFile /etc/apache2/x509.d/$site/crt.self-signed.pem SSLCADNRequestPath /etc/apache2/x509.d/$site/empty/ # NOTE: ne publie pas les certificats d’utilisateur-ice-s acceptés SSLCARevocationPath /etc/apache2/x509.d/$site/rvk/ SSLCertificateChainFile /etc/apache2/x509.d/$site/ca/crt.pem SSLCertificateFile /etc/apache2/x509.d/$site/crt.pem SSLCertificateKeyFile /etc/apache2/x509.d/$site/key.pem SSLCipherSuite AES+RSA+SHA256 SSLEngine On SSLInsecureRenegotiation Off SSLOptions +StrictRequire +OptRenegotiate +StdEnvVars SSLProtocol -All +TLSv1 #SSLRenegBufferSize 262144 SSLSessionCacheTimeout 1200 SSLStrictSNIVHostCheck On SSLUserName SSL_CLIENT_S_DN_CN SSLVerifyClient None SSLVerifyDepth 1 $(cat "$tool"/etc/apache2/site.d/"$site"/VirtualHost.conf) EOF ;; (*) cat <<-EOF AssignUserID www-$site www-$site CustomLog "|/usr/sbin/rotatelogs /home/www/log/$site/apache2/access/%Y-%m-%d.log 86400 60" Combined #CustomLog "/dev/null" Combined DocumentRoot /home/www/pub/$site ErrorLog "|/usr/sbin/rotatelogs /home/www/log/$site/apache2/error/%Y-%m-%d.log 86400 60" #ErrorLog "/dev/null" LogLevel Warn $(cat "$tool"/etc/apache2/site.d/"$site"/VirtualHost.conf) EOF ;; esac | sudo install -m 660 -o root -g root /dev/stdin \ /etc/apache2/site.d/"$site"/VirtualHost.conf sudo ln -fns \ ../site.d/"$site"/VirtualHost.conf \ /etc/apache2/sites-available/"$site" sudo install -d -m 770 -o www-"$site" -g www-"$site" \ /home/www/log/"$site" \ /home/www/log/"$site"/apache2 sudo ln -fns \ /etc/apache2/site.d/"$site" \ /home/www/etc/apache2/"$site" test -e /home/www/pub/"$site" || sudo install -d -m 2770 -o www-"$site" -g www-"$site" \ /home/www/pub/"$site" rule adduser www-"$site" --disabled-password \ --group \ --no-create-home \ --home /home/www/pub/"$site" \ --shell /bin/false \ --system #sudo setfacl -m u:"www-$site":--x \ # /home/www/ \ # /home/www/pub/ \ # /home/www/pub/"$site"/ #sudo setfacl -m d:u:"www-$site":rwx \ # "$home"/pub/www/"$site"/ test ! -r "$tool"/etc/apache2/site.d/"$site"/configure.sh || . "$tool"/etc/apache2/site.d/"$site"/configure.sh test -e /etc/apache2/sites-enabled/"$site" || sudo a2ensite "$site" done sudo service apache2 restart } rule_apt_configure () { sudo install -m 660 -o root -g root /dev/stdin /etc/apt/sources.list <<-EOF deb http://ftp.rezopole.net/debian $vm_lsb_name main EOF sudo install -m 660 -o root -g root /dev/stdin /etc/apt/sources.list.d/$vm_lsb_name-backports.list <<-EOF deb http://ftp.rezopole.net/debian $vm_lsb_name-backports main EOF sudo install -m 660 -o root -g root /dev/stdin /etc/apt/preferences <<-EOF Package: * Pin: release a=$vm_lsb_name Pin-Priority: 200 Package: * Pin: release a=$vm_lsb_name-backports Pin-Priority: 170 EOF sudo apt-get update rule apt_get_install apticron m4 \ --define=VM_DOMAINNAME=$vm_domainname \ <"$tool"/etc/apticron/apticron.conf.m4 | sudo install -m 644 -o root -g root /dev/stdin \ /etc/apticron/apticron.conf } rule_boot_configure () { #warn "lors de l'installation Debian, surtout n'installer GRUB sur AUCUN disque proposé !" sudo debconf-set-selections <<-EOF grub-pc grub-pc/install_devices multiselect EOF rule apt_get_install grub-pc sudo install -d -m 644 -o root -g root /boot/grub rule apt_get_install linux-image-$vm_arch 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\` GRUB_CMDLINE_LINUX_DEFAULT="quiet" GRUB_CMDLINE_LINUX="vt.default_utf8=1 rootfstype=ext4 loglevel=5 console=hvc0 ip=$vm_ipv4::$vm_ipv4:255.255.255.254:$vm:eth0:off resume=/dev/mapper/${vm}_swap_deciphered" GRUB_DISABLE_RECOVERY="true" #GRUB_PRELOAD_MODULES="lvm" 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 sudo update-grub2 # NOTE: prend en compte /boot/grub/device.map rule initramfs_configure rule apt_get_install molly-guard sudo install -m 644 -o root -g root /dev/stdin /etc/molly-guard/rc <<-EOF ALWAYS_QUERY_HOSTNAME=true # NOTE: une alternative est de dire à sudo de conserver les SSH_* # néamoins demander tout le temps n'est pas trop contraignant # et davantage sécurisant. EOF } rule_dovecot_configure () { rule apt_get_install dovecot-imapd dovecot-managesieved dovecot-sieve rule insserv_remove dovecot local hint="run vm_remote dovecot_key_send before" assert "sudo test -f /etc/dovecot/\"$vm_domainname\"/imap/x509/key.pem" hint sudo install -m 400 -o root -g root \ "$tool"/var/pub/x509/imap."$vm_domainname"/crt+crl.self-signed.pem \ /etc/dovecot/"$vm_domainname"/imap/x509/crt+crl.self-signed.pem sudo install -d -m 770 -o root -g root \ /etc/skel/etc/mail \ /etc/skel/etc/sieve sudo install -d -m 1777 -o root -g root \ /var/lib/dovecot-control \ /var/lib/dovecot-index m4 \ --define=VM_DOMAINNAME=$vm_domainname \ <"$tool"/etc/dovecot/local.conf.m4 | sudo install -m 644 -o root -g root /dev/stdin \ /etc/dovecot/local.conf sudo install -m 755 -o root -g root /dev/stdin /usr/local/bin/dovecot-passwd <<-EOF #!/bin/sh -efux # DESCRIPTION: permet à un-e utilisateurice d'initialiser ellui-même son mot-de-passe dovecot. install -d -m 770 ~/etc/dovecot install -m 640 /dev/stdin ~/etc/dovecot/passwd <<_EOF \$USER:\$(/usr/bin/doveadm pw -s SHA512-CRYPT)::::::: _EOF EOF rule runit_sv_configure dovecot rule runit_sv_restart dovecot } rule_etckeeper_configure () { sudo install -m 644 -o root -g root /dev/stdin /etc/etckeeper/etckeeper.conf <<-EOF VCS=git GIT_COMMIT_OPTIONS="" AVOID_DAILY_AUTOCOMMITS=1 #AVOID_SPECIAL_FILE_WARNING=1 AVOID_COMMIT_BEFORE_INSTALL=1 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 () { m4 \ --define=VM_LVM_LV=$vm_lvm_lv \ --define=VM_LVM_VG=$vm_lvm_vg \ <"$tool"/etc/fstab.m4 | sudo install -m 644 -o root -g root /dev/stdin \ /etc/fstab m4 \ --define=VM_LVM_LV=$vm_lvm_lv \ --define=VM_LVM_VG=$vm_lvm_vg \ <"$tool"/etc/crypttab.m4 | sudo install -m 644 -o root -g root /dev/stdin \ /etc/crypttab rule tmpfs_configure } rule_initramfs_configure () { 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 -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 -o root -g root /dev/stdin /etc/modules <<-EOF sha1_generic sha256_generic sha512_generic aes-x86_64 xts # NOTE: pour Xen en mode HVM : #modprobe xen-platform-pci 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 # NOTE: corrige une vermine : dropbear doit attendre que le réseau soit configuré.. ssh-keygen -F "init.$vm_fqdn" -f "$tool"/etc/openssh/known_hosts | ( while IFS= read -r line do case $line in (*" RSA") return 0; break;; esac done; return 1 ) || { sudo rm -f \ /etc/initramfs-tools/etc/dropbear/dropbear_rsa_host_key \ /etc/initramfs-tools/etc/dropbear/dropbear_rsa_host_key.pub sudo dropbearkey -t rsa -s 4096 -f \ /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 -o root -g root \ /etc/initramfs-tools/root \ /etc/initramfs-tools/root/.ssh getent group sudo | while IFS=: read -r group x x users do while test -n "$users" && IFS=, read -r user users <<-EOF $users EOF do eval local home\; home="~$user" sudo cat "$home"/etc/ssh/authorized_keys done done | 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 \ /etc/initramfs-tools/root/.ssh/id_rsa # NOTE: clefs générées par Debian sudo update-initramfs -u } rule_insserv_remove () { # SYNTAX: $sv local sv="$1" sudo chmod u+x /etc/init.d/"$sv" sudo insserv --force --remove "$sv" sudo /etc/init.d/"$sv" stop sudo chmod ugo-x /etc/init.d/"$sv" } rule_gitolite_configure () { sudo debconf-set-selections <<-EOF gitolite gitolite/gituser string git gitolite gitolite/adminkey string gitolite gitolite/gitdir string /home/git EOF rule apt_get_install gitolite rule adduser git \ --disabled-password \ --group \ --home /home/git \ --shell /bin/bash \ --system sudo chfn --full-name git git rule adduser log-git \ --disabled-login \ --disabled-password \ --group \ --home /home/git/log \ --shell /bin/false \ --system rule adduser git-data \ --disabled-login \ --disabled-password \ --group \ --home /home/git/pub \ --shell /bin/false \ --system sudo adduser git git-data sudo install -d -m 750 -o git -g git \ /etc/gitolite \ /home/git/etc \ /home/git/etc/ssh sudo install -d -m 751 -o git -g git \ /home/git sudo install -d -m 2770 -o git-data -g git-data \ /home/git/pub sudo install -d -m 1771 -o git -g git \ /home/git/log sudo install -d -m 2770 -o git -g log-git \ /home/git/log/gitolite \ /home/git/log/gitolite/perf sudo install -d -m 3771 -o git -g git \ /home/git/hooks sudo ln -fns /etc/gitolite /home/git/etc/gitolite sudo ln -fns /etc/gitweb /home/git/etc/gitweb sudo ln -fns etc/gitolite/gitolite.rc /home/git/.gitolite.rc sudo ln -fns etc/ssh /home/git/.ssh sudo install -m 770 -o git -g git /dev/stdin \ /home/git/etc/gitolite/gitolite.rc <<-EOF #\$ADMIN_POST_UPDATE_CHAINS_TO = "hooks/post-update.secondary"; #\$BIG_INFO_CAP = 20; #\$ENV{GL_SLAVES} = 'gitolite@server2 gitolite@server3'; # NOTE: Please use single quotes, not double quotes. #\$GITWEB_URI_ESCAPE = 0; \$GIT_PATH = ""; #\$GL_ADC_PATH = ""; \$GL_ADMINDIR = \$ENV{HOME} . "/etc/gitolite"; #\$GL_ALL_INCLUDES_SPECIAL = 0; #\$GL_ALL_READ_ALL = 0; \$GL_BIG_CONFIG = 0; \$GL_CONF = "\$GL_ADMINDIR/conf/gitolite.conf"; \$GL_CONF_COMPILED = "\$GL_ADMINDIR/conf/gitolite.conf.pm"; #\$GL_GET_MEMBERSHIPS_PGM = "/usr/local/bin/expand-ldap-user-to-groups" \$GL_GITCONFIG_KEYS = "gitweb\\..* hooks\\..*"; #\$GL_HOSTNAME = "git.$vm_domainname"; # NOTE: read doc/mirroring.mkd COMPLETELY before setting this. #\$GL_HTTP_ANON_USER = "mob"; \$GL_KEYDIR = "\$GL_ADMINDIR/keydir"; \$GL_LOGT = \$ENV{HOME} . "/log/gitolite/%y-%m-%d.log"; #\$GL_NICE_VALUE = 0; \$GL_NO_CREATE_REPOS = 0; \$GL_NO_DAEMON_NO_GITWEB = 0; \$GL_NO_SETUP_AUTHKEYS = 0; \$GL_PACKAGE_CONF = "/usr/share/gitolite/conf"; \$GL_PACKAGE_HOOKS = "/usr/share/gitolite/hooks"; #\$GL_PERFLOGT = \$ENV{HOME} . "/log/gitolite/perf/%y-%m-%d.log"; #\$GL_REF_OR_FILENAME_PATT = qr(^[0-9a-zA-Z][0-9a-zA-Z._\\@/+ :,-]*\$); \$GL_SITE_INFO = "git.$vm_domainname"; #\$GL_SLAVE_MODE = 0; \$GL_WILDREPOS = 0; #\$GL_WILDREPOS_DEFPERMS = 'R @all'; \$GL_WILDREPOS_PERM_CATS = "READERS WRITERS"; \$HTPASSWD_FILE = ""; \$PROJECTS_LIST = \$ENV{HOME} . "/etc/gitweb/projects.list"; \$REPO_BASE = "pub"; \$REPO_UMASK = 0007; \$RSYNC_BASE = ""; \$SVNSERVE = ""; #\$UPDATE_CHAINS_TO = "hooks/update.secondary"; \$WEB_INTERFACE = "gitweb"; 1; EOF sudo install -m 600 -o git -g git \ "$tool"/var/pub/ssh/git.key \ /home/git/etc/ssh/git.pub sudo -u git \ GL_RC=/home/git/etc/gitolite/gitolite.rc \ GIT_AUTHOR_NAME=git \ gl-setup -q /home/git/etc/ssh/git.pub git local d for d in doc logs src do test ! -d /home/git/etc/gitolite/"$d" || rmdir /home/git/etc/gitolite/"$d" done rule tmpfs_configure } rule_locales_configure () { sudo debconf-set-selections <<-EOF locales locales/default_environment_locale select None locales locales/locales_to_be_generated multiselect fr_FR.UTF-8 UTF-8 EOF rule dpkg_reconfigure locales } rule_login_configure () { sudo install -m 644 -o root -g root \ "$tool"/etc/inittab \ /etc/inittab sudo install -m 644 -o root -g root \ "$tool"/etc/login.defs \ /etc/login.defs grep -q '^session optional pam_umask.so\>' /etc/pam.d/common-session || 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 grep -q '^hvc0$' /etc/securetty || 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 -o root -g root /dev/stdin /etc/securetty <<-EOF $(cat /etc/securetty) xvc0 EOF } rule_mail_configure () { rule postfix_configure rule postgrey_configure rule procmail_configure rule dovecot_configure } rule_mysql_configure () { rule apt_get_install mysql-server-5.5 rule insserv_remove mysql rule adduser mysql \ --disabled-login \ --disabled-password \ --group \ --home /home/mysql \ --shell /bin/false \ --system rule adduser mysql-data \ --disabled-login \ --disabled-password \ --group \ --home /home/mysql/data \ --no-create-home \ --shell /bin/false \ --system sudo usermod --home /home/mysql mysql sudo adduser mysql mysql-data sudo install -d -m 751 -o mysql -g mysql \ /home/mysql sudo rm -rf /etc/mysql sudo install -d -m 750 -o mysql -g mysql \ /etc/mysql \ /etc/mysql/conf.d \ /home/mysql/etc sudo ln -fns \ /etc/mysql \ /home/mysql/etc/mysql sudo install -m 644 -o mysql -g mysql \ "$tool"/etc/mysql/my.cnf \ /etc/mysql/my.cnf if sudo test ! -d /home/mysql/data then sudo install -d -m 750 -o mysql -g mysql-data \ /home/mysql/data sudo -u mysql mysql_install_db \ --datadir=/home/mysql/data \ --no-defaults fi rule tmpfs_configure rule runit_sv_configure mysql rule runit_sv_restart mysql while ! sudo -u mysql mysql -u mysql