def scan(verify=True): signals.emit("apps", "pre_scan") app_dir = config.get("apps", "app_dir") apps = [] if not os.path.exists(app_dir): os.makedirs(app_dir) # Get paths for installed apps, metadata for available ones installed_apps = [x for x in os.listdir(app_dir) if not x.startswith(".")] available_apps = api("https://%s/api/v1/apps" % config.get("general", "repo_server"), crit=False) if available_apps: available_apps = available_apps["applications"] else: available_apps = [] # Create objects for installed apps with appropriate metadata for x in installed_apps: try: with open(os.path.join(app_dir, x, "manifest.json"), "r") as f: data = json.loads(f.read()) except ValueError: logger.warn("Failed to load %s due to a JSON parsing error" % x) continue except IOError: logger.warn("Failed to load %s: manifest file inaccessible or not present" % x) continue logger.debug(" *** Loading %s" % data["id"]) app = App(**data) app.installed = True for y in enumerate(available_apps): if app.id == y[1]["id"] and app.version != y[1]["version"]: app.upgradable = y[1]["version"] if app.id == y[1]["id"]: app.assets = y[1]["assets"] available_apps[y[0]]["installed"] = True app.load() apps.append(app) # Convert available apps payload to objects for x in available_apps: if not x.get("installed"): app = App(**x) app.installed = False apps.append(app) storage.apps.set("applications", apps) if verify: verify_app_dependencies() signals.emit("apps", "post_scan") return storage.apps.get("applications")
def load(self, verify=True): try: signals.emit("apps", "pre_load", self) if verify: self.verify_dependencies() # Load the application module into Python imp.load_module(self.id, *imp.find_module(self.id, [os.path.join(config.get("apps", "app_dir"))])) # Get module and its important classes and track them on this object for module in self.modules: submod = imp.load_module("%s.%s" % (self.id, module), *imp.find_module(module, [os.path.join(config.get("apps", "app_dir"), self.id)])) classes = inspect.getmembers(submod, inspect.isclass) mgr = None for y in classes: if y[0] in ["DatabaseManager", "Site", "BackupController"]: mgr = y[1] break logger.debug(" *** Registering %s module on %s" % (module, self.id)) if module == "database": for y in classes: if issubclass(y[1], mgr) and y[1] != mgr: setattr(self, "_database_mgr", y[1]) elif module == "website": for y in classes: if issubclass(y[1], mgr) and y[1] != mgr: setattr(self, "_website", y[1]) elif module == "backup": for y in classes: if issubclass(y[1], mgr) and y[1] != mgr: setattr(self, "_backup", y[1]) elif module == "api": if hasattr(self, "_backend"): setattr(submod, self.id, self._backend) setattr(self, "_api", submod) elif module == "ssl": self.ssl = submod else: setattr(self, "_%s" % module, submod) # Set up tracking of ports associated with this app for s in self.services: if s["ports"]: tracked_services.register(self.id, s["binary"], s["name"], self.icon, s["ports"], default_policy=s.get("default_policy", 2), fw=False) signals.emit("apps", "post_load", self) except Exception, e: self.loadable = False self.error = "Module error: %s" % str(e) logger.warn("Failed to load %s -- %s" % (self.name, str(e)))