1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
use rusty_yaml::Yaml; use std::fmt::{Display, Error, Formatter}; pub struct Worker { name: String, dir: String, password: String, masterhost: String, masterport: String, } impl Worker { fn new<S: ToString>(name: S, dir: S, password: S, masterhost: S) -> Self { Self { name: name.to_string(), dir: dir.to_string(), password: password.to_string(), masterhost: masterhost.to_string(), masterport: String::from("9989"), } } pub fn get_name(&self) -> String { self.name.clone() } pub fn get_dir(&self) -> String { self.dir.clone() } pub fn get_password(&self) -> String { self.password.clone() } } impl From<Yaml> for Worker { fn from(yaml: Yaml) -> Self { let name = yaml.get_name(); for section in ["masterhost", "basedir", "password"].iter() { assert!( yaml.has_section(section), format!("{} section not specified for {} worker", section, name) ) } let basedir = yaml .get_section("basedir") .into_iter() .collect::<Vec<Yaml>>()[0] .to_string(); let password = yaml .get_section("password") .into_iter() .collect::<Vec<Yaml>>()[0] .to_string(); let masterhost = yaml .get_section("masterhost") .into_iter() .collect::<Vec<Yaml>>()[0] .to_string(); Self::new(name, basedir, password, masterhost) } } impl Display for Worker { fn fmt(&self, f: &mut Formatter) -> Result<(), Error> { write!( f, r#"import os from buildbot_worker.bot import Worker from twisted.application import service basedir = '{basedir}' rotateLength = 10000000 maxRotatedFiles = 10 # if this is a relocatable tac file, get the directory containing the TAC if basedir == '.': import os.path basedir = os.path.abspath(os.path.dirname(__file__)) # note: this line is matched against to check that this is a worker # directory; do not edit it. application = service.Application('buildbot-worker') from twisted.python.logfile import LogFile from twisted.python.log import ILogObserver, FileLogObserver logfile = LogFile.fromFullPath( os.path.join(basedir, "twistd.log"), rotateLength=rotateLength, maxRotatedFiles=maxRotatedFiles) application.setComponent(ILogObserver, FileLogObserver(logfile).emit) buildmaster_host = '{masterhost}' port = {masterport} workername = '{name}' passwd = '{password}' keepalive = 600 umask = None maxdelay = 300 numcpus = None allow_shutdown = None maxretries = None s = Worker(buildmaster_host, port, workername, passwd, basedir, keepalive, umask=umask, maxdelay=maxdelay, numcpus=numcpus, allow_shutdown=allow_shutdown, maxRetries=maxretries) s.setServiceParent(application)"#, name = self.name, basedir = self.dir, password = self.password, masterhost = self.masterhost, masterport = self.masterport ) } }