#!/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}" RSYNC_OPTS="--rsync-path=/usr/bin/openrsync -Dlrt" 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 } rsync_verbose() { local _opt="" if [ $VERBOSITY -ge 2 ]; then _opt="$V" fi if [ $DRY == 1 ]; then echo openrsync ${RSYNC_OPTS} $_opt "$1" "$2" else openrsync ${RSYNC_OPTS} $_opt "$1" "$2" fi } rsync_quiet() { if [ $DRY == 1 ]; then echo openrsync ${RSYNC_OPTS} "$1" "$2" else openrsync ${RSYNC_OPTS} "$1" "$2" >/dev/null 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 } _rsync() { local _src _dest _src=$1 _dest="$(dirname $2)" if [ $VERBOSITY -gt 2 ]; then rsync_verbose "$_src" "$_dest" else rsync_quiet "$_src" "$_dest" 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}" _rsync $_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}')" local _svc _chfile for service in $(cat services); do read _svc _chfile <