diff options
author | Andrew Cady <d@jerkface.net> | 2023-08-23 19:03:48 -0400 |
---|---|---|
committer | Andrew Cady <d@jerkface.net> | 2023-08-23 19:03:48 -0400 |
commit | 5f8d82c9078b3076d7009bd8aa98e10ea3ac70a3 (patch) | |
tree | 965b20e9a0bc9a3cd2a6c45b7c29d8187c7d1ff8 /src/rpc.bash | |
parent | 4f771eac3b737018c44e630d578683abb868846e (diff) |
split up rpc.bash into source-able library
Diffstat (limited to 'src/rpc.bash')
-rw-r--r-- | src/rpc.bash | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/src/rpc.bash b/src/rpc.bash new file mode 100644 index 0000000..91292cd --- /dev/null +++ b/src/rpc.bash | |||
@@ -0,0 +1,100 @@ | |||
1 | |||
2 | intersection() | ||
3 | { | ||
4 | comm -12 "$@" | ||
5 | } | ||
6 | |||
7 | difference() | ||
8 | { | ||
9 | comm -23 "$@" | ||
10 | } | ||
11 | |||
12 | extract_words() | ||
13 | { | ||
14 | grep -o -E '\b\w+\b' | sort -u | ||
15 | } | ||
16 | |||
17 | read_len() | ||
18 | { | ||
19 | [ "$1" -gt 0 ] | ||
20 | REPLY= | ||
21 | read -r -N"$1" | ||
22 | [ "$REPLY" ] | ||
23 | } | ||
24 | |||
25 | read_remote_command() | ||
26 | { | ||
27 | read_len "$1" | ||
28 | shift | ||
29 | remote_command=(bash -c ${REPLY@Q} bash "${@@Q}") | ||
30 | } | ||
31 | |||
32 | remote_run_shell_script_stdin() | ||
33 | { | ||
34 | read_remote_command "$@" | ||
35 | ssh -- "${REMOTE_DEST}" "${remote_command[@]}" | ||
36 | } | ||
37 | |||
38 | remote_run_shell_script_tty() | ||
39 | { | ||
40 | read_remote_command "$@" | ||
41 | ssh -t -- "${REMOTE_DEST}" "${remote_command[@]}" </dev/tty | ||
42 | } | ||
43 | |||
44 | remote_run_shell_script_arg1() | ||
45 | { | ||
46 | script=$1 | ||
47 | shift | ||
48 | set -- "${#script}" "$@" | ||
49 | if test -t 0 && test -t 1 | ||
50 | then | ||
51 | printf '%s' "$script" | remote_run_shell_script_tty "$@" | ||
52 | else | ||
53 | cat <(printf '%s' "$script") - | remote_run_shell_script_stdin "$@" | ||
54 | fi | ||
55 | } | ||
56 | |||
57 | immediate_dependencies1() | ||
58 | { | ||
59 | # Thanks Lri from stackoverflow.com/questions/4471364/ | ||
60 | # how-do-i-list-the-functions-defined-in-my-shell/28278090 | ||
61 | intersection \ | ||
62 | <(compgen -A function | sort -u) \ | ||
63 | <(declare -f "$1" | extract_words) | ||
64 | } | ||
65 | |||
66 | immediate_dependencies() | ||
67 | { | ||
68 | for f | ||
69 | do | ||
70 | immediate_dependencies1 "$f" | ||
71 | done | sort -u | ||
72 | } | ||
73 | |||
74 | recursive_dependencies() | ||
75 | { | ||
76 | resolved=() | ||
77 | while [ $# -gt 0 ] | ||
78 | do | ||
79 | resolved+=("$@") | ||
80 | set -- $(difference <(immediate_dependencies "$@") \ | ||
81 | <(printf '%s\n' "${resolved[@]}" | sort -u)) | ||
82 | done | ||
83 | printf '%s\n' "${resolved[@]}" | ||
84 | } | ||
85 | |||
86 | remote_run_function() | ||
87 | { | ||
88 | main=$1 | ||
89 | shift | ||
90 | funcs=$(recursive_dependencies "$main") | ||
91 | |||
92 | script= | ||
93 | read -N2147483647 -r script < <( | ||
94 | declare -f $funcs | ||
95 | printf '%s "$@";\n' "$main" | ||
96 | ) || [ "$script" ] | ||
97 | |||
98 | remote_run_shell_script_arg1 "$script" "$@" | ||
99 | } | ||
100 | |||