SMOLNET PORTAL home about changes
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
Original URLgopher://bitreich.org/0/scm/drist/commit/1ddb1582cfb17a5d...
Content-Typetext/plain; charset=utf-8