Пример #1
0
    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')
Пример #2
0
    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
Пример #3
0
    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
Пример #4
0
 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')
Пример #5
0
 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')
Пример #6
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
Пример #7
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
Пример #8
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
Пример #9
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
Пример #10
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
Пример #11
0
    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
Пример #12
0
    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
Пример #13
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
Пример #14
0
 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
Пример #15
0
    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
Пример #16
0
    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
Пример #17
0
 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
Пример #18
0
    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
Пример #19
0
    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
Пример #20
0
    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')
Пример #21
0
    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')
Пример #22
0
    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')
Пример #23
0
 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)
Пример #24
0
 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)
Пример #25
0
 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)))
Пример #26
0
 def host_status(self):
     log.info("host status")
Пример #27
0
 def host_status(self):
     log.info("host status")
Пример #28
0
 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)))