def setUp(self):
     ks_template = settings.KS_TEMPLATE
     self.WORKING_DIR = tempfile.mkdtemp(prefix='preupg')
     if os.path.isdir(self.WORKING_DIR):
         shutil.rmtree(self.WORKING_DIR)
     os.makedirs(self.WORKING_DIR)
     settings.KS_DIR = self.WORKING_DIR
     shutil.copyfile(
         os.path.join(os.getcwd(), 'data', 'templates', ks_template),
         os.path.join(self.WORKING_DIR, ks_template))
     conf = {"y": True}
     dc = DummyConfKickstart(**conf)
     cli_kickstart = CLIKickstart(["--assumeyes"])
     conf = ConfKickstart(cli_kickstart.opts, dc, cli_kickstart)
     self.kg = KickstartGenerator(conf, self.WORKING_DIR,
                                  settings.KS_FILENAME)
     self.kg.collect_data()
 def setUp(self):
     ks_template = settings.KS_TEMPLATE
     self.WORKING_DIR = tempfile.mkdtemp(prefix='preupg')
     if os.path.isdir(self.WORKING_DIR):
         shutil.rmtree(self.WORKING_DIR)
     os.makedirs(self.WORKING_DIR)
     settings.KS_DIR = self.WORKING_DIR
     shutil.copyfile(os.path.join(os.getcwd(), 'data', 'templates',
                                  ks_template),
                     os.path.join(self.WORKING_DIR, ks_template))
     conf = {"y": True}
     dc = DummyConfKickstart(**conf)
     cli_kickstart = CLIKickstart(["--assumeyes"])
     conf = ConfKickstart(cli_kickstart.opts, dc, cli_kickstart)
     self.kg = KickstartGenerator(conf, self.WORKING_DIR,
                                  settings.KS_FILENAME)
     self.kg.collect_data()
Beispiel #3
0
    def run(self):
        """run analysis"""
        version_msg = "Preupgrade Assistant version: %s" % VERSION
        if self.conf.version:
            print(version_msg)
            return 0

        logger_debug.debug(version_msg)
        if self.conf.list_contents_set:
            for dir_name, dummy_content in iter(
                    get_installed_module_sets(self.conf.source_dir).items()):
                log_message("%s" % dir_name)
            return 0

        if self.conf.riskcheck:
            result_xml_path = os.path.join(settings.assessment_results_dir,
                                           settings.xml_result_name)
            if not os.path.exists(result_xml_path):
                log_message("System assessment needs to be performed first.")
                return ReturnValues.PREUPG_BEFORE_RISKCHECK
            return XccdfHelper.check_inplace_risk(result_xml_path,
                                                  self.conf.verbose)

        if self.conf.upload and self.conf.results:
            if not self.upload_results():
                return ReturnValues.SEND_REPORT_TO_UI
            return 0

        if self.conf.cleanup:
            if not self.executed_under_root():
                return ReturnValues.ROOT
            self.clean_preupgrade_environment()
            return 0

        if self.conf.text:
            # Test whether w3m, lynx and elinks packages are installed
            found = False
            for pkg in SystemIdentification.get_convertors():
                if xml_manager.get_package_version(pkg):
                    self.text_convertor = pkg
                    found = True
                    break
            if not found:
                log_message(
                    settings.converter_message.format(' '.join(
                        SystemIdentification.get_convertors())))
                return ReturnValues.MISSING_TEXT_CONVERTOR

        return_code = self.determine_module_set_location()
        if return_code:
            return return_code
        self.determine_module_set_copy_location()

        if self.conf.list_rules:
            rules = [
                x for x in XccdfHelper.get_list_rules(self.all_xccdf_xml_path)
            ]
            log_message('\n'.join(rules))
            return 0

        if self.conf.mode and self.conf.select_rules:
            log_message(settings.options_not_allowed)
            return ReturnValues.MODE_SELECT_RULES

        # If force option is not mentioned and user selects NO then exit
        if not self.conf.force:
            text = ""
            if self.conf.dst_arch:
                correct_option = [
                    x for x in settings.migration_options
                    if self.conf.dst_arch == x
                ]
                if not correct_option:
                    sys.stderr.write(
                        "Error: Specify correct value for --dst-arch"
                        " option.\nValid are: %s.\n" %
                        ", ".join(settings.migration_options))
                    return ReturnValues.INVALID_CLI_OPTION
            if SystemIdentification.get_arch() == "i386" or \
                    SystemIdentification.get_arch() == "i686":
                if not self.conf.dst_arch:
                    text = '\n' + settings.migration_text
            logger_debug.debug("Architecture '%s'. Text '%s'.",
                               SystemIdentification.get_arch(), text)
            if not show_message(settings.warning_text + text):
                # User does not want to continue
                return ReturnValues.USER_ABORT

        self.openscap_helper = OpenSCAPHelper(self.conf.assessment_results_dir,
                                              self.conf.result_prefix,
                                              self.conf.xml_result_name,
                                              self.conf.html_result_name,
                                              self.all_xccdf_xml_path)

        if not self.executed_under_root():
            return ReturnValues.ROOT
        if not os.path.exists(settings.openscap_binary):
            log_message("Oscap with SCE enabled is not installed")
            return ReturnValues.MISSING_OPENSCAP
        if not os.access(settings.openscap_binary, os.X_OK):
            log_message("Oscap with SCE %s is not executable" %
                        settings.openscap_binary)
            return ReturnValues.MISSING_OPENSCAP

        self.execution_dir = os.getcwd()
        os.chdir("/tmp")
        retval = self.scan_system()
        if retval != 0:
            return retval
        retval = self.summary_report(self.tar_ball_name)
        self.common.copy_common_files()
        KickstartGenerator.kickstart_scripts()
        FileHelper.remove_home_issues()
        if self.conf.upload:
            if not self.upload_results():
                retval = ReturnValues.SEND_REPORT_TO_UI
        os.chdir(self.execution_dir)
        return retval
class TestKickstartPartitioning(base.TestCase):

    kickstart = None
    dir_name = None
    WORKING_DIR = ''
    lsblk_list = 'lsblk_list'
    vgs_list = 'vgs_list'
    lvdisplay = 'lvdisplay'
    firewall_cmd = 'firewall-cmd'
    users = 'Users'
    groups = 'Groups'
    kg = None

    def setUp(self):
        ks_template = settings.KS_TEMPLATE
        self.WORKING_DIR = tempfile.mkdtemp(prefix='preupg')
        if os.path.isdir(self.WORKING_DIR):
            shutil.rmtree(self.WORKING_DIR)
        os.makedirs(self.WORKING_DIR)
        settings.KS_DIR = self.WORKING_DIR
        shutil.copyfile(
            os.path.join(os.getcwd(), 'data', 'templates', ks_template),
            os.path.join(self.WORKING_DIR, ks_template))
        conf = {"y": True}
        dc = DummyConfKickstart(**conf)
        cli_kickstart = CLIKickstart(["--assumeyes"])
        conf = ConfKickstart(cli_kickstart.opts, dc, cli_kickstart)
        self.kg = KickstartGenerator(conf, self.WORKING_DIR,
                                     settings.KS_FILENAME)
        self.kg.collect_data()

    def test_lvm_partitions(self):
        lvm_lsblk = get_full_path('lvm_lsblk_list')
        vgs_list = get_full_path('vgs_list')
        lvdisplay = get_full_path('lvdisplay')
        shutil.copyfile(lvm_lsblk,
                        os.path.join(self.WORKING_DIR, self.lsblk_list))
        shutil.copyfile(vgs_list, os.path.join(self.WORKING_DIR,
                                               self.vgs_list))
        shutil.copyfile(lvdisplay,
                        os.path.join(self.WORKING_DIR, self.lvdisplay))
        self.kg.generate()
        expected_layout = [
            'clearpart --all', 'part /boot --ondisk=vda --size=500',
            'part pv.01 --size=9000', 'volgroup vg_rhel67 --pesize=4096 pv.01',
            'logvol /  --size=8000 --name=lv_root --vgname=vg_rhel67',
            'logvol swap  --size=1000 --name=lv_swap --vgname=vg_rhel67'
        ]
        for layout in expected_layout:
            self.assertTrue(layout.strip(), self.kg.ks.handler.__str__())

    def test_lvm_crypt_partitions(self):
        lvm_lsblk = get_full_path('lvm_crypt_lsblk_list')
        vgs_list = get_full_path('vgs_list')
        lvdisplay = get_full_path('lvdisplay')
        shutil.copyfile(lvm_lsblk,
                        os.path.join(self.WORKING_DIR, self.lsblk_list))
        shutil.copyfile(vgs_list, os.path.join(self.WORKING_DIR,
                                               self.vgs_list))
        shutil.copyfile(lvdisplay,
                        os.path.join(self.WORKING_DIR, self.lvdisplay))
        self.kg.generate()
        expected_layout = [
            'clearpart --all', 'part /boot --ondisk=vda --size=500',
            'part pv.01 --size=9000', 'volgroup vg_rhel67 --pesize=4096 pv.01',
            'logvol /  --size=8000 --name=lv_root --vgname=vg_rhel67',
            'logvol swap  --size=1000 --name=lv_swap --vgname=vg_rhel67'
        ]
        for layout in expected_layout:
            self.assertTrue(layout.strip(), self.kg.ks.handler.__str__())

    def test_crypt_partitions(self):
        lvm_lsblk = get_full_path('crypt_lsblk_list')
        shutil.copyfile(lvm_lsblk,
                        os.path.join(self.WORKING_DIR, self.lsblk_list))
        self.kg.generate()
        expected_layout = [
            'clearpart --all', 'part / --size=3000 --encrypted',
            'part /boot --ondisk=vda --size=200',
            'part swap --ondisk=vda --size=2000'
        ]
        for layout in expected_layout:
            self.assertTrue(layout.strip(), self.kg.ks.handler.__str__())

    def test_raid_crypt_partitions(self):
        raid_lsblk = get_full_path('raid_lsblk_list')
        shutil.copyfile(raid_lsblk,
                        os.path.join(self.WORKING_DIR, self.lsblk_list))
        self.kg.generate()
        expected_layout = [
            'clearpart --all', 'part /boot --ondisk=sda --size=200',
            'part swap --ondisk=sda --size=1000',
            'part raid.00001 --grow --size=2048',
            'part raid.00002 --grow --size=2048',
            'part raid.00003 --grow --size=2048',
            'part raid.00004 --grow --size=2048',
            'raid / --device=md1 --level=1 raid.00001 raid.00002',
            'raid /home --device=md0 --level=0 --encrypted raid.00003 raid.00004'
        ]
        for layout in expected_layout:
            self.assertTrue(layout.strip(), self.kg.ks.handler.__str__())

    def test_raid_second_partitions(self):
        raid_lsblk = get_full_path('raid_lsblk_second_list')
        shutil.copyfile(raid_lsblk,
                        os.path.join(self.WORKING_DIR, self.lsblk_list))
        self.kg.generate()
        expected_layout = [
            'clearpart --all',
            'part /boot --ondisk=vda --size=1000 ',
            'part swap --ondisk=vdb --size=1000',
            'part raid.00001 --grow --size=2048',
            'part raid.00002 --grow --size=2048',
            'raid / --device=md0 --level=0 raid.00001 raid.00002',
        ]
        for layout in expected_layout:
            self.assertTrue(layout.strip(), self.kg.ks.handler.__str__())

    def test_native_partitioning(self):
        lsblk_native_lsblk = get_full_path('lsblk_native_list')
        shutil.copyfile(lsblk_native_lsblk,
                        os.path.join(self.WORKING_DIR, self.lsblk_list))
        self.kg.generate()
        expected_layout = [
            'clearpart --all',
            'part / --ondisk=vda --size=5000',
            'part /boot --ondisk=vda --size=200',
            'part /home --ondisk=vda --size=2000',
            'part swap --ondisk=vda --size=1000',
        ]
        for layout in expected_layout:
            self.assertTrue(layout.strip() in self.kg.ks.handler.__str__())

    def test_firewall_rules(self):
        firewall_cmd = get_full_path(self.firewall_cmd)
        shutil.copyfile(firewall_cmd,
                        os.path.join(self.WORKING_DIR, self.firewall_cmd))
        self.kg.generate()
        expected_layout = ['firewall --enabled --service=foo,bar,test']
        for layout in expected_layout:
            self.assertTrue(layout.strip(), self.kg.ks.handler.__str__())

    def test_user_and_groups(self):
        files = ['Users', 'Groups', 'setup_passwd', 'uidgid']
        for f in files:
            shutil.copyfile(get_full_path(f),
                            os.path.join(self.WORKING_DIR, f))
        self.kg.generate()
        expected_layout = [
            'group --name=foobar --gid=500', 'group --name=testfoo --gid=506',
            'group --name=preupg --gid=501',
            'user --homedir=/home/foobar --name=foobar --shell=/bin/bash --uid=500 --gid=500',
            'user --homedir=/ --name=testfoo --shell=/sbin/nologin --uid=506 --gid=506',
            'user --homedir=/home/preupg --name=preupg --shell=/sbin/nologin --uid=501 --gid=501'
        ]

        for layout in expected_layout:
            self.assertTrue(layout.strip(), self.kg.ks.handler.__str__())

    def tearDown(self):
        pass
    def run(self):
        """run analysis"""
        version_msg = "Preupgrade Assistant version: %s" % VERSION
        if self.conf.version:
            print (version_msg)
            return 0

        logger_debug.debug(version_msg)
        if self.conf.list_contents_set:
            for dir_name, dummy_content in six.iteritems(list_contents(self.conf.source_dir)):
                log_message("%s" % dir_name)
            return 0

        if not self.conf.scan and not self.conf.contents and not self.conf.list_rules:
            ret_val = self._check_available_contents()
            if int(ret_val) != 0:
                return ret_val

        if self.conf.list_rules:
            ret_val = self._check_available_contents()
            if int(ret_val) != 0:
                return ret_val
            rules = [self.conf.scan + ':' + x for x in XccdfHelper.get_list_rules(self.conf.scan)]
            log_message('\n'.join(rules))
            return 0

        if self.conf.upload:
            if not self.upload_results():
                return ReturnValues.SEND_REPORT_TO_UI
            return 0

        if self.conf.mode and self.conf.select_rules:
            log_message(settings.options_not_allowed)
            return ReturnValues.MODE_SELECT_RULES

        if not self.conf.riskcheck and not self.conf.cleanup and not self.conf.kickstart:
            # If force option is not mentioned and user select NO then exits
            if not self.conf.force:
                text = ""
                if self.conf.dst_arch:
                    correct_option = [x for x in settings.migration_options if self.conf.dst_arch == x]
                    if not correct_option:
                        log_message("Specify the correct --dst-arch option.")
                        log_message("There are '%s' or '%s' available." % (settings.migration_options[0],
                                                                    settings.migration_options[1]))
                        return ReturnValues.RISK_CLEANUP_KICKSTART
                if SystemIdentification.get_arch() == "i386" or SystemIdentification.get_arch() == "i686":
                    if not self.conf.dst_arch:
                        text = '\n' + settings.migration_text
                logger_debug.debug("Architecture '%s'. Text '%s'.", SystemIdentification.get_arch(), text)
                if not show_message(settings.warning_text + text):
                    # We do not want to continue
                    return ReturnValues.RISK_CLEANUP_KICKSTART

        if self.conf.text:
            # Test whether w3m, lynx and elinks packages are installed
            found = False
            for pkg in SystemIdentification.get_convertors():
                if xml_manager.get_package_version(pkg):
                    self.text_convertor = pkg
                    found = True
                    break
            if not found:
                log_message(settings.converter_message.format(' '.join(SystemIdentification.get_convertors())))
                return ReturnValues.MISSING_TEXT_CONVERTOR

        if os.geteuid() != 0:
            print("Need to be root", end="\n")
            if not self.conf.debug:
                return ReturnValues.ROOT

        if self.conf.cleanup:
            self.clean_preupgrade_environment()
            return 0

        self.openscap_helper = OpenSCAPHelper(self.conf.assessment_results_dir,
                                              self.conf.result_prefix,
                                              self.conf.xml_result_name,
                                              self.conf.html_result_name,
                                              self.content)
        if self.conf.riskcheck:
            if not os.path.exists(self.openscap_helper.get_default_xml_result_path()):
                log_message("The 'preupg' command was not run yet. Run it to check for possible risks.")
                return ReturnValues.PREUPG_BEFORE_KICKSTART
            return_val = XccdfHelper.check_inplace_risk(self.openscap_helper.get_default_xml_result_path(),
                                                        self.conf.verbose)
            return return_val

        if self.conf.kickstart:
            if not os.path.exists(self.openscap_helper.get_default_xml_result_path()):
                log_message("The 'preupg' command was not run yet. Run it before the Kickstart generation.")
                return ReturnValues.PREUPG_BEFORE_KICKSTART
            kg = KickstartGenerator(self.conf, settings.KS_DIR,
                                    settings.KS_PATH)
            kg.main()
            return 0

        if self.conf.scan:
            self.content = os.path.join(self.conf.source_dir,
                                        self.conf.scan,
                                        settings.content_file)
            if self.conf.scan.startswith("/"):
                log_message('Specify the correct upgrade path parameter like -s RHEL6_7')
                log_message("Upgrade path is provided by the 'preupg --list' command.")
                self._check_available_contents()
                log_message("The available upgrade paths: '%s'" % '\n'.join(self.list_scans))
                return ReturnValues.SCENARIO
            if not os.path.isdir(os.path.join(self.conf.source_dir, self.conf.scan)):
                log_message('Specify the correct upgrade path parameter like -s RHEL6_7')
                self._check_available_contents()
                log_message("Upgrade path is provided by the 'preupg --list' command.")
                log_message("The available upgrade paths: '%s'" % '\n'.join(self.list_scans))
                return ReturnValues.SCENARIO

        if self.conf.contents:
            self.content = os.path.join(os.getcwd(), self.conf.contents)
            # From content path like content-users/RHEL6_7 we need
            # to get content-users dir
            content_dir = self.conf.contents[:self.conf.contents.find(self.get_scenario())]
            self.conf.source_dir = os.path.join(os.getcwd(), content_dir)

        self.common = Common(self.conf)
        if not self.conf.skip_common:
            if not self.common.common_results():
                return ReturnValues.SCRIPT_TXT_MISSING

        if self.conf.scan or self.conf.contents:
            if not os.path.exists(settings.openscap_binary):
                log_message("Oscap with SCE enabled is not installed")
                return ReturnValues.MISSING_OPENSCAP
            if not os.access(settings.openscap_binary, os.X_OK):
                log_message("Oscap with SCE %s is not executable" % settings.openscap_binary)
                return ReturnValues.MISSING_OPENSCAP

            current_dir = os.getcwd()
            os.chdir("/tmp")
            retval = self.scan_system()
            if int(retval) != 0:
                return retval
            self.summary_report(self.tar_ball_name)
            self.common.copy_common_files()
            KickstartGenerator.kickstart_scripts()
            FileHelper.remove_home_issues()
            if self.conf.upload:
                self.upload_results(self.tar_ball_name)
            os.chdir(current_dir)
            return self.report_return_value

        log_message('Nothing to do. Give me a task, please.')
        self.conf.settings[2].parser.print_help()
        return 0
    def run(self):
        """run analysis"""
        version_msg = "Preupgrade Assistant version: %s" % VERSION
        if self.conf.version:
            print (version_msg)
            return 0

        logger_debug.debug(version_msg)
        if self.conf.list_contents_set:
            for dir_name, dummy_content in iter(get_installed_module_sets(
                    self.conf.source_dir).items()):
                log_message("%s" % dir_name)
            return 0

        if self.conf.riskcheck:
            result_xml_path = os.path.join(settings.assessment_results_dir,
                                           settings.xml_result_name)
            if not os.path.exists(result_xml_path):
                log_message("System assessment needs to be performed first.")
                return ReturnValues.PREUPG_BEFORE_RISKCHECK
            return XccdfHelper.check_inplace_risk(result_xml_path,
                                                  self.conf.verbose)

        if self.conf.upload and self.conf.results:
            if not self.upload_results():
                return ReturnValues.SEND_REPORT_TO_UI
            return 0

        if self.conf.cleanup:
            if not self.executed_under_root():
                return ReturnValues.ROOT
            self.clean_preupgrade_environment()
            return 0

        if self.conf.text:
            # Test whether w3m, lynx and elinks packages are installed
            found = False
            for pkg in SystemIdentification.get_convertors():
                if xml_manager.get_package_version(pkg):
                    self.text_convertor = pkg
                    found = True
                    break
            if not found:
                log_message(settings.converter_message.format(
                    ' '.join(SystemIdentification.get_convertors())))
                return ReturnValues.MISSING_TEXT_CONVERTOR

        return_code = self.determine_module_set_location()
        if return_code:
            return return_code
        self.determine_module_set_copy_location()

        if self.conf.list_rules:
            rules = [x for x in
                     XccdfHelper.get_list_rules(self.all_xccdf_xml_path)]
            log_message('\n'.join(rules))
            return 0

        if self.conf.mode and self.conf.select_rules:
            log_message(settings.options_not_allowed)
            return ReturnValues.MODE_SELECT_RULES

        # If force option is not mentioned and user selects NO then exit
        if not self.conf.force:
            text = ""
            if self.conf.dst_arch:
                correct_option = [x for x in settings.migration_options
                                  if self.conf.dst_arch == x]
                if not correct_option:
                    sys.stderr.write(
                        "Error: Specify correct value for --dst-arch"
                        " option.\nValid are: %s.\n"
                        % ", ".join(settings.migration_options)
                    )
                    return ReturnValues.INVALID_CLI_OPTION
            if SystemIdentification.get_arch() == "i386" or \
                    SystemIdentification.get_arch() == "i686":
                if not self.conf.dst_arch:
                    text = '\n' + settings.migration_text
            logger_debug.debug("Architecture '%s'. Text '%s'.",
                               SystemIdentification.get_arch(), text)
            if not show_message(settings.warning_text + text):
                # User does not want to continue
                return ReturnValues.USER_ABORT

        self.openscap_helper = OpenSCAPHelper(self.conf.assessment_results_dir,
                                              self.conf.result_prefix,
                                              self.conf.xml_result_name,
                                              self.conf.html_result_name,
                                              self.all_xccdf_xml_path)

        if not self.executed_under_root():
            return ReturnValues.ROOT
        if not os.path.exists(settings.openscap_binary):
            log_message("Oscap with SCE enabled is not installed")
            return ReturnValues.MISSING_OPENSCAP
        if not os.access(settings.openscap_binary, os.X_OK):
            log_message("Oscap with SCE %s is not executable"
                        % settings.openscap_binary)
            return ReturnValues.MISSING_OPENSCAP

        self.execution_dir = os.getcwd()
        os.chdir("/tmp")
        retval = self.scan_system()
        if retval != 0:
            return retval
        retval = self.summary_report(self.tar_ball_name)
        self.common.copy_common_files()
        KickstartGenerator.kickstart_scripts()
        FileHelper.remove_home_issues()
        if self.conf.upload:
            if not self.upload_results():
                retval = ReturnValues.SEND_REPORT_TO_UI
        os.chdir(self.execution_dir)
        return retval
class TestKickstartPartitioning(base.TestCase):

    kickstart = None
    dir_name = None
    WORKING_DIR = ''
    lsblk_list = 'lsblk_list'
    vgs_list = 'vgs_list'
    lvdisplay = 'lvdisplay'
    firewall_cmd = 'firewall-cmd'
    users = 'Users'
    groups = 'Groups'
    kg = None

    def setUp(self):
        ks_template = settings.KS_TEMPLATE
        self.WORKING_DIR = tempfile.mkdtemp(prefix='preupg')
        if os.path.isdir(self.WORKING_DIR):
            shutil.rmtree(self.WORKING_DIR)
        os.makedirs(self.WORKING_DIR)
        settings.KS_DIR = self.WORKING_DIR
        shutil.copyfile(os.path.join(os.getcwd(), 'data', 'templates',
                                     ks_template),
                        os.path.join(self.WORKING_DIR, ks_template))
        conf = {"y": True}
        dc = DummyConfKickstart(**conf)
        cli_kickstart = CLIKickstart(["--assumeyes"])
        conf = ConfKickstart(cli_kickstart.opts, dc, cli_kickstart)
        self.kg = KickstartGenerator(conf, self.WORKING_DIR,
                                     settings.KS_FILENAME)
        self.kg.collect_data()

    def test_lvm_partitions(self):
        lvm_lsblk = get_full_path('lvm_lsblk_list')
        vgs_list = get_full_path('vgs_list')
        lvdisplay = get_full_path('lvdisplay')
        shutil.copyfile(lvm_lsblk, os.path.join(self.WORKING_DIR, self.lsblk_list))
        shutil.copyfile(vgs_list, os.path.join(self.WORKING_DIR, self.vgs_list))
        shutil.copyfile(lvdisplay, os.path.join(self.WORKING_DIR, self.lvdisplay))
        self.kg.generate()
        expected_layout = ['clearpart --all',
                           'part /boot --ondisk=vda --size=500',
                           'part pv.01 --size=9000',
                           'volgroup vg_rhel67 --pesize=4096 pv.01',
                           'logvol /  --size=8000 --name=lv_root --vgname=vg_rhel67',
                           'logvol swap  --size=1000 --name=lv_swap --vgname=vg_rhel67']
        for layout in expected_layout:
            self.assertTrue(layout.strip(), self.kg.ks.handler.__str__())

    def test_lvm_crypt_partitions(self):
        lvm_lsblk = get_full_path('lvm_crypt_lsblk_list')
        vgs_list = get_full_path('vgs_list')
        lvdisplay = get_full_path('lvdisplay')
        shutil.copyfile(lvm_lsblk, os.path.join(self.WORKING_DIR, self.lsblk_list))
        shutil.copyfile(vgs_list, os.path.join(self.WORKING_DIR, self.vgs_list))
        shutil.copyfile(lvdisplay, os.path.join(self.WORKING_DIR, self.lvdisplay))
        self.kg.generate()
        expected_layout = ['clearpart --all',
                           'part /boot --ondisk=vda --size=500',
                           'part pv.01 --size=9000',
                           'volgroup vg_rhel67 --pesize=4096 pv.01',
                           'logvol /  --size=8000 --name=lv_root --vgname=vg_rhel67',
                           'logvol swap  --size=1000 --name=lv_swap --vgname=vg_rhel67']
        for layout in expected_layout:
            self.assertTrue(layout.strip(), self.kg.ks.handler.__str__())

    def test_crypt_partitions(self):
        lvm_lsblk = get_full_path('crypt_lsblk_list')
        shutil.copyfile(lvm_lsblk, os.path.join(self.WORKING_DIR, self.lsblk_list))
        self.kg.generate()
        expected_layout = ['clearpart --all',
                           'part / --size=3000 --encrypted',
                           'part /boot --ondisk=vda --size=200',
                           'part swap --ondisk=vda --size=2000']
        for layout in expected_layout:
            self.assertTrue(layout.strip(), self.kg.ks.handler.__str__())

    def test_raid_crypt_partitions(self):
        raid_lsblk = get_full_path('raid_lsblk_list')
        shutil.copyfile(raid_lsblk, os.path.join(self.WORKING_DIR, self.lsblk_list))
        self.kg.generate()
        expected_layout = ['clearpart --all',
                           'part /boot --ondisk=sda --size=200',
                           'part swap --ondisk=sda --size=1000',
                           'part raid.00001 --grow --size=2048',
                           'part raid.00002 --grow --size=2048',
                           'part raid.00003 --grow --size=2048',
                           'part raid.00004 --grow --size=2048',
                           'raid / --device=md1 --level=1 raid.00001 raid.00002',
                           'raid /home --device=md0 --level=0 --encrypted raid.00003 raid.00004'
                           ]
        for layout in expected_layout:
            self.assertTrue(layout.strip(), self.kg.ks.handler.__str__())

    def test_raid_second_partitions(self):
        raid_lsblk = get_full_path('raid_lsblk_second_list')
        shutil.copyfile(raid_lsblk, os.path.join(self.WORKING_DIR, self.lsblk_list))
        self.kg.generate()
        expected_layout = ['clearpart --all',
                           'part /boot --ondisk=vda --size=1000 ',
                           'part swap --ondisk=vdb --size=1000',
                           'part raid.00001 --grow --size=2048',
                           'part raid.00002 --grow --size=2048',
                           'raid / --device=md0 --level=0 raid.00001 raid.00002',
                           ]
        for layout in expected_layout:
            self.assertTrue(layout.strip(), self.kg.ks.handler.__str__())

    def test_native_partitioning(self):
        lsblk_native_lsblk = get_full_path('lsblk_native_list')
        shutil.copyfile(lsblk_native_lsblk, os.path.join(self.WORKING_DIR, self.lsblk_list))
        self.kg.generate()
        expected_layout = ['clearpart --all',
                           'part / --ondisk=vda --size=5000',
                           'part /boot --ondisk=vda --size=200',
                           'part /home --ondisk=vda --size=2000',
                           'part swap --ondisk=vda --size=1000',
                           ]
        for layout in expected_layout:
            self.assertTrue(layout.strip() in self.kg.ks.handler.__str__())

    def test_firewall_rules(self):
        firewall_cmd = get_full_path(self.firewall_cmd)
        shutil.copyfile(firewall_cmd, os.path.join(self.WORKING_DIR, self.firewall_cmd))
        self.kg.generate()
        expected_layout = ['firewall --enabled --service=foo,bar,test']
        for layout in expected_layout:
            self.assertTrue(layout.strip(), self.kg.ks.handler.__str__())

    def test_user_and_groups(self):
        files = ['Users', 'Groups', 'setup_passwd', 'uidgid']
        for f in files:
            shutil.copyfile(get_full_path(f), os.path.join(self.WORKING_DIR, f))
        self.kg.generate()
        expected_layout = ['group --name=foobar --gid=500',
                           'group --name=testfoo --gid=506',
                           'group --name=preupg --gid=501',
                           'user --homedir=/home/foobar --name=foobar --shell=/bin/bash --uid=500 --gid=500',
                           'user --homedir=/ --name=testfoo --shell=/sbin/nologin --uid=506 --gid=506',
                           'user --homedir=/home/preupg --name=preupg --shell=/sbin/nologin --uid=501 --gid=501']

        for layout in expected_layout:
            self.assertTrue(layout.strip(), self.kg.ks.handler.__str__())

    def tearDown(self):
        pass
Beispiel #8
0
    def run(self):
        """run analysis"""
        version_msg = "Preupgrade Assistant version: %s" % VERSION
        if self.conf.version:
            print(version_msg)
            return 0

        logger_debug.debug(version_msg)
        if self.conf.list_contents_set:
            for dir_name, dummy_content in six.iteritems(
                    list_contents(self.conf.source_dir)):
                log_message("%s" % dir_name)
            return 0

        if not self.conf.scan and not self.conf.contents and not self.conf.list_rules:
            ret_val = self._check_available_contents()
            if int(ret_val) != 0:
                return ret_val

        if self.conf.list_rules:
            ret_val = self._check_available_contents()
            if int(ret_val) != 0:
                return ret_val
            rules = [
                self.conf.scan + ':' + x
                for x in XccdfHelper.get_list_rules(self.conf.scan)
            ]
            log_message('\n'.join(rules))
            return 0

        if self.conf.upload:
            if not self.upload_results():
                return ReturnValues.SEND_REPORT_TO_UI
            return 0

        if self.conf.mode and self.conf.select_rules:
            log_message(settings.options_not_allowed)
            return ReturnValues.MODE_SELECT_RULES

        if not self.conf.riskcheck and not self.conf.cleanup and not self.conf.kickstart:
            # If force option is not mentioned and user select NO then exits
            if not self.conf.force:
                text = ""
                if self.conf.dst_arch:
                    correct_option = [
                        x for x in settings.migration_options
                        if self.conf.dst_arch == x
                    ]
                    if not correct_option:
                        log_message("Specify the correct --dst-arch option.")
                        log_message("There are '%s' or '%s' available." %
                                    (settings.migration_options[0],
                                     settings.migration_options[1]))
                        return ReturnValues.RISK_CLEANUP_KICKSTART
                if SystemIdentification.get_arch(
                ) == "i386" or SystemIdentification.get_arch() == "i686":
                    if not self.conf.dst_arch:
                        text = '\n' + settings.migration_text
                logger_debug.debug("Architecture '%s'. Text '%s'.",
                                   SystemIdentification.get_arch(), text)
                if not show_message(settings.warning_text + text):
                    # We do not want to continue
                    return ReturnValues.RISK_CLEANUP_KICKSTART

        if self.conf.text:
            # Test whether w3m, lynx and elinks packages are installed
            found = False
            for pkg in SystemIdentification.get_convertors():
                if xml_manager.get_package_version(pkg):
                    self.text_convertor = pkg
                    found = True
                    break
            if not found:
                log_message(
                    settings.converter_message.format(' '.join(
                        SystemIdentification.get_convertors())))
                return ReturnValues.MISSING_TEXT_CONVERTOR

        if os.geteuid() != 0:
            print("Need to be root", end="\n")
            if not self.conf.debug:
                return ReturnValues.ROOT

        if self.conf.cleanup:
            self.clean_preupgrade_environment()
            return 0

        self.openscap_helper = OpenSCAPHelper(self.conf.assessment_results_dir,
                                              self.conf.result_prefix,
                                              self.conf.xml_result_name,
                                              self.conf.html_result_name,
                                              self.content)
        if self.conf.riskcheck:
            if not os.path.exists(
                    self.openscap_helper.get_default_xml_result_path()):
                log_message(
                    "The 'preupg' command was not run yet. Run it to check for possible risks."
                )
                return ReturnValues.PREUPG_BEFORE_KICKSTART
            return_val = XccdfHelper.check_inplace_risk(
                self.openscap_helper.get_default_xml_result_path(),
                self.conf.verbose)
            return return_val

        if self.conf.kickstart:
            if not os.path.exists(
                    self.openscap_helper.get_default_xml_result_path()):
                log_message(
                    "The 'preupg' command was not run yet. Run it before the Kickstart generation."
                )
                return ReturnValues.PREUPG_BEFORE_KICKSTART
            kg = KickstartGenerator(self.conf, settings.KS_DIR,
                                    settings.KS_PATH)
            kg.main()
            return 0

        if self.conf.scan:
            self.content = os.path.join(self.conf.source_dir, self.conf.scan,
                                        settings.content_file)
            if self.conf.scan.startswith("/"):
                log_message(
                    'Specify the correct upgrade path parameter like -s RHEL6_7'
                )
                log_message(
                    "Upgrade path is provided by the 'preupg --list' command.")
                self._check_available_contents()
                log_message("The available upgrade paths: '%s'" %
                            '\n'.join(self.list_scans))
                return ReturnValues.SCENARIO
            if not os.path.isdir(
                    os.path.join(self.conf.source_dir, self.conf.scan)):
                log_message(
                    'Specify the correct upgrade path parameter like -s RHEL6_7'
                )
                self._check_available_contents()
                log_message(
                    "Upgrade path is provided by the 'preupg --list' command.")
                log_message("The available upgrade paths: '%s'" %
                            '\n'.join(self.list_scans))
                return ReturnValues.SCENARIO

        if self.conf.contents:
            self.content = os.path.join(os.getcwd(), self.conf.contents)
            # From content path like content-users/RHEL6_7 we need
            # to get content-users dir
            content_dir = self.conf.contents[:self.conf.contents.
                                             find(self.get_scenario())]
            self.conf.source_dir = os.path.join(os.getcwd(), content_dir)

        self.common = Common(self.conf)
        if not self.conf.skip_common:
            if not self.common.common_results():
                return ReturnValues.SCRIPT_TXT_MISSING

        if self.conf.scan or self.conf.contents:
            if not os.path.exists(settings.openscap_binary):
                log_message("Oscap with SCE enabled is not installed")
                return ReturnValues.MISSING_OPENSCAP
            if not os.access(settings.openscap_binary, os.X_OK):
                log_message("Oscap with SCE %s is not executable" %
                            settings.openscap_binary)
                return ReturnValues.MISSING_OPENSCAP

            current_dir = os.getcwd()
            os.chdir("/tmp")
            retval = self.scan_system()
            if int(retval) != 0:
                return retval
            self.summary_report(self.tar_ball_name)
            self.common.copy_common_files()
            KickstartGenerator.kickstart_scripts()
            FileHelper.remove_home_issues()
            if self.conf.upload:
                self.upload_results(self.tar_ball_name)
            os.chdir(current_dir)
            return self.report_return_value

        log_message('Nothing to do. Give me a task, please.')
        self.conf.settings[2].parser.print_help()
        return 0