iMajor rework - 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
1commit 1ddb1582cfb17a5d79fd9725907a1b329dacbd6b /scm/drist/commit/1ddb1582cfb17a5d79fd9725907a1b329dacbd6b.gph bitreich.org 70
1parent c6481050031bc54fa99a6fcfa7d3408850040883 /scm/drist/commit/c6481050031bc54fa99a6fcfa7d3408850040883.gph bitreich.org 70
hAuthor: Solene Rapenne <solene@perso.pw> URL:mailto:solene@perso.pw bitreich.org 70
iDate: Wed, 26 Aug 2020 21:13:06 +0200 Err bitreich.org 70
i Err bitreich.org 70
iMajor rework Err bitreich.org 70
i Err bitreich.org 70
iFiles are now copied in a temporary subtree and files must be copied on the Err bitreich.org 70
isystem from the script. This is safer in many ways and result is predictable. Err bitreich.org 70
i Err bitreich.org 70
iDrop "absent" function Err bitreich.org 70
iDrop simulate flag Err bitreich.org 70
i Err bitreich.org 70
iIf previous behavior is prefered, you should stay with previous version Err bitreich.org 70
i Err bitreich.org 70
iDiffstat: Err bitreich.org 70
i M drist | 165 ++++++++++++++++--------------- Err bitreich.org 70
i M drist.1 | 28 +++++++++------------------- Err bitreich.org 70
i Err bitreich.org 70
i2 files changed, 94 insertions(+), 99 deletions(-) Err bitreich.org 70
i--- Err bitreich.org 70
1diff --git a/drist b/drist /scm/drist/file/drist.gph bitreich.org 70
i@@ -1,20 +1,71 @@ Err bitreich.org 70
i #!/bin/sh Err bitreich.org 70
i Err bitreich.org 70
i-SIMULATE=0 Err bitreich.org 70
i SUDO=0 Err bitreich.org 70
i SUDO_BIN=sudo Err bitreich.org 70
i EXEC="" Err bitreich.org 70
i SSHONCE=0 Err bitreich.org 70
i TRUNCATE=0 Err bitreich.org 70
i+TEMPDIR="" Err bitreich.org 70
i Err bitreich.org 70
i usage() { Err bitreich.org 70
i- echo "$0 [-n] [-d] [-s [-e sudo|doas]] server" Err bitreich.org 70
i+ echo "$0 [-n] [-d] [-s [-e sudo|doas]] server [...]" Err bitreich.org 70
i exit 0 Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i+# $1 = directory name Err bitreich.org 70
i+# $2 = remote server Err bitreich.org 70
i+copy_files() { Err bitreich.org 70
i+ # -l = keep symlink / -D = special device Err bitreich.org 70
i+ if [ -d "${1}" ] Err bitreich.org 70
i+ then Err bitreich.org 70
i+ LIST=$(mktemp /tmp/drist-rsync.XXXXXXXXXX) Err bitreich.org 70
i+ if [ -f "$LIST" ] Err bitreich.org 70
i+ then Err bitreich.org 70
i+ printf 'Copying files from "%s" to temporary directory %s:\n' "$1" "$3" Err bitreich.org 70
i+ find "${1}"/ -type f -or -type l | cut -d '/' -f 2- | tee "${LIST}" | sed 's/^/ \//' Err bitreich.org 70
i+ rsync -e "ssh $SSH_PARAMS" -lD --files-from="${LIST}" "${1}/" "${2}":"/${3}" Err bitreich.org 70
i+ rm "$LIST" Err bitreich.org 70
i+ fi Err bitreich.org 70
i+ fi Err bitreich.org 70
i+} Err bitreich.org 70
i+ Err bitreich.org 70
i+# $1 = script filename Err bitreich.org 70
i+# $2 = remote server Err bitreich.org 70
i+# $3 = tempdir Err bitreich.org 70
i+remote_script() { Err bitreich.org 70
i+ if [ -f "${1}" ] Err bitreich.org 70
i+ then Err bitreich.org 70
i+ printf 'Executing file "%s":\n' "$1" Err bitreich.org 70
i+ ssh $SSH_PARAMS "${2}" "cd ${3} && DRIST=${3}/script && Err bitreich.org 70
i+ cat - > \$DRIST && Err bitreich.org 70
i+ chmod u+x \$DRIST && Err bitreich.org 70
i+ ${EXEC} \$DRIST" < "$1" Err bitreich.org 70
i+ fi Err bitreich.org 70
i+} Err bitreich.org 70
i+ Err bitreich.org 70
i+# $1 = remote server Err bitreich.org 70
i+create_temp() { Err bitreich.org 70
i+ TEMPDIR=$(ssh $SSH_PARAMS "$1" "mktemp -d ~/.drist_files_XXXXXXXXXXXXXXX") Err bitreich.org 70
i+ if [ "$TEMPDIR" = "" ]; then Err bitreich.org 70
i+ echo "mktemp error, aborting" Err bitreich.org 70
i+ fi Err bitreich.org 70
i+} Err bitreich.org 70
i+ Err bitreich.org 70
i+# $1 = remote server Err bitreich.org 70
i+# $2 = temporary directory Err bitreich.org 70
i+delete_temp() { Err bitreich.org 70
i+ if echo "${2}" | grep drist_files_ >/dev/null ; then Err bitreich.org 70
i+ ssh $SSH_PARAMS "$1" "rm -fr ${2}" Err bitreich.org 70
i+ else Err bitreich.org 70
i+ echo "Problem, TEMPDIR was reset during execution, current value is = $2" Err bitreich.org 70
i+ exit 2 Err bitreich.org 70
i+ fi Err bitreich.org 70
i+} Err bitreich.org 70
i+ Err bitreich.org 70
i+ Err bitreich.org 70
i+# RUNTIME BEGINS HERE Err bitreich.org 70
i while getopts pndse: arg; do Err bitreich.org 70
i case ${arg} in Err bitreich.org 70
i- n) SIMULATE=1 ;; Err bitreich.org 70
i d) TRUNCATE=1 ;; Err bitreich.org 70
i s) SUDO=1 ;; Err bitreich.org 70
i e) SUDO_BIN="${OPTARG}" ;; Err bitreich.org 70
i@@ -36,93 +87,47 @@ then Err bitreich.org 70
i SSH_PARAMS=-o"ControlMaster=auto"" "-o"ControlPath=/tmp/drist_ssh_%h_%p_%r.sock"" "-o"ControlPersist=1m" Err bitreich.org 70
i fi Err bitreich.org 70
i Err bitreich.org 70
i-# check if host exists Err bitreich.org 70
i-if [ "$#" -ne 1 ]; then Err bitreich.org 70
i- usage Err bitreich.org 70
i+# start looping over server list Err bitreich.org 70
i+if [ -f "$1" ] Err bitreich.org 70
i+then Err bitreich.org 70
i+ SERVER_LIST="$(cat $1 | tr '\n' ' ')" Err bitreich.org 70
i else Err bitreich.org 70
i- HOSTNAME=$(ssh $SSH_PARAMS "$1" "${EXEC} uname -n") Err bitreich.org 70
i+ SERVER_LIST="$@" Err bitreich.org 70
i+fi Err bitreich.org 70
i+ Err bitreich.org 70
i+if [ "${SERVER_LIST}" = "" ] Err bitreich.org 70
i+then Err bitreich.org 70
i+ echo "No server specified" Err bitreich.org 70
i+ exit 1 Err bitreich.org 70
i+fi Err bitreich.org 70
i+ Err bitreich.org 70
i+for remote_server in ${SERVER_LIST} Err bitreich.org 70
i+do Err bitreich.org 70
i+ echo "Running on ${remote_server}" Err bitreich.org 70
i+ Err bitreich.org 70
i+ # check if host exists Err bitreich.org 70
i+ HOSTNAME=$(ssh $SSH_PARAMS "${remote_server}" "${EXEC} uname -n") Err bitreich.org 70
i if [ "$?" -ne 0 ]; then Err bitreich.org 70
i- echo "Error while ssh ${1}" Err bitreich.org 70
i+ echo "Error while ssh ${remote_server}" Err bitreich.org 70
i exit 2 Err bitreich.org 70
i fi Err bitreich.org 70
i Err bitreich.org 70
i if [ "$TRUNCATE" -eq 1 ]; then Err bitreich.org 70
i HOSTNAME="${HOSTNAME%%.*}" Err bitreich.org 70
i fi Err bitreich.org 70
i-fi Err bitreich.org 70
i- Err bitreich.org 70
i-# $1 = directory name Err bitreich.org 70
i-# $2 = remote server Err bitreich.org 70
i-copy_files() { Err bitreich.org 70
i- # -l = keep symlink / -D = special device Err bitreich.org 70
i- if [ -d "${1}" ] Err bitreich.org 70
i- then Err bitreich.org 70
i- LIST=$(mktemp /tmp/drist-rsync.XXXXXXXXXX) Err bitreich.org 70
i- if [ -f "$LIST" ] Err bitreich.org 70
i- then Err bitreich.org 70
i- printf 'Copying files from folder "%s":\n' "$1" Err bitreich.org 70
i- find "${1}"/ -type f -or -type l | cut -d '/' -f 2- | tee "${LIST}" | sed 's/^/ \//' Err bitreich.org 70
i- if [ "$SIMULATE" -ne 1 ] Err bitreich.org 70
i- then Err bitreich.org 70
i- rsync -e "ssh $SSH_PARAMS" --rsync-path="${EXEC} rsync" -lDp --files-from="${LIST}" "${1}/" "${2}":/ Err bitreich.org 70
i- fi Err bitreich.org 70
i- rm "$LIST" Err bitreich.org 70
i- fi Err bitreich.org 70
i- fi Err bitreich.org 70
i-} Err bitreich.org 70
i Err bitreich.org 70
i-# $1 = script filename Err bitreich.org 70
i-# $2 = remote server Err bitreich.org 70
i-remote_script() { Err bitreich.org 70
i- if [ -f "${1}" ] Err bitreich.org 70
i- then Err bitreich.org 70
i- printf 'Executing file "%s":\n' "$1" Err bitreich.org 70
i- if [ "$SIMULATE" -ne 1 ] Err bitreich.org 70
i- then Err bitreich.org 70
i- dr="$(mktemp ./drist.XXXXXXXXXXXX)" Err bitreich.org 70
i- ssh $SSH_PARAMS "${2}" "DRIST=${dr} && Err bitreich.org 70
i- cat - > \$DRIST && Err bitreich.org 70
i- chmod u+x \$DRIST && Err bitreich.org 70
i- ${EXEC} \$DRIST ; Err bitreich.org 70
i- rm \$DRIST" < "$1" Err bitreich.org 70
i- rm "$dr" Err bitreich.org 70
i- fi Err bitreich.org 70
i- fi Err bitreich.org 70
i-} Err bitreich.org 70
i+ create_temp "${remote_server}" Err bitreich.org 70
i+ copy_files "files" "${remote_server}" "$TEMPDIR" Err bitreich.org 70
i+ copy_files "files-${HOSTNAME}" "${remote_server}" "$TEMPDIR" Err bitreich.org 70
i+ remote_script "script" "${remote_server}" "$TEMPDIR" Err bitreich.org 70
i+ remote_script "script-${HOSTNAME}" "${remote_server}" "$TEMPDIR" Err bitreich.org 70
i+ delete_temp "${remote_server}" "$TEMPDIR" Err bitreich.org 70
i Err bitreich.org 70
i-# $1 = directory name Err bitreich.org 70
i-# $2 = remote server Err bitreich.org 70
i-delete_files() { Err bitreich.org 70
i- if [ -d "${1}" ] Err bitreich.org 70
i+ # close socket if persistance is actived Err bitreich.org 70
i+ if [ "$SSHONCE" -eq 1 ] Err bitreich.org 70
i then Err bitreich.org 70
i- LIST=$(mktemp /tmp/drist-rsync.XXXXXXXXXX) Err bitreich.org 70
i- if [ -f "$LIST" ] Err bitreich.org 70
i- then Err bitreich.org 70
i- printf 'Removing files from folder "%s":\n' "$1" Err bitreich.org 70
i- find "$1" -type f | sed 's/"/\\&/' | \ Err bitreich.org 70
i- awk -v path="${1}" '{ printf "\"%s\" ",substr($0,length(path)+1)}' | \ Err bitreich.org 70
i- tee "${LIST}" | sed 's/^/ /' Err bitreich.org 70
i- printf '\n' # add a new line Err bitreich.org 70
i- Err bitreich.org 70
i- if [ "$SIMULATE" -ne 1 ] Err bitreich.org 70
i- then Err bitreich.org 70
i- test -s "$LIST" && ssh $SSH_PARAMS "$2" "${EXEC} rm $(cat $LIST)" Err bitreich.org 70
i- fi Err bitreich.org 70
i- rm $LIST Err bitreich.org 70
i- fi Err bitreich.org 70
i+ ssh $SSH_PARAMS -O exit -N "$1" Err bitreich.org 70
i fi Err bitreich.org 70
i-} Err bitreich.org 70
i- Err bitreich.org 70
i- Err bitreich.org 70
i-copy_files "files" "$1" Err bitreich.org 70
i-copy_files "files-${HOSTNAME}" "$1" Err bitreich.org 70
i-delete_files "absent" "$1" Err bitreich.org 70
i-delete_files "absent-${HOSTNAME}" "$1" Err bitreich.org 70
i-remote_script "script" "$1" Err bitreich.org 70
i-remote_script "script-${HOSTNAME}" "$1" Err bitreich.org 70
i Err bitreich.org 70
i-# close socket if persistance is actived Err bitreich.org 70
i-if [ "$SSHONCE" -eq 1 ] Err bitreich.org 70
i-then Err bitreich.org 70
i- ssh $SSH_PARAMS -O exit -N "$1" Err bitreich.org 70
i-fi Err bitreich.org 70
i+ unset TEMPDIR HOSTNAME Err bitreich.org 70
i+done Err bitreich.org 70
1diff --git a/drist.1 b/drist.1 /scm/drist/file/drist.1.gph bitreich.org 70
i@@ -10,7 +10,7 @@ Err bitreich.org 70
i .Op Fl n Err bitreich.org 70
i .Op Fl d Err bitreich.org 70
i .Op Fl s Op Fl e Ar sudo|doas Err bitreich.org 70
i-.Ar server Err bitreich.org 70
i+.Ar server ... Err bitreich.org 70
i .Sh OPTIONS Err bitreich.org 70
i .Op Fl p Err bitreich.org 70
i to use persistent ssh connection, allowing to ssh only once Err bitreich.org 70
i@@ -59,41 +59,33 @@ by calling Err bitreich.org 70
i After that following steps will be executed: Err bitreich.org 70
i .Bl -enum -offset indent -compact Err bitreich.org 70
i .It Err bitreich.org 70
i-If folder Err bitreich.org 70
i+If directory Err bitreich.org 70
i .Ar files Err bitreich.org 70
i exists, its content is copied to Err bitreich.org 70
i .Ar server Err bitreich.org 70
i using Err bitreich.org 70
i-.Xr rsync 1 . Err bitreich.org 70
i+.Xr rsync 1 Err bitreich.org 70
i+in a temporary directory in ~/.drist_files_XXXXXXXX Err bitreich.org 70
i .It Err bitreich.org 70
i-If folder Err bitreich.org 70
i+If directory Err bitreich.org 70
i .Ar files- Ns Em HOSTNAME Err bitreich.org 70
i exists, its content is copied to Err bitreich.org 70
i .Ar server Err bitreich.org 70
i using Err bitreich.org 70
i-.Xr rsync 1 . Err bitreich.org 70
i-.It Err bitreich.org 70
i-If folder Err bitreich.org 70
i-.Ar absent Err bitreich.org 70
i-exists, filenames in it are deleted on Err bitreich.org 70
i-.Ar server . Err bitreich.org 70
i-.It Err bitreich.org 70
i-If folder Err bitreich.org 70
i-.Ar absent- Ns Em HOSTNAME Err bitreich.org 70
i-exists, filenames in it are deleted on Err bitreich.org 70
i-.Ar server . Err bitreich.org 70
i+.Xr rsync 1 Err bitreich.org 70
i+in a temporary directory in ~/.drist_files_XXXXXXXX . Err bitreich.org 70
i .It Err bitreich.org 70
i If file Err bitreich.org 70
i .Ar script Err bitreich.org 70
i exists, it is copied to Err bitreich.org 70
i .Ar server Err bitreich.org 70
i-and executed there. Err bitreich.org 70
i+and executed from the temporary directory. Err bitreich.org 70
i .It Err bitreich.org 70
i If file Err bitreich.org 70
i .Ar script- Ns Em HOSTNAME Err bitreich.org 70
i exists, it is copied to Err bitreich.org 70
i .Ar server Err bitreich.org 70
i-and executed there. Err bitreich.org 70
i+and executed from the temporary directory. Err bitreich.org 70
i .El Err bitreich.org 70
i .Pp Err bitreich.org 70
i The presence of each of those files or directories is optional. Err bitreich.org 70
i@@ -101,8 +93,6 @@ The presence of each of those files or directories is optional. Err bitreich.org 70
i All files in either Err bitreich.org 70
i .Ar files Err bitreich.org 70
i or Err bitreich.org 70
i-.Ar absent Err bitreich.org 70
i-or Err bitreich.org 70
i .Ar files- Ns Em HOSTNAME Err bitreich.org 70
i etc. are relative to the root (/) directory. Err bitreich.org 70
i The specific files for Err bitreich.org 70
.
Response:
text/plain