commit 65ef7afb4a8e73e8150e2d1688ddd5850b9b5b02 from: mischa date: Mon Sep 24 20:25:26 2018 UTC added vm name and owner check commit - 0700999247a69ae82f8d118fcbfbad94db1aca04 commit + 65ef7afb4a8e73e8150e2d1688ddd5850b9b5b02 blob - 6fdfcfd2fe69832094a6c60547dea54fc5150814 blob + be7da4fa9b91b7a8cca73dcc5bc7777aba2fe46f --- deploy.sh +++ deploy.sh @@ -1,5 +1,6 @@ #!/bin/sh # shellcheck disable=SC1090 +# shellcheck disable=SC2038 # shellcheck disable=SC2154 # CONF_FILE "_vms.conf" needs to have the following variables: @@ -64,19 +65,23 @@ main () { list_files() { # Find all the VM config files. - # Takes the directory with vm*.txt files. - find "$1" -type f -name "vm*.txt" -maxdepth 1 | sort | xargs grep -l "message" + # Takes the directory with vm*.txt files + find "$1" -type f -name "vm*.txt" -maxdepth 1 | sort -V | xargs grep -l "message" } find_vm() { # Find the number of the VM (VM#). - # Takes the directory with vm*.txt files and instance name as variable. - find "$1" -type f -name "vm*.txt" -maxdepth 1 | xargs grep -l "$2" | sed 's/^\.\/vm//;s/\.txt$//' + # Takes the directory with vm*.txt files and instance + # Checks if instance exists otherwise returns the vm filename + if _vm=$(find "$1" -type f -name "vm*.txt" -maxdepth 1 | xargs grep -l "$2") + then echo "$_vm" | sed 's/^\.\/vm//;s/\.txt$//' + else echo "$2" | sed 's/^vm//' + fi } fetch_mac() { # Fetch the MAC address for the VM. - # Takes the MAC_PREFIX and VM#. + # Takes the MAC_PREFIX and VM# # print the MAC address echo "${1}:${2}" } @@ -104,11 +109,46 @@ fetch_ipv6() { generate_passwd() { # Generate a random password for the install-.conf file. - # Doesn't take variables. + # Doesn't take variables tr -cd '[:print:]' < /dev/urandom | fold -w 20 | head -n 1 } +check_instance() { + # Check if the instance name exists, otherwise return filename as VM. + # Takes vm*.txt and instance + # prints either filename or instance variable + if test -z "$2" + then echo "$1" | sed 's/^\.\///;s/\.txt$//' + else echo "$2" + fi +} +check_owner() { + # Check if the owner name exists, otherwise returns username. + # Takes username and owner + # prints either owner or username + if test -z "$2" + then echo "$1" + else echo "$2" + fi +} + +clear_variables() { + # Clears all variables in vm*.txt. + # Doesn't take variables + unset instance + unset date + unset payment + unset donated + unset owner + unset name + unset email + unset message + unset hostname + unset username + unset note +} + render_vm_conf() { # Generate vm.comf # Takes defaults from of _vms.conf and iterate over the vm*.txt files. @@ -123,22 +163,21 @@ render_vm_conf() { while read -r f do . "$f" - printf "vm \"%s\" {\\n" "$instance" + _instance=$(check_instance "$f" "$instance") + _owner=$(check_owner "$username" "$owner") + printf "vm \"%s\" {\\n" "$_instance" printf "\\tdisable\\n" - if test -n "$owner" - then - printf "\\towner %s\\n" "$owner" - fi - if ! test -f "${IMAGES}/${instance}.img" - then - printf "\\tboot \"%s/bsd.rd\"\\n" "$IMAGES" + printf "\\towner %s\\n" "$_owner" + if ! test -f "${IMAGES}/${_instance}.img" + then printf "\\tboot \"%s/bsd.rd\"\\n" "$IMAGES" fi - printf "\\tdisk \"%s/%s.img\"\\n" "$IMAGES" "$instance" + printf "\\tdisk \"%s/%s.img\"\\n" "$IMAGES" "$_instance" printf "\\tinterface tap {\\n" printf "\\t\\tswitch \"uplink_vlan921\"\\n" - printf "\\t\\tlladdr %s\\n" "$(fetch_mac "$MAC_PREFIX" "$(find_vm "$VMS" "$instance")")" + printf "\\t\\tlladdr %s\\n" "$(fetch_mac "$MAC_PREFIX" "$(find_vm "$VMS" "$_instance")")" printf "\\t}\\n" printf "}\\n" + clear_variables done } @@ -159,17 +198,17 @@ render_dhcpd_conf() { while read -r f do . "$f" - printf "\\thost %s {\\n" "$instance" - printf "\\t\\thardware ethernet %s\\n" "$(fetch_mac "$MAC_PREFIX" "$(find_vm "$VMS" "$instance")")" - printf "\\t\\tfixed-address %s\\n" "$(fetch_ip "$IP_PREFIX" "$IP_START" "$(find_vm "$VMS" "$instance")")" - if ! test -f "${IMAGES}/${instance}.img" - then - printf "\\t\\tfilename \"auto_install\"\\n" - else - printf "\\t\\tfilename \"auto_upgrade\"\\n" + _instance=$(check_instance "$f" "$instance") + printf "\\thost %s {\\n" "$_instance" + printf "\\t\\thardware ethernet %s\\n" "$(fetch_mac "$MAC_PREFIX" "$(find_vm "$VMS" "$_instance")")" + printf "\\t\\tfixed-address %s\\n" "$(fetch_ip "$IP_PREFIX" "$IP_START" "$(find_vm "$VMS" "$_instance")")" + if ! test -f "${IMAGES}/${_instance}.img" + then printf "\\t\\tfilename \"auto_install\"\\n" + else printf "\\t\\tfilename \"auto_upgrade\"\\n" fi printf "\\t\\toption host-name \"%s\"\\n" "$hostname" printf "\\t}\\n" + clear_variables done printf "}\\n" } @@ -184,11 +223,12 @@ render_install_conf() { while read -r f do . "$f" + _instance=$(check_instance "$f" "$instance") _pass="$(generate_passwd)" - _ipv6=$(fetch_ipv6 "$IPV6_PREFIX" "$IPV6_START" "$IP_START" "$(find_vm "$VMS" "$instance")") + _ipv6=$(fetch_ipv6 "$IPV6_PREFIX" "$IPV6_START" "$IP_START" "$(find_vm "$VMS" "$_instance")") _ipv6_gateway=$(echo "$_ipv6" | sed -e 's/::[0-9]*$/::1/g') - _mac=$(fetch_mac "$MAC_PREFIX" "$(find_vm "$VMS" "$instance")") - if ! test -f "${IMAGES}/${instance}.img" + _mac=$(fetch_mac "$MAC_PREFIX" "$(find_vm "$VMS" "$_instance")") + if ! test -f "${IMAGES}/${_instance}.img" then cat <<-EOF > "${HTDOCS}/install-${_mac}.conf" # @@ -216,6 +256,7 @@ render_install_conf() { then rm -rf "${HTDOCS}/install-${_mac}.conf" fi fi + clear_variables done } @@ -223,10 +264,12 @@ create_images() { while read -r f do . "$f" - if ! test -f "${IMAGES}/${instance}.img" - then vmctl create "${IMAGES}/${instance}.img" -s 50G > /dev/null - echo "Image file created: ${IMAGES}/${instance}.img" + _instance=$(check_instance "$f" "$instance") + if ! test -f "${IMAGES}/${_instance}.img" + then vmctl create "${IMAGES}/${_instance}.img" -s 50G > /dev/null + echo "Image file created: ${IMAGES}/${_instance}.img" fi + clear_variables done } @@ -234,21 +277,18 @@ create_users() { while read -r f do . "$f" - if test -n "$owner" + _owner=$(check_owner "$username" "$owner") + if test -n "$_owner" then - if ! grep -e "^$owner" /etc/passwd > /dev/null + if ! grep -e "^$_owner" /etc/passwd > /dev/null then - useradd -m -G "$VMDUSERS" "$owner" - echo "$message" > "/home/${owner}/.ssh/authorized_keys" - echo "User created: $owner" + useradd -m -G "$VMDUSERS" "$_owner" + echo "$message" > "/home/${_owner}/.ssh/authorized_keys" + echo "User created: $_owner" fi fi + clear_variables done } -restart_service() { - rcctl restart dhcpd - vmctl reload -} - main "$@" blob - 67854bfccc30b95648b8ddbdf389dfc02c244733 blob + 0dac2995656224eff575dd90c8bd2986c54d5343 --- vm1.txt +++ vm1.txt @@ -1,4 +1,4 @@ -instance="vm1" +instance="vm1instance" date="2018/09/18" payment= donated= blob - 25333445be35b6b6c7439818d28ee5c65726e402 blob + 19f19d282b678c437f2abffb38aa9afebb8f8b74 --- vm2.txt +++ vm2.txt @@ -1,4 +1,4 @@ -instance="vm2" +instance="vm2instance" date="2018/09/18" payment= donated= blob - c7abf02e827b47f54279563795603accb87aae60 blob + 25c225cf1dd7e45d82d39842476737d1cfb0eacd --- vm3.txt +++ vm3.txt @@ -1,11 +1,10 @@ -instance="vm3" date="2018/09/18" payment= donated= -owner= +owner="rolf" name="User Three" email="user.three@gmail.com" -message="ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDZ5LtCgngY6ehDPRA4+hBWl1NtfNNy5++0NjHuVNQgFls4hjdDeouNz1zPL6HXh72PgsBUEoTUucNi8BjOL//qFOCfKiPSJfiGUty+xIjyPowigoDx76z+hOwXVeKJ9sGMmknfH0x1z9Da+ShnNM5r1WwTz5JBV4tlVnQlYX65PeskWJSreTKRoPGSfNU2xxIJePmp0sCTJXfgDooqT7gR8W07vEYfW3pYReJXz3ipD/YBbkAXOxJEa3B75As+K7QC0UgTazq9u7mg+BTuRI9dAybyGqVWG+4EsiVwr57+5yLQkHRsS3JoBZXgyHJQ92o65Tt9eWQZ4DedgTha0d" -hostname="vm3.example.com" -username="user3" +message="ssh-rsa AAAAB4NzaC1yc2EAAAADAQABAAABAQDZ5LtCgngY6ehDPRA4+hBWl1NtfNNy5++0NjHuVNQgFls4hjdDeouNz1zPL6HXh72PgsBUEoTUucNi8BjOL//qFOCfKiPSJfiGUty+xIjyPowigoDx76z+hOwXVeKJ9sGMmknfH0x1z9Da+ShnNM5r1WwTz5JBV4tlVnQlYX65PeskWJSreTKRoPGSfNU2xxIJePmp0sCTJXfgDooqT7gR8W07vEYfW4pYReJXz4ipD/YBbkAXOxJEa4B75As+K7QC0UgTazq9u7mg+BTuRI9dAybyGqVWG+4EsiVwr57+5yLQkHRsS4JoBZXgyHJQ92o65Tt9eWQZ4DedgTha0d" +hostname="vmthree.example.com" +username="userthree" note= blob - 13a23a8dc8f78999011e241e3c56399e572e62dd blob + e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 --- vm4.txt +++ vm4.txt @@ -1,5 +0,0 @@ -instance= -date= -payment= -donated= -owner=