update local configuration files from PLC
"""
-import grp
import os
+import time
import pwd
+import grp
from hashlib import sha1 as sha
import xmlrpc.client
# right after net
priority = 2
-class conf_files:
+class ConfFiles:
def __init__(self, noscripts=False):
self.config = Config()
self.noscripts = noscripts
def checksum(self, path):
try:
with open(path) as feed:
- return sha(feed.read()).digest()
+ return sha(feed.read().encode()).digest()
except IOError:
return None
os.makedirs(os.path.dirname(dest))
except OSError:
pass
- tools.write_file(dest, lambda f: f.write(contents),
+ tools.write_file(dest, lambda f: f.write(contents.decode()),
mode=mode, uidgid=(uid, gid))
if self.system(cf_rec['postinstall_cmd']):
self.system(err_cmd)
def GetSlivers(data, config=None, plc=None):
logger.log("conf_files: Running.")
- instance = conf_files()
+ instance = ConfFiles()
instance.run_once(data)
logger.log("conf_files: Done.")
def main():
from argparse import ArgumentParser
+ from plcapi import PLCAPI
+
parser = ArgumentParser()
parser.add_argument('-f', '--config', action='store', dest='config',
default='/etc/planetlab/plc_config',
parser.add_argument('--noscripts', action='store_true', dest='noscripts',
default=False,
help='Do not run pre- or post-install scripts')
+ parser.add_argument('--max-attempts', action='store', dest='max_attempts',
+ default=10,
+ help='Max number of attempts')
+ parser.add_argument('--period', action='store', dest='period',
+ help='Time in seconds to wait between attempts')
args = parser.parse_args()
# Load /etc/planetlab/plc_config
else:
session = args.session
- # Initialize XML-RPC client
- from plcapi import PLCAPI
- plc = PLCAPI(config.plc_api_uri, config.cacert, auth=session)
- data = plc.GetSlivers()
+ # loop until it succeeds once
+ # this is a change that comes with python3/fedora29 in late 2018,
+ # because although the conf_files service is defined to systemd
+ # as a dependency of the network, it triggers too early
+ # at a point where eth0 is not ready
- instance = conf_files(args.noscripts)
- instance.run_once(data)
+ # Initialize XML-RPC client
+ attempts = 0
+ while True:
+ try:
+ plc = PLCAPI(config.plc_api_uri, config.cacert, auth=session)
+ data = plc.GetSlivers()
+ instance = ConfFiles(args.noscripts)
+ instance.run_once(data)
+ return 0
+ except Exception as exc:
+ logger.log_exc("Could not receive GetSlivers() from PLC")
+ attempts += 1
+ if attempts >= args.max_attempts:
+ return 1
+ logger.log("Waiting for {}s before trying again".format(args.period))
+ time.sleep(args.period)
if __name__ == '__main__':