web: Builder/Build: use a relative link to the welcome page
[buildbot.git] / buildbot / status / web / slaves.py
blob18ce24631150f0401cd2b11f93c7e8e26b3eee39
2 import time
3 from buildbot.status.web.base import HtmlResource, abbreviate_age
5 # buildslaves/$slavename
6 class OneBuildSlaveResource(HtmlResource):
7 pass
9 # buildslaves/
10 class BuildSlavesResource(HtmlResource):
11 title = "BuildSlaves"
12 addSlash = True
14 def body(self, req):
15 s = self.getStatus(req)
16 data = ""
17 data += "<h1>Build Slaves</h1>\n"
19 used_by_builder = {}
20 for bname in s.getBuilderNames():
21 b = s.getBuilder(bname)
22 for bs in b.getSlaves():
23 slavename = bs.getName()
24 if slavename not in used_by_builder:
25 used_by_builder[slavename] = []
26 used_by_builder[slavename].append(bname)
28 data += "<ol>\n"
29 for name in s.getSlaveNames():
30 slave = s.getSlave(name)
31 data += " <li>%s:\n" % name
32 data += " <ul>\n"
33 builder_links = ['<a href="../builders/%s">%s</a>' % (bname, bname)
34 for bname in used_by_builder.get(name, [])]
35 if builder_links:
36 data += " <li>Used by: %s</li>\n" % ", ".join(builder_links)
37 else:
38 data += " <li>Not used by any Builders</li>\n"
39 if slave.isConnected():
40 data += " <li>Slave is currently connected</li>\n"
41 admin = slave.getAdmin()
42 if admin:
43 # munge it to avoid feeding the spambot harvesters
44 admin = admin.replace("@", " -at- ")
45 data += " <li>Admin: %s</li>\n" % admin
46 last = slave.lastMessageReceived()
47 if last:
48 lt = time.strftime("%Y-%M-%d %H:%M:%S",
49 time.localtime(last))
50 age = abbreviate_age(time.time() - last)
51 data += " <li>Last heard from: %s " % age
52 data += '<font size="-1">(%s)</font>' % lt
53 data += "</li>\n"
54 else:
55 data += " <li>Slave is NOT currently connected</li>\n"
57 data += " </ul>\n"
58 data += " </li>\n"
59 data += "\n"
61 data += "</ol>\n"
63 return data