summaryrefslogtreecommitdiff
path: root/.local/bin/doasedit
diff options
context:
space:
mode:
Diffstat (limited to '.local/bin/doasedit')
-rwxr-xr-x.local/bin/doasedit47
1 files changed, 47 insertions, 0 deletions
diff --git a/.local/bin/doasedit b/.local/bin/doasedit
new file mode 100755
index 0000000..0d2c9c9
--- /dev/null
+++ b/.local/bin/doasedit
@@ -0,0 +1,47 @@
+#!/bin/sh -e
+
+help() {
+ cat - >&2 <<EOF
+doasedit - like sudoedit, but for doas
+
+doasedit file...
+
+Every argument will be treated as a file to edit. There's no support for
+passing arguments to doas, so you can only doas root.
+
+This script is SECURITY SENSITIVE! Special care has been taken to correctly
+preserve file attributes. Please exercise CAUTION when modifying AND using
+this script.
+EOF
+}
+
+case "$1" in --help|-h) help; exit 0;; esac
+
+export TMPDIR=/dev/shm/
+trap 'trap - EXIT HUP QUIT TERM INT ABRT; rm -f "$tmp" "$tmpcopy"' EXIT HUP QUIT TERM INT ABRT
+
+for file; do
+ case "$file" in -*) file=./"$file" ;; esac
+
+ tmp="$(mktemp)"
+ if [ -f "$file" ] && [ ! -r "$file" ]; then
+ doas cat "$file" > "$tmp"
+ elif [ -r "$file" ]; then
+ cat "$file" > "$tmp"
+ fi
+
+ tmpcopy="$(mktemp)"
+ cat "$tmp" > "$tmpcopy"
+
+ ${EDITOR:-vi} "$tmp"
+
+ if cmp -s "$tmp" "$tmpcopy"; then
+ echo 'File unchanged, exiting...'
+ else
+ doas dd if="$tmp" of="$file"
+ echo 'Done, changes written'
+ fi
+
+ rm "$tmp" "$tmpcopy"
+done
+