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.
Files changed (170) hide show
  1. {ClusterShell-1.9.2 → clustershell-1.10}/ChangeLog +93 -4
  2. {ClusterShell-1.9.2 → clustershell-1.10}/MANIFEST.in +2 -0
  3. clustershell-1.10/PKG-INFO +111 -0
  4. {ClusterShell-1.9.2 → clustershell-1.10}/README.md +33 -26
  5. clustershell-1.10/bash_completion.d/cluset +80 -0
  6. clustershell-1.10/bash_completion.d/clush +159 -0
  7. {ClusterShell-1.9.2 → clustershell-1.10}/conf/groups.conf +1 -1
  8. clustershell-1.10/conf/groups.conf.d/ansible.conf.example +25 -0
  9. clustershell-1.10/conf/groups.conf.d/slurm.conf.example +75 -0
  10. {ClusterShell-1.9.2 → clustershell-1.10}/conf/groups.d/cluster.yaml.example +1 -0
  11. {ClusterShell-1.9.2 → clustershell-1.10}/doc/man/man1/clubak.1 +20 -17
  12. {ClusterShell-1.9.2 → clustershell-1.10}/doc/man/man1/cluset.1 +30 -24
  13. {ClusterShell-1.9.2 → clustershell-1.10}/doc/man/man1/clush.1 +31 -25
  14. {ClusterShell-1.9.2 → clustershell-1.10}/doc/man/man1/nodeset.1 +30 -24
  15. {ClusterShell-1.9.2 → clustershell-1.10}/doc/man/man5/clush.conf.5 +12 -5
  16. {ClusterShell-1.9.2 → clustershell-1.10}/doc/man/man5/groups.conf.5 +28 -12
  17. clustershell-1.10/doc/sphinx/CHARTER.rst +233 -0
  18. clustershell-1.10/doc/sphinx/acknowledgments.rst +22 -0
  19. {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/conf.py +5 -5
  20. {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/config.rst +177 -12
  21. {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/further.rst +4 -9
  22. {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/guide/nodesets.rst +1 -1
  23. {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/guide/taskmgnt.rst +8 -7
  24. clustershell-1.10/doc/sphinx/index.rst +34 -0
  25. {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/install.rst +17 -16
  26. {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/release.rst +168 -1
  27. {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/tools/clubak.rst +6 -3
  28. clustershell-1.10/doc/sphinx/tools/cluset.rst +1137 -0
  29. {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/tools/clush.rst +29 -3
  30. {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/tools/index.rst +8 -4
  31. {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/tools/nodeset.rst +77 -6
  32. {ClusterShell-1.9.2 → clustershell-1.10}/doc/txt/clubak.txt +6 -4
  33. {ClusterShell-1.9.2 → clustershell-1.10}/doc/txt/cluset.txt +6 -4
  34. {ClusterShell-1.9.2 → clustershell-1.10}/doc/txt/clush.conf.txt +12 -3
  35. {ClusterShell-1.9.2 → clustershell-1.10}/doc/txt/clush.txt +8 -4
  36. {ClusterShell-1.9.2 → clustershell-1.10}/doc/txt/clustershell.rst +1 -4
  37. {ClusterShell-1.9.2 → clustershell-1.10}/doc/txt/groups.conf.txt +21 -6
  38. {ClusterShell-1.9.2 → clustershell-1.10}/doc/txt/nodeset.txt +6 -4
  39. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/CLI/Clubak.py +7 -3
  40. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/CLI/Clush.py +22 -8
  41. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/CLI/Display.py +9 -8
  42. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/CLI/Nodeset.py +30 -12
  43. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/CLI/OptionParser.py +11 -0
  44. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/CLI/Utils.py +12 -0
  45. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Communication.py +26 -7
  46. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Engine/Engine.py +2 -1
  47. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Gateway.py +9 -1
  48. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/NodeSet.py +96 -0
  49. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/NodeUtils.py +87 -15
  50. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Propagation.py +53 -31
  51. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/RangeSet.py +99 -11
  52. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Task.py +35 -6
  53. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Topology.py +3 -0
  54. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Worker/EngineClient.py +9 -4
  55. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Worker/Tree.py +106 -30
  56. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/__init__.py +3 -3
  57. clustershell-1.10/lib/ClusterShell.egg-info/PKG-INFO +111 -0
  58. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell.egg-info/SOURCES.txt +8 -3
  59. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell.egg-info/entry_points.txt +0 -1
  60. {ClusterShell-1.9.2 → clustershell-1.10}/setup.cfg +0 -3
  61. {ClusterShell-1.9.2 → clustershell-1.10}/setup.py +4 -3
  62. {ClusterShell-1.9.2 → clustershell-1.10}/tests/CLIClubakTest.py +33 -1
  63. {ClusterShell-1.9.2 → clustershell-1.10}/tests/CLIClushTest.py +91 -4
  64. {ClusterShell-1.9.2 → clustershell-1.10}/tests/CLIConfigTest.py +1 -1
  65. {ClusterShell-1.9.2 → clustershell-1.10}/tests/CLINodesetTest.py +113 -2
  66. {ClusterShell-1.9.2 → clustershell-1.10}/tests/DefaultsTest.py +1 -1
  67. {ClusterShell-1.9.2 → clustershell-1.10}/tests/MisusageTest.py +1 -1
  68. {ClusterShell-1.9.2 → clustershell-1.10}/tests/NodeSetGroupTest.py +270 -27
  69. {ClusterShell-1.9.2 → clustershell-1.10}/tests/NodeSetTest.py +60 -0
  70. {ClusterShell-1.9.2 → clustershell-1.10}/tests/RangeSetNDTest.py +34 -0
  71. {ClusterShell-1.9.2 → clustershell-1.10}/tests/RangeSetTest.py +66 -3
  72. {ClusterShell-1.9.2 → clustershell-1.10}/tests/StreamWorkerTest.py +38 -0
  73. {ClusterShell-1.9.2 → clustershell-1.10}/tests/TLib.py +21 -2
  74. {ClusterShell-1.9.2 → clustershell-1.10}/tests/TaskDistantMixin.py +1 -1
  75. {ClusterShell-1.9.2 → clustershell-1.10}/tests/TaskDistantPdshMixin.py +1 -1
  76. {ClusterShell-1.9.2 → clustershell-1.10}/tests/TaskDistantPdshTest.py +5 -1
  77. {ClusterShell-1.9.2 → clustershell-1.10}/tests/TaskDistantTest.py +1 -1
  78. {ClusterShell-1.9.2 → clustershell-1.10}/tests/TaskLocalTest.py +1 -1
  79. {ClusterShell-1.9.2 → clustershell-1.10}/tests/TaskRLimitsTest.py +3 -1
  80. {ClusterShell-1.9.2 → clustershell-1.10}/tests/TaskThreadJoinTest.py +35 -0
  81. {ClusterShell-1.9.2 → clustershell-1.10}/tests/TaskTimerTest.py +1 -1
  82. {ClusterShell-1.9.2 → clustershell-1.10}/tests/TreeGatewayTest.py +18 -5
  83. {ClusterShell-1.9.2 → clustershell-1.10}/tests/TreeTaskTest.py +4 -4
  84. {ClusterShell-1.9.2 → clustershell-1.10}/tests/TreeTopologyTest.py +9 -3
  85. clustershell-1.10/tests/TreeWorkerTest.py +1157 -0
  86. {ClusterShell-1.9.2 → clustershell-1.10}/tests/WorkerExecTest.py +1 -1
  87. clustershell-1.10/tests/__init__.py +0 -0
  88. clustershell-1.10/tests/bin/hostname +4 -0
  89. ClusterShell-1.9.2/PKG-INFO +0 -99
  90. ClusterShell-1.9.2/conf/groups.conf.d/slurm.conf.example +0 -41
  91. ClusterShell-1.9.2/doc/sphinx/clustershell-nautilus-logo200.png +0 -0
  92. ClusterShell-1.9.2/doc/sphinx/index.rst +0 -25
  93. ClusterShell-1.9.2/doc/sphinx/tools/cluset.rst +0 -10
  94. ClusterShell-1.9.2/lib/ClusterShell.egg-info/PKG-INFO +0 -99
  95. ClusterShell-1.9.2/tests/TreeWorkerTest.py +0 -448
  96. {ClusterShell-1.9.2 → clustershell-1.10}/COPYING.LGPLv2.1 +0 -0
  97. {ClusterShell-1.9.2 → clustershell-1.10}/conf/clush.conf +0 -0
  98. {ClusterShell-1.9.2 → clustershell-1.10}/conf/clush.conf.d/README +0 -0
  99. {ClusterShell-1.9.2 → clustershell-1.10}/conf/clush.conf.d/sshpass.conf.example +0 -0
  100. {ClusterShell-1.9.2 → clustershell-1.10}/conf/clush.conf.d/sudo.conf.example +0 -0
  101. {ClusterShell-1.9.2 → clustershell-1.10}/conf/groups.conf.d/README +0 -0
  102. {ClusterShell-1.9.2 → clustershell-1.10}/conf/groups.conf.d/ace.conf.example +0 -0
  103. {ClusterShell-1.9.2 → clustershell-1.10}/conf/groups.conf.d/genders.conf.example +0 -0
  104. {ClusterShell-1.9.2 → clustershell-1.10}/conf/groups.conf.d/xcat.conf.example +0 -0
  105. {ClusterShell-1.9.2 → clustershell-1.10}/conf/groups.d/README +0 -0
  106. {ClusterShell-1.9.2 → clustershell-1.10}/conf/groups.d/local.cfg +0 -0
  107. {ClusterShell-1.9.2 → clustershell-1.10}/conf/topology.conf.example +0 -0
  108. {ClusterShell-1.9.2 → clustershell-1.10}/doc/epydoc/clustershell_epydoc.conf +0 -0
  109. {ClusterShell-1.9.2 → clustershell-1.10}/doc/examples/check_nodes.py +0 -0
  110. {ClusterShell-1.9.2 → clustershell-1.10}/doc/examples/defaults.conf-rsh +0 -0
  111. {ClusterShell-1.9.2 → clustershell-1.10}/doc/extras/vim/ftdetect/clustershell.vim +0 -0
  112. {ClusterShell-1.9.2 → clustershell-1.10}/doc/extras/vim/syntax/clushconf.vim +0 -0
  113. {ClusterShell-1.9.2 → clustershell-1.10}/doc/extras/vim/syntax/groupsconf.vim +0 -0
  114. {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/Makefile +0 -0
  115. {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/_static/clustershell-nautilus-logo200.png +0 -0
  116. {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/_static/theme_overrides.css +0 -0
  117. {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/api/Defaults.rst +0 -0
  118. {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/api/EngineTimer.rst +0 -0
  119. {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/api/Event.rst +0 -0
  120. {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/api/MsgTree.rst +0 -0
  121. {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/api/NodeSet.rst +0 -0
  122. {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/api/NodeUtils.rst +0 -0
  123. {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/api/RangeSet.rst +0 -0
  124. {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/api/Task.rst +0 -0
  125. {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/api/index.rst +0 -0
  126. {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/api/workers/ExecWorker.rst +0 -0
  127. {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/api/workers/StreamWorker.rst +0 -0
  128. {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/api/workers/TreeWorker.rst +0 -0
  129. {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/api/workers/Worker.rst +0 -0
  130. {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/api/workers/WorkerPdsh.rst +0 -0
  131. {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/api/workers/WorkerPopen.rst +0 -0
  132. {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/api/workers/WorkerRsh.rst +0 -0
  133. {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/api/workers/WorkerSsh.rst +0 -0
  134. {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/api/workers/index.rst +0 -0
  135. {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/guide/examples.rst +0 -0
  136. {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/guide/index.rst +0 -0
  137. {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/guide/rangesets.rst +0 -0
  138. {ClusterShell-1.9.2 → clustershell-1.10}/doc/sphinx/intro.rst +0 -0
  139. {ClusterShell-1.9.2 → clustershell-1.10}/doc/txt/README +0 -0
  140. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/CLI/Config.py +0 -0
  141. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/CLI/Error.py +0 -0
  142. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/CLI/__init__.py +0 -0
  143. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Defaults.py +0 -0
  144. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Engine/EPoll.py +0 -0
  145. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Engine/Factory.py +0 -0
  146. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Engine/Poll.py +0 -0
  147. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Engine/Select.py +0 -0
  148. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Engine/__init__.py +0 -0
  149. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Event.py +0 -0
  150. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/MsgTree.py +0 -0
  151. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Worker/Exec.py +0 -0
  152. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Worker/Pdsh.py +0 -0
  153. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Worker/Popen.py +0 -0
  154. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Worker/Rsh.py +0 -0
  155. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Worker/Ssh.py +0 -0
  156. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Worker/Worker.py +0 -0
  157. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Worker/__init__.py +0 -0
  158. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell/Worker/fastsubprocess.py +0 -0
  159. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell.egg-info/dependency_links.txt +0 -0
  160. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell.egg-info/requires.txt +0 -0
  161. {ClusterShell-1.9.2 → clustershell-1.10}/lib/ClusterShell.egg-info/top_level.txt +0 -0
  162. {ClusterShell-1.9.2 → clustershell-1.10}/tests/CLIDisplayTest.py +0 -0
  163. {ClusterShell-1.9.2 → clustershell-1.10}/tests/CLIOptionParserTest.py +0 -0
  164. {ClusterShell-1.9.2 → clustershell-1.10}/tests/MsgTreeTest.py +0 -0
  165. {ClusterShell-1.9.2 → clustershell-1.10}/tests/TaskEventTest.py +0 -0
  166. {ClusterShell-1.9.2 → clustershell-1.10}/tests/TaskLocalMixin.py +0 -0
  167. {ClusterShell-1.9.2 → clustershell-1.10}/tests/TaskMsgTreeTest.py +0 -0
  168. {ClusterShell-1.9.2 → clustershell-1.10}/tests/TaskPortTest.py +0 -0
  169. {ClusterShell-1.9.2 → clustershell-1.10}/tests/TaskThreadSuspendTest.py +0 -0
  170. {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 litteral new line in -S, so both -S "\n"
142
- and -S $'\n' will work
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 transfered in xml payload instead of
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 separtor.
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
- ClusterShell is an event-driven open source Python library, designed to run
4
+ [![HPSF Established](https://raw.githubusercontent.com/hpsfoundation/tac/main/badges/HPSF_Project_Badge_Established.png)](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 will take care of common issues encountered on HPC clusters, such
7
- as operating on groups of nodes, running distributed commands using optimized
8
- execution algorithms, as well as gathering results and merging identical
9
- outputs, or retrieving return codes. ClusterShell takes advantage of existing
10
- remote shell facilities already installed on your systems, like SSH.
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
- http://clustershell.readthedocs.org/
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
- $ cd tests
60
- $ nosetests -sv <Test.py>
61
- $ nosetests -sv --all-modules
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
- http://clustershell.readthedocs.org/
97
+ https://clustershell.readthedocs.io/
94
98
 
95
99
  Github source repository:
96
100
 
97
- https://github.com/cea-hpc/clustershell
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/cea-hpc/clustershell/issues
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
- CEA/DAM 2010, 2011, 2012, 2013, 2014, 2015 - http://www-hpc.cea.fr
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
- # http://clustershell.readthedocs.org/en/latest/config.html#node-groups
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")'