X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=conf_files.py;h=4903b3f8de788a6090f064183889df97579a758c;hb=refs%2Fheads%2F1.5;hp=0730f7d7303b5385d105dd7767ef53846cc409bb;hpb=1ee32df25e4036bd98593ccc0cf99005d99e2b23;p=nodemanager.git diff --git a/conf_files.py b/conf_files.py index 0730f7d..4903b3f 100644 --- a/conf_files.py +++ b/conf_files.py @@ -13,8 +13,9 @@ import tools class conf_files: - def __init__(self, config): + def __init__(self, config, noscripts=False): self.config = config + self.noscripts = noscripts self.cond = threading.Condition() self.data = None @@ -26,39 +27,41 @@ class conf_files: except IOError: return None def system(self, cmd): - if cmd: + if not self.noscripts and cmd: logger.log('conf_files: running command %s' % cmd) - return os.system(cmd) + return tools.fork_as(None, os.system, cmd) else: return 0 def update_conf_file(self, cf_rec): if not cf_rec['enabled']: return dest = cf_rec['dest'] - logger.log('conf_files: considering file %s' % dest) + # XXX Remove once old Node Manager is out of service + if dest == '/etc/proper/propd.conf': return err_cmd = cf_rec['error_cmd'] mode = string.atoi(cf_rec['file_permissions'], base=8) uid = pwd.getpwnam(cf_rec['file_owner'])[2] gid = grp.getgrnam(cf_rec['file_group'])[2] url = 'https://%s/%s' % (self.config.PLC_BOOT_HOST, cf_rec['source']) - contents = curlwrapper.retrieve(url, self.config.cacert) - logger.log('conf_files: retrieving url %s' % url) + try: + contents = curlwrapper.retrieve(url, self.config.cacert) + except curlwrapper.CurlException: + logger.log('conf_files: failed to retrieve %s from %s, skipping' % (dest, url)) + return if not cf_rec['always_update'] and sha.new(contents).digest() == self.checksum(dest): - logger.log('conf_files: skipping file %s, always_update is false and checksums are identical' % dest) return if self.system(cf_rec['preinstall_cmd']): self.system(err_cmd) if not cf_rec['ignore_cmd_errors']: return - logger.log('conf_files: installing file %s' % dest) + logger.log('conf_files: installing file %s from %s' % (dest, url)) try: os.makedirs(os.path.dirname(dest)) except OSError: pass tools.write_file(dest, lambda f: f.write(contents), mode=mode, uidgid=(uid,gid)) if self.system(cf_rec['postinstall_cmd']): self.system(err_cmd) def run_once(self, data): - for d in data: - for f in d['conf_files']: - try: self.update_conf_file(f) - except: logger.log_exc() + for f in data['conf_files']: + try: self.update_conf_file(f) + except: logger.log_exc() def run(self): while True: @@ -78,20 +81,22 @@ class conf_files: main = None -def GetSlivers_callback(data): - global main - main.callback(data) - def start(options, config): global main main = conf_files(config) tools.as_daemon_thread(main.run) +def GetSlivers(data): + global main + assert main is not None + return main.callback(data) + if __name__ == '__main__': import optparse parser = optparse.OptionParser() parser.add_option('-f', '--config', action='store', dest='config', default='/etc/planetlab/plc_config', help='PLC configuration file') parser.add_option('-k', '--session', action='store', dest='session', default='/etc/planetlab/session', help='API session key (or file)') + parser.add_option('--noscripts', action='store_true', dest='noscripts', default=False, help='Do not run pre- or post-install scripts') (options, args) = parser.parse_args() # Load /etc/planetlab/plc_config @@ -108,6 +113,6 @@ if __name__ == '__main__': from plcapi import PLCAPI plc = PLCAPI(config.plc_api_uri, config.cacert, auth = session) - main = conf_files(config) + main = conf_files(config, options.noscripts) data = plc.GetSlivers() main.run_once(data)