1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 """
36 WorkerPopen
37
38 ClusterShell worker for executing local commands.
39 """
40
41 import os
42 import signal
43
44 from ClusterShell.Worker.Worker import WorkerSimple, WorkerBadArgumentError
45
46
48 """
49 Implements the Popen Worker.
50 """
51
52 - def __init__(self, command, key=None, handler=None,
53 stderr=False, timeout=-1, autoclose=False):
54 """
55 Initialize Popen worker.
56 """
57 WorkerSimple.__init__(self, None, None, None, key, handler,
58 stderr, timeout, autoclose)
59
60 self.command = command
61 if not self.command:
62 raise WorkerBadArgumentError()
63
64 self.popen = None
65 self.rc = None
66
68 """
69 Start worker.
70 """
71 assert self.popen is None
72
73 self.popen = self._exec_nonblock(self.command, shell=True)
74 self.file_reader = self.popen.stdout
75 self.file_error = self.popen.stderr
76 self.file_writer = self.popen.stdin
77
78 if self.task.info("debug", False):
79 self.task.info("print_debug")(self.task, "POPEN: %s" % self.command)
80
81 self._invoke("ev_start")
82
83 return self
84
85 - def _close(self, force, timeout):
86 """
87 Close worker. Called by engine after worker has been
88 unregistered. This method should handle all termination types
89 (normal, forced or on timeout).
90 """
91 if not force and self._rbuf:
92
93
94 self.worker._on_msgline(self._rbuf)
95
96 rc = -1
97 if force or timeout:
98
99 prc = self.popen.poll()
100 if prc is None:
101
102 os.kill(self.popen.pid, signal.SIGKILL)
103 else:
104
105 prc = self.popen.wait()
106
107 if prc >= 0:
108
109 rc = prc
110 else:
111
112 rc = 128 + -prc
113
114 self.popen.stdin.close()
115 self.popen.stdout.close()
116
117 if rc >= 0:
118 self._on_rc(rc)
119 elif timeout:
120 self._on_timeout()
121
122 self._invoke("ev_close")
123
125 """
126 Set return code.
127 """
128 self.rc = rc
129 self.task._rc_set((self, self.key), rc)
130
131 self._invoke("ev_hup")
132
134 """
135 Return return code or None if command is still in progress.
136 """
137 return self.rc
138