summaryrefslogtreecommitdiff
path: root/src/rpc.bash
diff options
context:
space:
mode:
authorAndrew Cady <d@jerkface.net>2023-08-23 19:03:48 -0400
committerAndrew Cady <d@jerkface.net>2023-08-23 19:03:48 -0400
commit5f8d82c9078b3076d7009bd8aa98e10ea3ac70a3 (patch)
tree965b20e9a0bc9a3cd2a6c45b7c29d8187c7d1ff8 /src/rpc.bash
parent4f771eac3b737018c44e630d578683abb868846e (diff)
split up rpc.bash into source-able library
Diffstat (limited to 'src/rpc.bash')
-rw-r--r--src/rpc.bash100
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
2intersection()
3{
4 comm -12 "$@"
5}
6
7difference()
8{
9 comm -23 "$@"
10}
11
12extract_words()
13{
14 grep -o -E '\b\w+\b' | sort -u
15}
16
17read_len()
18{
19 [ "$1" -gt 0 ]
20 REPLY=
21 read -r -N"$1"
22 [ "$REPLY" ]
23}
24
25read_remote_command()
26{
27 read_len "$1"
28 shift
29 remote_command=(bash -c ${REPLY@Q} bash "${@@Q}")
30}
31
32remote_run_shell_script_stdin()
33{
34 read_remote_command "$@"
35 ssh -- "${REMOTE_DEST}" "${remote_command[@]}"
36}
37
38remote_run_shell_script_tty()
39{
40 read_remote_command "$@"
41 ssh -t -- "${REMOTE_DEST}" "${remote_command[@]}" </dev/tty
42}
43
44remote_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
57immediate_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
66immediate_dependencies()
67{
68 for f
69 do
70 immediate_dependencies1 "$f"
71 done | sort -u
72}
73
74recursive_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
86remote_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