예제 #1
0
 def removing_package_event(self, pkg: Pkg):
     """
     will run as package remover event while starting removing a package
     """
     pr.p('Removing ' + ansi.yellow + pkg.data['name'] + ' (' +
          pkg.data['version'] + ')' + ansi.reset + '...',
          end=' ')
예제 #2
0
    def download_once(self, pkg, output=None):
        """ Download once package """

        try:
            file_path = pkg.data['file_path']
        except:
            self.message('package "' + pkg.data['name'] +
                         '" is local and cannot be downloaded' + ansi.reset,
                         is_error=True,
                         before=ansi.red)
            return False
        if not self.is_quiet():
            pr.p('Downloading ' + pkg.data['name'] + ':' +
                 pkg.data['version'] + ':' + pkg.data['arch'] + '...')

        if output == None:
            output = file_path.split('/')[-1]

        if file_path[:7] == 'http://' or file_path[:8] == 'https://':
            i = 0
            while i < 5:
                res = DownloadProgress.download(file_path, output)
                if res == True:
                    break
                else:
                    pr.e(ansi.red + str(res) + ansi.reset)
                i += 1
            if i == 5:
                return False
        else:
            if not os.path.isfile(file_path):
                return False
            shutil.copy(file_path, output)

        return True
예제 #3
0
파일: ListCommand.py 프로젝트: catios/cati
    def show_once(self, package: Pkg):
        """
        show once item in loaded packages list
        """
        if self.has_option('-q') or self.has_option('--quiet'):
            pr.p(package.data['name'])
            return
        output = ansi.green + package.data[
            'name'] + ansi.reset + '/' + ansi.yellow + package.data[
                'version'] + ansi.reset
        if package.installed():
            if package.is_installed_manual(package.data['name']):
                output += '/Installed-Manual:' + ansi.blue + package.installed(
                ).strip() + ansi.reset
            else:
                output += '/Installed:' + ansi.blue + package.installed(
                ).strip() + ansi.reset
        output += '/[' + package.data['repo'] + ']'

        # if verbose output wanted, show first line of description
        if self.is_verbose():
            try:
                description_summary = package.data['description'].split(
                    '\n')[0]
                if description_summary != '':
                    output += '/ ' + ansi.header + description_summary + ansi.reset
            except:
                pass

        pr.p(output)
예제 #4
0
파일: PkgCommand.py 프로젝트: catios/cati
    def sub_build(self):
        """ build subcommand (cati pkg build) """
        if len(self.arguments) <= 1:
            self.message('argument package directory(s) required')
            return 1

        i = 1
        while i < len(self.arguments):
            try:
                output = self.option_value('--output')
                if output == None:
                    output = self.option_value('-o')
                builder = Builder()
                output_package = builder.build(self.arguments[i], output)
                if not self.is_quiet():
                    pr.p(ansi.green + 'Package ' + self.arguments[i] +
                         ' created successfuly in ' + output_package +
                         ansi.reset)
            except FileNotFoundError as ex:
                self.message('directory "' + self.arguments[i] +
                             '" not found' + ansi.reset,
                             before=ansi.red)
                return 1
            except InvalidPackageDirException as ex:
                self.message('cannot build "' + self.arguments[i] + '": ' +
                             str(ex) + ansi.reset,
                             before=ansi.red)
                return 1

            i += 1
예제 #5
0
    def run(self):
        """ Run command """

        if not self.is_quiet():
            pr.p('Loading packages list...')
            pr.p('========================')

        loaded_packages = []

        for argument in self.arguments:
            arg_parts = argument.split('=')
            if len(arg_parts) == 1:
                # load last version as default
                pkg = Pkg.load_last(argument)
            elif len(arg_parts) == 2:
                # load specify version
                pkg = Pkg.load_version(arg_parts[0], arg_parts[1])
                if pkg == 1:
                    pkg = False
                elif pkg == 2:
                    self.message('package "' + arg_parts[0] +
                                 '" has not version "' + arg_parts[1] + '"' +
                                 ansi.reset,
                                 before=ansi.red)
                    continue
            else:
                # load specify version and specify arch
                pkg = Pkg.load_version(arg_parts[0], arg_parts[1],
                                       arg_parts[2])
                if pkg == 1:
                    pkg = False
                elif pkg == 2:
                    self.message('package "' + arg_parts[0] +
                                 '" has not version or arch "' + arg_parts[1] +
                                 ':' + arg_parts[2] + '"' + ansi.reset,
                                 before=ansi.red)
                    continue
            if pkg:
                loaded_packages.append(pkg)
            else:
                self.message('unknow package "' + argument + '"' + ansi.reset,
                             before=ansi.red)

        if not loaded_packages:
            return 1

        # download loaded packages
        is_any_success = False
        output_path = self.option_value('--output')
        for pkg in loaded_packages:
            if len(loaded_packages) > 1:
                tmp = self.download_once(pkg)
            else:
                tmp = self.download_once(pkg, output_path)
            if tmp:
                is_any_success = True

        if not is_any_success:
            return 1
예제 #6
0
파일: PkgCommand.py 프로젝트: catios/cati
 def package_new_installs_event(self, package: BaseArchive):
     """
     installer package_new_installs event
     will run when package will NEW installed
     """
     pr.p('Installing ' + ansi.yellow + package.data['name'] + ':' +
          package.data['version'] + ansi.reset + '...',
          end=' ')
예제 #7
0
파일: PkgCommand.py 프로젝트: catios/cati
    def install_once(self, pkg: BaseArchive):
        """
        installs once package
        is called from install sub command
        """
        target_path = self.option_value('--target')
        if target_path == None:
            target_path = ''
        installer = Installer()

        try:
            out = installer.install(
                pkg, {
                    'cannot_read_file': self.cannot_read_file_event,
                    'invalid_json_data': self.invalid_json_data_event,
                }, {
                    'package_currently_installed':
                    self.package_currently_installed_event,
                    'package_new_installs': self.package_new_installs_event,
                    'package_installed': self.package_installed_event,
                    'directory_not_empty': self.directory_not_empty_event,
                    'dep_and_conflict_error':
                    self.dep_and_conflict_error_event,
                    'arch_error': self.arch_error_event,
                }, (not self.has_option('--auto')),
                run_scripts=(not self.has_option('--without-scripts')),
                target_path=str(target_path),
                keep_conffiles=self.has_option('--keep-conffiles'),
                check_security_blacklist=(not self.has_option('--force')
                                          and not self.has_option('-f')))

            if type(out) == int:
                return out
        except PackageScriptError as ex:
            pr.e(ansi.red + 'cannot install "' + pkg.data['name'] + ':' +
                 pkg.data['version'] + '": ' + str(ex) + ansi.reset)
            return 1
        except PackageIsInSecurityBlacklist as ex:
            pr.e(ansi.red + 'cannot install ' + pkg.data['name'] + ':' +
                 pkg.data['version'] +
                 ' because this is in security blacklist:')
            pr.e('  ' + ex.blacklist_item['title'] + ':')
            for l in ex.blacklist_item['description'].split('\n'):
                pr.e('\t' + l)
            pr.p(ansi.reset, end='')
            return 1
        except CannotReadFileException as ex:
            self.message(ansi.red + str(ex), True, before=ansi.reset)
            return 1
        except FileConflictError as ex:
            pr.e(ansi.red + '\nCannot install ' + pkg.data['name'] + ':' +
                 pkg.data['version'] + ': File conflict error:')
            pr.e('    ' + str(ex))
            pr.p(ansi.reset, end='')
            return 1
예제 #8
0
파일: PkgCommand.py 프로젝트: catios/cati
 def package_currently_installed_event(self, package: BaseArchive,
                                       current_version: str):
     """
     installer package_currently_installed event
     will run when package already installed
     gets package and current installed version
     """
     pr.p('Installing ' + ansi.yellow + package.data['name'] + ':' +
          package.data['version'] + ansi.reset + ' (over ' + ansi.yellow +
          current_version + ansi.reset + ')...',
          end=' ')
예제 #9
0
파일: PkgCommand.py 프로젝트: catios/cati
 def show_once(self, pkg: BaseArchive):
     """
     shows once package (called from `show` subcommand function)
     gives package data to cli package sohwer component to show package info
     """
     PackageShower.show(pkg.data)
     if self.has_option('--files') or self.has_option('-f'):
         pr.p('Files:')
         pkg.tar.list()
     if len(self.arguments) > 2:
         pr.p('=' * 50)
예제 #10
0
파일: MeowCommand.py 프로젝트: catios/cati
    def run(self):
        """ Run command """
        pr.p("""
               /\       /\            * * * * * * * * * * * * * *
               | |_____| |            * Meow.....! I am Cati!   *
              |  --   --  |       ....* I can manage your       *
             |  { { * } }  | ..../    * Packages!               *
              |           |           *                         *
     __________|         |            * * * * * * * * * * * * * *
    /                     |
   /                      |
__/_  __  _________  _   _|
    |_| |_|       |_| |_|
""")
예제 #11
0
파일: StateCommand.py 프로젝트: catios/cati
    def run(self):
        """ Run command """

        if self.has_option('--abort'):
            require_root_permission()
            state_list = BaseTransaction.state_list()
            if not state_list:
                pr.p(ansi.green + 'There is not any undoned transaction and everything is ok' + ansi.reset)
                return 0
            user_answer = 'y'
            if not self.has_option('-y') and not self.has_option('--yes'):
                pr.p(ansi.yellow + 'WARNING: this process maybe dangerous and ' + str(len(state_list)) + ' transactions will be igonred. are you sure? [y/N] ' + ansi.reset, end='')
                user_answer = input()
            if user_answer in ['Y', 'y']:
                BaseTransaction.finish_all_state()
                pr.p(ansi.green + 'state was empty successfully' + ansi.reset)
            else:
                return
        elif self.has_option('--complete'):
            require_root_permission()
            state_list = BaseTransaction.state_list()
            if not state_list:
                pr.p(ansi.green + 'There is not any undoned transaction and everything is ok' + ansi.reset)
                return 0
            BaseTransaction.finish_all_state()
            # complete transactions
            for item in state_list:
                if item['action'] == 'remove':
                    tmp_arguments = [item['pkg'], '-y']
                    tmp_arguments.insert(0, 'cati')
                    tmp_arguments.insert(1, 'remove')
                    cmd = RemoveCommand()
                    cmd.handle(ArgParser.parse(tmp_arguments))
                elif item['action'] == 'install':
                    tmp_arguments = ['install', item['file']]
                    tmp_arguments.insert(0, 'cati')
                    tmp_arguments.insert(1, 'pkg')
                    cmd = PkgCommand()
                    cmd.handle(ArgParser.parse(tmp_arguments))
            return
        else:
            # show list of undoned transactions
            state_list = BaseTransaction.state_list()
            if state_list:
                StateContentShower.show(state_list)
                return 1
            else:
                pr.p(ansi.green + 'There is not any undoned transaction and everything is ok' + ansi.reset)
                return 0
예제 #12
0
파일: PkgCommand.py 프로젝트: catios/cati
    def run(self):
        """ Run command """

        if len(self.arguments) <= 0:
            pr.p(self.help_full())
            return 0

        if self.arguments[0] == 'build':
            return self.sub_build()
        elif self.arguments[0] == 'show':
            return self.sub_show()
        elif self.arguments[0] == 'install':
            return self.sub_install()
        else:
            self.message('unknow subcommand "' + self.arguments[0] + '"', True)
            return 1
예제 #13
0
파일: RepoCommand.py 프로젝트: catios/cati
    def run(self):
        """ Run command """

        if self.has_option('--edit') or self.has_option('-e'):
            return os.system('vim "' + Env.repos_config() + '"')

        if self.has_option('--add') or self.has_option('-a'):
            RootRequired.require_root_permission()
            repo_string = ''
            for arg in self.arguments:
                repo_string += arg + ' '
            repo_string = repo_string.strip()
            tmp_repo = Repo(repo_string)
            tmp_repo.loaded_from_file = 'argument'
            tmp_repo.line_number = 0
            if not tmp_repo.successful_loaded:
                ReposListErrorShower.show([tmp_repo])
                return 1
            # write repo
            path = Env.repos_config_dir('/' + tmp_repo.name + '-' +
                                        tmp_repo.get_pkg_str() + '-' +
                                        tmp_repo.get_arch_str())
            tmp = ''
            tmp_i = 1
            while os.path.isfile(path + tmp):
                tmp = '-' + str(tmp_i)
            f = open(path, 'w')
            f.write('# added manually\n' + repo_string)
            f.close()
            return 0

        if self.has_option('--scan'):
            for arg in self.arguments:
                if os.path.isdir(arg):
                    Scanner.scan(arg)
                    pr.p(ansi.green + 'directory ' + arg +
                         ' scanned successfully' + ansi.reset)
                else:
                    self.message('directory' + arg + ' not found',
                                 is_error=True)
            return 0

        # show list of repos
        if not self.is_quiet():
            pr.p('Loading repositories list...')
        repos = Repo.get_list()
        if not self.is_quiet():
            pr.p('============================')
        ReposListErrorShower.show(repos)
        for repo in repos:
            if repo.successful_loaded:
                is_disable = ''
                if repo.is_disable:
                    is_disable = ' (Disabled)'
                pr.p(repo.name + ': ' + repo.url + ' pkg=' +
                     repo.get_pkg_str() + ' arch=' + repo.get_arch_str() +
                     ' channel=' + repo.get_channel_str() + is_disable)
예제 #14
0
    def run(self):
        """ Run command """

        pr.p('Checking upgradable packages...')
        installed_packages = Pkg.installed_list()['list']
        upgradable_packages = []
        for pkg in installed_packages:
            installed_version = pkg.installed()
            latest_version = pkg.data['version']
            if Pkg.compare_version(latest_version, installed_version) == 1:
                upgradable_packages.append(pkg)

        if not upgradable_packages:
            pr.p(ansi.green + 'all of packages are up to date' + ansi.reset)
            return 0

        packages_names = [pkg.data['name'] for pkg in upgradable_packages]

        install_cmd = InstallCommand()
        return install_cmd.handle(ArgParser.parse(['cati', 'install', *self.args['options'], *packages_names]))
예제 #15
0
def show(state_list: list):
    """
    Shows and renders list of undoned transactions in state

    Args:
        state_list: loaded state from `transaction.BaseTransaction.state_list()` as (list)
    """
    pr.e(ansi.yellow + 'Error: state is not done')
    pr.p('\tthere is some undoned transactions:')
    for item in state_list:
        pr.p('\t\t' + BaseTransaction.state_item_to_string(item))
    pr.p('to complete them, run `' + sys.argv[0] + ' state --complete`')
    pr.p(ansi.reset, end='')
예제 #16
0
    def run(self):
        """ Run command """

        if not self.is_quiet():
            pr.p('Checking unused packages...')

        self.unused_packages = []
        self.find_unused_packages()
        unused_packages = self.unused_packages

        package_names = [pkg.data['name'] for pkg in unused_packages]
        options = [op for op in self.args['options']]

        if not package_names:
            pr.p('There is not any unused package')
            return 0

        remove_cmd = RemoveCommand()
        return remove_cmd.handle(
            ArgParser.parse(['cati', 'remove', *package_names, *options]))
예제 #17
0
파일: ShowCommand.py 프로젝트: catios/cati
    def run(self):
        """ Run command """

        pr.p('Loading packages list...')
        pr.p('========================')

        loaded_packages = []

        for argument in self.arguments:
            arg_parts = argument.split('=')
            if len(arg_parts) == 1:
                # load last version as default
                pkg = Pkg.load_last(argument)
            else:
                # load specify version
                pkg = Pkg.load_version(arg_parts[0], arg_parts[1])
                if pkg == 1:
                    pkg = False
                elif pkg == 2:
                    self.message('package "' + arg_parts[0] + '" has not version "' + arg_parts[1] + '"' + ansi.reset, before=ansi.red)
                    continue
            if pkg:
                loaded_packages.append(pkg)
            else:
                self.message('unknow package "' + argument + '"' + ansi.reset, before=ansi.red)

        if not loaded_packages:
            return 1

        # show loaded packages
        for pkg in loaded_packages:
            if self.has_option('--versions'):
                versions_list = pkg.get_versions_list()
                pr.p(pkg.data['name'] + ':')
                for ver in versions_list:
                    pr.p(' ' + ver[0] + ':' + ver[1])
            else:
                PackageShower.show(pkg.data)
            if len(loaded_packages) > 1:
                pr.p('---------------------')
예제 #18
0
    def run(self):
        """ Run command """

        # join all of arguments as one argument
        full_query_string = ''
        if len(self.arguments) > 1:
            for arg in self.arguments:
                full_query_string += arg + ' '
            full_query_string = full_query_string[:len(full_query_string) - 1]
        else:
            full_query_string = self.arguments[0]

        result = Pkg.check_state(full_query_string)

        if result:
            if not self.is_quiet():
                pr.p(ansi.green + 'True' + ansi.reset)
            return 0
        else:
            if not self.is_quiet():
                pr.p(ansi.red + 'False' + ansi.reset)
            return 1
예제 #19
0
    def run(self):
        """ Run command """

        RootRequired.require_root_permission()

        for f in os.listdir(Env.cache_dir()):
            if os.path.isfile(Env.cache_dir('/' + f)):
                if self.is_verbose():
                    pr.p('removing ' + Env.cache_dir('/' + f) + '...')
                os.remove(Env.cache_dir('/' + f))
        for f in os.listdir(Env.cache_dir('/archives')):
            if os.path.isfile(Env.cache_dir('/archives/' + f)):
                if self.is_verbose():
                    pr.p('removing ' + Env.cache_dir('/archives/' + f) + '...')
                os.remove(Env.cache_dir('/archives/' + f))

        pr.p(ansi.green + 'Cache files cleared successfully' + ansi.reset)
예제 #20
0
def show(calc: Calculator):
    """
    shows transactions from `Calculator` object.

    Args:
        calc: `transaction.Calculator.Calculator` object
    """
    if calc.to_remove:
        pr.p('The following packages will be removed:')
        for pkg in calc.to_remove:
            pr.p('- ' + ansi.red + pkg.data['name'] + ansi.reset)

    to_install = []
    to_upgrade = []
    to_downgrade = []
    to_reinstall = []
    for pkg in calc.to_install:
        if not pkg.installed():
            to_install.append(pkg)
        elif pkg.compare_version(pkg.wanted_version, pkg.installed()) == 1:
            to_upgrade.append(pkg)
        elif pkg.compare_version(pkg.wanted_version, pkg.installed()) == -1:
            to_downgrade.append(pkg)
        else:
            to_reinstall.append(pkg)
    if to_upgrade:
        pr.p('The following packages will be upgraded:')
        for pkg in to_upgrade:
            pr.p('- ' + ansi.yellow + pkg.data['name'] + '(' +
                 pkg.installed() + ' -> ' + pkg.wanted_version + ') ' +
                 pkg.get_file_size_str() + ansi.reset)

    if to_downgrade:
        pr.p('The following packages will be downgraded:')
        for pkg in to_downgrade:
            pr.p('- ' + ansi.yellow + pkg.data['name'] + '(' +
                 pkg.installed() + ' >> ' + pkg.wanted_version + ') ' +
                 pkg.get_file_size_str() + ansi.reset)

    if to_reinstall:
        pr.p('The following packages will be re-installed:')
        for pkg in to_reinstall:
            pr.p('- ' + ansi.yellow + pkg.data['name'] + '(' +
                 pkg.wanted_version + ') ' + pkg.get_file_size_str() +
                 ansi.reset)

    if to_install:
        pr.p('The following packages will be installed:')
        for pkg in to_install:
            pr.p('- ' + ansi.green + pkg.data['name'] + '(' +
                 pkg.wanted_version + ') ' + pkg.get_file_size_str() +
                 ansi.reset)

    total_download_size = calc.get_total_download_size()

    if total_download_size > 0:
        pr.p('Total download size: ' + str(total_download_size))
예제 #21
0
    def run(self):
        """ Run command """

        RootRequired.require_root_permission()

        pr.p('Loading packages list...')
        pr.p('========================')

        loaded_packages = []

        for argument in self.arguments:
            arg_parts = argument.split('=')
            if len(arg_parts) == 1:
                # load last version as default
                pkg = Pkg.load_last(argument)
            else:
                # load specify version
                pkg = Pkg.load_version(arg_parts[0], arg_parts[1])
                if pkg == 1:
                    pkg = False
                elif pkg == 2:
                    self.message('package "' + arg_parts[0] + '" has not version "' + arg_parts[1] + '"' + ansi.reset, before=ansi.red)
                    continue
                else:
                    pkg.only_specify_version = True
            if pkg:
                try:
                    pkg.only_specify_version
                except:
                    pkg.only_specify_version = False
                if pkg.installed():
                    if not pkg.only_specify_version:
                        self.message('package "' + argument + '" is installed. cannot forget installed packages' + ansi.reset, before=ansi.red)
                        continue
                    else:
                        if pkg.installed() == pkg.data['version']:
                            self.message('package ' + argument + ' (' + pkg.data['version'] + ') is installed. cannot forget installed packages' + ansi.reset, before=ansi.red)
                            continue
                loaded_packages.append(pkg)
            else:
                self.message('unknow package "' + argument + '"' + ansi.reset, before=ansi.red)

        if not loaded_packages:
            return 1

        # forget loaded packages
        for pkg in loaded_packages:
            if not pkg.only_specify_version:
                # forget all of package versions
                shutil.rmtree(Env.packages_lists('/' + pkg.data['name']))
                pr.p('Package ' + pkg.data['name'] + ' was forgoten successfully')
            else:
                files = glob.glob(Env.packages_lists('/' + pkg.data['name'] + '/' + pkg.data['version'] + '-*'))
                for f in files:
                    if not '-' in f[len(Env.packages_lists('/' + pkg.data['name'] + '/' + pkg.data['version'] + '-')):]:
                        os.remove(f)
                pr.p('Version ' + pkg.data['version'] + ' of package ' + pkg.data['name'] + ' was forgoten successfully')
            try:
                if len(os.listdir(Env.packages_lists('/' + pkg.data['name']))) <= 1:
                    shutil.rmtree(Env.packages_lists('/' + pkg.data['name']))
            except:
                pass

        ListUpdater.update_indexes({
            'cannot_read_file': self.empty_method_for_event,
            'invalid_json_data': self.empty_method_for_event,
        })
예제 #22
0
    def run(self):
        """ Run command """

        # check -v|--version options
        if self.has_option('--version') or self.has_option('-v'):
            pr.p(cati_version)
            return

        if not self.is_quiet():
            pr.p()
            pr.p(ansi.yellow + "  $$$$$$                $$     $$" +
                 ansi.reset)
            pr.p(ansi.yellow + " $$    $$              $$" + ansi.reset)
            pr.p(ansi.yellow + " $$         $$$$$$   $$$$$$    $$" +
                 ansi.reset)
            pr.p(ansi.yellow + " $$              $$    $$      $$" +
                 ansi.reset)
            pr.p(ansi.yellow + " $$         $$$$$$$    $$      $$" +
                 ansi.reset + ansi.cyan + " | " +
                 self.general_help().split('\n')[0] + ansi.reset)
            pr.p(ansi.yellow + " $$    $$  $$    $$    $$  $$  $$" +
                 ansi.reset + ansi.cyan + " | " +
                 self.general_help().split('\n')[1] + ansi.reset)
            pr.p(ansi.yellow + "  $$$$$$    $$$$$$$     $$$$   $$" +
                 ansi.reset + ansi.cyan + " | " +
                 self.general_help().split('\n')[2] + ansi.reset)
            pr.p()

        pr.p('Options:')
        pr.p(ansi.header + '\t-v|--version' + ansi.reset +
             ': shows cati version')
        pr.p(ansi.header + '\t--no-ansi' + ansi.reset +
             ': disable terminal ansi colors')
        pr.p(ansi.header + '\t--help' + ansi.reset +
             ': pass it to commands to show help of that command')
        pr.p(ansi.header + '\t-q|--quiet' + ansi.reset + ': quiet output')
        pr.p(ansi.header + '\t-v|--verbose' + ansi.reset + ': verbose output')

        pr.p()

        commands = kernel.commands

        # check arguments
        if len(self.arguments) >= 1:
            # a command inserted. show detail of that command
            try:
                cmd = commands[self.arguments[0]]
                obj = cmd()
                pr.p(obj.help_full(False))
                return 0
            except:
                self.message('unknow command "' + self.arguments[0] + '"' +
                             ansi.reset,
                             True,
                             before=ansi.red)
                return 1

        # show summary help of command
        pr.p('Subcommands:')
        for cmd in commands:
            obj = commands[cmd]()
            tabs = '\t\t'
            if len(cmd) > 7:
                tabs = '\t'
            pr.p('\t' + ansi.green + cmd + ansi.reset + tabs +
                 obj.help_summary())

        if not self.is_quiet():
            pr.p('\nfor see detailed help about commands, run: "' +
                 ansi.yellow + self.cati_exec + ' help [command-name]' +
                 ansi.reset + '"')

        return 0
예제 #23
0
파일: CheckCommand.py 프로젝트: catios/cati
    def run(self):
        """ Run command """
        
        # require root permission
        require_root_permission()

        result_code = 0

        packages_to_reinstall = []

        if not self.is_quiet():
            pr.p('Starting checking system health and security...')
            pr.p('===============================================')

        # check state
        state_cmd = StateCommand()
        out = state_cmd.handle(ArgParser.parse(['cati', 'state']))
        if out > 0:
            return out

        # search for conflict and dependency corruptions
        if not self.is_quiet():
            pr.p('Checking dependency and conflict corruptions...')
        dependency_problems = []
        conflict_problems = []
        installed_packages = Pkg.installed_list()['list']
        for pkg in installed_packages:
            if self.is_verbose():
                pr.p('[info] checking dependencies and conflicts for ' + pkg.data['name'] + '...')
            for dp in pkg.get_depends():
                if not Pkg.check_state(dp):
                    dependency_problems.append([
                        pkg, dp
                    ])
            for conflict in pkg.get_conflicts():
                if Pkg.check_state(conflict):
                    conflict_problems.append([
                        pkg, conflict
                    ])

        if dependency_problems or conflict_problems:
            for depend in dependency_problems:
                pr.p(ansi.red + 'dependency problem for ' + depend[0].data['name'] + ': ' + depend[1] + ansi.reset)
                packages_to_reinstall.append(depend[0])
            for conflict in conflict_problems:
                pr.p(ansi.red + 'conflict problem for ' + conflict[0].data['name'] + ': ' + conflict[1] + ansi.reset)
                packages_to_reinstall.append(conflict[0])
            result_code = 1
        else:
            pr.p(ansi.green + 'There is not any conflict or dependnecy problem and everything is ok' + ansi.reset)

        # check static files
        if not self.is_quiet():
            pr.p('Checking packages static files...')
        staticfile_problems = []
        for pkg in installed_packages:
            if self.is_verbose():
                pr.p('[info] checking static files for ' + pkg.data['name'] + '...')
            files = pkg.installed_static_files()
            for f in files:
                f[1] = Env.base_path(f[1])
                if os.path.isfile(f[1]):
                    wanted_hash = f[0]
                    current_hash = calc_file_sha256(f[1])
                    if wanted_hash != current_hash:
                        staticfile_problems.append([
                            pkg,
                            f,
                            'file is changed'
                        ])
                else:
                    staticfile_problems.append([
                        pkg,
                        f,
                        'file is deleted'
                    ])
        if staticfile_problems:
            for problem in staticfile_problems:
                pr.p(ansi.red + 'staticfile problem in package ' + problem[0].data['name'] + ': ' + problem[1][1] + ': ' + problem[2] + ansi.reset)
                packages_to_reinstall.append(problem[0])
            result_code = 1
        else:
            pr.p(ansi.green + 'all of static files are ok' + ansi.reset)
        
        # check repos config files health
        if not self.is_quiet():
            pr.p('Checking cati configuration files...')
        if self.is_verbose():
                pr.p('[info] checking repositories config...')
        repos = Repo.get_list()
        pr.p(ansi.red, end='')
        ReposListErrorShower.show(repos)
        pr.p(ansi.reset, end='')
        is_any_repo_error = False
        for repo in repos:
            if repo.syntax_errors:
                is_any_repo_error = True
                result_code = 1
        if not is_any_repo_error:
            pr.p(ansi.green + 'all of cati configuration files are ok' + ansi.reset)

        # check database files
        if not self.is_quiet():
            pr.p('Checking cati database...')
        database_problems = []
        for f in os.listdir(Env.installed_lists()):
            if self.is_verbose():
                pr.p('[info] checking database install dir for ' + f + '...')
            if not os.path.isfile(Env.installed_lists('/' + f + '/files')) or not os.path.isfile(Env.installed_lists('/' + f + '/ver')):
                database_problems.append('installed packages database: directory ' + Env.installed_lists('/' + f) + ' is corrupt')
        for f in os.listdir(Env.security_blacklist()):
            if self.is_verbose():
                pr.p('[info] checking security blacklist part ' + f + '...')
            if not os.path.isfile(Env.security_blacklist('/' + f)):
                database_problems.append('security blacklist: an directory detected: ' + Env.security_blacklist('/' + f))
            else:
                tmp = open(Env.security_blacklist('/' + f), 'r')
                try:
                    json.loads(tmp.read())
                except:
                    database_problems.append('security blacklist: invalid json data in ' + Env.security_blacklist('/' + f))
        if database_problems:
            for problem in database_problems:
                pr.p(ansi.red + 'database: ' + problem + ansi.reset)
            result_code = 1
        else:
            pr.p(ansi.green + 'all of cati database is ok' + ansi.reset)

        if not self.is_quiet():
            if packages_to_reinstall:
                pr.p(ansi.blue + 'We suggest re-install this packages:')
                for pkg in packages_to_reinstall:
                    pr.p('- ' + pkg.data['name'])
                if not self.has_option('--autofix'):
                    pr.p('use --autofix option to re-install them or do this manually')
                    pr.p(ansi.reset, end='')
                else:
                    pr.p(ansi.reset, end='')
                    packages_names = [pkg.data['name'] for pkg in packages_to_reinstall]
                    install_cmd = InstallCommand()
                    args = ['cati', 'install', '--reinstall', *packages_names]
                    cmd_str = ''
                    for arg in args:
                        cmd_str += arg + ' '
                    cmd_str = cmd_str.strip()
                    pr.p(cmd_str)
                    return install_cmd.handle(ArgParser.parse(args))

        return result_code
예제 #24
0
 def package_remove_finished_event(self, pkg: Pkg):
     """
     will run as package remover event when package remove process finished
     """
     pr.p(ansi.green + 'OK' + ansi.reset)
예제 #25
0
파일: FilesCommand.py 프로젝트: catios/cati
    def run(self):
        """ Run command """

        if self.has_option('--installed'):
            if not self.is_quiet():
                pr.p('Loading files list...')
                pr.p('=====================')
            all_of_installed_files_list = Pkg.get_all_installed_files_list()
            for item in all_of_installed_files_list:
                if self.is_quiet():
                    pr.p(item[2])
                else:
                    message = ''
                    if item[1] == 'd':
                        message = ' (directory)'
                    elif item[1] == 'cf':
                        message = ' (config file)'
                    elif item[1] == 'cd':
                        message = ' (config directory)'
                    pr.p(item[0] + ': ' + item[2] + message)
            return 0

        if not self.arguments:
            self.message('argument package names is required', True)
            return 1

        if not self.is_quiet():
            pr.p('Loading packages list...')
            pr.p('========================')

        loaded_packages = []

        for argument in self.arguments:
            arg_parts = argument.split('=')
            if len(arg_parts) == 1:
                # load last version as default
                pkg = Pkg.load_last(argument)
            else:
                # load specify version
                pkg = Pkg.load_version(arg_parts[0], arg_parts[1])
                if pkg == 1:
                    pkg = False
                elif pkg == 2:
                    self.message('package "' + arg_parts[0] +
                                 '" has not version "' + arg_parts[1] + '"' +
                                 ansi.reset,
                                 before=ansi.red)
                    continue
            if pkg:
                loaded_packages.append(pkg)
            else:
                self.message('unknow package "' + argument + '"' + ansi.reset,
                             before=ansi.red)

        if not loaded_packages:
            return 1

        # show files list of loaded packages
        for pkg in loaded_packages:
            try:
                files_list = pkg.data['files']
            except:
                files_list = []
            if not self.is_quiet():
                pr.p(pkg.data['name'] + ':')
                if not files_list:
                    pr.p(ansi.yellow + '  This package is empty' + ansi.reset)
                for item in files_list:
                    pr.p('  ' + item)
            else:
                for item in files_list:
                    pr.p(item)
            if len(loaded_packages) > 1:
                if not self.is_quiet():
                    pr.p('========================')
예제 #26
0
파일: ListCommand.py 프로젝트: catios/cati
    def run(self):
        """ Run command """

        if not self.has_option('-q') and not self.has_option('--quiet'):
            pr.p('Loading packages list...')
            pr.p('========================')
        # load list of packages
        if self.has_option('--installed'):
            # just list installed packages
            packages = Pkg.installed_list()
        elif self.has_option('--installed-manual'):
            packages = Pkg.installed_list()
            packages_list = [
                tmp_pkg for tmp_pkg in packages['list']
                if Pkg.is_installed_manual(tmp_pkg.data['name'])
            ]
            packages['list'] = packages_list
        else:
            packages = Pkg.all_list()

        for error in packages['errors']:
            self.message(error + ansi.reset, True, before=ansi.red)

        # load filter options
        wanted_authors = []
        if self.has_option('--author'):
            wanted_authors = self.option_value('--author').strip().split('|')
            wanted_authors = [author.strip() for author in wanted_authors]
        wanted_maintainers = []
        if self.has_option('--maintainer'):
            wanted_maintainers = self.option_value(
                '--maintainer').strip().split('|')
            wanted_maintainers = [
                maintainer.strip() for maintainer in wanted_maintainers
            ]
        wanted_categories = []
        if self.has_option('--category'):
            wanted_categories = self.option_value('--category').strip().split(
                '|')
            wanted_categories = [
                category.strip() for category in wanted_categories
            ]
        search_query = self.option_value('--search')
        if search_query:
            search_query_words = search_query.strip().split(' ')
            search_query_words = [word.strip() for word in search_query_words]
        else:
            search_query_words = []

        for package in packages['list']:
            # check filters
            if wanted_authors:
                try:
                    if not package.data['author'].strip() in wanted_authors:
                        continue
                except:
                    continue
            if wanted_maintainers:
                try:
                    if not package.data['maintainer'].strip(
                    ) in wanted_maintainers:
                        continue
                except:
                    continue
            if wanted_categories:
                try:
                    if not package.data['category'].strip(
                    ) in wanted_categories:
                        continue
                except:
                    continue
            if search_query:
                is_math_with_query = False
                for word in search_query_words:
                    if word in package.data['name']:
                        is_math_with_query = True
                try:
                    if search_query in package.data['description']:
                        is_math_with_query = True
                except:
                    pass
                if not is_math_with_query:
                    continue

            if self.has_option('--upgradable'):
                if package.installed():
                    if Pkg.compare_version(package.data['version'],
                                           package.installed()) != 1:
                        continue
                else:
                    continue
            # show item
            self.show_once(package)
예제 #27
0
    def run(self):
        """ Run command """

        require_root_permission()

        # check transactions state before run new transactions
        pr.p('Checking transactions state...')
        state_list = BaseTransaction.state_list(
        )  # get list of undoned transactions
        if state_list:
            # the list is not empty
            StateContentShower.show(state_list)
            return 1

        pr.p('Loading packages list...')
        pr.p('==============================')
        # load list of packages
        packages = []
        for arg in self.arguments:
            pkg = Pkg.load_last(arg)
            if pkg == False:
                self.message('unknow package "' + arg + '"' + ansi.reset,
                             before=ansi.red)
            else:
                if pkg.installed():
                    packages.append(pkg)
                else:
                    self.message('package "' + pkg.data['name'] +
                                 '" is not installed' + ansi.reset,
                                 before=ansi.red)

        # start removing loaded packages
        calc = Calculator()
        calc.remove(packages)

        # show transactions
        TransactionShower.show(calc)

        essential_packages = []
        for pkg in calc.to_remove:
            try:
                if pkg.data['essential']:
                    essential_packages.append(pkg)
            except:
                pass

        if not self.has_option('--force') and not self.has_option('-f'):
            for pkg in essential_packages:
                pr.p(
                    ansi.red + 'Package "' + pkg.data['name'] +
                    '" is a essential package and cannot be remove. use --force|-f option to force remove them'
                    + ansi.reset)
            if essential_packages:
                return 1

        if not calc.has_any_thing():
            return

        # check user confirmation
        if not self.has_option('-y') and not self.has_option('--yes'):
            pr.p('Do you want to continue? [Y/n] ', end='')
            answer = input()
            if not (answer == 'y' or answer == 'Y' or answer == ''):
                pr.p(ansi.yellow + 'Abort.' + ansi.reset)
                pr.exit(1)

        # add packages to state
        BaseTransaction.add_to_state(calc)

        packages_to_remove_names_and_versions = [
            pkg.data['name'] + '@' + pkg.data['version']
            for pkg in calc.to_remove
        ]

        # run transactions
        for pkg in calc.to_remove:
            Remove.run(pkg, {
                'removing_package': self.removing_package_event,
                'package_remove_finished': self.package_remove_finished_event,
                'dir_is_not_empty': self.dir_is_not_empty_event,
            },
                       self.has_option('--conffiles'),
                       run_scripts=(not self.has_option('--without-scripts')))
            BaseTransaction.pop_state()

        BaseTransaction.run_any_scripts(
            ['remove', packages_to_remove_names_and_versions],
            events={
                'start_run_script': self.start_run_any_script_event,
            })

        BaseTransaction.finish_all_state()
예제 #28
0
파일: PkgCommand.py 프로젝트: catios/cati
 def package_installed_event(self, package: BaseArchive):
     """
     installer package_installed event
     will run when package installation finshed
     """
     pr.p(ansi.green + 'OK' + ansi.reset)
예제 #29
0
파일: PkgCommand.py 프로젝트: catios/cati
 def start_run_any_script_event(self, package_name: str):
     """ will run when starting running an `any` script """
     pr.p('Processing scripts for ' + package_name + '...')
예제 #30
0
파일: PkgCommand.py 프로젝트: catios/cati
    def sub_install(self):
        """ install sub command (cati pkg install) """
        if len(self.arguments) <= 1:
            self.message('argument package file(s) required')
            return 1

        require_root_permission()

        # check transactions state before run new transactions
        pr.p('Checking transactions state...')
        state_list = BaseTransaction.state_list(
        )  # get list of undoned transactions
        if state_list:
            # the list is not empty
            StateContentShower.show(state_list)
            return 1

        packages_to_install = []
        i = 1
        while i < len(self.arguments):
            try:
                pkg = archive_factory(self.arguments[i], 'r')
                pkg.read()
                pkg.package_file_path = os.path.abspath(self.arguments[i])
                packages_to_install.append(pkg)
            except FileNotFoundError as ex:
                self.message('file "' + self.arguments[i] + '" not found' +
                             ansi.reset,
                             before=ansi.red)
                return 1
            except:
                self.message('cannot open "' + self.arguments[i] +
                             '": file is corrupt' + ansi.reset,
                             before=ansi.red)
                return 1

            i += 1

        # add packages to state
        state_f = open(Env.state_file(), 'w')
        tmp = ''
        for pkg in packages_to_install:
            tmp += ('install%' + pkg.data['name'] + '%' + pkg.data['version'] +
                    '%' + pkg.data['arch'] + '%' + pkg.package_file_path +
                    '\n')
        state_f.write(tmp)
        state_f.close()

        packages_to_install_names_and_versions = [
            pkg.data['name'] + '@' + pkg.data['version']
            for pkg in packages_to_install
        ]
        i = 0
        while i < len(packages_to_install):
            try:
                pkg = packages_to_install[i]
                tmp = self.install_once(pkg)
                if type(tmp) == int and tmp != 0:
                    if not self.has_option('--dont-ignore-state'):
                        BaseTransaction.finish_all_state()
                    return tmp
                pkg.close()
            except:
                if not self.has_option('--dont-ignore-state'):
                    BaseTransaction.finish_all_state()
                self.message('cannot install "' +
                             packages_to_install[i].data['name'] + '"' +
                             ansi.reset,
                             before=ansi.red)
                return 1
            i += 1
        BaseTransaction.run_any_scripts(
            ['install', packages_to_install_names_and_versions],
            events={
                'start_run_script': self.start_run_any_script_event,
            })
        BaseTransaction.finish_all_state()