1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 """
21 ClusterShell Defaults module.
22
23 Manage library defaults.
24 """
25
26
27
28 from ConfigParser import ConfigParser, NoOptionError, NoSectionError
29 import os
30 import sys
31
32
33
34
35
36 CFG_SECTION_TASK_DEFAULT = 'task.default'
37 CFG_SECTION_TASK_INFO = 'task.info'
38
39
40
41
43 """Default task debug printing function."""
44 print line
45
47 """
48 Return the class pointer matching `workername`.
49
50 The module is loaded if not done yet.
51 """
52 modname = "ClusterShell.Worker.%s" % workername.capitalize()
53
54
55 if modname.lower() not in [mod.lower() for mod in sys.modules.keys()]:
56
57 __import__(modname)
58
59
60 return sys.modules[modname].WORKER_CLASS
61
63 """Return default local worker class."""
64 return _load_workerclass(defaults.local_workername)
65
67 """Return default distant worker class."""
68 return _load_workerclass(defaults.distant_workername)
69
71 """Return default path list for a ClusterShell config file name."""
72 return ['/etc/clustershell/%s' % config_name,
73
74 os.path.expanduser('~/.local/etc/clustershell/%s' % config_name),
75
76 os.path.join(os.environ.get('XDG_CONFIG_HOME',
77 os.path.expanduser('~/.config')),
78 'clustershell', config_name)]
79
80
81
82
84 """
85 Class used to manipulate ClusterShell defaults.
86
87 The following attributes may be read at any time and also changed
88 programmatically, for most of them **before** ClusterShell objects
89 are initialized (like Task):
90
91 * stderr (boolean; default is ``False``)
92 * stdout_msgtree (boolean; default is ``True``)
93 * stderr_msgtree (boolean; default is ``True``)
94 * engine (string; default is ``'auto'``)
95 * port_qlimit (integer; default is ``100``)
96 * local_workername (string; default is ``'exec'``)
97 * distant_workername (string; default is ``'ssh'``)
98 * debug (boolean; default is ``False``)
99 * print_debug (function; default is internal)
100 * fanout (integer; default is ``64``)
101 * grooming_delay (float; default is ``0.25``)
102 * connect_timeout (float; default is ``10``)
103 * command_timeout (float; default is ``0``)
104
105 Example of use::
106
107 >>> from ClusterShell.Defaults import DEFAULTS
108 >>> from ClusterShell.Task import task_self
109 >>> # Change default distant worker to rsh (WorkerRsh)
110 ... DEFAULTS.distant_workername = 'rsh'
111 >>> task = task_self()
112 >>> task.run("uname -r", nodes="cs[01-03]")
113 <ClusterShell.Worker.Rsh.WorkerRsh object at 0x1f4a410>
114 >>> list((str(msg), nodes) for msg, nodes in task.iter_buffers())
115 [('3.10.0-229.7.2.el7.x86_64', ['cs02', 'cs01', 'cs03'])]
116
117
118 The library default values of all of the above attributes may be changed
119 using the defaults.conf configuration file, except for *print_debug*
120 (cf. :ref:`defaults-config`). An example defaults.conf file should be
121 included with ClusterShell. Remember that this could affect all
122 applications using ClusterShell.
123 """
124
125
126
127
128 _TASK_DEFAULT = {"stderr" : False,
129 "stdout_msgtree" : True,
130 "stderr_msgtree" : True,
131 "engine" : 'auto',
132 "port_qlimit" : 100,
133 "auto_tree" : True,
134 "local_workername" : 'exec',
135 "distant_workername" : 'ssh'}
136
137
138
139
140 _TASK_DEFAULT_CONVERTERS = {"stderr" : ConfigParser.getboolean,
141 "stdout_msgtree" : ConfigParser.getboolean,
142 "stderr_msgtree" : ConfigParser.getboolean,
143 "engine" : ConfigParser.get,
144 "port_qlimit" : ConfigParser.getint,
145 "auto_tree" : ConfigParser.getboolean,
146 "local_workername" : ConfigParser.get,
147 "distant_workername" : ConfigParser.get}
148
149
150
151
152 _TASK_INFO = {"debug" : False,
153 "print_debug" : _task_print_debug,
154 "fanout" : 64,
155 "grooming_delay" : 0.25,
156 "connect_timeout" : 10,
157 "command_timeout" : 0}
158
159
160
161
162 _TASK_INFO_CONVERTERS = {"debug" : ConfigParser.getboolean,
163 "fanout" : ConfigParser.getint,
164 "grooming_delay" : ConfigParser.getfloat,
165 "connect_timeout" : ConfigParser.getfloat,
166 "command_timeout" : ConfigParser.getfloat}
167
168
169
170
171
172 _TASK_INFO_PKEYS_BL = ['engine', 'print_debug']
173
186
204
206 """Defaults attribute lookup"""
207 if name in self._task_default:
208 return self._task_default[name]
209 elif name in self._task_info:
210 return self._task_info[name]
211 raise AttributeError(name)
212
214 """Defaults attribute assignment"""
215 if name in ('_task_default', '_task_info', '_task_info_pkeys_bl'):
216 object.__setattr__(self, name, value)
217 elif name in self._task_default:
218 self._task_default[name] = value
219 elif name in self._task_info:
220 self._task_info[name] = value
221 else:
222 raise AttributeError(name)
223
224
225
226
227 DEFAULTS = Defaults(config_paths('defaults.conf'))
228