Blame


1 138e225e 2025-06-04 xs # ISC License
2 138e225e 2025-06-04 xs #
3 138e225e 2025-06-04 xs # Copyright 2025 xs <xs@inda.re>
4 138e225e 2025-06-04 xs #
5 138e225e 2025-06-04 xs # Permission to use, copy, modify, and/or distribute this software for any
6 138e225e 2025-06-04 xs # purpose with or without fee is hereby granted, provided that the above
7 138e225e 2025-06-04 xs # copyright notice and this permission notice appear in all copies.
8 138e225e 2025-06-04 xs #
9 138e225e 2025-06-04 xs # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
10 138e225e 2025-06-04 xs # REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
11 138e225e 2025-06-04 xs # FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
12 138e225e 2025-06-04 xs # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13 138e225e 2025-06-04 xs # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
14 138e225e 2025-06-04 xs # OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15 138e225e 2025-06-04 xs # PERFORMANCE OF THIS SOFTWARE.
16 46924c01 2025-05-28 xs .POSIX:
17 03d8f521 2025-05-27 xs PREFIX:=/usr/local
18 730e151b 2025-06-02 xs SHELLS=ksh93 ksh yash sh
19 8e44e3d4 2025-06-25 xs UTILITY_VERSION=0.2.0
20 46924c01 2025-05-28 xs UTILITY=$(PWD)/r7
21 58f9c509 2025-06-04 xs # To use the test suite, please edit or use environment for SSH parameters
22 58f9c509 2025-06-04 xs # SSH_ID=/path/to/.ssh/id_ed25519
23 58f9c509 2025-06-04 xs # SSH_TEST_NODES=nodeA nodeB
24 8e44e3d4 2025-06-25 xs .DEFAULT: all all: tests
25 46924c01 2025-05-28 xs
26 688c9bfd 2025-06-03 xs release: r7.1
27 138e225e 2025-06-04 xs make tests
28 f976c0b3 2025-06-05 xs whoami
29 688c9bfd 2025-06-03 xs rm -fr _release/r7-$(UTILITY_VERSION)
30 688c9bfd 2025-06-03 xs mkdir -p _release/r7-$(UTILITY_VERSION)
31 8a9cbf90 2025-06-04 xs cp LICENSE r7 r7.1 Makefile README.md _release/r7-$(UTILITY_VERSION)
32 35f45d45 2025-06-04 xs cp -r groups/ _release/r7-$(UTILITY_VERSION)
33 688c9bfd 2025-06-03 xs cd _release && tar cfv r7-$(UTILITY_VERSION).tar r7-$(UTILITY_VERSION)
34 688c9bfd 2025-06-03 xs gzip -9 _release/r7-$(UTILITY_VERSION).tar
35 688c9bfd 2025-06-03 xs cp _release/r7-$(UTILITY_VERSION).tar.gz _release/r7-latest.tar.gz
36 688c9bfd 2025-06-03 xs
37 688c9bfd 2025-06-03 xs html: index.md documentation.html
38 861dd1d4 2025-05-31 xs pandoc --template=./r7doc.html \
39 688c9bfd 2025-06-03 xs -s --toc=false \
40 861dd1d4 2025-05-31 xs --metadata title='R7' \
41 861dd1d4 2025-05-31 xs --from markdown+smart \
42 861dd1d4 2025-05-31 xs -t html -o index.html index.md
43 861dd1d4 2025-05-31 xs
44 730e151b 2025-06-02 xs documentation.html: README.md ./r7
45 861dd1d4 2025-05-31 xs pandoc --template=./r7doc.html \
46 861dd1d4 2025-05-31 xs -s --toc=true \
47 861dd1d4 2025-05-31 xs --metadata title='R7 Documentation' \
48 138e225e 2025-06-04 xs --metadata date="Tue Jun 3 2025" \
49 861dd1d4 2025-05-31 xs --from markdown+smart \
50 861dd1d4 2025-05-31 xs -t html -o documentation.html README.md
51 861dd1d4 2025-05-31 xs
52 4b968d3f 2025-06-04 xs r7.1: README.md r7 Makefile
53 730e151b 2025-06-02 xs pandoc --from markdown+smart \
54 138e225e 2025-06-04 xs --metadata section=1 \
55 138e225e 2025-06-04 xs --metadata title="R7" \
56 138e225e 2025-06-04 xs --metadata header="User Manual" \
57 138e225e 2025-06-04 xs --metadata date="Tue Jun 3 2025" \
58 138e225e 2025-06-04 xs --metadata footer="v$(UTILITY_VERSION)" \
59 688c9bfd 2025-06-03 xs -s -t man -o r7.1 README.md
60 730e151b 2025-06-02 xs
61 730e151b 2025-06-02 xs r7.1.pdf: README.md
62 730e151b 2025-06-02 xs pandoc --from markdown+smart \
63 688c9bfd 2025-06-03 xs -s -t pdf -o r7.1.pdf README.md
64 730e151b 2025-06-02 xs
65 03d8f521 2025-05-27 xs install:
66 03d8f521 2025-05-27 xs cp ./r7 $(PREFIX)/bin/
67 03d8f521 2025-05-27 xs chmod 755 $(PREFIX)/bin/r7
68 688c9bfd 2025-06-03 xs cp ./r7.1 $(PREFIX)/man/man1/
69 688c9bfd 2025-06-03 xs chmod 644 $(PREFIX)/man/man1/r7.1
70 46924c01 2025-05-28 xs
71 46924c01 2025-05-28 xs # Test suite for r7
72 46924c01 2025-05-28 xs R=${SHELL} ${UTILITY}
73 46924c01 2025-05-28 xs test_arguments: usage version debug
74 2ae3e68f 2025-06-07 xs test_workdirs: workdir3-init \
75 46924c01 2025-05-28 xs workdir0-arguments \
76 46924c01 2025-05-28 xs workdir0-digraph \
77 46924c01 2025-05-28 xs workdir1-init \
78 730e151b 2025-06-02 xs workdir1-populate \
79 730e151b 2025-06-02 xs workdir2-init \
80 730e151b 2025-06-02 xs workdir2-ssh \
81 730e151b 2025-06-02 xs workdir2-grouplib \
82 730e151b 2025-06-02 xs workdir2-goodby \
83 730e151b 2025-06-02 xs workdir2-r7doc \
84 730e151b 2025-06-02 xs workdir2-source \
85 730e151b 2025-06-02 xs workdir2-importer
86 46924c01 2025-05-28 xs
87 46924c01 2025-05-28 xs tests:
88 46924c01 2025-05-28 xs @echo
89 46924c01 2025-05-28 xs make test_arguments
90 46924c01 2025-05-28 xs make test_workdirs
91 46924c01 2025-05-28 xs @echo == ALL TESTS PASSED
92 46924c01 2025-05-28 xs
93 46924c01 2025-05-28 xs poly:
94 46924c01 2025-05-28 xs @for shell in ${SHELLS}; do \
95 46924c01 2025-05-28 xs ashell=$$(command -v $$shell || true); \
96 46924c01 2025-05-28 xs if test -x "$$ashell"; then \
97 35f45d45 2025-06-04 xs if time make tests SHELL=$$ashell SH=$$ashell; then \
98 46924c01 2025-05-28 xs : \
99 46924c01 2025-05-28 xs else \
100 46924c01 2025-05-28 xs failed="$$(basename "$$ashell") $$failed"; \
101 46924c01 2025-05-28 xs fi; \
102 46924c01 2025-05-28 xs else \
103 35f45d45 2025-06-04 xs notfound="$$shell $$notfound"; \
104 46924c01 2025-05-28 xs fi; \
105 46924c01 2025-05-28 xs done; \
106 46924c01 2025-05-28 xs echo; \
107 46924c01 2025-05-28 xs echo "== POLY TESTS RESULTS"; \
108 46924c01 2025-05-28 xs echo " spec: $(SHELLS)"; \
109 46924c01 2025-05-28 xs echo "not-found: $$notfound"; \
110 46924c01 2025-05-28 xs echo " failed: $$failed"; \
111 46924c01 2025-05-28 xs test -z "$$failed" -a -z "$$notfound" || (echo; false;)
112 46924c01 2025-05-28 xs
113 46924c01 2025-05-28 xs usage:
114 730e151b 2025-06-02 xs @echo _________________________________________________________
115 2ae3e68f 2025-06-07 xs @echo USAGE
116 2ae3e68f 2025-06-07 xs @echo _________________________________________________________
117 730e151b 2025-06-02 xs $R -h
118 46924c01 2025-05-28 xs $R -h 2>&1 | grep -q -e usage: -e '\['
119 730e151b 2025-06-02 xs @echo _________________________________________________________
120 46924c01 2025-05-28 xs
121 46924c01 2025-05-28 xs version:
122 730e151b 2025-06-02 xs @echo _________________________________________________________
123 2ae3e68f 2025-06-07 xs @echo VERSION
124 2ae3e68f 2025-06-07 xs @echo _________________________________________________________
125 46924c01 2025-05-28 xs $R -h 2>&1 | grep -q -e "$(UTILITY_VERSION)"
126 730e151b 2025-06-02 xs @echo _________________________________________________________
127 46924c01 2025-05-28 xs
128 46924c01 2025-05-28 xs debug:
129 730e151b 2025-06-02 xs @echo _________________________________________________________
130 2ae3e68f 2025-06-07 xs @echo DEBUG
131 2ae3e68f 2025-06-07 xs @echo _________________________________________________________
132 46924c01 2025-05-28 xs $R -dn 2>&1 run-config | grep -q "R7 DEBUG $(UTILITY_VERSION)"
133 730e151b 2025-06-02 xs @echo _________________________________________________________
134 46924c01 2025-05-28 xs
135 46924c01 2025-05-28 xs workdir0-arguments:
136 730e151b 2025-06-02 xs @echo _________________________________________________________
137 46924c01 2025-05-28 xs rm -fr testdir/workdir0/_run
138 730e151b 2025-06-02 xs $R -w testdir/workdir0 -dn run-config 2>&1 | tee testdir/wd01.produced
139 730e151b 2025-06-02 xs grep -q -e '^LOADING $(PWD)/testdir/workdir0/site-config' testdir/wd01.produced
140 730e151b 2025-06-02 xs grep -q -e '^PROCESSING GROUP common' testdir/wd01.produced
141 730e151b 2025-06-02 xs grep -q -e '^PROCESSING GROUP test0' testdir/wd01.produced
142 730e151b 2025-06-02 xs @echo _________________________________________________________
143 46924c01 2025-05-28 xs
144 46924c01 2025-05-28 xs workdir0-digraph:
145 730e151b 2025-06-02 xs @echo _________________________________________________________
146 46924c01 2025-05-28 xs $R -w testdir/workdir0 -dn digraph-host 2>/dev/null | \
147 46924c01 2025-05-28 xs tee testdir/wd01.dot.produced
148 46924c01 2025-05-28 xs cmp testdir/wd01.dot testdir/wd01.dot.produced
149 730e151b 2025-06-02 xs @echo _________________________________________________________
150 46924c01 2025-05-28 xs
151 46924c01 2025-05-28 xs workdir1-init:
152 730e151b 2025-06-02 xs @echo _________________________________________________________
153 46924c01 2025-05-28 xs rm -fr testdir/workdir1
154 46924c01 2025-05-28 xs $R -dw testdir/workdir1 init
155 46924c01 2025-05-28 xs test -d testdir/workdir1
156 46924c01 2025-05-28 xs find testdir/workdir1 | tee testdir/wd1-init-find.produced
157 46924c01 2025-05-28 xs cmp testdir/wd1-init-find testdir/wd1-init-find.produced
158 730e151b 2025-06-02 xs @echo _________________________________________________________
159 46924c01 2025-05-28 xs
160 46924c01 2025-05-28 xs workdir1-populate: workdir1-init
161 730e151b 2025-06-02 xs @echo _________________________________________________________
162 730e151b 2025-06-02 xs { cd testdir/workdir1 && \
163 730e151b 2025-06-02 xs $R && \
164 46924c01 2025-05-28 xs $R run-config && \
165 46924c01 2025-05-28 xs $R output-dump && \
166 46924c01 2025-05-28 xs $R output && \
167 0e2a1ba1 2025-05-29 xs $R group && \
168 730e151b 2025-06-02 xs $R -s group ;} | wc -c | grep -q 0
169 730e151b 2025-06-02 xs @echo _________________________________________________________
170 730e151b 2025-06-02 xs
171 730e151b 2025-06-02 xs workdir2-init:
172 730e151b 2025-06-02 xs @echo _________________________________________________________
173 730e151b 2025-06-02 xs rm -fr testdir/workdir2
174 730e151b 2025-06-02 xs $R -dw testdir/workdir2 init
175 730e151b 2025-06-02 xs test -d testdir/workdir2
176 730e151b 2025-06-02 xs cd testdir/workdir2 && $R | wc -c | grep -q 0
177 730e151b 2025-06-02 xs cd testdir/workdir2 && \
178 730e151b 2025-06-02 xs cp "$(SSH_ID)" .ssh/id_ed25519_r7 && \
179 730e151b 2025-06-02 xs cp "$(SSH_ID).pub" .ssh/id_ed25519_r7.pub && \
180 730e151b 2025-06-02 xs . $(UTILITY) && for node in $(SSH_TEST_NODES); do \
181 730e151b 2025-06-02 xs mkdir "nodes/$$node" && \
182 730e151b 2025-06-02 xs ssh_accept_new "$$node"; \
183 730e151b 2025-06-02 xs done;
184 730e151b 2025-06-02 xs @echo _________________________________________________________
185 730e151b 2025-06-02 xs
186 730e151b 2025-06-02 xs workdir2-ssh: workdir2-init
187 730e151b 2025-06-02 xs @echo _________________________________________________________
188 730e151b 2025-06-02 xs cd testdir/workdir2 && . $(UTILITY) && \
189 730e151b 2025-06-02 xs cat site-config && \
190 730e151b 2025-06-02 xs echo 'state_hello() { echo Hi! ; }' > groups/common && \
191 730e151b 2025-06-02 xs echo 'state_hello() { echo Hey! ; }' > groups/heyo && \
192 730e151b 2025-06-02 xs echo 'dummy_hello() { echo Heyo! ; }' >> groups/heyo && \
193 730e151b 2025-06-02 xs echo 'group heyo $(SSH_TEST_NODES)' >> site-config && export R7_DEBUG=yes && \
194 8e44e3d4 2025-06-25 xs . $(UTILITY) && \
195 8e44e3d4 2025-06-25 xs prefix install state doc dummy && \
196 730e151b 2025-06-02 xs digraph_host && \
197 8e44e3d4 2025-06-25 xs run_config && \
198 730e151b 2025-06-02 xs output_dump && \
199 730e151b 2025-06-02 xs output | grep Hey! && \
200 730e151b 2025-06-02 xs output && \
201 730e151b 2025-06-02 xs info && \
202 730e151b 2025-06-02 xs digraph_ssh_id_hosts && \
203 730e151b 2025-06-02 xs ssh_known_hosts && \
204 730e151b 2025-06-02 xs nodes && \
205 730e151b 2025-06-02 xs prefix dummy && group heyo '.*' && output_dump && \
206 730e151b 2025-06-02 xs output | grep Heyo! && \
207 8fe13599 2025-06-05 xs group_functions_all && \
208 730e151b 2025-06-02 xs trace_id_last && \
209 730e151b 2025-06-02 xs output_duration | grep 0 && \
210 730e151b 2025-06-02 xs output_status && \
211 730e151b 2025-06-02 xs summary && \
212 730e151b 2025-06-02 xs output_errors && \
213 730e151b 2025-06-02 xs output_permissions && \
214 730e151b 2025-06-02 xs output_diffs
215 730e151b 2025-06-02 xs @echo _________________________________________________________
216 730e151b 2025-06-02 xs
217 730e151b 2025-06-02 xs workdir2-grouplib: workdir2-init
218 730e151b 2025-06-02 xs @echo _________________________________________________________
219 730e151b 2025-06-02 xs cp testdir/grouplib testdir/workdir2/groups/
220 730e151b 2025-06-02 xs mkdir -p testdir/workdir2/groups/grouplib.dir/subdir
221 730e151b 2025-06-02 xs touch testdir/workdir2/groups/grouplib.dir/item
222 730e151b 2025-06-02 xs echo 'aaa' > testdir/workdir2/groups/grouplib.dir/subdir/subitem
223 730e151b 2025-06-02 xs echo 'bbb' > testdir/workdir2/groups/grouplib.dir/subdir/subitem2
224 730e151b 2025-06-02 xs cp testdir/testfile2 testdir/workdir2/groups/grouplib.dir/
225 35f45d45 2025-06-04 xs cd testdir/workdir2 && set -e && . $(UTILITY) && \
226 730e151b 2025-06-02 xs echo 'prefix grouplib' > site-config && \
227 730e151b 2025-06-02 xs echo "group grouplib '.*'" >> site-config && \
228 f6bdfddc 2025-06-03 xs $R run-config && $R output-dump && $R info && \
229 730e151b 2025-06-02 xs for node in $(SSH_TEST_NODES); do \
230 730e151b 2025-06-02 xs ssh "$$node" ls -la /tmp/item\* | grep item; \
231 730e151b 2025-06-02 xs ssh "$$node" ls -la /tmp/r7/my-empty-file | grep empty | grep -e '-rw-r-----' ; \
232 730e151b 2025-06-02 xs ssh "$$node" ls -la /tmp/newdir/newdir2/null | grep -e '-rw-r-----' ; \
233 f6bdfddc 2025-06-03 xs done && $R output tools0 grouplib
234 730e151b 2025-06-02 xs @echo _________________________________________________________
235 730e151b 2025-06-02 xs
236 730e151b 2025-06-02 xs workdir2-goodby: workdir2-grouplib
237 730e151b 2025-06-02 xs @echo _________________________________________________________
238 730e151b 2025-06-02 xs cd testdir/workdir2 && \
239 730e151b 2025-06-02 xs rm -fr _output && \
240 730e151b 2025-06-02 xs $R -P grouplib -se group grouplib $(SSH_TEST_NODES)
241 730e151b 2025-06-02 xs @echo _________________________________________________________
242 730e151b 2025-06-02 xs
243 730e151b 2025-06-02 xs workdir2-r7doc: workdir2-init
244 730e151b 2025-06-02 xs @echo _________________________________________________________
245 730e151b 2025-06-02 xs rm -fr testdir/workdir2/_output
246 730e151b 2025-06-02 xs cp testdir/example1 testdir/workdir2/groups/
247 730e151b 2025-06-02 xs cd testdir/workdir2/ && $R -a group example1 $(SSH_TEST_NODES)
248 730e151b 2025-06-02 xs cd testdir/workdir2/ && $R -ea group example1 $(SSH_TEST_NODES)
249 730e151b 2025-06-02 xs rm -fr testdir/workdir2/_output
250 730e151b 2025-06-02 xs cp testdir/example2 testdir/workdir2/groups/
251 730e151b 2025-06-02 xs cd testdir/workdir2/ && $R -sea group example2 $(SSH_TEST_NODES)
252 730e151b 2025-06-02 xs @echo _________________________________________________________
253 730e151b 2025-06-02 xs
254 730e151b 2025-06-02 xs workdir2-source: workdir2-init
255 730e151b 2025-06-02 xs @echo _________________________________________________________
256 730e151b 2025-06-02 xs rm -fr testdir/workdir2/_output
257 730e151b 2025-06-02 xs rm -fr testdir/workdir2/_run
258 730e151b 2025-06-02 xs cp testdir/source testdir/workdir2/groups/
259 730e151b 2025-06-02 xs mkdir testdir/workdir2/groups/source.dir
260 730e151b 2025-06-02 xs for node in $(SSH_TEST_NODES); do \
261 730e151b 2025-06-02 xs echo myvar=3333 > "testdir/workdir2/nodes/$$node/my-source" ; \
262 730e151b 2025-06-02 xs done
263 730e151b 2025-06-02 xs cd testdir/workdir2/ && $R -sea group source $(SSH_TEST_NODES)
264 730e151b 2025-06-02 xs sleep 1
265 730e151b 2025-06-02 xs cd testdir/workdir2/ && $R -sda group source $(SSH_TEST_NODES)
266 730e151b 2025-06-02 xs cd testdir/workdir2/ && $R output \* source source_nodesource2 | grep 3333
267 8fe13599 2025-06-05 xs cd testdir/workdir2/ && . $(UTILITY) && group_functions_all
268 730e151b 2025-06-02 xs @echo _________________________________________________________
269 730e151b 2025-06-02 xs
270 730e151b 2025-06-02 xs workdir2-importer: workdir2-init
271 730e151b 2025-06-02 xs @echo _________________________________________________________
272 730e151b 2025-06-02 xs rm -fr testdir/workdir2/_output
273 730e151b 2025-06-02 xs rm -fr testdir/workdir2/_run
274 730e151b 2025-06-02 xs cd testdir/workdir2/ && \
275 730e151b 2025-06-02 xs for node in $(SSH_TEST_NODES); do \
276 730e151b 2025-06-02 xs . $(UTILITY) && import "$$node"; \
277 730e151b 2025-06-02 xs done
278 6e564797 2025-06-06 xs cd testdir/workdir2/ && . $(UTILITY) && import notfound || :
279 8e44e3d4 2025-06-25 xs find testdir/workdir2/nodes | grep hosts
280 730e151b 2025-06-02 xs find testdir/workdir2/nodes
281 730e151b 2025-06-02 xs @echo _________________________________________________________
282 2ae3e68f 2025-06-07 xs
283 2ae3e68f 2025-06-07 xs workdir3-init:
284 2ae3e68f 2025-06-07 xs @echo _________________________________________________________
285 2ae3e68f 2025-06-07 xs @echo WORKDIR3-INIT
286 2ae3e68f 2025-06-07 xs @echo _________________________________________________________
287 2ae3e68f 2025-06-07 xs rm -fr testdir/workdir3
288 2ae3e68f 2025-06-07 xs $R -dw testdir/workdir3 init
289 2ae3e68f 2025-06-07 xs test -d testdir/workdir3
290 2ae3e68f 2025-06-07 xs cd testdir/workdir3 && $R | wc -c | grep -q 0
291 2ae3e68f 2025-06-07 xs cd testdir/workdir3 && \
292 8e44e3d4 2025-06-25 xs cp .ssh/config .sshtmp && \
293 8e44e3d4 2025-06-25 xs echo 'Host test-haiku-b5' > .ssh/config && \
294 8e44e3d4 2025-06-25 xs echo ' User user' >> .ssh/config && \
295 8e44e3d4 2025-06-25 xs echo >>.ssh/.config && \
296 8e44e3d4 2025-06-25 xs cat .sshtmp >>.ssh/config && \
297 8e44e3d4 2025-06-25 xs sleep 1 && \
298 8e44e3d4 2025-06-25 xs cp -p "$(SSH_ID)" .ssh/id_ed25519_r7 && \
299 8e44e3d4 2025-06-25 xs cp -p "$(SSH_ID).pub" .ssh/id_ed25519_r7.pub && \
300 2ae3e68f 2025-06-07 xs . $(UTILITY) && for node in $(SSH_TEST_NODES); do \
301 2ae3e68f 2025-06-07 xs mkdir "nodes/$$node" && \
302 2ae3e68f 2025-06-07 xs ssh_accept_new "$$node"; \
303 2ae3e68f 2025-06-07 xs done;
304 2ae3e68f 2025-06-07 xs @echo _________________________________________________________