#!/bin/ksh # /* # * Copyright (c) 2019 Aaron Bieber # * # * Permission to use, copy, modify, and distribute this software for any # * purpose with or without fee is hereby granted, provided that the above # * copyright notice and this permission notice appear in all copies. # * # * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # */ set -au SERVER="" RUN_USER="root" VERBOSITY=0 DRY=0 MAINTENANCE=0 SNAPSHOT="" FORCE=0 SSH_CTL_PATH="/tmp/boxctl-%r@%h:%p" SSH_OPTS="-o ControlMaster=auto -o ControlPersist=60s -o ControlPath=${SSH_CTL_PATH}" while getopts "fh:mnu:sv" arg; do case $arg in f) FORCE=1 ;; h) SERVER=$OPTARG ;; m) MAINTENANCE=1 ;; n) DRY=1 ;; u) RUN_USER=$OPTARG ;; s) SNAPSHOT="-Dsnap" ;; v) VERBOSITY=$((VERBOSITY+1)) ;; esac done PKG_DIFF_INSTALL=$(cat < /tmp/new_packages /usr/sbin/pkg_add %s ${SNAPSHOT} -z -l /tmp/new_packages else /usr/sbin/pkg_add %s ${SNAPSHOT} -z -l /etc/packages.tmp fi mv /etc/packages.tmp /etc/packages EOF ) SERVICE_START_RESTART=$(cat < ${SERVER} -> $_msg" fi } expand_v() { V="" if [ $VERBOSITY -gt 0 ]; then for v in $(jot $VERBOSITY); do V="${V}v" done fi if [ "${V}" == "" ]; then echo "${V}" else echo "-${V}" fi } ssh_verbose() { local _opt="" if [ $VERBOSITY -ge 4 ]; then _opt="$V" fi if [ $DRY == 1 ]; then echo ssh ${SSH_OPTS} $_opt "$1" "${2}" else ssh ${SSH_OPTS} $_opt "$1" "${2}" fi } ssh_quiet() { if [ $DRY == 1 ]; then echo "ssh ${SSH_OPTS} '$1' '${2}' >/dev/null" else ssh ${SSH_OPTS} "$1" "${2}" >/dev/null fi } scp_verbose() { local _opt="" if [ $VERBOSITY -ge 4 ]; then _opt="$V" fi if [ $DRY == 1 ]; then echo scp ${SSH_OPTS} $_opt "$1" "${2}" else scp ${SSH_OPTS} $_opt "$1" "${2}" fi } scp_quiet() { if [ $DRY == 1 ]; then echo "scp ${SSH_OPTS} '$1' '${2}' >/dev/null" else scp ${SSH_OPTS} "$1" "${2}" >/dev/null fi } _scp() { local _src _dest _src=$1 _dest=$2 if [ $VERBOSITY -gt 2 ]; then scp_verbose "$_src" "$_dest" else scp_quiet "$_src" "$_dest" fi } _ssh() { local _server _cmd _server=$1 _cmd=$2 if [ $VERBOSITY -gt 2 ]; then ssh_verbose "$_server" "$_cmd" else ssh_quiet "$_server" "$_cmd" fi } V=$(expand_v) if [ -f ./groups ]; then msg 0 "adding $(wc -l groups | awk '{print $1 " " $2}')" for group in $(cat groups); do local _group _gid read _group _gid < ${_dest}" msg 2 "\t\tmkdir -p ${_dir}" msg 2 "\t\tchown ${_owner}:${_group} $_dest" msg 2 "\t\tchmod ${_mode} $_dest" _ssh ${RUN_USER}@${SERVER} "mkdir -p ${_dir}" _scp $_src "${RUN_USER}@${SERVER}:$_dest" _ssh ${RUN_USER}@${SERVER} "/sbin/chown ${_owner}:${_group} \ $_dest; /bin/chmod ${_mode} $_dest" done fi if [ -f ./services ]; then msg 0 "enabling services $(wc -l services | awk '{print $1 " " $2}')" for service in $(cat services); do msg 1 "\tenabling/restarting ${service}" cmd="$(printf "$SERVICE_START_RESTART" \ $service $service $service $service)" _ssh ${RUN_USER}@${SERVER} "${cmd}" done fi if [ -f ./packages ]; then msg 0 "installing $(wc -l packages | awk '{print $1 " " $2}')" cmd=$(printf "${PKG_DIFF_INSTALL}" $V $V) _scp packages "${RUN_USER}@${SERVER}:/etc/packages.tmp" _ssh ${RUN_USER}@${SERVER} "${cmd}" fi if [ $MAINTENANCE == 1 ]; then msg 0 "cleaning up unused packages" _ssh ${RUN_USER}@${SERVER} "/usr/sbin/pkg_delete $V -a" msg 0 "installing firmware updates" _ssh ${RUN_USER}@${SERVER} "/usr/sbin/fw_update $V -a" fi if [ -f ./commands ]; then local _tmp=$(mktemp) rm $_tmp msg 0 "executing 'commands' file" _scp commands "${RUN_USER}@${SERVER}:${_tmp}" _ssh ${RUN_USER}@${SERVER} "chmod +x ${_tmp}; . ${_tmp}; rm ${_tmp}" fi