ClusterShell 1.9.3__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 (169) hide show
  1. {ClusterShell-1.9.3 → clustershell-1.10}/ChangeLog +73 -0
  2. {ClusterShell-1.9.3 → clustershell-1.10}/MANIFEST.in +1 -0
  3. clustershell-1.10/PKG-INFO +111 -0
  4. {ClusterShell-1.9.3 → clustershell-1.10}/README.md +33 -26
  5. {ClusterShell-1.9.3 → clustershell-1.10}/bash_completion.d/cluset +5 -4
  6. clustershell-1.10/bash_completion.d/clush +159 -0
  7. {ClusterShell-1.9.3 → clustershell-1.10}/conf/groups.conf +1 -1
  8. clustershell-1.10/conf/groups.conf.d/ansible.conf.example +25 -0
  9. {ClusterShell-1.9.3 → clustershell-1.10}/conf/groups.conf.d/slurm.conf.example +7 -0
  10. {ClusterShell-1.9.3 → clustershell-1.10}/conf/groups.d/cluster.yaml.example +1 -0
  11. {ClusterShell-1.9.3 → clustershell-1.10}/doc/man/man1/clubak.1 +6 -3
  12. {ClusterShell-1.9.3 → clustershell-1.10}/doc/man/man1/cluset.1 +6 -3
  13. {ClusterShell-1.9.3 → clustershell-1.10}/doc/man/man1/clush.1 +9 -3
  14. {ClusterShell-1.9.3 → clustershell-1.10}/doc/man/man1/nodeset.1 +6 -3
  15. {ClusterShell-1.9.3 → clustershell-1.10}/doc/man/man5/clush.conf.5 +9 -2
  16. {ClusterShell-1.9.3 → clustershell-1.10}/doc/man/man5/groups.conf.5 +21 -5
  17. clustershell-1.10/doc/sphinx/CHARTER.rst +233 -0
  18. clustershell-1.10/doc/sphinx/acknowledgments.rst +22 -0
  19. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/conf.py +3 -3
  20. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/config.rst +116 -6
  21. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/further.rst +4 -9
  22. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/guide/nodesets.rst +1 -1
  23. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/guide/taskmgnt.rst +8 -7
  24. clustershell-1.10/doc/sphinx/index.rst +34 -0
  25. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/install.rst +8 -6
  26. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/release.rst +132 -1
  27. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/tools/clubak.rst +5 -2
  28. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/tools/cluset.rst +63 -3
  29. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/tools/clush.rst +28 -2
  30. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/tools/nodeset.rst +63 -1
  31. {ClusterShell-1.9.3 → clustershell-1.10}/doc/txt/clubak.txt +6 -4
  32. {ClusterShell-1.9.3 → clustershell-1.10}/doc/txt/cluset.txt +5 -4
  33. {ClusterShell-1.9.3 → clustershell-1.10}/doc/txt/clush.conf.txt +12 -3
  34. {ClusterShell-1.9.3 → clustershell-1.10}/doc/txt/clush.txt +8 -4
  35. {ClusterShell-1.9.3 → clustershell-1.10}/doc/txt/clustershell.rst +1 -1
  36. {ClusterShell-1.9.3 → clustershell-1.10}/doc/txt/groups.conf.txt +21 -6
  37. {ClusterShell-1.9.3 → clustershell-1.10}/doc/txt/nodeset.txt +5 -4
  38. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/CLI/Clubak.py +7 -3
  39. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/CLI/Clush.py +14 -3
  40. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/CLI/Display.py +9 -8
  41. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/CLI/Nodeset.py +12 -8
  42. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/CLI/OptionParser.py +7 -0
  43. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/CLI/Utils.py +12 -0
  44. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Communication.py +24 -7
  45. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Engine/Engine.py +2 -1
  46. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Gateway.py +9 -1
  47. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/NodeSet.py +96 -0
  48. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/NodeUtils.py +87 -15
  49. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Propagation.py +53 -31
  50. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/RangeSet.py +99 -11
  51. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Task.py +35 -6
  52. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Topology.py +3 -0
  53. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Worker/EngineClient.py +9 -4
  54. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Worker/Tree.py +101 -25
  55. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/__init__.py +3 -3
  56. clustershell-1.10/lib/ClusterShell.egg-info/PKG-INFO +111 -0
  57. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell.egg-info/SOURCES.txt +6 -3
  58. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell.egg-info/entry_points.txt +0 -1
  59. {ClusterShell-1.9.3 → clustershell-1.10}/setup.cfg +0 -3
  60. {ClusterShell-1.9.3 → clustershell-1.10}/setup.py +4 -3
  61. {ClusterShell-1.9.3 → clustershell-1.10}/tests/CLIClubakTest.py +33 -1
  62. {ClusterShell-1.9.3 → clustershell-1.10}/tests/CLIClushTest.py +67 -5
  63. {ClusterShell-1.9.3 → clustershell-1.10}/tests/CLIConfigTest.py +1 -1
  64. {ClusterShell-1.9.3 → clustershell-1.10}/tests/CLINodesetTest.py +101 -1
  65. {ClusterShell-1.9.3 → clustershell-1.10}/tests/DefaultsTest.py +1 -1
  66. {ClusterShell-1.9.3 → clustershell-1.10}/tests/MisusageTest.py +1 -1
  67. {ClusterShell-1.9.3 → clustershell-1.10}/tests/NodeSetGroupTest.py +270 -27
  68. {ClusterShell-1.9.3 → clustershell-1.10}/tests/NodeSetTest.py +60 -0
  69. {ClusterShell-1.9.3 → clustershell-1.10}/tests/RangeSetNDTest.py +34 -0
  70. {ClusterShell-1.9.3 → clustershell-1.10}/tests/RangeSetTest.py +66 -3
  71. {ClusterShell-1.9.3 → clustershell-1.10}/tests/StreamWorkerTest.py +38 -0
  72. {ClusterShell-1.9.3 → clustershell-1.10}/tests/TLib.py +21 -2
  73. {ClusterShell-1.9.3 → clustershell-1.10}/tests/TaskDistantMixin.py +1 -1
  74. {ClusterShell-1.9.3 → clustershell-1.10}/tests/TaskDistantPdshMixin.py +1 -1
  75. {ClusterShell-1.9.3 → clustershell-1.10}/tests/TaskDistantPdshTest.py +5 -1
  76. {ClusterShell-1.9.3 → clustershell-1.10}/tests/TaskDistantTest.py +1 -1
  77. {ClusterShell-1.9.3 → clustershell-1.10}/tests/TaskLocalTest.py +1 -1
  78. {ClusterShell-1.9.3 → clustershell-1.10}/tests/TaskRLimitsTest.py +3 -1
  79. {ClusterShell-1.9.3 → clustershell-1.10}/tests/TaskThreadJoinTest.py +35 -0
  80. {ClusterShell-1.9.3 → clustershell-1.10}/tests/TaskTimerTest.py +1 -1
  81. {ClusterShell-1.9.3 → clustershell-1.10}/tests/TreeGatewayTest.py +14 -4
  82. {ClusterShell-1.9.3 → clustershell-1.10}/tests/TreeTaskTest.py +4 -4
  83. {ClusterShell-1.9.3 → clustershell-1.10}/tests/TreeTopologyTest.py +8 -2
  84. clustershell-1.10/tests/TreeWorkerTest.py +1157 -0
  85. {ClusterShell-1.9.3 → clustershell-1.10}/tests/WorkerExecTest.py +1 -1
  86. clustershell-1.10/tests/__init__.py +0 -0
  87. clustershell-1.10/tests/bin/hostname +4 -0
  88. ClusterShell-1.9.3/PKG-INFO +0 -96
  89. ClusterShell-1.9.3/bash_completion.d/clush +0 -91
  90. ClusterShell-1.9.3/doc/sphinx/clustershell-nautilus-logo200.png +0 -0
  91. ClusterShell-1.9.3/doc/sphinx/index.rst +0 -25
  92. ClusterShell-1.9.3/lib/ClusterShell.egg-info/PKG-INFO +0 -96
  93. ClusterShell-1.9.3/tests/TreeWorkerTest.py +0 -448
  94. {ClusterShell-1.9.3 → clustershell-1.10}/COPYING.LGPLv2.1 +0 -0
  95. {ClusterShell-1.9.3 → clustershell-1.10}/conf/clush.conf +0 -0
  96. {ClusterShell-1.9.3 → clustershell-1.10}/conf/clush.conf.d/README +0 -0
  97. {ClusterShell-1.9.3 → clustershell-1.10}/conf/clush.conf.d/sshpass.conf.example +0 -0
  98. {ClusterShell-1.9.3 → clustershell-1.10}/conf/clush.conf.d/sudo.conf.example +0 -0
  99. {ClusterShell-1.9.3 → clustershell-1.10}/conf/groups.conf.d/README +0 -0
  100. {ClusterShell-1.9.3 → clustershell-1.10}/conf/groups.conf.d/ace.conf.example +0 -0
  101. {ClusterShell-1.9.3 → clustershell-1.10}/conf/groups.conf.d/genders.conf.example +0 -0
  102. {ClusterShell-1.9.3 → clustershell-1.10}/conf/groups.conf.d/xcat.conf.example +0 -0
  103. {ClusterShell-1.9.3 → clustershell-1.10}/conf/groups.d/README +0 -0
  104. {ClusterShell-1.9.3 → clustershell-1.10}/conf/groups.d/local.cfg +0 -0
  105. {ClusterShell-1.9.3 → clustershell-1.10}/conf/topology.conf.example +0 -0
  106. {ClusterShell-1.9.3 → clustershell-1.10}/doc/epydoc/clustershell_epydoc.conf +0 -0
  107. {ClusterShell-1.9.3 → clustershell-1.10}/doc/examples/check_nodes.py +0 -0
  108. {ClusterShell-1.9.3 → clustershell-1.10}/doc/examples/defaults.conf-rsh +0 -0
  109. {ClusterShell-1.9.3 → clustershell-1.10}/doc/extras/vim/ftdetect/clustershell.vim +0 -0
  110. {ClusterShell-1.9.3 → clustershell-1.10}/doc/extras/vim/syntax/clushconf.vim +0 -0
  111. {ClusterShell-1.9.3 → clustershell-1.10}/doc/extras/vim/syntax/groupsconf.vim +0 -0
  112. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/Makefile +0 -0
  113. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/_static/clustershell-nautilus-logo200.png +0 -0
  114. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/_static/theme_overrides.css +0 -0
  115. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/api/Defaults.rst +0 -0
  116. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/api/EngineTimer.rst +0 -0
  117. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/api/Event.rst +0 -0
  118. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/api/MsgTree.rst +0 -0
  119. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/api/NodeSet.rst +0 -0
  120. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/api/NodeUtils.rst +0 -0
  121. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/api/RangeSet.rst +0 -0
  122. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/api/Task.rst +0 -0
  123. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/api/index.rst +0 -0
  124. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/api/workers/ExecWorker.rst +0 -0
  125. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/api/workers/StreamWorker.rst +0 -0
  126. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/api/workers/TreeWorker.rst +0 -0
  127. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/api/workers/Worker.rst +0 -0
  128. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/api/workers/WorkerPdsh.rst +0 -0
  129. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/api/workers/WorkerPopen.rst +0 -0
  130. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/api/workers/WorkerRsh.rst +0 -0
  131. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/api/workers/WorkerSsh.rst +0 -0
  132. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/api/workers/index.rst +0 -0
  133. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/guide/examples.rst +0 -0
  134. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/guide/index.rst +0 -0
  135. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/guide/rangesets.rst +0 -0
  136. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/intro.rst +0 -0
  137. {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/tools/index.rst +0 -0
  138. {ClusterShell-1.9.3 → clustershell-1.10}/doc/txt/README +0 -0
  139. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/CLI/Config.py +0 -0
  140. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/CLI/Error.py +0 -0
  141. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/CLI/__init__.py +0 -0
  142. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Defaults.py +0 -0
  143. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Engine/EPoll.py +0 -0
  144. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Engine/Factory.py +0 -0
  145. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Engine/Poll.py +0 -0
  146. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Engine/Select.py +0 -0
  147. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Engine/__init__.py +0 -0
  148. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Event.py +0 -0
  149. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/MsgTree.py +0 -0
  150. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Worker/Exec.py +0 -0
  151. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Worker/Pdsh.py +0 -0
  152. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Worker/Popen.py +0 -0
  153. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Worker/Rsh.py +0 -0
  154. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Worker/Ssh.py +0 -0
  155. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Worker/Worker.py +0 -0
  156. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Worker/__init__.py +0 -0
  157. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Worker/fastsubprocess.py +0 -0
  158. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell.egg-info/dependency_links.txt +0 -0
  159. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell.egg-info/requires.txt +0 -0
  160. {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell.egg-info/top_level.txt +0 -0
  161. {ClusterShell-1.9.3 → clustershell-1.10}/tests/CLIDisplayTest.py +0 -0
  162. {ClusterShell-1.9.3 → clustershell-1.10}/tests/CLIOptionParserTest.py +0 -0
  163. {ClusterShell-1.9.3 → clustershell-1.10}/tests/MsgTreeTest.py +0 -0
  164. {ClusterShell-1.9.3 → clustershell-1.10}/tests/TaskEventTest.py +0 -0
  165. {ClusterShell-1.9.3 → clustershell-1.10}/tests/TaskLocalMixin.py +0 -0
  166. {ClusterShell-1.9.3 → clustershell-1.10}/tests/TaskMsgTreeTest.py +0 -0
  167. {ClusterShell-1.9.3 → clustershell-1.10}/tests/TaskPortTest.py +0 -0
  168. {ClusterShell-1.9.3 → clustershell-1.10}/tests/TaskThreadSuspendTest.py +0 -0
  169. {ClusterShell-1.9.3 → clustershell-1.10}/tests/TaskTimeoutTest.py +0 -0
@@ -1,3 +1,76 @@
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
+
1
74
  2025-01-23 S. Thiell <sthiell@stanford.edu>
2
75
 
3
76
  * Version 1.9.3 released. The main changes are listed below.
@@ -32,3 +32,4 @@ include doc/examples/*.py
32
32
  include doc/examples/defaults.conf-rsh
33
33
  include doc/epydoc/*.conf
34
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.
@@ -25,8 +25,9 @@ _cluset()
25
25
  "") ;;
26
26
  --) return;;
27
27
  # no-arg options
28
- --version|-h|--help|-n|--nostdin|-a|--all|-q|--quiet|\
29
- -v|--verbose|-d|--debug) ;;
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) ;;
30
31
  # get source separately...
31
32
  --groupsource=*) groupsource="${word#*=}";;
32
33
  -s|--groupsource) skip=groupsource;;
@@ -39,7 +40,7 @@ _cluset()
39
40
  done
40
41
 
41
42
  case "$prev" in
42
- -c|--count|-e|--expand|-f|--fold|\
43
+ -c|--count|-e|--expand|-f|--fold|--index|\
43
44
  -x|--exclude|-i|--intersection|-X|--xor)
44
45
  case "$cur" in
45
46
  *:*)
@@ -63,7 +64,7 @@ _cluset()
63
64
  # no-arg options
64
65
  --version|-h|--help|-l|--list|-L|--list-all|-r|--regroup|\
65
66
  --list-sources|--groupsources|-d|--debug|-q|--quiet|\
66
- -R|--rangeset|-G|--groupbase|--contiguous) ;;
67
+ -R|--rangeset|-G|--groupbase|--contiguous|-a|--all|--completion) ;;
67
68
  # any other option: just ignore.
68
69
  -*)
69
70
  return;;
@@ -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")'
@@ -8,6 +8,7 @@
8
8
  #
9
9
  [slurmpart,sp]
10
10
  map: sinfo -h -o "%N" -p $GROUP
11
+ mapall: sinfo -h -o "%R:%N"
11
12
  all: sinfo -h -o "%N"
12
13
  list: sinfo -h -o "%R"
13
14
  reverse: sinfo -h -N -o "%R" -n $NODE
@@ -17,6 +18,7 @@ reverse: sinfo -h -N -o "%R" -n $NODE
17
18
  #
18
19
  [slurmresv,sr]
19
20
  map: scontrol -o show reservation $GROUP | grep -Po 'Nodes=\K[^ ]+'
21
+ mapall: scontrol -o show reservation | sed -n 's/^ReservationName=\([^ :]*\) .* Nodes=\([^ ]*\).*/\1:\2/p'
20
22
  all: scontrol -o show reservation | grep -Po 'Nodes=\K[^ ]+'
21
23
  list: scontrol -o show reservation | grep -Po 'ReservationName=\K[^ ]+'
22
24
  cache_time: 60
@@ -26,6 +28,7 @@ cache_time: 60
26
28
  #
27
29
  [slurmstate,st]
28
30
  map: sinfo -h -o "%N" -t $GROUP
31
+ mapall: sinfo -h -o "%T:%N" | sed 's/[*~#!%$@+^-]*:/:/'
29
32
  all: sinfo -h -o "%N"
30
33
  list: sinfo -h -o "%T" | tr -d '*~#!%$@+^-'
31
34
  reverse: sinfo -h -N -o "%T" -n $NODE | tr -d '*~#!%$@+^-'
@@ -36,6 +39,7 @@ cache_time: 60
36
39
  #
37
40
  [slurmjob,sj]
38
41
  map: squeue -h -j $GROUP -o "%N"
42
+ mapall: squeue -h -o "%i:%N" -t R
39
43
  list: squeue -h -o "%i" -t R
40
44
  reverse: squeue -h -w $NODE -o "%i"
41
45
  cache_time: 60
@@ -45,6 +49,7 @@ cache_time: 60
45
49
  #
46
50
  [slurmuser,su]
47
51
  map: squeue -h -u $GROUP -o "%N" -t R
52
+ mapall: squeue -h -o "%u:%N" -t R
48
53
  list: squeue -h -o "%u" -t R
49
54
  reverse: squeue -h -w $NODE -o "%u"
50
55
  cache_time: 60
@@ -54,6 +59,7 @@ cache_time: 60
54
59
  #
55
60
  [slurmaccount,sa]
56
61
  map: squeue -h -A $GROUP -o "%N" -t R
62
+ mapall: squeue -h -o "%a:%N" -t R
57
63
  list: squeue -h -o "%a" -t R
58
64
  reverse: squeue -h -w $NODE -o "%a" 2>/dev/null || true
59
65
  cache_time: 60
@@ -63,6 +69,7 @@ cache_time: 60
63
69
  #
64
70
  [slurmqos,sq]
65
71
  map: squeue -h -q $GROUP -o "%N" -t R
72
+ mapall: squeue -h -o "%q:%N" -t R
66
73
  list: squeue -h -o "%q" -t R
67
74
  reverse: squeue -h -w $NODE -o "%q" 2>/dev/null || true
68
75
  cache_time: 60
@@ -24,6 +24,7 @@ roles:
24
24
  io: '@racks:rack2,example2'
25
25
  compute: '@racks:rack[3-4]'
26
26
  gpu: '@racks:rack4'
27
+ # '*' is the all-nodes wildcard, e.g. @roles:* or clush -a, not 'all'
27
28
  # the 'all' special group is only needed if we don't want all nodes from
28
29
  # this group source included, here we don't want example0 for clush -a
29
30
  all: '@io,@compute'
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
27
27
  .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
28
28
  .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
29
29
  ..
30
- .TH "CLUBAK" "1" "2025-01-23" "1.9.3" "ClusterShell User Manual"
30
+ .TH "CLUBAK" 1 "2026-07-04" "1.10" "ClusterShell User Manual"
31
31
  .SH NAME
32
32
  clubak \- format output from clush/pdsh-like output and more
33
33
  .SH SYNOPSIS
@@ -68,6 +68,9 @@ disable header block and order output by nodes
68
68
  .B \-r\fP,\fB \-\-regroup
69
69
  fold nodeset using node groups
70
70
  .TP
71
+ .BI \-\-axis\fB= RANGESET
72
+ for nD nodesets, fold the displayed nodeset (eg. in gathered output headers) along provided axis only. Axis are indexed from 1 to n and can be specified here either using the rangeset syntax, eg. \(aq1\(aq, \(aq1\-2\(aq, \(aq1,3\(aq, or by a single negative number meaning that the index is counted from the end. Because some nodesets may have several different dimensions, axis indices are silently truncated to fall in the allowed range. This is the per\-invocation equivalent of the \fBfold_axis\fP library default.
73
+ .TP
71
74
  .BI \-s \ GROUPSOURCE\fR,\fB \ \-\-groupsource\fB= GROUPSOURCE
72
75
  optional \fBgroups.conf\fP(5) group source to use
73
76
  .TP
@@ -133,12 +136,12 @@ node2: 9
133
136
  .sp
134
137
  \fBcluset\fP(1), \fBclush\fP(1), \fBnodeset\fP(1), \fBgroups.conf\fP(5).
135
138
  .sp
136
- <http://clustershell.readthedocs.org/>
139
+ \fI\%https://clustershell.readthedocs.io/\fP
137
140
  .SH BUG REPORTS
138
141
  .INDENT 0.0
139
142
  .TP
140
143
  .B Use the following URL to submit a bug report or feedback:
141
- <https://github.com/cea\-hpc/clustershell/issues>
144
+ \fI\%https://github.com/clustershell/clustershell/issues\fP
142
145
  .UNINDENT
143
146
  .SH AUTHOR
144
147
  Stephane Thiell <sthiell@stanford.edu>
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
27
27
  .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
28
28
  .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
29
29
  ..
30
- .TH "CLUSET" "1" "2025-01-23" "1.9.3" "ClusterShell User Manual"
30
+ .TH "CLUSET" 1 "2026-07-04" "1.10" "ClusterShell User Manual"
31
31
  .SH NAME
32
32
  cluset \- compute advanced cluster node set operations
33
33
  .SH SYNOPSIS
@@ -88,6 +88,9 @@ list node groups from all group sources (\fB\-LL\fP shows nodes and \fB\-LLL\fP
88
88
  .B \-r\fP,\fB \-\-regroup
89
89
  fold nodes using node groups (see \-s \fIGROUPSOURCE\fP)
90
90
  .TP
91
+ .BI \-\-index\fB= NODE
92
+ output the index of NODE in the nodeset (reverse of \-I/\-\-slice)
93
+ .TP
91
94
  .B \-\-groupsources
92
95
  list all active group sources (see \fBgroups.conf\fP(5))
93
96
  .UNINDENT
@@ -477,12 +480,12 @@ command and also to conform with ClusterShell\(aqs \(dqclu*\(dq command nomencla
477
480
  .sp
478
481
  \fBclubak\fP(1), \fBclush\fP(1), \fBnodeset\fP(1), \fBgroups.conf\fP(5).
479
482
  .sp
480
- <http://clustershell.readthedocs.org/>
483
+ \fI\%https://clustershell.readthedocs.io/\fP
481
484
  .SH BUG REPORTS
482
485
  .INDENT 0.0
483
486
  .TP
484
487
  .B Use the following URL to submit a bug report or feedback:
485
- <https://github.com/cea\-hpc/clustershell/issues>
488
+ \fI\%https://github.com/clustershell/clustershell/issues\fP
486
489
  .UNINDENT
487
490
  .SH AUTHOR
488
491
  Stephane Thiell <sthiell@stanford.edu>