1
2 import sys, re
3
4 from twisted.spread import pb
5 from twisted.cred import credentials, error
6 from twisted.internet import reactor
7
9 """To use this, call my .connected method with a RemoteReference to the
10 buildmaster's StatusClientPerspective object.
11 """
12
14 self.builders = {}
15 self.events = events
16
18 print "connected"
19 self.remote = remote
20 remote.callRemote("subscribe", self.events, 5, self)
21
23 print "builderAdded", buildername
24
26 print "builderRemoved", buildername
27
29 print "builderChangedState", buildername, state, eta
30
32 print "buildStarted", buildername
33
36
38 print "ETA", buildername, eta
39
41 print "stepStarted", buildername, stepname
42
44 print "stepFinished", buildername, stepname, results
45
48 print "stepETA", buildername, stepname, eta
49
52 print "logStarted", buildername, stepname
53
56 print "logFinished", buildername, stepname
57
58 - def remote_logChunk(self, buildername, build, stepname, step, logname, log,
59 channel, text):
62
64 - def __init__(self, master, events="steps"):
65 """
66 @type events: string, one of builders, builds, steps, logs, full
67 @param events: specify what level of detail should be reported.
68 - 'builders': only announce new/removed Builders
69 - 'builds': also announce builderChangedState, buildStarted, and
70 buildFinished
71 - 'steps': also announce buildETAUpdate, stepStarted, stepFinished
72 - 'logs': also announce stepETAUpdate, logStarted, logFinished
73 - 'full': also announce log contents
74 """
75 self.master = master
76 self.listener = StatusClient(events)
77
79 """Start the TextClient."""
80 self.startConnecting()
81 reactor.run()
82
84 try:
85 host, port = re.search(r'(.+):(\d+)', self.master).groups()
86 port = int(port)
87 except:
88 print "unparseable master location '%s'" % self.master
89 print " expecting something more like localhost:8007"
90 raise
91 cf = pb.PBClientFactory()
92 creds = credentials.UsernamePassword("statusClient", "clientpw")
93 d = cf.login(creds)
94 reactor.connectTCP(host, port, cf)
95 d.addCallbacks(self.connected, self.not_connected)
96 return d
97 - def connected(self, ref):
98 ref.notifyOnDisconnect(self.disconnected)
99 self.listener.connected(ref)
100 - def not_connected(self, why):
101 if why.check(error.UnauthorizedLogin):
102 print """
103 Unable to login.. are you sure we are connecting to a
104 buildbot.status.client.PBListener port and not to the slaveport?
105 """
106 reactor.stop()
107 return why
108 - def disconnected(self, ref):
109 print "lost connection"
110
111
112
113
114
115 try:
116 reactor.stop()
117 except RuntimeError:
118 pass
119
120 if __name__ == '__main__':
121 master = "localhost:8007"
122 if len(sys.argv) > 1:
123 master = sys.argv[1]
124 c = TextClient()
125 c.run()
126