From afe955cbd1dab48cf15a5a9b3f033d47d87720f4 Mon Sep 17 00:00:00 2001 From: Sean Whitton Date: Sat, 25 Jun 2022 15:12:14 -0700 Subject: convert some internal shell snippets to single lines Signed-off-by: Sean Whitton --- src/connection.lisp | 5 +++-- src/connection/shell-wrap.lisp | 22 ++++++++++------------ src/package.lisp | 1 + src/util.lisp | 15 +++++++++++++++ 4 files changed, 29 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/connection.lisp b/src/connection.lisp index 7db2413..b03e33e 100644 --- a/src/connection.lisp +++ b/src/connection.lisp @@ -318,7 +318,8 @@ which will be cleaned up when BODY is finished." ;; ;; While GNU M4 mkstemp makes the temporary file at most readable and ;; writeable by its owner, POSIX doesn't require this, so set a umask. - #?"umask 077 + (sh-script-to-single-line + #?"umask 077 exec 3>&1 if err=\$(if command -v m4 >/dev/null; then echo 'mkstemp(${template})' | m4 2>&1 1>&3 @@ -334,7 +335,7 @@ else ?*) printf >&2 \"%s\\n\" \"$err\" ;; esac exit 1 -fi") +fi")) (defun mktemp (&key (connection *connection*) directory) "Make a temporary file on the remote side, in DIRECTORY, defaulting to /tmp." diff --git a/src/connection/shell-wrap.lisp b/src/connection/shell-wrap.lisp index 51591b8..1200391 100644 --- a/src/connection/shell-wrap.lisp +++ b/src/connection/shell-wrap.lisp @@ -46,18 +46,16 @@ path content mode) - (let ((cmd - (format - nil "set -e -tmpf=$(~A) -trap \"rm -f '$tmpf'\" EXIT HUP KILL TERM INT -chmod ~O \"$tmpf\" -cat >\"$tmpf\" -mv \"$tmpf\" ~A" - (mkstemp-cmd - (merge-pathnames "tmp.XXXXXX" (pathname-directory-pathname path))) - mode - (sh-escape path)))) + (let* ((mkstemp (mkstemp-cmd + (merge-pathnames "tmp.XXXXXX" + (pathname-directory-pathname path)))) + (cmd (sh-script-to-single-line + (format nil "set -e + tmpf=$(~A) + trap \"rm -f '$tmpf'\" EXIT HUP KILL TERM INT + chmod ~O \"$tmpf\" + cat >\"$tmpf\" + mv \"$tmpf\" ~A" mkstemp mode (sh-escape path))))) (multiple-value-bind (out exit) (connection-run conn cmd content) (unless (zerop exit) (error "Failed to write ~A: ~A" path out))))) diff --git a/src/package.lisp b/src/package.lisp index 9f1637f..69b50fb 100644 --- a/src/package.lisp +++ b/src/package.lisp @@ -131,6 +131,7 @@ #:prog-changes #:add-change #:return-changes + #:sh-script-to-single-line #:*consfigurator-debug-level* #:with-indented-inform diff --git a/src/util.lisp b/src/util.lisp index c78005f..cd986d9 100644 --- a/src/util.lisp +++ b/src/util.lisp @@ -432,6 +432,21 @@ expansion as a starting point for your own DEFPACKAGE form for your consfig." ,@body ,result))))) +(defun sh-script-to-single-line (script) + "Attempt to convert a multiline POSIX sh script to a single line. + +The current implementation is naïve, and certainly unsuitable for converting +arbitrary scripts. Thus, this function is presently intended to be used only +on simple scripts embedded in source code, written with newlines for the sake +of maintainability. Converting those scripts to single lines before they are +executed improves Consfigurator's debug output, and also makes process names +visible to remote commands like ps(1) more readable." + (re:regex-replace-all + #?/\s+/ (re:regex-replace-all "(then|else|elif|fi|case|in|;;|do|done);" + (format nil "~{~A~^; ~}" (lines script)) + "\\1") + " ")) + ;;;; Progress & debug printing -- cgit v1.2.3