| OLD | NEW |
| (Empty) |
| 1 | |
| 2 import os, sys, time | |
| 3 | |
| 4 class Follower: | |
| 5 def follow(self): | |
| 6 from twisted.internet import reactor | |
| 7 from buildbot.scripts.reconfig import LogWatcher | |
| 8 self.rc = 0 | |
| 9 print "Following twistd.log until startup finished.." | |
| 10 lw = LogWatcher("twistd.log") | |
| 11 d = lw.start() | |
| 12 d.addCallbacks(self._success, self._failure) | |
| 13 reactor.run() | |
| 14 return self.rc | |
| 15 | |
| 16 def _success(self, processtype): | |
| 17 from twisted.internet import reactor | |
| 18 print "The %s appears to have (re)started correctly." % processtype | |
| 19 self.rc = 0 | |
| 20 reactor.stop() | |
| 21 | |
| 22 def _failure(self, why): | |
| 23 from twisted.internet import reactor | |
| 24 from buildbot.scripts.logwatcher import BuildmasterTimeoutError, \ | |
| 25 ReconfigError, BuildslaveTimeoutError, BuildSlaveDetectedError | |
| 26 if why.check(BuildmasterTimeoutError): | |
| 27 print """ | |
| 28 The buildmaster took more than 10 seconds to start, so we were unable to | |
| 29 confirm that it started correctly. Please 'tail twistd.log' and look for a | |
| 30 line that says 'configuration update complete' to verify correct startup. | |
| 31 """ | |
| 32 elif why.check(BuildslaveTimeoutError): | |
| 33 print """ | |
| 34 The buildslave took more than 10 seconds to start and/or connect to the | |
| 35 buildmaster, so we were unable to confirm that it started and connected | |
| 36 correctly. Please 'tail twistd.log' and look for a line that says 'message | |
| 37 from master: attached' to verify correct startup. If you see a bunch of | |
| 38 messages like 'will retry in 6 seconds', your buildslave might not have the | |
| 39 correct hostname or portnumber for the buildmaster, or the buildmaster might | |
| 40 not be running. If you see messages like | |
| 41 'Failure: twisted.cred.error.UnauthorizedLogin' | |
| 42 then your buildslave might be using the wrong botname or password. Please | |
| 43 correct these problems and then restart the buildslave. | |
| 44 """ | |
| 45 elif why.check(ReconfigError): | |
| 46 print """ | |
| 47 The buildmaster appears to have encountered an error in the master.cfg config | |
| 48 file during startup. It is probably running with an empty configuration right | |
| 49 now. Please inspect and fix master.cfg, then restart the buildmaster. | |
| 50 """ | |
| 51 elif why.check(BuildSlaveDetectedError): | |
| 52 print """ | |
| 53 Buildslave is starting up, not following logfile. | |
| 54 """ | |
| 55 else: | |
| 56 print """ | |
| 57 Unable to confirm that the buildmaster started correctly. You may need to | |
| 58 stop it, fix the config file, and restart. | |
| 59 """ | |
| 60 print why | |
| 61 self.rc = 1 | |
| 62 reactor.stop() | |
| 63 | |
| 64 | |
| 65 def start(config): | |
| 66 os.chdir(config['basedir']) | |
| 67 if (not os.path.exists("buildbot.tac") and | |
| 68 not os.path.exists("Makefile.buildbot")): | |
| 69 print "This doesn't look like a buildbot base directory:" | |
| 70 print "No buildbot.tac or Makefile.buildbot file." | |
| 71 print "Giving up!" | |
| 72 sys.exit(1) | |
| 73 if config['quiet']: | |
| 74 return launch(config) | |
| 75 | |
| 76 # we probably can't do this os.fork under windows | |
| 77 from twisted.python.runtime import platformType | |
| 78 if platformType == "win32": | |
| 79 return launch(config) | |
| 80 | |
| 81 # fork a child to launch the daemon, while the parent process tails the | |
| 82 # logfile | |
| 83 if os.fork(): | |
| 84 # this is the parent | |
| 85 rc = Follower().follow() | |
| 86 sys.exit(rc) | |
| 87 # this is the child: give the logfile-watching parent a chance to start | |
| 88 # watching it before we start the daemon | |
| 89 time.sleep(0.2) | |
| 90 launch(config) | |
| 91 | |
| 92 def launch(config): | |
| 93 sys.path.insert(0, os.path.abspath(os.getcwd())) | |
| 94 if os.path.exists("/usr/bin/make") and os.path.exists("Makefile.buildbot"): | |
| 95 # Preferring the Makefile lets slave admins do useful things like set | |
| 96 # up environment variables for the buildslave. | |
| 97 cmd = "make -f Makefile.buildbot start" | |
| 98 if not config['quiet']: | |
| 99 print cmd | |
| 100 os.system(cmd) | |
| 101 else: | |
| 102 # see if we can launch the application without actually having to | |
| 103 # spawn twistd, since spawning processes correctly is a real hassle | |
| 104 # on windows. | |
| 105 from twisted.python.runtime import platformType | |
| 106 argv = ["twistd", | |
| 107 "--no_save", | |
| 108 "--logfile=twistd.log", # windows doesn't use the same default | |
| 109 "--python=buildbot.tac"] | |
| 110 if platformType == "win32": | |
| 111 argv.append("--reactor=win32") | |
| 112 sys.argv = argv | |
| 113 | |
| 114 # this is copied from bin/twistd. twisted-2.0.0 through 2.4.0 use | |
| 115 # _twistw.run . Twisted-2.5.0 and later use twistd.run, even for | |
| 116 # windows. | |
| 117 from twisted import __version__ | |
| 118 major, minor, ignored = __version__.split(".", 2) | |
| 119 major = int(major) | |
| 120 minor = int(minor) | |
| 121 if (platformType == "win32" and (major == 2 and minor < 5)): | |
| 122 from twisted.scripts import _twistw | |
| 123 run = _twistw.run | |
| 124 else: | |
| 125 from twisted.scripts import twistd | |
| 126 run = twistd.run | |
| 127 run() | |
| 128 | |
| OLD | NEW |