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