drist - drist - a remote deployment tool HTML git clone git://bitreich.org/drist/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/drist/ DIR Log DIR Files DIR Refs DIR Tags DIR README DIR LICENSE --- drist (2829B) --- 1 #!/bin/sh 2 3 SUDO=0 4 SUDO_BIN=sudo 5 EXEC="" 6 SSHONCE=0 7 TRUNCATE=0 8 TEMPDIR="" 9 10 usage() { 11 echo "$0 [-p] [-d] [-s [-e sudo|doas]] server [...]" 12 exit 0 13 } 14 15 # $1 = directory name 16 # $2 = remote server 17 # $3 = tempdir 18 copy_files() { 19 # -l = keep symlink / -D = special device 20 if [ -d "${1}" ] 21 then 22 LIST=$(mktemp /tmp/drist-rsync.XXXXXXXXXX) 23 if [ -f "$LIST" ] 24 then 25 printf 'Copying files from "%s" to temporary directory %s:\n' "$1" "$3" 26 find "${1}"/ -type f -or -type l | cut -d '/' -f 2- | tee "${LIST}" | sed 's/^/ \//' 27 rsync -t -e "ssh $SSH_PARAMS" -lD --files-from="${LIST}" "${1}/" "${2}":"/${3}" 28 rm "$LIST" 29 fi 30 fi 31 } 32 33 # $1 = script filename 34 # $2 = remote server 35 # $3 = tempdir 36 remote_script() { 37 if [ -f "${1}" ] 38 then 39 printf 'Executing file "%s":\n' "$1" 40 ssh $SSH_PARAMS "${2}" "cd ${3} && DRIST=${3}/script && 41 cat - > \$DRIST && 42 chmod u+x \$DRIST && 43 ${EXEC} \$DRIST" < "$1" 44 fi 45 } 46 47 # $1 = remote server 48 create_temp() { 49 TEMPDIR=$(ssh $SSH_PARAMS "$1" "mktemp -d ~/.drist_files_XXXXXXXXXXXXXXX") 50 if [ "$TEMPDIR" = "" ]; then 51 echo "mktemp error, aborting" 52 exit 1 53 fi 54 } 55 56 # $1 = remote server 57 # $2 = temporary directory 58 delete_temp() { 59 if echo "${2}" | grep drist_files_ >/dev/null ; then 60 ssh $SSH_PARAMS "$1" "rm -fr ${2}" 61 else 62 echo "Problem, TEMPDIR was reset during execution, current value is = $2" 63 exit 2 64 fi 65 } 66 67 68 # RUNTIME BEGINS HERE 69 while getopts pndse: arg; do 70 case ${arg} in 71 d) TRUNCATE=1 ;; 72 s) SUDO=1 ;; 73 e) SUDO_BIN="${OPTARG}" ;; 74 p) SSHONCE=1 ;; 75 *) usage ;; 76 esac 77 done 78 shift $((OPTIND - 1)) 79 80 # allow to use a privilege escalation program 81 if [ "$SUDO" -eq 1 ] 82 then 83 EXEC="$SUDO_BIN" 84 fi 85 86 # use ControlMaster to make connections persistent 87 if [ "$SSHONCE" -eq 1 ] 88 then 89 SSH_PARAMS=-o"ControlMaster=auto"" "-o"ControlPath=/tmp/drist_ssh_%h_%p_%r.sock"" "-o"ControlPersist=1m" 90 fi 91 92 # start looping over server list 93 if [ -f "$1" ] 94 then 95 SERVER_LIST="$(tr '\n' ' ' < $1)" 96 else 97 SERVER_LIST="$@" 98 fi 99 100 if [ "${SERVER_LIST}" = "" ] 101 then 102 echo "No server specified" 103 exit 1 104 fi 105 106 for remote_server in ${SERVER_LIST} 107 do 108 echo "Running on ${remote_server}" 109 110 # check if host exists 111 HOSTNAME=$(ssh $SSH_PARAMS "${remote_server}" "uname -n") 112 if [ "$?" -ne 0 ]; then 113 echo "Error while ssh ${remote_server}" 114 exit 2 115 fi 116 117 if [ "$TRUNCATE" -eq 1 ]; then 118 HOSTNAME="${HOSTNAME%%.*}" 119 fi 120 121 create_temp "${remote_server}" 122 copy_files "files" "${remote_server}" "$TEMPDIR" 123 copy_files "files-${HOSTNAME}" "${remote_server}" "$TEMPDIR" 124 remote_script "script" "${remote_server}" "$TEMPDIR" 125 remote_script "script-${HOSTNAME}" "${remote_server}" "$TEMPDIR" 126 delete_temp "${remote_server}" "$TEMPDIR" 127 128 # close socket if persistance is actived 129 if [ "$SSHONCE" -eq 1 ] 130 then 131 ssh $SSH_PARAMS -O exit -N "$1" 132 fi 133 134 unset TEMPDIR HOSTNAME 135 done