1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 """
22 WorkerPopen
23
24 ClusterShell worker for executing local commands.
25
26 Usage example:
27 >>> worker = WorkerPopen("/bin/uname", key="mykernel")
28 >>> task.schedule(worker) # schedule worker
29 >>> task.resume() # run task
30 >>> worker.retcode() # get return code
31 0
32 >>> worker.read() # read command output
33 'Linux'
34
35 """
36
37 from ClusterShell.Worker.Worker import WorkerSimple, StreamClient
38
39
41
42 - def __init__(self, worker, key, stderr, timeout, autoclose):
48
50 """Worker is starting."""
51 assert not self.worker.started
52 assert self.popen is None
53
54 self.popen = self._exec_nonblock(self.worker.command, shell=True)
55
56 task = self.worker.task
57 if task.info("debug", False):
58 task.info("print_debug")(task, "POPEN: %s" % self.worker.command)
59
60 self.worker._on_start(self.key)
61 return self
62
63 - def _close(self, abort, timeout):
64 """
65 Close client. See EngineClient._close().
66 """
67 if abort:
68
69 prc = self.popen.poll()
70
71 if prc is None:
72 try:
73 self.popen.kill()
74 except OSError:
75 pass
76 prc = self.popen.wait()
77
78 self.streams.clear()
79
80 if prc >= 0:
81 self.rc = prc
82 self.worker._on_rc(self.key, prc)
83 elif timeout:
84 assert abort, "abort flag not set on timeout"
85 self.worker._on_timeout(self.key)
86 elif not abort:
87
88 self.rc = 128 + -prc
89 self.worker._on_rc(self.key, self.rc)
90
91 if self.worker.eh:
92 self.worker.eh.ev_close(self.worker)
93
94
96 """
97 Implements the Popen Worker.
98 """
99 - def __init__(self, command, key=None, handler=None,
100 stderr=False, timeout=-1, autoclose=False):
101 """Initialize Popen worker."""
102 WorkerSimple.__init__(self, None, None, None, key, handler, stderr,
103 timeout, autoclose, client_class=PopenClient)
104 self.command = command
105 if not self.command:
106 raise ValueError("missing command parameter in WorkerPopen "
107 "constructor")
108
110 """Return return code or None if command is still in progress."""
111 return self.clients[0].rc
112
113 WORKER_CLASS = WorkerPopen
114