예제 #1
0
 def __init__(self, cmd, args):
     CommandBase.__init__(self,
             cmd, args,
             load_recipes=True,
             require_prefix=False,
     )
     self.package_manager = package_manager.PackageManager()
     if args.all:
         self.args.packages = recipe_manager.list_all()
     else:
         self.args.packages = args.packages[0] # wat?
     if len(self.args.packages) == 0:
         self.log.error("No packages specified.")
         exit(1)
예제 #2
0
    def run(self):
        self.pid = os.getpid()
        self.pid_info.emit(self.pid)
        instaman = install_manager.InstallManager()
        if 'install' in self.package_list:
            install_list = self.package_list.get('install')
            for package in install_list:
                self.worker_log.info('Preparing {} for installation'.format(package))
                if instaman.install([package], 'install'):
                    self.worker_log.info("Install {} successful".format(package))
                    pkg_index = install_list.index(package)+1
                    progress = (pkg_index/len(install_list))* 100.0
                    self.progress_tick.emit(pkg_index, progress,
                                            len(install_list), 'install')
                else:
                    self.worker_log.error("Install Failed")
                    self.error_info.emit('install',
                                         "Install {} failed. Check logs !".format(package))

        if 'update' in self.package_list:
            update_list = self.package_list.get('update')
            for package in update_list:
                self.worker_log.info("Preparing {} to update".format(package))
                if instaman.install([package], 'update', update_if_exists=True):
                    self.worker_log.info("Update {} successful".format(package))
                    pkg_index = update_list.index(package)+1
                    progress = (pkg_index/len(update_list))* 100.0
                    self.progress_tick.emit(pkg_index, progress,
                                            len(update_list), 'update')
                else:
                    self.worker_log.error("Update Failed")
                    self.error_info.emit(
                        "Update {} failed. Check logs !".format(package))

        if 'remove' in self.package_list:
            remove_list = self.package_list.get('remove')
            pm = package_manager.PackageManager()
            dep_tree = dep_manager.DepManager().make_dep_tree(
            self.package_list.get('remove'),
            lambda x: bool(x in self.package_list.get('remove')))
            remove = reversed(dep_tree.serialize())
            ### Remove packages
            for pkg in remove:
                #Uninstall:
                self.worker_log.info("Preparing {} to remove".format(pkg))
                if pm.uninstall(pkg):
                    self.worker_log.info("Uninstall {} successful !".format(pkg))
                    pkg_index = remove_list.index(pkg)+1
                    progress = (pkg_index/len(remove_list))* 100.0
                    self.progress_tick.emit(pkg_index, progress,
                                            len(remove_list), 'remove')
                    #Remove entry from inventory:
                    self.inventory.remove(pkg)
                    self.inventory.save()
                else:
                    self.worker_log.error("Failed to remove {}".format(pkg))
                    self.error_info.emit(
                        "Removing {} unsuccessful. Check logs !".format(pkg))

        self.info_tick.emit("Tasks Completed successfully !")
        return
예제 #3
0
    def run(self):
        """This is where we generate our data and provide a signal it to the GUI
        """
        self.indicator.emit("Collecting packages for PyBOMBS")
        #Init lists required to hold our data
        app_package_list = []
        sdk_package_list = []
        app_package_data = []
        sdk_package_data = []
        base_package_data = []

        pm = package_manager.PackageManager()
        #cfg = config_manager.config_manager
        #TODO Correctly list out recipes based on the prefix selected

        list_recipes = sorted(list(recipe_manager.recipe_manager.list_all()))

        for pkg_name in list_recipes:
            module = Recipe(recipe_manager.recipe_manager.
                            get_recipe_filename(pkg_name))
            if module.target == 'prefix':
                sdk_package_list.append(pkg_name)
            elif module.target == 'sdk':
                sdk_package_list.append(pkg_name)
            elif module.target == 'package':
                app_package_list.append(pkg_name)

        self.indicator.emit("Preparing SDK packages")
        self.log.info("Preparing SDK packages")
        for pkg in sdk_package_list:
            rec = Recipe(recipe_manager.recipe_manager.get_recipe_filename(pkg))
            if rec.target == 'prefix':
                sdk_package_data.append([pkg, 'Prefix Specific Packages'])
            elif rec.target == 'sdk':
                sdk_package_data.append([pkg, 'SDK Packages'])
        self.log.info("Loading SDK packages - successful !")

        self.indicator.emit("Preparing application and baseline packages")
        self.log.info("Preparing application and baseline packages")
        for oot_module in app_package_list:
            rec = recipe.get_recipe(oot_module, target='package', fail_easy=True)
            if rec.category == 'baseline':
                if pm.installed(oot_module):
                    base_package_data.append([oot_module, 'Installed'])
                else:
                    base_package_data.append([oot_module, 'Not Installed'])
            else:
                if 'description' in rec.get_dict():
                    if pm.installed(oot_module):
                        app_package_data.append([oot_module,
                                                 rec.get_dict()['category'],
                                                 'Installed',
                                                 rec.get_dict()['description']])
                    else:
                        app_package_data.append([oot_module,
                                                 rec.get_dict()['category'],
                                                 'Not Installed',
                                                 rec.get_dict()['description']])
                else:
                    if pm.installed(oot_module):
                        app_package_data.append([oot_module,
                                                 rec.get_dict()['category'],
                                                 'Installed',
                                                 'No description available'])
                    else:
                        app_package_data.append([oot_module,
                                                 rec.get_dict()['category'],
                                                 'Not Installed',
                                                 'No description available'])

        self.data_generator.emit(app_package_data, base_package_data,
                                 sdk_package_data)
        self.log.info("Loading application and baseline packages - Successful !")
        self.data_done.emit("Data successfully loaded")
        return
예제 #4
0
    def context_menu_baseline(self):
        """Custom ContextMenu that helps us install/update/remove OOT Modules
           from the list displayed on tableWidget
        """
        pm = package_manager.PackageManager()
        #Following three lines will return the package name irrespective of where
        #mouse click event happens on the row associated with the package
        indexes = self.ui.tableWidget_3.selectionModel().selectedRows()
        for index in indexes:
            package_name = self.ui.tableWidget_3.model().index(index.row(),
                                                               0).data()
        #Our custom context menu
        menu = QMenu(self)
        install = menu.addAction("&Mark Install")
        update = menu.addAction("&Mark Update")
        remove = menu.addAction("&Mark Remove")
        discard = menu.addAction("&Discard Changes")
        menu.addSeparator()
        module_info = menu.addAction("&Module Info")

        discard.setEnabled(False)

        if pm.installed(package_name):
            install.setEnabled(False)
        else:
            update.setEnabled(False)
            remove.setEnabled(False)

        if package_name in self.install_material:
            install.setEnabled(False)
            discard.setEnabled(True)

        if package_name in self.update_material:
            update.setEnabled(False)
            discard.setEnabled(True)

        if package_name in self.remove_material:
            remove.setEnabled(False)
            discard.setEnabled(True)

        action = menu.exec_(QCursor.pos())

        #Here's where our context menu gets some work to do
        if action == install:
            self.install_material.append(package_name)

        if action == update:
            self.update_material.append(package_name)

        if action == remove:
            self.remove_material.append(package_name)

        if action == discard:
            if package_name in self.install_material:
                self.install_material.remove(package_name)

            if package_name in self.update_material:
                self.update_material.remove(package_name)

            if package_name in self.remove_material:
                self.remove_material.remove(package_name)

        if (self.install_material or self.update_material
                or self.remove_material):
            self.ui.action_Apply.setEnabled(True)
        else:
            self.ui.action_Apply.setEnabled(False)

        if action == module_info:
            self.module_info_popup(package_name)