ClusterShell 1.5.1__tar.gz → 1.7__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 (176) hide show
  1. {clustershell-1.5.1 → clustershell-1.7}/ChangeLog +393 -1
  2. clustershell-1.7/README.md +128 -0
  3. {clustershell-1.5.1 → clustershell-1.7}/clustershell.spec +29 -6
  4. clustershell-1.7/conf/clush.conf +28 -0
  5. clustershell-1.7/conf/groups.conf +45 -0
  6. clustershell-1.7/conf/groups.conf.d/README +5 -0
  7. clustershell-1.7/conf/groups.conf.d/ace.conf.example +32 -0
  8. clustershell-1.7/conf/groups.conf.d/genders.conf.example +12 -0
  9. clustershell-1.7/conf/groups.conf.d/slurm.conf.example +21 -0
  10. clustershell-1.7/conf/groups.d/README +22 -0
  11. clustershell-1.7/conf/groups.d/cluster.yaml.example +48 -0
  12. clustershell-1.7/conf/groups.d/local.cfg +17 -0
  13. clustershell-1.7/conf/topology.conf.example +12 -0
  14. {clustershell-1.5.1 → clustershell-1.7}/doc/epydoc/clustershell_epydoc.conf +0 -2
  15. clustershell-1.7/doc/examples/check_nodes.py +113 -0
  16. clustershell-1.7/doc/examples/defaults.conf-rsh +13 -0
  17. clustershell-1.7/doc/extras/vim/ftdetect/clustershell.vim +6 -0
  18. {clustershell-1.5.1 → clustershell-1.7}/doc/extras/vim/syntax/clushconf.vim +3 -2
  19. {clustershell-1.5.1 → clustershell-1.7}/doc/extras/vim/syntax/groupsconf.vim +10 -6
  20. {clustershell-1.5.1 → clustershell-1.7}/doc/man/man1/clubak.1 +15 -27
  21. {clustershell-1.5.1 → clustershell-1.7}/doc/man/man1/clush.1 +103 -95
  22. {clustershell-1.5.1 → clustershell-1.7}/doc/man/man1/nodeset.1 +132 -61
  23. {clustershell-1.5.1 → clustershell-1.7}/doc/man/man5/clush.conf.5 +36 -29
  24. clustershell-1.7/doc/man/man5/groups.conf.5 +213 -0
  25. clustershell-1.7/doc/sphinx/Makefile +154 -0
  26. clustershell-1.7/doc/sphinx/_static/clustershell-nautilus-logo200.png +0 -0
  27. clustershell-1.7/doc/sphinx/_static/theme_overrides.css +12 -0
  28. clustershell-1.7/doc/sphinx/api/Defaults.rst +13 -0
  29. clustershell-1.7/doc/sphinx/api/EngineTimer.rst +9 -0
  30. clustershell-1.7/doc/sphinx/api/Event.rst +10 -0
  31. clustershell-1.7/doc/sphinx/api/MsgTree.rst +9 -0
  32. clustershell-1.7/doc/sphinx/api/NodeSet.rst +15 -0
  33. clustershell-1.7/doc/sphinx/api/NodeUtils.rst +15 -0
  34. clustershell-1.7/doc/sphinx/api/RangeSet.rst +17 -0
  35. clustershell-1.7/doc/sphinx/api/Task.rst +13 -0
  36. clustershell-1.7/doc/sphinx/api/index.rst +17 -0
  37. clustershell-1.7/doc/sphinx/api/workers/ExecWorker.rst +13 -0
  38. clustershell-1.7/doc/sphinx/api/workers/StreamWorker.rst +12 -0
  39. clustershell-1.7/doc/sphinx/api/workers/Worker.rst +13 -0
  40. clustershell-1.7/doc/sphinx/api/workers/WorkerPdsh.rst +16 -0
  41. clustershell-1.7/doc/sphinx/api/workers/WorkerPopen.rst +13 -0
  42. clustershell-1.7/doc/sphinx/api/workers/WorkerRsh.rst +16 -0
  43. clustershell-1.7/doc/sphinx/api/workers/WorkerSsh.rst +16 -0
  44. clustershell-1.7/doc/sphinx/api/workers/index.rst +22 -0
  45. clustershell-1.7/doc/sphinx/clustershell-nautilus-logo200.png +1 -0
  46. clustershell-1.7/doc/sphinx/conf.py +254 -0
  47. clustershell-1.7/doc/sphinx/config.rst +379 -0
  48. clustershell-1.7/doc/sphinx/further.rst +34 -0
  49. clustershell-1.7/doc/sphinx/guide/examples.rst +253 -0
  50. clustershell-1.7/doc/sphinx/guide/index.rst +21 -0
  51. clustershell-1.7/doc/sphinx/guide/nodesets.rst +319 -0
  52. clustershell-1.7/doc/sphinx/guide/rangesets.rst +76 -0
  53. clustershell-1.7/doc/sphinx/guide/taskmgnt.rst +313 -0
  54. clustershell-1.7/doc/sphinx/index.rst +25 -0
  55. clustershell-1.7/doc/sphinx/install.rst +189 -0
  56. clustershell-1.7/doc/sphinx/intro.rst +39 -0
  57. clustershell-1.7/doc/sphinx/release.rst +235 -0
  58. clustershell-1.7/doc/sphinx/tools/clubak.rst +94 -0
  59. clustershell-1.7/doc/sphinx/tools/clush.rst +515 -0
  60. clustershell-1.7/doc/sphinx/tools/index.rst +19 -0
  61. clustershell-1.7/doc/sphinx/tools/nodeset.rst +926 -0
  62. {clustershell-1.5.1 → clustershell-1.7}/doc/txt/clubak.txt +5 -4
  63. {clustershell-1.5.1 → clustershell-1.7}/doc/txt/clush.conf.txt +31 -14
  64. {clustershell-1.5.1 → clustershell-1.7}/doc/txt/clush.txt +81 -30
  65. {clustershell-1.5.1 → clustershell-1.7}/doc/txt/clustershell.rst +11 -8
  66. clustershell-1.7/doc/txt/groups.conf.txt +186 -0
  67. {clustershell-1.5.1 → clustershell-1.7}/doc/txt/nodeset.txt +73 -15
  68. {clustershell-1.5.1 → clustershell-1.7}/lib/ClusterShell/CLI/Clubak.py +58 -28
  69. {clustershell-1.5.1 → clustershell-1.7}/lib/ClusterShell/CLI/Clush.py +338 -137
  70. {clustershell-1.5.1 → clustershell-1.7}/lib/ClusterShell/CLI/Config.py +51 -18
  71. {clustershell-1.5.1 → clustershell-1.7}/lib/ClusterShell/CLI/Display.py +84 -13
  72. {clustershell-1.5.1 → clustershell-1.7}/lib/ClusterShell/CLI/Error.py +19 -10
  73. {clustershell-1.5.1 → clustershell-1.7}/lib/ClusterShell/CLI/Nodeset.py +145 -62
  74. {clustershell-1.5.1 → clustershell-1.7}/lib/ClusterShell/CLI/OptionParser.py +123 -59
  75. {clustershell-1.5.1 → clustershell-1.7}/lib/ClusterShell/CLI/Utils.py +22 -7
  76. clustershell-1.7/lib/ClusterShell/Communication.py +431 -0
  77. clustershell-1.7/lib/ClusterShell/Defaults.py +242 -0
  78. {clustershell-1.5.1 → clustershell-1.7}/lib/ClusterShell/Engine/EPoll.py +47 -63
  79. {clustershell-1.5.1 → clustershell-1.7}/lib/ClusterShell/Engine/Engine.py +238 -296
  80. {clustershell-1.5.1 → clustershell-1.7}/lib/ClusterShell/Engine/Factory.py +10 -5
  81. {clustershell-1.5.1 → clustershell-1.7}/lib/ClusterShell/Engine/Poll.py +39 -55
  82. {clustershell-1.5.1 → clustershell-1.7}/lib/ClusterShell/Engine/Select.py +29 -44
  83. clustershell-1.7/lib/ClusterShell/Event.py +163 -0
  84. clustershell-1.7/lib/ClusterShell/Gateway.py +359 -0
  85. {clustershell-1.5.1 → clustershell-1.7}/lib/ClusterShell/MsgTree.py +33 -28
  86. clustershell-1.7/lib/ClusterShell/NodeSet.py +1552 -0
  87. clustershell-1.7/lib/ClusterShell/NodeSet.py-XD2.py +1488 -0
  88. clustershell-1.7/lib/ClusterShell/NodeUtils.py +631 -0
  89. clustershell-1.7/lib/ClusterShell/Propagation.py +421 -0
  90. clustershell-1.7/lib/ClusterShell/RangeSet.py +1448 -0
  91. {clustershell-1.5.1 → clustershell-1.7}/lib/ClusterShell/Task.py +461 -252
  92. clustershell-1.7/lib/ClusterShell/Topology.py +461 -0
  93. clustershell-1.7/lib/ClusterShell/Worker/EngineClient.py +530 -0
  94. clustershell-1.7/lib/ClusterShell/Worker/Exec.py +393 -0
  95. clustershell-1.7/lib/ClusterShell/Worker/Pdsh.py +276 -0
  96. {clustershell-1.5.1 → clustershell-1.7}/lib/ClusterShell/Worker/Popen.py +54 -78
  97. clustershell-1.7/lib/ClusterShell/Worker/Rsh.py +147 -0
  98. clustershell-1.7/lib/ClusterShell/Worker/Ssh.py +176 -0
  99. clustershell-1.7/lib/ClusterShell/Worker/Tree.py +431 -0
  100. clustershell-1.7/lib/ClusterShell/Worker/Worker.py +661 -0
  101. {clustershell-1.5.1 → clustershell-1.7}/lib/ClusterShell/Worker/fastsubprocess.py +3 -6
  102. {clustershell-1.5.1 → clustershell-1.7}/lib/ClusterShell/__init__.py +15 -14
  103. {clustershell-1.5.1 → clustershell-1.7}/scripts/clubak.py +0 -1
  104. {clustershell-1.5.1 → clustershell-1.7}/scripts/clush.py +0 -1
  105. {clustershell-1.5.1 → clustershell-1.7}/scripts/nodeset.py +0 -1
  106. {clustershell-1.5.1 → clustershell-1.7}/setup.py +29 -12
  107. clustershell-1.7/tests/CLIClubakTest.py +134 -0
  108. clustershell-1.7/tests/CLIClushTest.py +487 -0
  109. clustershell-1.5.1/tests/CLIConfig.py → clustershell-1.7/tests/CLIConfigTest.py +82 -22
  110. clustershell-1.5.1/tests/CLIDisplay.py → clustershell-1.7/tests/CLIDisplayTest.py +32 -36
  111. clustershell-1.7/tests/CLINodesetTest.py +719 -0
  112. clustershell-1.5.1/tests/CLIOptionParser.py → clustershell-1.7/tests/CLIOptionParserTest.py +2 -3
  113. clustershell-1.7/tests/DefaultsTest.py +202 -0
  114. {clustershell-1.5.1 → clustershell-1.7}/tests/MisusageTest.py +3 -3
  115. {clustershell-1.5.1 → clustershell-1.7}/tests/MsgTreeTest.py +81 -11
  116. clustershell-1.7/tests/NodeSetErrorTest.py +182 -0
  117. clustershell-1.7/tests/NodeSetGroupTest.py +1539 -0
  118. clustershell-1.7/tests/NodeSetTest.py +2502 -0
  119. {clustershell-1.5.1 → clustershell-1.7}/tests/RangeSetErrorTest.py +0 -1
  120. clustershell-1.7/tests/RangeSetNDTest.py +507 -0
  121. {clustershell-1.5.1 → clustershell-1.7}/tests/RangeSetTest.py +453 -59
  122. clustershell-1.7/tests/StreamWorkerTest.py +202 -0
  123. clustershell-1.7/tests/TLib.py +107 -0
  124. clustershell-1.5.1/tests/TaskDistantTest.py → clustershell-1.7/tests/TaskDistantMixin.py +332 -217
  125. clustershell-1.7/tests/TaskDistantPdshMixin.py +527 -0
  126. clustershell-1.7/tests/TaskDistantPdshTest.py +68 -0
  127. clustershell-1.7/tests/TaskDistantTest.py +68 -0
  128. clustershell-1.7/tests/TaskEventTest.py +252 -0
  129. clustershell-1.5.1/tests/TaskLocalTest.py → clustershell-1.7/tests/TaskLocalMixin.py +303 -88
  130. clustershell-1.7/tests/TaskLocalTest.py +66 -0
  131. {clustershell-1.5.1 → clustershell-1.7}/tests/TaskMsgTreeTest.py +62 -30
  132. {clustershell-1.5.1 → clustershell-1.7}/tests/TaskPortTest.py +0 -1
  133. {clustershell-1.5.1 → clustershell-1.7}/tests/TaskRLimitsTest.py +5 -4
  134. {clustershell-1.5.1 → clustershell-1.7}/tests/TaskThreadJoinTest.py +1 -7
  135. {clustershell-1.5.1 → clustershell-1.7}/tests/TaskThreadSuspendTest.py +0 -1
  136. {clustershell-1.5.1 → clustershell-1.7}/tests/TaskTimeoutTest.py +0 -1
  137. {clustershell-1.5.1 → clustershell-1.7}/tests/TaskTimerTest.py +94 -23
  138. clustershell-1.7/tests/TreeCopyTest.py +71 -0
  139. clustershell-1.7/tests/TreeGatewayTest.py +470 -0
  140. clustershell-1.7/tests/TreeTaskTest.py +60 -0
  141. clustershell-1.7/tests/TreeTopologyTest.py +443 -0
  142. clustershell-1.7/tests/WorkerExecTest.py +149 -0
  143. clustershell-1.7/tests/fromlist_timeit.py +16 -0
  144. clustershell-1.7/tests/replace_timeit.py +12 -0
  145. clustershell-1.7/tests/t.py +9 -0
  146. {clustershell-1.5.1 → clustershell-1.7}/tests/test_command.py +0 -1
  147. clustershell-1.5.1/README +0 -138
  148. clustershell-1.5.1/conf/clush.conf +0 -18
  149. clustershell-1.5.1/conf/groups.conf +0 -26
  150. clustershell-1.5.1/doc/extras/vim/ftdetect/clustershell.vim +0 -6
  151. clustershell-1.5.1/doc/man/man5/groups.conf.5 +0 -139
  152. clustershell-1.5.1/doc/txt/groups.conf.txt +0 -113
  153. clustershell-1.5.1/lib/ClusterShell/Event.py +0 -95
  154. clustershell-1.5.1/lib/ClusterShell/NodeSet.py +0 -1978
  155. clustershell-1.5.1/lib/ClusterShell/NodeUtils.py +0 -334
  156. clustershell-1.5.1/lib/ClusterShell/Worker/EngineClient.py +0 -429
  157. clustershell-1.5.1/lib/ClusterShell/Worker/Pdsh.py +0 -316
  158. clustershell-1.5.1/lib/ClusterShell/Worker/Ssh.py +0 -350
  159. clustershell-1.5.1/lib/ClusterShell/Worker/Worker.py +0 -536
  160. clustershell-1.5.1/tests/ClushScriptTest.py +0 -137
  161. clustershell-1.5.1/tests/NodeSetErrorTest.py +0 -72
  162. clustershell-1.5.1/tests/NodeSetGroupTest.py +0 -625
  163. clustershell-1.5.1/tests/NodeSetScriptTest.py +0 -339
  164. clustershell-1.5.1/tests/NodeSetTest.py +0 -1255
  165. clustershell-1.5.1/tests/TaskAdvancedTest.py +0 -138
  166. clustershell-1.5.1/tests/TaskDistantPdshTest.py +0 -490
  167. clustershell-1.5.1/tests/TaskEventTest.py +0 -156
  168. clustershell-1.5.1/tests/__init__.py +0 -0
  169. clustershell-1.5.1/tests/run_testsuite.py +0 -66
  170. {clustershell-1.5.1 → clustershell-1.7}/Licence_CeCILL-C_V1-en.txt +0 -0
  171. {clustershell-1.5.1 → clustershell-1.7}/Licence_CeCILL-C_V1-fr.txt +0 -0
  172. {clustershell-1.5.1 → clustershell-1.7}/doc/txt/README +0 -0
  173. {clustershell-1.5.1 → clustershell-1.7}/lib/ClusterShell/CLI/__init__.py +0 -0
  174. {clustershell-1.5.1 → clustershell-1.7}/lib/ClusterShell/Engine/__init__.py +0 -0
  175. {clustershell-1.5.1 → clustershell-1.7}/lib/ClusterShell/Worker/__init__.py +0 -0
  176. {clustershell-1.5.1 → clustershell-1.7}/setup.cfg +0 -0
@@ -1,3 +1,384 @@
1
+ 2015-11-10 S. Thiell <sthiell@stanford.edu>
2
+
3
+ * Version 1.7 released.
4
+
5
+ 2015-11-01 S. Thiell <sthiell@stanford.edu>
6
+
7
+ * Clush.py: added -P/--progress to force display of the live progress
8
+ indicator and display global write bandwidth when writing standard input.
9
+
10
+ 2015-10-25 S. Thiell <sthiell@stanford.edu>
11
+
12
+ * Clush.py: added --option/-O clush.conf settings override (pull
13
+ request #248).
14
+
15
+ 2015-10-18 S. Thiell <sthiell@stanford.edu>
16
+
17
+ * Clush.py: added --hostfile command line option to specify a file
18
+ containing single hosts, node sets or node groups (ticket #235).
19
+
20
+ 2015-10-16 S. Thiell <sthiell@stanford.edu>
21
+
22
+ * NodeSet.py: enhancing parser to recognize nodesets with brackets having
23
+ leading/trailing digits like in "prod-00[01-99]" (ticket #228).
24
+
25
+ 2015-08-29 S. Thiell <sthiell@stanford.edu>
26
+
27
+ * CLI/Nodeset.py: added --axis option to choose nD fold axis (ticket
28
+ #269).
29
+ * NodeSet.py: added fold_axis public member to NodeSetBase along with
30
+ expand algorithm when casting to string to choose nD fold axis (ticket
31
+ #269).
32
+
33
+ 2015-08-28 S. Thiell <sthiell@stanford.edu>
34
+
35
+ * CLI/Config.py: better per-user clush.conf support. clush now also checks
36
+ for $XDG_CONFIG_HOME/clustershell/clush.conf and
37
+ $HOME/.local/etc/clustershell/clush.conf (ticket #111).
38
+
39
+ 2015-08-27 S. Thiell <sthiell@stanford.edu>
40
+
41
+ * CLI/Nodeset.py: add --list-all / -L to list groups from all group
42
+ sources (ticket #266). If repeated, it has the same behavior than -l.
43
+
44
+ * NodeUtils.py: add support for built-in groups definition files based on
45
+ YAML. Added autodir configuration option in groups.conf to declare a
46
+ directory where .yaml files are automatically loaded. Example available in
47
+ groups.d/cluster.yaml.example. Added support for groups.conf section with
48
+ multiple source names separated by comma. This is also the case for
49
+ groups.conf.d/*.conf extensions. Also added new upcall command $SOURCE
50
+ variable that is replaced by calling source name before execution.
51
+ Finally, /etc/clustershell/groups is now deprecated and replaced by
52
+ /etc/clustershell/groups.d/local.cfg for new installation (ticket #258).
53
+
54
+ 2015-07-07 S. Thiell <sthiell@stanford.edu>
55
+
56
+ * CLI/Nodeset.py: add --autostep=auto and --autostep=x% option (#161).
57
+
58
+ * NodeSet: add autostep property to allow changing the way every RangeSet of
59
+ a NodeSet object is displayed (eg. node[2-8/2] instead of node[2,4,6,8]).
60
+ Autostep value is the min number of indexes that are found at equal distance
61
+ of each other inside a range before NodeSet starts to use this syntax.
62
+
63
+ 2015-05-18 S. Thiell <stephane.thiell@cea.fr>
64
+
65
+ * Version 1.6.92 released.
66
+
67
+ 2015-04-10 S. Thiell <stephane.thiell@cea.fr>
68
+
69
+ * Tree: implement task.copy() in tree mode using temporary tar file.
70
+
71
+ 2015-04-01 S. Thiell <stephane.thiell@cea.fr>
72
+
73
+ * Tree: allow local command execution on gateways by adding remote=False to
74
+ task.shell()/run(). In practice with this patch, we can now easily
75
+ execute local commands on (remote) gateways using node argument like
76
+ `ipmitool -H %h` to spread the load between gateways.
77
+
78
+ 2015-03-24 S. Thiell <stephane.thiell@cea.fr>
79
+
80
+ * NodeSet.py: disallow opening bracket after digit (ticket #228).
81
+
82
+ 2015-03-23 S. Thiell <stephane.thiell@cea.fr>
83
+
84
+ * Clush.py: Warn user of possible use of shell globbing, especially when
85
+ using brackets and bash without GLOBIGNORE set (ticket #225).
86
+ * Clush.py: Fix --diff against null content (ticket #214).
87
+
88
+ 2015-03-19 S. Thiell <stephane.thiell@cea.fr>
89
+
90
+ * Task.py: Make max_retcode() return None on no-op. Until now, max_retcode()
91
+ returned 0 by default, so even when no command was able to finish (for
92
+ example, due to reached timeout). This behavior did not allow users to
93
+ distinguish between successful commands and such no-op.
94
+
95
+ 2015-03-11 S. Thiell <stephane.thiell@cea.fr>
96
+
97
+ * Worker.py: Introduce StreamWorker as a generic worker class to manage a
98
+ set of streams (using one EngineClient with multiple I/O streams
99
+ internally). It's a concrete class that is now used in Gateway.py to
100
+ manage I/O from the parent host in tree propagation mode. Also changed
101
+ WorkerSimple (and thus WorkerPopen) to inherit from StreamWorker.
102
+
103
+ 2014-05-20 S. Thiell <stephane.thiell@cea.fr>
104
+
105
+ * EngineClient.py: Code improvement to support multiple customizable I/O
106
+ streams per EngineClient in different mode, each being named and having
107
+ their own read/write buffers and attributes.
108
+
109
+ 2014-04-30 A. Degremont <aurelien.degremont@cea.fr>
110
+
111
+ * Clush.py: Add a 'worker' option to switch default worker (ticket #221).
112
+
113
+ 2014-04-23 S. Thiell <stephane.thiell@cea.fr>
114
+
115
+ * EPoll.py: Close epoll control file descriptor when engine is released.
116
+
117
+ 2014-01-26 A. Degremont <aurelien.degremont@cea.fr>
118
+
119
+ * NodeUtils.py: Add group source caching expiration (ticket #98).
120
+
121
+ 2014-01-16 S. Thiell <stephane.thiell@cea.fr>
122
+
123
+ * RangeSet.py: Multidimensional RangeSet support (new RangeSetND class).
124
+ Created RangeSetND class to manage a matrix of RangeSet objects. Folding
125
+ of such objects is quite complex and time consuming. A special
126
+ optimization is provided when only one dimension is varying. Patch by
127
+ aurelien.degremont@cea.fr and stephane.thiell@cea.fr.
128
+
129
+ * NodeSet.py: Multidimensional nodeset support. Added support of
130
+ RangeSetND to NodeSet. Optimized NodeSet so that 1D NodeSet objects are
131
+ still using RangeSet (ticket #92). Also benefiting from RangeSetND
132
+ optimization when only one dimension is varying. Patch by
133
+ aurelien.degremont@cea.fr and stephane.thiell@cea.fr.
134
+
135
+ 2014-01-14 S. Thiell <stephane.thiell@cea.fr>
136
+
137
+ * NodeSet.py: fix and clean fromall()/@* magic and add resolver option to
138
+ grouplist()'s NodeSet module function.
139
+
140
+ 2014-01-14 S. Thiell <stephane.thiell@cea.fr>
141
+
142
+ * NodeSet.py: Define module API to access and set group resolver used for
143
+ @-prefixed (eg. '@group') resolution. This is used to circumvent accessing
144
+ and setting NodeSet module's variable 'RESOLVER_STD_GROUP' directly, which
145
+ is not convenient and error prone. The new functions are
146
+ std_group_resolver() and set_std_group_resolver(). Updated User Guide.
147
+
148
+ * CLI/Clush.py: ignore IOError on stdin reader thread, but print a warning
149
+ in verbose or debug mode (ticket #201).
150
+
151
+ 2014-01-06 S. Thiell <stephane.thiell@cea.fr>
152
+
153
+ * NodeSet.py: Fix internal implementation of NodeSet.contiguous(), that
154
+ is, as NodeSet is mutable, we should avoid using the same NodeSet instance
155
+ in NodeSet.contiguous() for different NodeSet values.
156
+
157
+ 2013-12-17 S. Thiell <stephane.thiell@cea.fr>
158
+
159
+ * Task.py: fix task.iter_buffers() and worker.iter_buffers() to allow
160
+ optional argument match_keys to be an empty list for convenience. It
161
+ should be set to None to disable match_keys check. Also check that
162
+ match_keys is a true key/node sequence and not a string.
163
+
164
+ 2013-11-05 S. Thiell <stephane.thiell@cea.fr>
165
+
166
+ * EngineClient.py: Hide unwanted debug messages: when aborting a task,
167
+ cleanup of associated resources may lead to dropped inter-task messages
168
+ through the EnginePort mechanism. We now only display associated warning
169
+ messages when debugging is enabled...
170
+
171
+ * Task.py: Fix abort() race condition.
172
+
173
+ * CLI/Clush.py: Fix a defect to allow the use of command timeout when
174
+ copying files (with clush -u delay -c ..., ticket #220).
175
+
176
+ 2013-11-04 A. Degremont <aurelien.degremont@cea.fr>
177
+
178
+ * Worker/Rsh.py: Add a Rsh worker. It is compatible with rsh clones
179
+ like mrsh/krsh. (ticket #216).
180
+ * Task.py: Add a 'worker' default option for Task object. It is used
181
+ in Task.shell() and Task.copy().
182
+
183
+ 2012-09-13 S. Thiell <stephane.thiell@cea.fr>
184
+
185
+ * Engine.py: Allow EngineTimer with immediate fire date, that is, a fire
186
+ delay of 0s. Obviously not fired in time, such a timer will still be armed
187
+ and fired as soon as possible (ticket #200).
188
+
189
+ 2012-08-27 S. Thiell <stephane.thiell@cea.fr>
190
+
191
+ * Engine.py: Fix catch-all used in case of KeyboardInterrupt exception
192
+ during runloop, resulting in ghost engine clients in that case and results
193
+ possibly not cleaned properly (ticket #199).
194
+
195
+ 2012-08-01 S. Thiell <stephane.thiell@cea.fr>
196
+
197
+ * CLI/Clush.py: Fix clush_exit() side effects thanks to latest task
198
+ termination improvements (tickets #185).
199
+
200
+ * Task.py: Avoid termination race condition when using multiple threads
201
+ and calling abort()+join() from another thread (tickets #197).
202
+
203
+ 2012-07-09 S. Thiell <stephane.thiell@cea.fr>
204
+
205
+ * NodeSet.py: "All nodes" extended pattern support with @* (ticket #193).
206
+
207
+ 2012-04-08 S. Thiell <stephane.thiell@cea.fr>
208
+
209
+ * Version 1.6 released.
210
+
211
+ * doc/guide: Add ClusterShell User and Programming Guide LaTeX source to
212
+ repository.
213
+
214
+ 2012-04-07 S. Thiell <stephane.thiell@cea.fr>
215
+
216
+ * doc/examples/check_nodes.py: Add simple example of event-driven script.
217
+
218
+ 2012-03-31 S. Thiell <stephane.thiell@cea.fr>
219
+
220
+ * CLI/Nodeset.py: Allow -a and common nodeset operations when using -l to
221
+ list belonging groups (a new 1.6 feature, see ticket #162).
222
+
223
+ 2012-03-29 S. Thiell <stephane.thiell@cea.fr>
224
+
225
+ * Worker/Worker.py: added documentation for
226
+ worker.current_[node,msg,errmsg,rc] variables (ticket #160).
227
+
228
+ * Task.py: timeout parameters better explained (ticket #157).
229
+
230
+ 2012-03-28 S. Thiell <stephane.thiell@cea.fr>
231
+
232
+ * CLI/OptionParser.py: Add --diff option to enable diff display between
233
+ gathered outputs. Enabled in clush and clubak (ticket #176).
234
+
235
+ * CLI/Display.py: Add _print_diff() and flush() methods.
236
+
237
+ * Task.py: Initialize MsgTree instances in constructor according to
238
+ default values in order to allow no-op calls to buffer getters before
239
+ resume() (ticket #186).
240
+
241
+ 2012-03-26 S. Thiell <stephane.thiell@cea.fr>
242
+
243
+ * CLI/Clush.py: Fix clush --[r]copy behavior when no source directory is
244
+ specified (ticket #172).
245
+
246
+ * CLI/Clush.py: Fix interactive mode gather/standard toggle error, when
247
+ using special character '=' (ticket #171).
248
+
249
+ * CLI/Clubak.py: Add -v/-q verbosity options (ticket #174).
250
+
251
+ 2012-03-24 S. Thiell <stephane.thiell@cea.fr>
252
+
253
+ * CLI/Clubak.py: Add --interpret-keys=never,always,auto option to clubak
254
+ to allow a more generic usage of clubak, ie. even in cases where keys are
255
+ not nodeset compliant (ticket #180).
256
+
257
+ 2012-03-21 S. Thiell <stephane.thiell@cea.fr>
258
+
259
+ * conf/groups.conf: Fix group cross reference issue (ticket #183), we now
260
+ use sed commands instead of awk ones in this default groups.conf file.
261
+
262
+ 2012-03-18 S. Thiell <stephane.thiell@cea.fr>
263
+
264
+ * conf/groups.conf: Fix default source regexp for mawk (ticket #178).
265
+
266
+ * Packaging: Add groups.conf.d directory and sample files.
267
+
268
+ 2012-03-17 S. Thiell <stephane.thiell@cea.fr>
269
+
270
+ * CLI/Nodeset.py: Add support for -l[ll] <nodeset(s)> to list belonging
271
+ groups (CLI interface to NodeSet.groups()) (ticket #162).
272
+
273
+ * NodeSet: Add groups() public method to list groups nodeset belongs to.
274
+
275
+ 2012-03-15 S. Thiell <stephane.thiell@cea.fr>
276
+
277
+ * NodeUtils.py: Add groupsdir option (ticket #179).
278
+
279
+ 2012-03-14 S. Thiell <stephane.thiell@cea.fr>
280
+
281
+ * CLI/Nodeset.py: Add --contiguous splitting option (ticket #173).
282
+
283
+ * NodeSet.py: Add contiguous() iterator.
284
+
285
+ * RangeSet.py: Add contiguous() iterator.
286
+
287
+ * RangeSet.py: Allow slice object in fromone() constructor.
288
+
289
+ 2012-02-26 S. Thiell <stephane.thiell@cea.fr>
290
+
291
+ * Gateway.py: Improved logging facility, configurable through
292
+ CLUSTERSHELL_GW_LOG_DIR and CLUSTERSHELL_GW_LOG_LEVEL environment
293
+ variables from the root node.
294
+
295
+ * Communication.py: Messages are now transfered in xml payload instead of
296
+ 'output' attribute for improved handling of multi-lines messages in
297
+ StdOutMessage and StdErrMessage.
298
+
299
+ 2012-02-24 S. Thiell <stephane.thiell@cea.fr>
300
+
301
+ * Worker/EngineClient.py: Fix gateway write performance issue, as seen on a
302
+ very large cluster with a no-grooming test case and lots of small messages
303
+ sent, by calling os.write() as soon as possible (might safely fail if not
304
+ ready as we are in non-blocking mode).
305
+
306
+ * NodeSet.py: Internal parsing optimization by adding a "should copy
307
+ RangeSet object?" flag to NodeSetBase constructor in order to save useless
308
+ but slightly costly RangeSet.copy() calls.
309
+
310
+ * NodeSet.py: Small rangeset parsing optimization on single node string
311
+ parsing code.
312
+
313
+ 2012-02-19 S. Thiell <stephane.thiell@cea.fr>
314
+
315
+ * NodeSet.py: Add NodeSet.nsiter(), a fast iterator on nodes as NodeSet
316
+ objects to avoid object-to-string-to-object conversion in some cases when
317
+ using __iter__() -- like in PropagationTreeRouter.dispatch().
318
+
319
+ 2012-02-15 S. Thiell <stephane.thiell@cea.fr>
320
+
321
+ * Clush.py: Add --topology <file> hidden option to enable V2 tree
322
+ propagation technology preview.
323
+
324
+ 2012-02-01 S. Thiell <stephane.thiell@cea.fr>
325
+
326
+ * RangeSet.py: Fix RangeSet.__setstate__() for proper object unpickling
327
+ from older RangeSet versions. Add unpickling tests.
328
+
329
+ 2012-01-28 S. Thiell <stephane.thiell@cea.fr>
330
+
331
+ * RangeSet.py: Discard AVL-tree based implementation, as we noticed that
332
+ built-in set is much faster. New implementation is based on built-in set,
333
+ and slightly changes padding and __iter__() behaviors. Padding value is
334
+ now accessible and settable at any time via a public variable "padding".
335
+ Auto-detection of padding is still available, but it is used as a
336
+ convenience for printing range sets. Moreover, all set-like operations are
337
+ now only based on integers, ignoring RangeSet's padding value. __iter__()
338
+ has been changed in order to iterate over sorted inner set integers,
339
+ instead of string items. A new method striter() is available to iterate
340
+ over string padding-enabled items. These changes allow us to offer a full
341
+ set-like API for RangeSet (new methods like isdisjoint(), pop(), etc. are
342
+ available according to your Python version). Also, a new constructor that
343
+ take any iterable of integers is available. Finally, this implementation
344
+ should much more faster than all previous ones, especially for large range
345
+ sets (ten thousand and more) with lots of holes.
346
+
347
+ 2012-01-10 S. Thiell <stephane.thiell@cea.fr>
348
+
349
+ * RangeSet.py: Move RangeSet class from NodeSet.py to this new module
350
+ dedicated to scalable management of cluster range sets (tens of thousands
351
+ of disjoint ranges). Change internal algorithm used to manage ranges from
352
+ a list to an AVL-tree based on bintrees project's avltree implementation.
353
+ Got rid of expand/fold() methods that don't scale, all sets-like methods
354
+ have been rewritten using AVL-tree.
355
+
356
+ 2012-01-04 S. Thiell <stephane.thiell@cea.fr>
357
+
358
+ * Task.py: Change behavior of shell()'s tree=None (auto) parameter: added
359
+ Task default parameter "auto_tree" defaulting to False and checked by
360
+ shell() when tree=None. This means that even with a valid topology
361
+ configuration file, the user has to explicitly enable tree mode for now.
362
+ This is for next 1.6 release and should be changed to True in version 2.0.
363
+
364
+ 2011-11-28 S. Thiell <stephane.thiell@cea.fr>
365
+
366
+ * Task.py: Fix 'tree' option of shell(), which can be either True (force
367
+ enable tree mode), False (disable tree mode) and None (automatic).
368
+
369
+ 2011-11-24 S. Thiell <stephane.thiell@cea.fr>
370
+
371
+ * CLI/Clush.py: Enable tree mode by default with grooming option.
372
+
373
+ * Worker/Tree.py: Integrate WorkerTree within ClusterShell Engine
374
+ framework, it will be used instead of PropagationTree.
375
+
376
+ * Engine/Engine.py: Inhibit any engine client changes when client is not
377
+ registered.
378
+
379
+ * Topology.py: Change DEFAULT section to Main section in topology.conf.
380
+ Cosmetic changes.
381
+
1
382
  2011-06-09 S. Thiell <stephane.thiell@cea.fr>
2
383
 
3
384
  * Version 1.5.1 released.
@@ -167,6 +548,17 @@
167
548
  * CLI/Clush.py: Do not disable internal messages gathering when using -bL
168
549
  for proper display after Ctrl-C interruption (#133).
169
550
 
551
+ 2011-01-26 S. Thiell <stephane.thiell@cea.fr>
552
+
553
+ * tests/config: test config-template directory created.
554
+
555
+ 2011-01-17 S. Thiell <stephane.thiell@cea.fr>
556
+
557
+ * Communication.py: New module from 2.0 dev branch (author: H. Doreau).
558
+ * Gateway.py: New module from 2.0 dev branch (author: H. Doreau).
559
+ * Propagation.py: New module from 2.0 dev branch (author: H. Doreau).
560
+ * Topology.py: New module from 2.0 dev branch (author: H. Doreau).
561
+
170
562
  2011-01-15 S. Thiell <stephane.thiell@cea.fr>
171
563
 
172
564
  * Version 1.4 released.
@@ -308,7 +700,7 @@
308
700
 
309
701
  * setup.py: Switch to setuptools.
310
702
 
311
- * clustershell.spec.in: Fix issue on el5 with if condition when defining
703
+ * clustershell.spec.in: Fix issue on el5 with if condition when defining
312
704
  python_sitelib.
313
705
 
314
706
  2010-08-26 S. Thiell <stephane.thiell@cea.fr>
@@ -0,0 +1,128 @@
1
+ ClusterShell 1.7 Python Library and Tools
2
+ =========================================
3
+
4
+ ClusterShell is an event-driven open source Python library, designed to run
5
+ 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.
11
+
12
+ ClusterShell's primary goal is to improve the administration of high-
13
+ performance clusters by providing a lightweight but scalable Python API for
14
+ developers. It also provides clush, clubak and nodeset, three convenient
15
+ command-line tools that allow traditional shell scripts to benefit from some
16
+ of the library features.
17
+
18
+ Requirements (v1.7)
19
+ -------------------
20
+
21
+ * GNU/Linux, *BSD, Mac OS X
22
+ * OpenSSH (ssh/scp) or rsh
23
+ * Python 2.x (x >= 4)
24
+ * PyYAML (optional)
25
+
26
+ License
27
+ -------
28
+
29
+ ClusterShell is distributed under the CeCILL-C license, a French transposition
30
+ of the GNU LGPL, and is fully LGPL-compatible (see Licence_CeCILL-C_V1-en.txt).
31
+
32
+ Documentation
33
+ -------------
34
+
35
+ Online documentation is available here:
36
+
37
+ http://clustershell.readthedocs.org/
38
+
39
+ The Sphinx documentation source is available under the doc/sphinx directory.
40
+ Type 'make' to see all available formats (you need Sphinx installed and
41
+ sphinx_rtd_theme to build the documentation). For example, to generate html
42
+ docs, just type:
43
+
44
+ make html BUILDDIR=/dest/path
45
+
46
+ For local library API documentation, just type:
47
+
48
+ $ pydoc ClusterShell
49
+
50
+ The following man pages are also provided:
51
+
52
+ clush(1), clubak(1), nodeset(1), clush.conl(5), groups.conf(5)
53
+
54
+ Test Suite
55
+ ----------
56
+
57
+ Regression testing scripts are available in the 'tests' directory:
58
+
59
+ $ cd tests
60
+ $ nosetests -sv <Test.py>
61
+ $ nosetests -sv --all-modules
62
+
63
+ You have to allow 'ssh localhost' and 'ssh $HOSTNAME' without any warnings for
64
+ "remote" tests to run as expected. $HOSTNAME should not be 127.0.0.1 nor ::1.
65
+ Also some tests use the 'bc' command.
66
+
67
+ ClusterShell interactively
68
+ --------------------------
69
+
70
+ ```python
71
+ >>> from ClusterShell.Task import task_self
72
+ >>> from ClusterShell.NodeSet import NodeSet
73
+ >>> task = task_self()
74
+ >>> task.run("/bin/uname -r", nodes="linux[4-6,32-39]")
75
+ <ClusterShell.Worker.Ssh.WorkerSsh object at 0x20a5e90>
76
+ >>> for buf, key in task.iter_buffers():
77
+ ... print NodeSet.fromlist(key), buf
78
+ ...
79
+ linux[32-39] 2.6.40.6-0.fc15.x86_64
80
+
81
+ linux[4-6] 2.6.32-71.el6.x86_64
82
+ ```
83
+
84
+ Links
85
+ -----
86
+
87
+ Web site:
88
+
89
+ http://clustershell.sourceforge.net
90
+ or http://cea-hpc.github.com/clustershell/
91
+
92
+ Online documentation:
93
+
94
+ http://clustershell.readthedocs.org/
95
+
96
+ Github source respository:
97
+
98
+ https://github.com/cea-hpc/clustershell
99
+
100
+ Github Wiki:
101
+
102
+ https://github.com/cea-hpc/clustershell/wiki
103
+
104
+ Github Issue tracking system:
105
+
106
+ https://github.com/cea-hpc/clustershell/issues
107
+
108
+ Sourceforge.net project page:
109
+
110
+ http://sourceforge.net/projects/clustershell
111
+
112
+ Python Package Index (PyPI) link:
113
+
114
+ http://pypi.python.org/pypi/ClusterShell
115
+
116
+ ClusterShell was born along with Shine, a scalable Lustre FS admin tool:
117
+
118
+ http://lustre-shine.sourceforge.net
119
+
120
+ Core developers/reviewers
121
+ -------------------------
122
+
123
+ * Stephane Thiell
124
+ * Aurelien Degremont
125
+ * Henri Doreau
126
+ * Dominique Martinet
127
+
128
+ CEA/DAM 2010, 2011, 2012, 2013, 2014, 2015 - http://www-hpc.cea.fr
@@ -1,7 +1,7 @@
1
1
  %{!?python_sitelib: %global python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())")}
2
2
 
3
3
  Name: clustershell
4
- Version: 1.5.1
4
+ Version: 1.7
5
5
  Release: 1%{?dist}
6
6
  Summary: Python framework for efficient cluster administration
7
7
 
@@ -12,6 +12,7 @@ Source0: http://downloads.sourceforge.net/%{name}/%{name}-%{version}.tar.g
12
12
  BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
13
13
  BuildArch: noarch
14
14
  BuildRequires: python-devel python-setuptools
15
+ Requires: PyYAML
15
16
 
16
17
  %description
17
18
  Tools and event-based Python library to execute commands on cluster nodes in
@@ -38,11 +39,14 @@ Syntax highlighting in the VIM editor for ClusterShell configuration files.
38
39
 
39
40
  %install
40
41
  rm -rf %{buildroot}
42
+ # install library (lib), scripts (bin) and config (etc)
41
43
  %{__python} setup.py install -O1 --skip-build --root %{buildroot}
44
+ # move config dir away from default setuptools /usr prefix (if rpm-building as user)
45
+ [ -d %{buildroot}/usr/etc ] && mv %{buildroot}/usr/etc %{buildroot}/%{_sysconfdir}
42
46
 
43
- # config files
44
- install -d %{buildroot}/%{_sysconfdir}/clustershell
45
- install -p -m 0644 conf/*.conf %{buildroot}/%{_sysconfdir}/clustershell/
47
+ # old versions of rpm (el5) requires that a file/link exists in buildroot even
48
+ # when ghosted, but it is not installed at the end...
49
+ ln -s conf/groups.d/local.cfg %{buildroot}/%{_sysconfdir}/clustershell/groups
46
50
 
47
51
  # man pages
48
52
  install -d %{buildroot}/%{_mandir}/{man1,man5}
@@ -59,21 +63,31 @@ install -p -m 0644 doc/extras/vim/ftdetect/clustershell.vim %{buildroot}/%{vimda
59
63
  install -p -m 0644 doc/extras/vim/syntax/clushconf.vim %{buildroot}/%{vimdatadir}/syntax/
60
64
  install -p -m 0644 doc/extras/vim/syntax/groupsconf.vim %{buildroot}/%{vimdatadir}/syntax/
61
65
 
62
-
63
66
  %clean
64
67
  rm -rf %{buildroot}
65
68
 
66
69
  %files
67
70
  %defattr(-,root,root,-)
68
- %doc README ChangeLog Licence_CeCILL-C_V1-en.txt Licence_CeCILL-C_V1-fr.txt
71
+ %doc README.md ChangeLog Licence_CeCILL-C_V1-en.txt Licence_CeCILL-C_V1-fr.txt
72
+ %doc doc/examples
73
+ %doc doc/sphinx
69
74
  %{_mandir}/man1/clubak.1*
70
75
  %{_mandir}/man1/clush.1*
71
76
  %{_mandir}/man1/nodeset.1*
72
77
  %{_mandir}/man5/clush.conf.5*
73
78
  %{_mandir}/man5/groups.conf.5*
74
79
  %dir %{_sysconfdir}/clustershell
80
+ %dir %{_sysconfdir}/clustershell/groups.d
81
+ %dir %{_sysconfdir}/clustershell/groups.conf.d
75
82
  %config(noreplace) %{_sysconfdir}/clustershell/clush.conf
76
83
  %config(noreplace) %{_sysconfdir}/clustershell/groups.conf
84
+ %ghost %{_sysconfdir}/clustershell/groups
85
+ %config(noreplace) %{_sysconfdir}/clustershell/groups.d/local.cfg
86
+ %doc %{_sysconfdir}/clustershell/groups.conf.d/README
87
+ %doc %{_sysconfdir}/clustershell/groups.conf.d/*.conf.example
88
+ %doc %{_sysconfdir}/clustershell/groups.d/README
89
+ %doc %{_sysconfdir}/clustershell/groups.d/*.yaml.example
90
+ %doc %{_sysconfdir}/clustershell/topology.conf.example
77
91
  %{python_sitelib}/ClusterShell/
78
92
  %{python_sitelib}/ClusterShell-*-py?.?.egg-info
79
93
  %{_bindir}/clubak
@@ -87,6 +101,15 @@ rm -rf %{buildroot}
87
101
  %{vimdatadir}/syntax/groupsconf.vim
88
102
 
89
103
  %changelog
104
+ * Tue Nov 10 2015 Stephane Thiell <sthiell@stanford.edu> 1.7-1
105
+ - update to 1.7
106
+
107
+ * Fri Aug 7 2015 Stephane Thiell <stephane.thiell@cea.fr> 1.6.96-1
108
+ - update to 1.6.96
109
+
110
+ * Sun Apr 08 2012 Stephane Thiell <stephane.thiell@cea.fr> 1.6-1
111
+ - update to 1.6
112
+
90
113
  * Thu Jun 09 2011 Stephane Thiell <stephane.thiell@cea.fr> 1.5.1-1
91
114
  - update to 1.5.1
92
115
 
@@ -0,0 +1,28 @@
1
+ # Configuration file for clush
2
+ #
3
+ # Please see man clush.conf(5)
4
+ #
5
+
6
+ [Main]
7
+ fanout: 64
8
+ connect_timeout: 15
9
+ command_timeout: 0
10
+ color: auto
11
+ fd_max: 16384
12
+ history_size: 100
13
+ node_count: yes
14
+ verbosity: 1
15
+
16
+ # Add always all remote hosts to known_hosts without confirmation
17
+ #ssh_user: root
18
+ #ssh_path: /usr/bin/ssh
19
+ #ssh_options: -oStrictHostKeyChecking=no
20
+
21
+ # Non-interactively performing password authentication with SSH's so called
22
+ # "interactive keyboard password authentication".
23
+ #ssh_user: root
24
+ #ssh_path: /usr/bin/sshpass -f /root/remotepasswordfile /usr/bin/ssh
25
+ #scp_path: /usr/bin/sshpass -f /root/remotepasswordfile /usr/bin/scp
26
+ #ssh_options: -oBatchMode=no -oStrictHostKeyChecking=no
27
+
28
+
@@ -0,0 +1,45 @@
1
+ # ClusterShell node groups main configuration file
2
+ #
3
+ # Please see `man 5 groups.conf` and
4
+ # http://clustershell.readthedocs.org/en/latest/config.html#node-groups
5
+ # for further details.
6
+ #
7
+ # NOTE: This is a simple group configuration example file, not a
8
+ # default config file. Please edit it to fit your own needs.
9
+ #
10
+ [Main]
11
+
12
+ # Default group source
13
+ default: local
14
+
15
+ # Group source config directory list (space separated, use quotes if needed).
16
+ # Examples are provided. Copy them from *.conf.example to *.conf to enable.
17
+ #
18
+ # $CFGDIR is replaced by the highest priority config directory found.
19
+ # Default confdir value enables both system-wide and user configuration.
20
+ confdir: /etc/clustershell/groups.conf.d $CFGDIR/groups.conf.d
21
+
22
+ # New in 1.7, autodir defines a directory list (space separated, use quotes if
23
+ # needed) where group data files will be auto-loaded.
24
+ # Only *.yaml file are loaded. Copy *.yaml.example files to enable.
25
+ # Group data files avoid the need of external calls for static config files.
26
+ #
27
+ # $CFGDIR is replaced by the highest priority config directory found.
28
+ # Default autodir value enables both system-wide and user configuration.
29
+ autodir: /etc/clustershell/groups.d $CFGDIR/groups.d
30
+
31
+ # Sections below also define group sources.
32
+ #
33
+ # NOTE: /etc/clustershell/groups is deprecated since version 1.7, thus if it
34
+ # doesn't exist, the "local.cfg" file from autodir will be used.
35
+ #
36
+ # See the documentation for $CFGDIR, $SOURCE, $GROUP and $NODE upcall special
37
+ # variables. Please remember that they are substitued before the shell command
38
+ # is effectively executed.
39
+ #
40
+ [local]
41
+ # flat file "group: nodeset" based group source using $CFGDIR/groups.d/local.cfg
42
+ # with backward support for /etc/clustershell/groups
43
+ map: [ -f $CFGDIR/groups ] && f=$CFGDIR/groups || f=$CFGDIR/groups.d/local.cfg; sed -n 's/^$GROUP:\(.*\)/\1/p' $f
44
+ all: [ -f $CFGDIR/groups ] && f=$CFGDIR/groups || f=$CFGDIR/groups.d/local.cfg; sed -n 's/^all:\(.*\)/\1/p' $f
45
+ list: [ -f $CFGDIR/groups ] && f=$CFGDIR/groups || f=$CFGDIR/groups.d/local.cfg; sed -n 's/^\([0-9A-Za-z_-]*\):.*/\1/p' $f