ClusterShell 1.9.2__tar.gz → 1.10__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ClusterShell-1.9.2 → clustershell-1.10}/ChangeLog +93 -4
- {ClusterShell-1.9.2 → clustershell-1.10}/MANIFEST.in +2 -0
- clustershell-1.10/PKG-INFO +111 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/README.md +33 -26
- clustershell-1.10/bash_completion.d/cluset +80 -0
- clustershell-1.10/bash_completion.d/clush +159 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/conf/groups.conf +1 -1
- clustershell-1.10/conf/groups.conf.d/ansible.conf.example +25 -0
- clustershell-1.10/conf/groups.conf.d/slurm.conf.example +75 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/conf/groups.d/cluster.yaml.example +1 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/man/man1/clubak.1 +20 -17
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/man/man1/cluset.1 +30 -24
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/man/man1/clush.1 +31 -25
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/man/man1/nodeset.1 +30 -24
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/man/man5/clush.conf.5 +12 -5
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/man/man5/groups.conf.5 +28 -12
- clustershell-1.10/doc/sphinx/CHARTER.rst +233 -0
- clustershell-1.10/doc/sphinx/acknowledgments.rst +22 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/conf.py +5 -5
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/config.rst +177 -12
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/further.rst +4 -9
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/guide/nodesets.rst +1 -1
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/guide/taskmgnt.rst +8 -7
- clustershell-1.10/doc/sphinx/index.rst +34 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/install.rst +17 -16
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/release.rst +168 -1
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/tools/clubak.rst +6 -3
- clustershell-1.10/doc/sphinx/tools/cluset.rst +1137 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/tools/clush.rst +29 -3
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/tools/index.rst +8 -4
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/tools/nodeset.rst +77 -6
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/txt/clubak.txt +6 -4
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/txt/cluset.txt +6 -4
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/txt/clush.conf.txt +12 -3
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/txt/clush.txt +8 -4
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/txt/clustershell.rst +1 -4
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/txt/groups.conf.txt +21 -6
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/txt/nodeset.txt +6 -4
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/CLI/Clubak.py +7 -3
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/CLI/Clush.py +22 -8
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/CLI/Display.py +9 -8
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/CLI/Nodeset.py +30 -12
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/CLI/OptionParser.py +11 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/CLI/Utils.py +12 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Communication.py +26 -7
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Engine/Engine.py +2 -1
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Gateway.py +9 -1
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/NodeSet.py +96 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/NodeUtils.py +87 -15
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Propagation.py +53 -31
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/RangeSet.py +99 -11
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Task.py +35 -6
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Topology.py +3 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Worker/EngineClient.py +9 -4
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Worker/Tree.py +106 -30
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/__init__.py +3 -3
- clustershell-1.10/lib/ClusterShell.egg-info/PKG-INFO +111 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell.egg-info/SOURCES.txt +8 -3
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell.egg-info/entry_points.txt +0 -1
- {ClusterShell-1.9.2 → clustershell-1.10}/setup.cfg +0 -3
- {ClusterShell-1.9.2 → clustershell-1.10}/setup.py +4 -3
- {ClusterShell-1.9.2 → clustershell-1.10}/tests/CLIClubakTest.py +33 -1
- {ClusterShell-1.9.2 → clustershell-1.10}/tests/CLIClushTest.py +91 -4
- {ClusterShell-1.9.2 → clustershell-1.10}/tests/CLIConfigTest.py +1 -1
- {ClusterShell-1.9.2 → clustershell-1.10}/tests/CLINodesetTest.py +113 -2
- {ClusterShell-1.9.2 → clustershell-1.10}/tests/DefaultsTest.py +1 -1
- {ClusterShell-1.9.2 → clustershell-1.10}/tests/MisusageTest.py +1 -1
- {ClusterShell-1.9.2 → clustershell-1.10}/tests/NodeSetGroupTest.py +270 -27
- {ClusterShell-1.9.2 → clustershell-1.10}/tests/NodeSetTest.py +60 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/tests/RangeSetNDTest.py +34 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/tests/RangeSetTest.py +66 -3
- {ClusterShell-1.9.2 → clustershell-1.10}/tests/StreamWorkerTest.py +38 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/tests/TLib.py +21 -2
- {ClusterShell-1.9.2 → clustershell-1.10}/tests/TaskDistantMixin.py +1 -1
- {ClusterShell-1.9.2 → clustershell-1.10}/tests/TaskDistantPdshMixin.py +1 -1
- {ClusterShell-1.9.2 → clustershell-1.10}/tests/TaskDistantPdshTest.py +5 -1
- {ClusterShell-1.9.2 → clustershell-1.10}/tests/TaskDistantTest.py +1 -1
- {ClusterShell-1.9.2 → clustershell-1.10}/tests/TaskLocalTest.py +1 -1
- {ClusterShell-1.9.2 → clustershell-1.10}/tests/TaskRLimitsTest.py +3 -1
- {ClusterShell-1.9.2 → clustershell-1.10}/tests/TaskThreadJoinTest.py +35 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/tests/TaskTimerTest.py +1 -1
- {ClusterShell-1.9.2 → clustershell-1.10}/tests/TreeGatewayTest.py +18 -5
- {ClusterShell-1.9.2 → clustershell-1.10}/tests/TreeTaskTest.py +4 -4
- {ClusterShell-1.9.2 → clustershell-1.10}/tests/TreeTopologyTest.py +9 -3
- clustershell-1.10/tests/TreeWorkerTest.py +1157 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/tests/WorkerExecTest.py +1 -1
- clustershell-1.10/tests/__init__.py +0 -0
- clustershell-1.10/tests/bin/hostname +4 -0
- ClusterShell-1.9.2/PKG-INFO +0 -99
- ClusterShell-1.9.2/conf/groups.conf.d/slurm.conf.example +0 -41
- ClusterShell-1.9.2/doc/sphinx/clustershell-nautilus-logo200.png +0 -0
- ClusterShell-1.9.2/doc/sphinx/index.rst +0 -25
- ClusterShell-1.9.2/doc/sphinx/tools/cluset.rst +0 -10
- ClusterShell-1.9.2/lib/ClusterShell.egg-info/PKG-INFO +0 -99
- ClusterShell-1.9.2/tests/TreeWorkerTest.py +0 -448
- {ClusterShell-1.9.2 → clustershell-1.10}/COPYING.LGPLv2.1 +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/conf/clush.conf +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/conf/clush.conf.d/README +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/conf/clush.conf.d/sshpass.conf.example +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/conf/clush.conf.d/sudo.conf.example +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/conf/groups.conf.d/README +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/conf/groups.conf.d/ace.conf.example +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/conf/groups.conf.d/genders.conf.example +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/conf/groups.conf.d/xcat.conf.example +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/conf/groups.d/README +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/conf/groups.d/local.cfg +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/conf/topology.conf.example +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/epydoc/clustershell_epydoc.conf +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/examples/check_nodes.py +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/examples/defaults.conf-rsh +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/extras/vim/ftdetect/clustershell.vim +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/extras/vim/syntax/clushconf.vim +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/extras/vim/syntax/groupsconf.vim +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/Makefile +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/_static/clustershell-nautilus-logo200.png +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/_static/theme_overrides.css +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/api/Defaults.rst +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/api/EngineTimer.rst +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/api/Event.rst +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/api/MsgTree.rst +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/api/NodeSet.rst +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/api/NodeUtils.rst +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/api/RangeSet.rst +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/api/Task.rst +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/api/index.rst +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/api/workers/ExecWorker.rst +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/api/workers/StreamWorker.rst +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/api/workers/TreeWorker.rst +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/api/workers/Worker.rst +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/api/workers/WorkerPdsh.rst +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/api/workers/WorkerPopen.rst +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/api/workers/WorkerRsh.rst +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/api/workers/WorkerSsh.rst +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/api/workers/index.rst +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/guide/examples.rst +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/guide/index.rst +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/guide/rangesets.rst +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/intro.rst +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/doc/txt/README +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/CLI/Config.py +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/CLI/Error.py +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/CLI/__init__.py +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Defaults.py +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Engine/EPoll.py +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Engine/Factory.py +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Engine/Poll.py +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Engine/Select.py +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Engine/__init__.py +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Event.py +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/MsgTree.py +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Worker/Exec.py +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Worker/Pdsh.py +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Worker/Popen.py +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Worker/Rsh.py +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Worker/Ssh.py +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Worker/Worker.py +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Worker/__init__.py +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Worker/fastsubprocess.py +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell.egg-info/dependency_links.txt +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell.egg-info/requires.txt +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell.egg-info/top_level.txt +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/tests/CLIDisplayTest.py +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/tests/CLIOptionParserTest.py +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/tests/MsgTreeTest.py +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/tests/TaskEventTest.py +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/tests/TaskLocalMixin.py +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/tests/TaskMsgTreeTest.py +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/tests/TaskPortTest.py +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/tests/TaskThreadSuspendTest.py +0 -0
- {ClusterShell-1.9.2 → clustershell-1.10}/tests/TaskTimeoutTest.py +0 -0
|
@@ -1,3 +1,92 @@
|
|
|
1
|
+
2026-07-04 S. Thiell <sthiell@stanford.edu>
|
|
2
|
+
|
|
3
|
+
* Version 1.10 released. The main changes are listed below.
|
|
4
|
+
|
|
5
|
+
* NodeUtils: add the 'mapall' group source upcall to retrieve all group
|
|
6
|
+
mappings in a single call, greatly speeding up group resolution on slow
|
|
7
|
+
sources (#612, #613)
|
|
8
|
+
|
|
9
|
+
* NodeUtils: do not pass stdin to group source upcalls (#581)
|
|
10
|
+
|
|
11
|
+
* NodeSet, RangeSet: add a list-like index() method returning the position
|
|
12
|
+
of a node or element, the inverse of [i] (#631, #633)
|
|
13
|
+
|
|
14
|
+
* cluset, nodeset: add a --index command to output a node's position in the
|
|
15
|
+
set, the reverse of -I/--slice (#637)
|
|
16
|
+
|
|
17
|
+
* groups.conf: add mapall upcalls to the Slurm group bindings (#623)
|
|
18
|
+
|
|
19
|
+
* groups.conf: add an Ansible inventory group source example (#610)
|
|
20
|
+
|
|
21
|
+
* clush, clubak: add --axis to fold nD node sets along selected axis only,
|
|
22
|
+
as already supported by nodeset and cluset (#356)
|
|
23
|
+
|
|
24
|
+
* Display: fix line buffering on Python 3.6 (#597)
|
|
25
|
+
|
|
26
|
+
* Tree: implement TreeWorker.abort() and per-gateway abort, with gateway
|
|
27
|
+
failover fixes (#229, #566)
|
|
28
|
+
|
|
29
|
+
* Tree: fire ev_pickup only once the command can no longer be rerouted and
|
|
30
|
+
improve reroute event reporting (#594)
|
|
31
|
+
|
|
32
|
+
* Tree: fix rcopy when a remote node closes (#545)
|
|
33
|
+
|
|
34
|
+
* Tree: improve handling of MessageProcessingError (#596)
|
|
35
|
+
|
|
36
|
+
* Tree: keep tar/scp errors on stderr instead of stdout during forward
|
|
37
|
+
copy (#622)
|
|
38
|
+
|
|
39
|
+
* Tree: pass filter='fully_trusted' to tarfile.extractall() (PEP 706) (#617)
|
|
40
|
+
|
|
41
|
+
* EngineClient: properly honor the abort flag on close (#591)
|
|
42
|
+
|
|
43
|
+
* Engine: fix set_events debug logging to identify the client and stream (#630)
|
|
44
|
+
|
|
45
|
+
* Task: only terminate a task once when killed, fixing a double termination
|
|
46
|
+
(#110, #640)
|
|
47
|
+
|
|
48
|
+
* NodeUtils, Topology: emit a DeprecationWarning for set_verbosity() and the
|
|
49
|
+
topology.conf [Main] section (#226, #639)
|
|
50
|
+
|
|
51
|
+
* Gateway: fix a Python 2 syntax error (#625)
|
|
52
|
+
|
|
53
|
+
* RangeSet: accept unicode strings on Python 2 (#635)
|
|
54
|
+
|
|
55
|
+
* completion: complete copy paths and command, and short options without
|
|
56
|
+
spaces (#585, #586)
|
|
57
|
+
|
|
58
|
+
* completion: treat -b/-B and clush's other no-arg options as flags (#598, #619)
|
|
59
|
+
|
|
60
|
+
* completion: fix cluset no-arg option lists (#620)
|
|
61
|
+
|
|
62
|
+
* doc: clarify the '*' all-nodes wildcard versus the literal 'all' group
|
|
63
|
+
source (#552)
|
|
64
|
+
|
|
65
|
+
* doc: HPSF onboarding (charter, DCO, governance) and misc doc fixes
|
|
66
|
+
(#577, #604)
|
|
67
|
+
|
|
68
|
+
* setup: clean up wheel packaging metadata (#634)
|
|
69
|
+
|
|
70
|
+
* CI: add Python 3.14 to the test matrix; run the test suite with the
|
|
71
|
+
standard library unittest instead of the abandoned nosetests runner
|
|
72
|
+
(#603, #618)
|
|
73
|
+
|
|
74
|
+
2025-01-23 S. Thiell <sthiell@stanford.edu>
|
|
75
|
+
|
|
76
|
+
* Version 1.9.3 released. The main changes are listed below.
|
|
77
|
+
|
|
78
|
+
* Added bash completions (#563)
|
|
79
|
+
|
|
80
|
+
* Communication: sax parser: add flush() after feed() (#556)
|
|
81
|
+
|
|
82
|
+
* Additional Slurm binding options (#558 and #561)
|
|
83
|
+
|
|
84
|
+
* clush: use set instead of NodeSet for runtime progress info (#562)
|
|
85
|
+
|
|
86
|
+
* Tree: Tree: use set instead of NodeSet for gwtargets tracking (#562)
|
|
87
|
+
|
|
88
|
+
* CLI/Nodeset: omit @source: prefix for cluset -s source -L (#563) (#570)
|
|
89
|
+
|
|
1
90
|
2023-09-29 S. Thiell <sthiell@stanford.edu>
|
|
2
91
|
|
|
3
92
|
* Version 1.9.2 released. The main changes are listed below.
|
|
@@ -138,8 +227,8 @@
|
|
|
138
227
|
|
|
139
228
|
* EventHandler: reinstate ev_error and ev_timeout as deprecated (#377)
|
|
140
229
|
|
|
141
|
-
* nodeset/cluset CLI: allow
|
|
142
|
-
|
|
230
|
+
* nodeset/cluset CLI: allow literal new line in -S, so both -S "\n" and
|
|
231
|
+
-S $'\n' will work
|
|
143
232
|
|
|
144
233
|
* nodeset/cluset CLI: handle multiline shell arguments in options (#394)
|
|
145
234
|
|
|
@@ -565,7 +654,7 @@
|
|
|
565
654
|
CLUSTERSHELL_GW_LOG_DIR and CLUSTERSHELL_GW_LOG_LEVEL environment
|
|
566
655
|
variables from the root node.
|
|
567
656
|
|
|
568
|
-
* Communication.py: Messages are now
|
|
657
|
+
* Communication.py: Messages are now transferred in xml payload instead of
|
|
569
658
|
'output' attribute for improved handling of multi-lines messages in
|
|
570
659
|
StdOutMessage and StdErrMessage.
|
|
571
660
|
|
|
@@ -1389,7 +1478,7 @@
|
|
|
1389
1478
|
2009-12-09 A. Degremont <aurelien.degremont@cea.fr>
|
|
1390
1479
|
|
|
1391
1480
|
* scripts/nodeset.py: Protect --separator from code injection and
|
|
1392
|
-
handle gracefully incorrect
|
|
1481
|
+
handle gracefully incorrect separator.
|
|
1393
1482
|
|
|
1394
1483
|
2009-12-09 S. Thiell <stephane.thiell@cea.fr>
|
|
1395
1484
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
include ChangeLog
|
|
2
2
|
include README.md
|
|
3
3
|
include COPYING.LGPLv2.1
|
|
4
|
+
include bash_completion.d/*
|
|
4
5
|
include conf/*.conf
|
|
5
6
|
include conf/*.example
|
|
6
7
|
include conf/clush.conf.d/README
|
|
@@ -31,3 +32,4 @@ include doc/examples/*.py
|
|
|
31
32
|
include doc/examples/defaults.conf-rsh
|
|
32
33
|
include doc/epydoc/*.conf
|
|
33
34
|
include tests/*.py
|
|
35
|
+
include tests/bin/*
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: ClusterShell
|
|
3
|
+
Version: 1.10
|
|
4
|
+
Summary: ClusterShell library and tools
|
|
5
|
+
Home-page: https://clustershell.readthedocs.io/
|
|
6
|
+
Download-URL: https://github.com/clustershell/clustershell/archive/refs/tags/v1.10.tar.gz
|
|
7
|
+
Author: Stephane Thiell
|
|
8
|
+
Author-email: sthiell@stanford.edu
|
|
9
|
+
License: LGPLv2+
|
|
10
|
+
Keywords: clustershell,clush,clubak,nodeset
|
|
11
|
+
Platform: GNU/Linux
|
|
12
|
+
Platform: BSD
|
|
13
|
+
Platform: MacOSX
|
|
14
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
15
|
+
Classifier: Environment :: Console
|
|
16
|
+
Classifier: Intended Audience :: System Administrators
|
|
17
|
+
Classifier: License :: OSI Approved :: GNU Lesser General Public License v2 or later (LGPLv2+)
|
|
18
|
+
Classifier: Operating System :: MacOS :: MacOS X
|
|
19
|
+
Classifier: Operating System :: POSIX :: BSD
|
|
20
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
21
|
+
Classifier: Programming Language :: Python
|
|
22
|
+
Classifier: Programming Language :: Python :: 2.7
|
|
23
|
+
Classifier: Programming Language :: Python :: 3
|
|
24
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
25
|
+
Classifier: Topic :: System :: Clustering
|
|
26
|
+
Classifier: Topic :: System :: Distributed Computing
|
|
27
|
+
Description-Content-Type: text/x-rst
|
|
28
|
+
License-File: COPYING.LGPLv2.1
|
|
29
|
+
Requires-Dist: PyYAML
|
|
30
|
+
Dynamic: author
|
|
31
|
+
Dynamic: author-email
|
|
32
|
+
Dynamic: classifier
|
|
33
|
+
Dynamic: description
|
|
34
|
+
Dynamic: description-content-type
|
|
35
|
+
Dynamic: download-url
|
|
36
|
+
Dynamic: home-page
|
|
37
|
+
Dynamic: keywords
|
|
38
|
+
Dynamic: license
|
|
39
|
+
Dynamic: license-file
|
|
40
|
+
Dynamic: platform
|
|
41
|
+
Dynamic: requires-dist
|
|
42
|
+
Dynamic: summary
|
|
43
|
+
|
|
44
|
+
ClusterShell is an event-driven open source Python framework, designed to run
|
|
45
|
+
local or distant commands in parallel on server farms or on large Linux
|
|
46
|
+
clusters. It will take care of common issues encountered on HPC clusters, such
|
|
47
|
+
as operating on groups of nodes, running distributed commands using optimized
|
|
48
|
+
execution algorithms, as well as gathering results and merging identical
|
|
49
|
+
outputs, or retrieving return codes. ClusterShell takes advantage of existing
|
|
50
|
+
remote shell facilities already installed on your systems, like SSH.
|
|
51
|
+
|
|
52
|
+
ClusterShell provides clush, clubak and cluset/nodeset, convenient command-line
|
|
53
|
+
tools that allow traditional shell scripts to benefit from some of the
|
|
54
|
+
library's features:
|
|
55
|
+
|
|
56
|
+
- **clush**: issue commands to cluster nodes and format output
|
|
57
|
+
|
|
58
|
+
Example of use:
|
|
59
|
+
|
|
60
|
+
::
|
|
61
|
+
|
|
62
|
+
$ clush -abL uname -r
|
|
63
|
+
node[32-49,51-71,80,82-150,156-159]: 2.6.18-164.11.1.el5
|
|
64
|
+
node[3-7,72-79]: 2.6.18-164.11.1.el5_lustre1.10.0.36
|
|
65
|
+
node[2,151-155]: 2.6.31.6-145.fc11.2.x86_64
|
|
66
|
+
|
|
67
|
+
See *man clush* for more details.
|
|
68
|
+
|
|
69
|
+
- **clubak**: improved dshbak to gather and sort dsh-like outputs
|
|
70
|
+
|
|
71
|
+
See *man clubak* for more details.
|
|
72
|
+
|
|
73
|
+
- **nodeset** (or **cluset**): compute advanced nodeset/nodegroup operations
|
|
74
|
+
|
|
75
|
+
Examples of use:
|
|
76
|
+
|
|
77
|
+
::
|
|
78
|
+
|
|
79
|
+
$ echo node160 node161 node162 node163 | nodeset -f
|
|
80
|
+
node[160-163]
|
|
81
|
+
|
|
82
|
+
$ nodeset -f node[0-7,32-159] node[160-163]
|
|
83
|
+
node[0-7,32-163]
|
|
84
|
+
|
|
85
|
+
$ nodeset -e node[160-163]
|
|
86
|
+
node160 node161 node162 node163
|
|
87
|
+
|
|
88
|
+
$ nodeset -f node[32-159] -x node33
|
|
89
|
+
node[32,34-159]
|
|
90
|
+
|
|
91
|
+
$ nodeset -f node[32-159] -i node[0-7,20-21,32,156-159]
|
|
92
|
+
node[32,156-159]
|
|
93
|
+
|
|
94
|
+
$ nodeset -f node[33-159] --xor node[32-33,156-159]
|
|
95
|
+
node[32,34-155]
|
|
96
|
+
|
|
97
|
+
$ nodeset -l
|
|
98
|
+
@oss
|
|
99
|
+
@mds
|
|
100
|
+
@io
|
|
101
|
+
@compute
|
|
102
|
+
|
|
103
|
+
$ nodeset -e @mds
|
|
104
|
+
node6 node7
|
|
105
|
+
|
|
106
|
+
See *man nodeset* (or *man cluset*) for more details.
|
|
107
|
+
|
|
108
|
+
Please visit the ClusterShell website_.
|
|
109
|
+
|
|
110
|
+
.. _website: https://clustershell.readthedocs.io/
|
|
111
|
+
|
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
ClusterShell Python Library and Tools
|
|
2
2
|
=====================================
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
[](https://hpsf.io)
|
|
5
|
+
|
|
6
|
+
This project adheres to a [Technical Charter](https://clustershell.readthedocs.io/en/latest/CHARTER.html), which defines its governance model, decision-making process, and long-term vision.
|
|
7
|
+
|
|
8
|
+
ClusterShell is an event-driven open source Python library designed to run
|
|
5
9
|
local or distant commands in parallel on server farms or on large Linux
|
|
6
|
-
clusters. It
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
10
|
+
clusters. It is an [HPSF Established](https://hpsf.io) project under
|
|
11
|
+
[LF Europe](https://linuxfoundation.eu/) stewardship.
|
|
12
|
+
|
|
13
|
+
ClusterShell handles typical HPC cluster administration tasks: operating on
|
|
14
|
+
groups of nodes, executing distributed commands with optimized algorithms,
|
|
15
|
+
gathering and merging output, and collecting return codes. It leverages remote
|
|
16
|
+
shell facilities already present on your systems, such as SSH.
|
|
11
17
|
|
|
12
18
|
ClusterShell's primary goal is to improve the administration of high-
|
|
13
19
|
performance clusters by providing a lightweight but scalable Python API for
|
|
@@ -34,7 +40,7 @@ Documentation
|
|
|
34
40
|
|
|
35
41
|
Online documentation is available here:
|
|
36
42
|
|
|
37
|
-
|
|
43
|
+
https://clustershell.readthedocs.io/
|
|
38
44
|
|
|
39
45
|
The Sphinx documentation source is available under the doc/sphinx directory.
|
|
40
46
|
Type 'make' to see all available formats (you need Sphinx installed and
|
|
@@ -54,11 +60,13 @@ The following man pages are also provided:
|
|
|
54
60
|
Test Suite
|
|
55
61
|
----------
|
|
56
62
|
|
|
57
|
-
Regression testing scripts are available in the 'tests' directory
|
|
63
|
+
Regression testing scripts are available in the 'tests' directory. To run the
|
|
64
|
+
whole test suite from the source tree root:
|
|
58
65
|
|
|
59
|
-
$
|
|
60
|
-
|
|
61
|
-
|
|
66
|
+
$ python -m unittest discover -v -s tests -p '*Test.py' -t .
|
|
67
|
+
|
|
68
|
+
To run a single test module, narrow the discovery pattern, for example
|
|
69
|
+
`-p 'NodeSetTest.py'`.
|
|
62
70
|
|
|
63
71
|
You have to allow 'ssh localhost' and 'ssh $HOSTNAME' without any warnings for
|
|
64
72
|
"remote" tests to run as expected. $HOSTNAME should not be 127.0.0.1 nor ::1.
|
|
@@ -84,32 +92,22 @@ linux[4-6] 2.6.32-71.el6.x86_64
|
|
|
84
92
|
Links
|
|
85
93
|
-----
|
|
86
94
|
|
|
87
|
-
Web site:
|
|
88
|
-
|
|
89
|
-
http://cea-hpc.github.com/clustershell/
|
|
90
|
-
|
|
91
95
|
Online documentation:
|
|
92
96
|
|
|
93
|
-
|
|
97
|
+
https://clustershell.readthedocs.io/
|
|
94
98
|
|
|
95
99
|
Github source repository:
|
|
96
100
|
|
|
97
|
-
https://github.com/
|
|
98
|
-
|
|
99
|
-
Github Wiki:
|
|
100
|
-
|
|
101
|
-
https://github.com/cea-hpc/clustershell/wiki
|
|
101
|
+
https://github.com/clustershell/clustershell
|
|
102
102
|
|
|
103
103
|
Github Issue tracking system:
|
|
104
104
|
|
|
105
|
-
https://github.com/
|
|
105
|
+
https://github.com/clustershell/clustershell/issues
|
|
106
106
|
|
|
107
107
|
Python Package Index (PyPI) links:
|
|
108
108
|
|
|
109
109
|
https://pypi.org/project/ClusterShell/
|
|
110
110
|
|
|
111
|
-
http://pypi.python.org/pypi/ClusterShell
|
|
112
|
-
|
|
113
111
|
ClusterShell was born along with Shine, a scalable Lustre FS admin tool:
|
|
114
112
|
|
|
115
113
|
https://github.com/cea-hpc/shine
|
|
@@ -119,7 +117,16 @@ Core developers/reviewers
|
|
|
119
117
|
|
|
120
118
|
* Stephane Thiell
|
|
121
119
|
* Aurelien Degremont
|
|
122
|
-
* Henri Doreau
|
|
123
120
|
* Dominique Martinet
|
|
124
121
|
|
|
125
|
-
|
|
122
|
+
Acknowledgments
|
|
123
|
+
---------------
|
|
124
|
+
|
|
125
|
+
We would like to express our gratitude to [CEA](https://www.cea.fr/english)
|
|
126
|
+
for the resources and funding provided to the project over the years.
|
|
127
|
+
|
|
128
|
+
We would also like to thank [Stanford University](https://srcc.stanford.edu)
|
|
129
|
+
(SRC) for their long-term support and resources provided to the project.
|
|
130
|
+
|
|
131
|
+
See the full [Acknowledgments](https://clustershell.readthedocs.io/en/latest/acknowledgments.html)
|
|
132
|
+
page for more details.
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# cluset bash completion
|
|
2
|
+
#
|
|
3
|
+
# to install in /usr/share/bash-completion/completions/ or ~/.local/share/bash-completion/completions/
|
|
4
|
+
_cluset()
|
|
5
|
+
{
|
|
6
|
+
# shellcheck disable=SC2034 # set/used by _init_completion
|
|
7
|
+
local cur prev words cword split
|
|
8
|
+
local word options="" skip=argv0 groupsource="" cleangroup=""
|
|
9
|
+
|
|
10
|
+
_init_completion -s -n : || return
|
|
11
|
+
|
|
12
|
+
# stop parsing if there had been any non-option before (or --)
|
|
13
|
+
for word in "${words[@]}"; do
|
|
14
|
+
case "$skip" in
|
|
15
|
+
"") ;;
|
|
16
|
+
groupsource)
|
|
17
|
+
groupsource="$word"
|
|
18
|
+
;& # fallthrough
|
|
19
|
+
*)
|
|
20
|
+
skip=""
|
|
21
|
+
continue
|
|
22
|
+
;;
|
|
23
|
+
esac
|
|
24
|
+
case "$word" in
|
|
25
|
+
"") ;;
|
|
26
|
+
--) return;;
|
|
27
|
+
# no-arg options
|
|
28
|
+
--version|-h|--help|-l|--list|-L|--list-all|-r|--regroup|\
|
|
29
|
+
--list-sources|--groupsources|-d|--debug|-q|--quiet|\
|
|
30
|
+
-R|--rangeset|-G|--groupbase|--contiguous|-a|--all|--completion) ;;
|
|
31
|
+
# get source separately...
|
|
32
|
+
--groupsource=*) groupsource="${word#*=}";;
|
|
33
|
+
-s|--groupsource) skip=groupsource;;
|
|
34
|
+
# assume all the rest as options...
|
|
35
|
+
# options with = included in word
|
|
36
|
+
--*=*) ;;
|
|
37
|
+
-*) skip=any;;
|
|
38
|
+
*) return;; # was non-option
|
|
39
|
+
esac
|
|
40
|
+
done
|
|
41
|
+
|
|
42
|
+
case "$prev" in
|
|
43
|
+
-c|--count|-e|--expand|-f|--fold|--index|\
|
|
44
|
+
-x|--exclude|-i|--intersection|-X|--xor)
|
|
45
|
+
case "$cur" in
|
|
46
|
+
*:*)
|
|
47
|
+
groupsource="${cur%%:*}"
|
|
48
|
+
groupsource="${groupsource#@}"
|
|
49
|
+
;;
|
|
50
|
+
*)
|
|
51
|
+
if [ -n "$groupsource" ]; then
|
|
52
|
+
cleangroup=1
|
|
53
|
+
fi
|
|
54
|
+
;;
|
|
55
|
+
esac
|
|
56
|
+
options="$(cluset ${groupsource:+-s "$groupsource"} --completion @*)"
|
|
57
|
+
if [ -n "$cleangroup" ]; then
|
|
58
|
+
options=${options//@"$groupsource":/@}
|
|
59
|
+
fi
|
|
60
|
+
;;
|
|
61
|
+
-s|--groupsource)
|
|
62
|
+
options=$(cluset --groupsources --quiet)
|
|
63
|
+
;;
|
|
64
|
+
# no-arg options
|
|
65
|
+
--version|-h|--help|-l|--list|-L|--list-all|-r|--regroup|\
|
|
66
|
+
--list-sources|--groupsources|-d|--debug|-q|--quiet|\
|
|
67
|
+
-R|--rangeset|-G|--groupbase|--contiguous|-a|--all|--completion) ;;
|
|
68
|
+
# any other option: just ignore.
|
|
69
|
+
-*)
|
|
70
|
+
return;;
|
|
71
|
+
esac
|
|
72
|
+
# get all options from help text... not 100% accurate but good enough.
|
|
73
|
+
[ -n "$options" ] || options="$(cluset --help | grep -oP -- '(?<=[ \t])(-[a-z]|--[^= \t]*)')"
|
|
74
|
+
|
|
75
|
+
# append space for everything that doesn't end in `:` (likely a groupsource)
|
|
76
|
+
mapfile -t COMPREPLY < <(compgen -W "$options" -- "$cur" | sed -e 's/[^:]$/& /')
|
|
77
|
+
# remove the prefix from COMPREPLY if $cur contains colons and
|
|
78
|
+
# COMP_WORDBREAKS splits on colons...
|
|
79
|
+
__ltrim_colon_completions "$cur"
|
|
80
|
+
} && complete -o nospace -F _cluset ${BASH_SOURCE##*/}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
# clush bash completion
|
|
2
|
+
#
|
|
3
|
+
# to install in /usr/share/bash-completion/completions/ or ~/.local/share/bash-completion/completions/
|
|
4
|
+
_clush_command_or_file() {
|
|
5
|
+
# undo our nospace setting...
|
|
6
|
+
compopt +o nospace
|
|
7
|
+
|
|
8
|
+
# skip if shortopt is set -- these helpers cannot "restore" shortopt at start of
|
|
9
|
+
# the completions they provide easily
|
|
10
|
+
[ -n "$shortopt" ] && return
|
|
11
|
+
|
|
12
|
+
# complete either files (copy mode) or commands (if target set)
|
|
13
|
+
case "$target_set,$mode" in
|
|
14
|
+
*,copy)
|
|
15
|
+
# available since bash-completion 2.12
|
|
16
|
+
if declare -F _comp_compgen_filedir >/dev/null; then
|
|
17
|
+
_comp_compgen_filedir
|
|
18
|
+
else
|
|
19
|
+
_filedir
|
|
20
|
+
fi
|
|
21
|
+
;;
|
|
22
|
+
1,command)
|
|
23
|
+
# available since bash-completion 2.12
|
|
24
|
+
if declare -F _comp_command_offset >/dev/null; then
|
|
25
|
+
_comp_command_offset "$i"
|
|
26
|
+
else
|
|
27
|
+
_command_offset "$i"
|
|
28
|
+
fi
|
|
29
|
+
;;
|
|
30
|
+
esac
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
_clush()
|
|
34
|
+
{
|
|
35
|
+
# shellcheck disable=SC2034 # set/used by _init_completion
|
|
36
|
+
local cur prev words cword split
|
|
37
|
+
local i word options="" compopts="" skip=argv0 groupsource="" cleangroup=""
|
|
38
|
+
local mode=command target_set=""
|
|
39
|
+
local shortopt=""
|
|
40
|
+
|
|
41
|
+
_init_completion -s -n : || return
|
|
42
|
+
|
|
43
|
+
# stop parsing if there had been any non-option before (or --)
|
|
44
|
+
for i in "${!words[@]}"; do
|
|
45
|
+
word="${words[i]}"
|
|
46
|
+
case "$skip" in
|
|
47
|
+
"") ;;
|
|
48
|
+
groupsource)
|
|
49
|
+
groupsource="$word"
|
|
50
|
+
;& # fallthrough
|
|
51
|
+
*)
|
|
52
|
+
skip=""
|
|
53
|
+
continue
|
|
54
|
+
;;
|
|
55
|
+
esac
|
|
56
|
+
case "$word" in
|
|
57
|
+
"") ;;
|
|
58
|
+
--)
|
|
59
|
+
i=$((i+1)) # command from next word!
|
|
60
|
+
_clush_command_or_file
|
|
61
|
+
return
|
|
62
|
+
;;
|
|
63
|
+
-c|--copy|--rcopy) mode=copy;;
|
|
64
|
+
-w|-g|--group) target_set=1; skip=any;;
|
|
65
|
+
# no-arg options
|
|
66
|
+
--version|-h|--help|-n|--nostdin|-a|--all|-q|--quiet|\
|
|
67
|
+
-b|-B|--dshbak|-G|--groupbase|-L|-N|-P|--progress|\
|
|
68
|
+
-r|--regroup|-S|--maxrc|--diff|-p|-v|--verbose|-d|--debug) ;;
|
|
69
|
+
# get source separately...
|
|
70
|
+
--groupsource=*) groupsource="${word#*=}";;
|
|
71
|
+
-s|--groupsource) skip=groupsource;;
|
|
72
|
+
# assume all the rest as options...
|
|
73
|
+
# options with = included in word
|
|
74
|
+
--*=*) ;;
|
|
75
|
+
-*) skip=any;;
|
|
76
|
+
*)
|
|
77
|
+
# likely non-option, in copy mode options like -w can come
|
|
78
|
+
# later so just skip, otherwise likely start of command
|
|
79
|
+
[ "$mode" = copy ] && continue
|
|
80
|
+
_clush_command_or_file
|
|
81
|
+
return;;
|
|
82
|
+
esac
|
|
83
|
+
done
|
|
84
|
+
|
|
85
|
+
# split short opts without space...
|
|
86
|
+
case "$cur" in
|
|
87
|
+
-[a-z]*)
|
|
88
|
+
shortopt="${cur:0:2}"
|
|
89
|
+
prev="$shortopt"
|
|
90
|
+
cur="${cur:2}"
|
|
91
|
+
;;
|
|
92
|
+
esac
|
|
93
|
+
|
|
94
|
+
case "$prev" in
|
|
95
|
+
-w|-x|-g|--group|-X)
|
|
96
|
+
case "$cur" in
|
|
97
|
+
*:*)
|
|
98
|
+
groupsource="${cur%%:*}"
|
|
99
|
+
groupsource="${groupsource#@}"
|
|
100
|
+
;;
|
|
101
|
+
*)
|
|
102
|
+
if [ -n "$groupsource" ]; then
|
|
103
|
+
cleangroup=1
|
|
104
|
+
fi
|
|
105
|
+
;;
|
|
106
|
+
esac
|
|
107
|
+
if [ "$prev" = "-w" ]; then
|
|
108
|
+
compopts="@*" # include all nodes
|
|
109
|
+
fi
|
|
110
|
+
# shellcheck disable=SC2086 ## $compopts expanded on purpose
|
|
111
|
+
options="$(cluset ${groupsource:+-s "$groupsource"} --completion $compopts)"
|
|
112
|
+
if [ -n "$cleangroup" ]; then
|
|
113
|
+
options=${options//@"$groupsource":/@}
|
|
114
|
+
fi
|
|
115
|
+
case "$prev" in
|
|
116
|
+
-g|--group|-X)
|
|
117
|
+
options=${options//@/}
|
|
118
|
+
;;
|
|
119
|
+
esac
|
|
120
|
+
;;
|
|
121
|
+
-s|--groupsource)
|
|
122
|
+
options=$(cluset --groupsources --quiet)
|
|
123
|
+
;;
|
|
124
|
+
--color)
|
|
125
|
+
options="never always auto"
|
|
126
|
+
;;
|
|
127
|
+
-R|--worker)
|
|
128
|
+
options="ssh exec rsh"
|
|
129
|
+
;;
|
|
130
|
+
# no-arg options
|
|
131
|
+
--version|-h|--help|-n|--nostdin|-a|--all|-q|--quiet|\
|
|
132
|
+
-b|-B|--dshbak|-G|--groupbase|-L|-N|-P|--progress|\
|
|
133
|
+
-r|--regroup|-S|--maxrc|--diff|-p|-v|--verbose|-d|--debug|-c|--copy|--rcopy) ;;
|
|
134
|
+
# any other option: ignore next word (likely argument)
|
|
135
|
+
-*)
|
|
136
|
+
return;;
|
|
137
|
+
esac
|
|
138
|
+
# new option or no option:
|
|
139
|
+
if [ -z "$options" ]; then
|
|
140
|
+
case "$cur" in
|
|
141
|
+
-*)
|
|
142
|
+
# starts with dash - get all options from help text...
|
|
143
|
+
options="$(clush --help | grep -oP -- '(?<=[ \t])(-[a-z]|--[^= \t]*)')"
|
|
144
|
+
;;
|
|
145
|
+
*)
|
|
146
|
+
# otherwise complete command or file if appropriate and stop here
|
|
147
|
+
_clush_command_or_file
|
|
148
|
+
return
|
|
149
|
+
esac
|
|
150
|
+
fi
|
|
151
|
+
|
|
152
|
+
# append space for everything that doesn't end in `:` (likely a groupsource)
|
|
153
|
+
mapfile -t COMPREPLY \
|
|
154
|
+
< <(compgen -W "$options" -- "$cur" \
|
|
155
|
+
| sed -e 's/[^:]$/& /' -e "s/^/$shortopt/")
|
|
156
|
+
# remove the prefix from COMPREPLY if $cur contains colons and
|
|
157
|
+
# COMP_WORDBREAKS splits on colons...
|
|
158
|
+
__ltrim_colon_completions "$cur"
|
|
159
|
+
} && complete -o nospace -F _clush "${BASH_SOURCE##*/}"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# ClusterShell node groups main configuration file
|
|
2
2
|
#
|
|
3
3
|
# Please see `man 5 groups.conf` and
|
|
4
|
-
#
|
|
4
|
+
# https://clustershell.readthedocs.io/en/latest/config.html#node-groups
|
|
5
5
|
# for further details.
|
|
6
6
|
#
|
|
7
7
|
# NOTE: This is a simple group configuration example file, not a
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Additional ClusterShell group source config file
|
|
2
|
+
#
|
|
3
|
+
# Please see `man 5 groups.conf` for further details.
|
|
4
|
+
#
|
|
5
|
+
|
|
6
|
+
# Ansible inventory bindings
|
|
7
|
+
#
|
|
8
|
+
# Requirements: ansible-core (provides ansible-inventory), jq
|
|
9
|
+
#
|
|
10
|
+
# Replace /path/to/inventory with your inventory path or directory,
|
|
11
|
+
# or set ANSIBLE_INVENTORY in your environment to override it.
|
|
12
|
+
#
|
|
13
|
+
[ansible]
|
|
14
|
+
|
|
15
|
+
# Resolve group members, recursing into child groups
|
|
16
|
+
map: ANSIBLE_INVENTORY="${ANSIBLE_INVENTORY:-/path/to/inventory}" ansible-inventory --list 2>/dev/null | jq -r --arg g "$GROUP" 'def r(d;g): (d[g].hosts//[])[], ((d[g].children//[])[] as $c | r(d;$c)); r(.;$g)'
|
|
17
|
+
|
|
18
|
+
# Resolve all groups in a single call, recursing into child groups
|
|
19
|
+
mapall: ANSIBLE_INVENTORY="${ANSIBLE_INVENTORY:-/path/to/inventory}" ansible-inventory --list 2>/dev/null | jq -r 'def r(d;g): (d[g].hosts//[])[], ((d[g].children//[])[] as $c | r(d;$c)); . as $d | keys[] | select(. != "_meta" and . != "all" and (test("[[:space:]:]") | not)) | "\(.): \([r($d;.)] | join(" "))"'
|
|
20
|
+
|
|
21
|
+
# All inventory hosts
|
|
22
|
+
all: ANSIBLE_INVENTORY="${ANSIBLE_INVENTORY:-/path/to/inventory}" ansible-inventory --list 2>/dev/null | jq -r '.[].hosts // empty | .[]'
|
|
23
|
+
|
|
24
|
+
# All groups
|
|
25
|
+
list: ANSIBLE_INVENTORY="${ANSIBLE_INVENTORY:-/path/to/inventory}" ansible-inventory --list 2>/dev/null | jq -r 'keys[] | select(. != "_meta" and . != "all")'
|