3 # Copyright (C) 2008 Andrew Bartlett <abartlet@samba.org>
4 # Copyright (C) 2008 Jelmer Vernooij <jelmer@samba.org>
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 3 of the License, or
9 # (at your option) any later version.
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
20 from buildfarm import (
29 from email.MIMEText import MIMEText
31 buildfarm = BuildFarm()
33 def update_rsyncd_secrets():
34 temp_rsyncd_secrets = os.path.join(os.path.dirname(__file__), "../rsyncd.secrets.new")
35 f = open(temp_rsyncd_secrets, "w")
36 f.writelines(buildfarm.hostdb.create_rsync_secrets())
39 os.rename(temp_rsyncd_secrets, "../rsyncd.secrets")
43 print "Samba Build farm management tool"
44 print "================================"
51 print "Initialize the buildfarm: init"
52 print "Add Machine to build farm: add"
53 print "Remove Machine from build farm: remove"
54 print "Modify build farm account: modify"
55 print "Print build farm host info: info"
56 print "Print build farm host list: list"
58 op = raw_input("Select Operation: [add] ").lower()
67 args = [raw_input("Please enter hostname to delete: ")]
70 buildfarm.hostdb.deletehost(hostname)
71 except hostdb.NoSuchHost, e:
72 print "No such host '%s'" % e.name
75 buildfarm.hostdb.commit()
76 update_rsyncd_secrets()
78 hostname = raw_input("Please enter hostname to modify: ")
80 host = buildfarm.hostdb[hostname]
81 except hostdb.NoSuchHost, e:
82 print "No such host '%s'" % e.name
84 print "Owner: %s <%s>" % host.owner
85 print "Platform: %s" % host.platform
87 mod_op = raw_input("Modify owner or platform: [platform] ")
90 if mod_op == "platform":
91 platform = raw_input("Enter new platform: ")
92 host.update_platform(platform)
94 elif mod_op == "owner":
95 owner = raw_input("Enter new owner's name: ")
96 owner_email = raw_input("Enter new owner's e-mail address: ")
97 host.update_owner(owner, owner_email.decode("utf-8"))
100 print "Unknown subcommand %s" % mod_op
102 update_rsyncd_secrets()
104 hostname = raw_input("Machine hostname: ")
106 buildfarm.hostdb[hostname]
107 except hostdb.NoSuchHost, e:
110 print "A host with the name %s already exists." % e.name
112 platform = raw_input("Machine platform (eg Fedora 9 x86_64): ")
113 owner = raw_input("Machine Owner Name: ")
114 owner_email = raw_input("Machine Owner E-mail: ")
115 password = raw_input("Enter password: [generate random] ")
117 password = commands.getoutput("pwgen 16 1").strip()
118 print "Password will be: %s" % password
120 print "Enter permission e-mail, finish with a ."
127 buildfarm.hostdb.createhost(hostname, platform.decode("utf-8"),
128 owner.decode("utf-8"), owner_email.decode("utf-8"),
129 password.decode("utf-8"),
130 "".join(permission).decode("utf-8", "replace"))
131 except hostdb.HostAlreadyExists, e:
132 print "A host with the name %s already exists." % e.name
138 Welcome to the Samba.org build farm.
140 Your host %(hostname)s has been added to the Samba Build farm.
142 We have recorded that it is running %(platform)s.
144 If you have not already done so, please read:
145 http://build.samba.org/instructions.html
147 The password for your rsync .password file is %(password)s
149 An e-mail asking you to subscribe to the build-farmers mailing
150 list will arrive shortly. Please ensure you maintain your
151 subscription to this list while you have hosts in the build farm.
153 Thank you for your contribution to ensuring portability and quality
154 of Samba.org projects.
157 """ % { "hostname": hostname, "platform": platform, "password": password }
159 msg_notification = MIMEText(body)
161 # send the password in an e-mail to that address
162 msg_notification["Subject"] = "Your new build farm host %s" % hostname
163 msg_notification["To"] = "\"%s\" <%s>" % (owner, owner_email)
164 msg_notification["Bcc"] = "build@samba.org"
165 msg_notification["From"] = "\"Samba Build Farm\" <build@samba.org>"
167 msg_subscribe = MIMEText("""Please subscribe %s to the build-farmers mailing list
169 Thanks, your friendly Samba build farm administrator <build@samba.org>""" % owner)
170 msg_subscribe["From"] = "\"%s\" <%s>" % (owner, owner_email)
171 msg_subscribe["Subject"] = 'Subscribe to build-farmers mailing list'
172 msg_subscribe["To"] = 'build-farmers-join@lists.samba.org'
175 print msg_notification
179 for msg in (msg_notification, msg_subscribe):
180 recipients = [msg["To"]]
182 recipients.append(msg["Bcc"])
183 s.sendmail(msg["From"], recipients, msg.as_string())
185 update_rsyncd_secrets()
188 args = [raw_input("Hostname: ")]
189 for hostname in args:
191 host = buildfarm.hostdb[hostname]
192 except hostdb.NoSuchHost, e:
193 print "No such host '%s'" % e.name
196 opt_fqdn = " (%s)" % host.fqdn
199 print "Host: %s%s" % (host.name, opt_fqdn)
200 print "Platform: %s" % host.platform
201 print "Owner: %s <%s>" % host.owner
203 for host in buildfarm.hostdb.host_ages():
205 age = time.time() - host.last_update
208 print "%-12s %s" % (age, host.name)
210 print "Unknown command %s" % op