Ticket #1246: example.py

File example.py, 2.4 KB (added by hagna, 10 years ago)
Line 
1import zope.interface
2import twisted.plugin
3import cPickle as pickle
4from twisted.spread import pb
5from twisted.internet import defer, protocol, reactor
6from twisted.python import log
7
8class PP(protocol.ProcessProtocol):
9    def __init__(self, processdone):
10        self.output = ""
11        self.d_connected = defer.Deferred()
12        self.d_connected.addCallback(log.msg)
13        self.d_connected.addErrback(log.err)
14        self.processdone = processdone
15       
16    def connectionMade(self):
17       self.transport.closeStdin()
18       self.d_connected.callback("Connected")
19           
20    def outReceived(self, data):
21       pass
22       
23    def errReceived(self, data):
24       log.err(data)
25
26    def processEnded(self, status):
27        self.transport.loseConnection()
28        self.processdone.callback("all done")
29       
30    def die(self):
31        log.msg("Kill %s:%d" % (self.name, self.transport.pid))
32        os.kill(self.transport.pid, signal.SIGKILL)
33       
34       
35class TimingOutCommand:
36    def __init__(self, timeout, command, args):
37        self.done = defer.Deferred()
38        self.done.addCallback(self._canceltimeout_cmd)
39        self.done.addErrback(log.err)
40        self.timeout =  timeout
41        self.command = command
42        self.args = args
43        self.connector = PP(self.done)
44        env = os.environ
45        args = [command, self.args]
46        reactor.spawnProcess(self.connector, command, args, env=env)
47        self.canceltimeout = False
48        reactor.callLater(timeout, self._timeout_cmd)
49       
50    def _timeout_cmd(self):
51        if self.canceltimeout:
52            log.msg("Trying to timeout command, but timeout was cancelled")
53            return
54        log.msg("Timed out before it could finish")
55        self.timeout_cmd()
56       
57    def _canceltimeout_cmd(self, result):
58        self.canceltimeout = True
59        self.canceltimeout_cmd()
60       
61    def conceltimeout_cmd(self):
62        raise NotImplementedError
63       
64    def timeout_cmd(self):
65        raise NotImplementedError
66       
67class CmdTimeout(TimingOutCommand):
68    def __init__(self, timeout, command, args):
69        TimingOutCommand.__init__(self, timeout, command, args)
70       
71    def canceltimeout_cmd(self):
72        pass
73       
74    def timeout_cmd(self):
75        log.msg("cancelling!!!")
76       
77if __name__ == "__main__":
78    log.FileLogObserver.timeFormat = '[%d/%b/%Y:%H:%M:%S]'
79    log.startLogging(sys.stdout)
80    a = CmdTimeout(3, "/bin/sleep", "10")
81    reactor.run()