def system_rollback(self): containers = self.container.get_container(self.args.template) # By now only support "Pulsar" and "overc" Linux rollback DIST = "Pulsar overc" need_reboot = False for cn in containers: if self.container.is_active(cn, self.args.template): for dist in DIST.split(): if dist in self.container.get_issue( cn, self.args.template).split(): log.info("Rollback container %s" % cn) self._container_rollback(cn, None, self.args.template, True) if self.retval is not 0: log.error("*** Failed to rollback container %s" % cn) else: need_reboot = True break self.host_rollback() if need_reboot: log.info("rebooting...") os.system('reboot')
def run(self, cmd, liveoutput=True): log.info("Running: %s" % cmd) child = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE) while True: fds = select.select([child.stdout.fileno(), child.stderr.fileno()], [], []) for fd in fds[0]: if fd == child.stdout.fileno(): if liveoutput: read = child.stdout.readline().decode("utf-8") else: read = child.stdout.read().decode("utf-8") if read != '': sys.stdout.write(read) self.stdout += read self.message += read if fd == child.stderr.fileno(): if liveoutput: read = child.stderr.readline().decode("utf-8") else: read = child.stderr.read().decode("utf-8") if read != '': sys.stderr.write(read) self.stderr += read self.message += read if child.poll() != None: break self.retval = child.poll() return self.retval
def run(self, cmd, liveoutput=True): log.info("Running: %s" % cmd) child = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE) while True: fds = select.select([child.stdout.fileno(), child.stderr.fileno()], [], []) for fd in fds[0]: if fd == child.stdout.fileno(): if liveoutput: read = child.stdout.readline().decode("utf-8") else: read = child.stdout.read().decode("utf-8") if read != '': sys.stdout.write(read) self.stdout += read self.message += read if fd == child.stderr.fileno(): if liveoutput: read = child.stderr.readline().decode("utf-8") else: read = child.stderr.read().decode("utf-8") if read != '': sys.stderr.write(read) self.stderr += read self.message += read if child.poll() != None: break self.retval = child.poll() return self.retval
def factory_reset(self): rc = self.agency.factory_reset() if not rc: self.agency.clean_essential() self.agency.clean_container() self.message += self.agency.message else: log.info("rebooting...") os.system('reboot')
def factory_reset(self): rc = self.agency.factory_reset() if not rc: self.agency.clean_essential() self.agency.clean_container() self.message += self.agency.message else: log.info("rebooting...") os.system('reboot')
def overlay_create(self, cn, dirs, source): val = self._overlay(cn, dirs, False, source) if (val == -1): return -1 if (val == 0): return 0 if (val == 1): log.info("Reboot required to rebuild overlay directories") return 0
def overlay_create(self, cn, dirs, source): val = self._overlay(cn, dirs, False, source) if (val == -1): return -1 if (val == 0): return 0 if (val == 1): log.info("Reboot required to rebuild overlay directories") return 0
def overlay_stop(self, cn, dirs): # Checking container status, overlay available val = self._overlay(cn, dirs, True) if (val == -1): return -1 if (val == 0): return 0 if (val == 1): log.info("Reboot required to rebuild overlay directories") return 0
def overlay_stop(self, cn, dirs): # Checking container status, overlay available val = self._overlay(cn, dirs, True) if (val == -1): return -1 if (val == 0): return 0 if (val == 1): log.info("Reboot required to rebuild overlay directories") return 0
def _overlay(self, cn, dirs, restore, sources=None): # Pararmeter check retval = 0 if (dirs == None): log.error("No dirs in parameter") return -1 if (restore == False): if (sources == None): log.error("No sources in parameter") return -1 else: # Check source container name for cn0 in sources.split(','): if (cn0 == cn): log.error("Can not set same container in source list") return -1 # check if overlay dir exists, ex /var/lib/lxc/dom0/rootfs/usr_temp for oldir in dirs.split(','): temppath = "%s/%s/rootfs%s_temp" % (CONTAINER_MOUNT, cn, oldir) fullpath = "%s/%s/rootfs%s" % (CONTAINER_MOUNT, cn, oldir) if (restore == True): # Stop an overlay, if (os.path.isdir(temppath) == False): #no such dir log.error("%s:not an overlay-ed dir in container" % (oldir)) return -1 else: # Create an overlay if (os.path.isdir(temppath) == True): # already overlay dir log.error("%s:already an overlay-ed dir in container" % (oldir)) return -1 # Insert request into lxc.service lxcfile = '%s/overlayrestore' % (CONTAINER_MOUNT) lxc = open(lxcfile, 'a+') lines = lxc.readlines().decode("utf-8").strip("\n") found = 0 for oldir in dirs.split(','): basepara = "%s %s" % (cn, oldir) for line in lines: if (line.find(basepara) != -1): found = 1 break if (found == 0): if (restore == True): cmdline = "/etc/lxc/overlayrestore %s\n" % basepara else: cmdline = "/etc/lxc/overlaycreate %s %s\n" % (basepara, sources) lxc.write(cmdline) retval = 1 else: log.info("%s already in overlay rebuild list, ignored" % basepara) lxc.close() return retval
def host_update(self): rc = 0 try: self.message += subprocess.check_output("cube-cmd dnf updateinfo --refresh", stderr=subprocess.STDOUT, shell=True).decode("utf-8").strip("\n") except subprocess.CalledProcessError as e: rc = e.returncode self.message += e.output.decode("utf-8").strip() if rc == 0: log.info(self.message) else: log.error(self.message) return rc
def _host_upgrade(self, reboot, force): rc = False if self._need_upgrade() or force: rc = self.agency.do_upgrade() self.message = self.agency.message else: self.message = "There is no new system available to upgrade!" log.info(self.message) return True if reboot: log.info("rebooting...") os.system('reboot') return rc
def _overlay(self, cn, dirs, restore, sources=None): # Pararmeter check retval = 0 if (dirs == None): log.error("No dirs in parameter") return -1 if (restore == False): if (sources == None): log.error("No sources in parameter") return -1 else: # Check source container name for cn0 in sources.split(','): if (cn0 == cn): log.error("Can not set same container in source list") return -1 # check if overlay dir exists, ex /var/lib/lxc/dom0/rootfs/usr_temp for oldir in dirs.split(','): temppath="%s/%s/rootfs%s_temp" % (CONTAINER_MOUNT,cn,oldir) fullpath="%s/%s/rootfs%s" % (CONTAINER_MOUNT,cn,oldir) if (restore == True): # Stop an overlay, if (os.path.isdir(temppath) == False): #no such dir log.error("%s:not an overlay-ed dir in container" % (oldir)) return -1 else: # Create an overlay if (os.path.isdir(temppath) == True): # already overlay dir log.error("%s:already an overlay-ed dir in container" % (oldir)) return -1 # Insert request into lxc.service lxcfile = '%s/overlayrestore' % (CONTAINER_MOUNT) lxc = open(lxcfile, 'a+') lines=lxc.readlines().decode("utf-8").strip("\n") found = 0 for oldir in dirs.split(','): basepara = "%s %s" % (cn,oldir) for line in lines: if (line.find(basepara) != -1): found = 1 break if (found == 0): if (restore == True): cmdline = "/etc/lxc/overlayrestore %s\n" % basepara else: cmdline = "/etc/lxc/overlaycreate %s %s\n" % (basepara, sources) lxc.write(cmdline) retval = 1 else: log.info("%s already in overlay rebuild list, ignored" % basepara) lxc.close() return retval
def run_script(self, template, args, failok=False, liveoutput=True): fname = CONTAINER_SCRIPT_PATH + "/" + template if not os.path.isfile(fname): self.message = "Error! Missing file: %s" % fname return 1 cmd = "%s %s" % (fname, args) process = Process() retval = process.run(cmd, liveoutput) self.message = process.message if retval is 0: log.info("%s ok" % fname) elif not failok: log.error("%s failed" % fname) return retval
def host_rollback(self): if self.bakup_mode: self.message = "You are running in the backup mode, cannot do rollback!" log.error(self.message) return False log.info("Start doing host rollback") r = self.agency.do_rollback() self.message = self.agency.message if r: os.system('reboot') else: log.error(self.message) return False
def host_rollback(self): if self.bakup_mode: self.message = "You are running in the backup mode, cannot do rollback!" log.error(self.message) return False log.info("Start doing host rollback") r = self.agency.do_rollback() self.message = self.agency.message if r: os.system('reboot') else: log.error(self.message) return False
def run_script(self, template, args, failok=False, liveoutput=True): fname = CONTAINER_SCRIPT_PATH + "/" + template if not os.path.isfile(fname): self.message = "Error! Missing file: %s" % fname return 1 cmd = "%s %s" % (fname, args) process = Process() retval = process.run(cmd, liveoutput) self.message = process.message if retval is 0: log.info("%s ok" % fname) elif not failok: log.error("%s failed" % fname) return retval
def _host_upgrade(self, reboot, force): rc = False if self._need_upgrade() or force: rc = self.agency.do_upgrade() self.message = self.agency.message else: self.message = "There is no new system available to upgrade!" log.info(self.message) return True if reboot: log.info("rebooting...") os.system('reboot') return rc
def host_update(self): rc = 0 try: self.message += subprocess.check_output( "cube-cmd dnf updateinfo --refresh", stderr=subprocess.STDOUT, shell=True).decode("utf-8").strip("\n") except subprocess.CalledProcessError as e: rc = e.returncode self.message += e.output.decode("utf-8").strip() if rc == 0: log.info(self.message) else: log.error(self.message) return rc
def _system_upgrade(self, template, reboot, force, skipscan, skip_del): containers = self.container.get_container(template) overlay_flag = 0 # By now only support "Pulsar" and "overc" Linux upgrading DIST = "Pulsar overc" succeeded = [] for cn in containers: self.retval = 0 if self.container.is_active(cn, template): for dist in DIST.split(): if dist in self.container.get_issue(cn, template).split(): log.info("Updating container %s" % cn) self._container_upgrade( cn, template, True, False, skip_del) #by now only rpm upgrade support if self.retval is not 0: log.error("*** Failed to upgrade container %s" % cn) log.error("*** Abort the system upgrade action") break else: succeeded.append(cn) if self.container.is_overlay(cn) > 0: overlay_flag = 1 break if self.retval is not 0: break if self.retval is not 0: for cn in succeeded: self._container_rollback(cn, None, template, True) sys.exit(self.retval) rc = self._host_upgrade(0, force) if ((overlay_flag == 1) and (skipscan == 0) and (rc == 1)): # Enable lxc-overlay service in essential by create a flagfile in CONTAINER_MOUNT lxcfile = '%s/need_scan_duplicate' % (CONTAINER_MOUNT) lxc = open(lxcfile, 'w+') lxc.close() if ((rc == 1) and (reboot != 0)): log.info("rebooting...") os.system('reboot')
def _system_upgrade(self, template, reboot, force, skipscan, skip_del): containers = self.container.get_container(template) overlay_flag = 0 # By now only support "Pulsar" and "overc" Linux upgrading DIST = "Pulsar overc" succeeded = [] for cn in containers: self.retval = 0 if self.container.is_active(cn, template): for dist in DIST.split(): if dist in self.container.get_issue(cn, template).split(): log.info("Updating container %s" % cn) self._container_upgrade(cn, template, True, False, skip_del) #by now only rpm upgrade support if self.retval is not 0: log.error("*** Failed to upgrade container %s" % cn) log.error("*** Abort the system upgrade action") break else: succeeded.append(cn) if self.container.is_overlay(cn) > 0: overlay_flag = 1 break if self.retval is not 0: break if self.retval is not 0: for cn in succeeded: self._container_rollback(cn, None, template, True) sys.exit(self.retval) rc = self._host_upgrade(0, force) if ((overlay_flag == 1) and (skipscan == 0) and (rc == 1)): # Enable lxc-overlay service in essential by create a flagfile in CONTAINER_MOUNT lxcfile = '%s/need_scan_duplicate' % (CONTAINER_MOUNT) lxc = open(lxcfile, 'w+') lxc.close() if ((rc == 1) and (reboot != 0)): log.info("rebooting...") os.system('reboot')
def system_rollback(self): containers = self.container.get_container(self.args.template) # By now only support "Pulsar" and "overc" Linux rollback DIST = "Pulsar overc" need_reboot=False for cn in containers: if self.container.is_active(cn, self.args.template): for dist in DIST.split(): if dist in self.container.get_issue(cn, self.args.template).split(): log.info("Rollback container %s" % cn) self._container_rollback(cn, None, self.args.template, True) if self.retval is not 0: log.error("*** Failed to rollback container %s" % cn) else: need_reboot=True break self.host_rollback() if need_reboot: log.info("rebooting...") os.system('reboot')
def container_upgrade(self): # Perform overlay check fist overlaylist = self.container.get_overlay(self.args.name) if len(overlaylist)>0: log.info("Container %s has overlayed dir, including" % self.args.name) log.info(overlaylist) log.info("This container can only be upgraded via a system upgrade") self.retval = 0 else: self._container_upgrade(self.args.name, self.args.template, self.args.rpm, self.args.image, self.args.skip_del) sys.exit(self.retval)
def container_upgrade(self): # Perform overlay check fist overlaylist = self.container.get_overlay(self.args.name) if len(overlaylist) > 0: log.info("Container %s has overlayed dir, including" % self.args.name) log.info(overlaylist) log.info( "This container can only be upgraded via a system upgrade") self.retval = 0 else: self._container_upgrade(self.args.name, self.args.template, self.args.rpm, self.args.image, self.args.skip_del) sys.exit(self.retval)
def _container_overlay_list(self, container): # List overlay dir in container log.info("overlayed directories in %s including:" % container) log.info(",".join(self.container.get_overlay(container)))
def host_status(self): log.info("host status")
def host_status(self): log.info("host status")
def _container_overlay_list(self, container): # List overlay dir in container log.info("overlayed directories in %s including:" % container) log.info(",".join(self.container.get_overlay(container)))