1
2 import os
3 from twisted.python.failure import Failure
4 from twisted.internet import defer, reactor, protocol, error
5 from twisted.protocols.basic import LineOnlyReceiver
6
9
18
21 self.lw.dataReceived(data)
23 print "ERR: '%s'" % (data,)
24
25
27 POLL_INTERVAL = 0.1
28 TIMEOUT_DELAY = 10.0
29 delimiter = os.linesep
30
32 self.logfile = logfile
33 self.in_reconfig = False
34 self.transport = FakeTransport()
35 self.pp = TailProcess()
36 self.pp.lw = self
37 self.processtype = "buildmaster"
38 self.timer = None
39
41
42
43
44
45
46 self.p = reactor.spawnProcess(self.pp, "/usr/bin/tail",
47 ("tail", "-f", "-n", "0", self.logfile),
48 env=os.environ,
49 )
50 self.running = True
51 d = defer.maybeDeferred(self._start)
52 return d
53
58
66
68 try:
69 self.p.signalProcess("KILL")
70 except error.ProcessExitedAlready:
71 pass
72 if self.timer:
73 self.timer.cancel()
74 self.timer = None
75 self.running = False
76 self.in_reconfig = False
77 self.d.callback(results)
78
80 if not self.running:
81 return
82 if "Log opened." in line:
83 self.in_reconfig = True
84 if "loading configuration from" in line:
85 self.in_reconfig = True
86 if "Creating BuildSlave" in line:
87 self.processtype = "buildslave"
88
89 if self.in_reconfig:
90 print line
91
92 if "message from master: attached" in line:
93 return self.finished("buildslave")
94 if "I will keep using the previous config file" in line:
95 return self.finished(Failure(ReconfigError()))
96 if "configuration update complete" in line:
97 return self.finished("buildmaster")
98