def build_all(): """Build all profiles of openwrt latest stable""" for profile in database.get_all_profiles( "openwrt", config.get("openwrt").get("latest")): target, profile = profile params = { "distro": "openwrt", "version": config.get("openwrt").get("latest"), "target": target, "profile": profile, } params["request_hash"] = get_request_hash(params) database.insert_dict("requests", params)
def build_worker(): """Build image with worker package preinstalled""" log.info("build worker image") packages = [ "bash", "bzip2", "coreutils", "coreutils-stat", "diffutils", "file", "gawk", "gcc", "getopt", "git", "libncurses", "make", "patch", "perl", "perlbase-attributes", "perlbase-findbin", "perlbase-getopt", "perlbase-thread", "python-light", "tar", "unzip", "wget", "xz", "xzdiff", "xzgrep", "xzless", "xz-utils", "zlib-dev", ] packages_hash = get_packages_hash(packages) database.insert_packages_hash(packages_hash, packages) params = { "distro": "openwrt", "version": config.get("openwrt").get("latest"), "target": "x86/64", "profile": "Generic", "packages_hash": packages_hash, } params["request_hash"] = get_request_hash(params) database.insert_dict("requests", params)
def _process_request(self): self.log.debug("request_json: %s", self.request_json) # if request_hash is available check the database directly if "request_hash" in self.request_json: self.request = self.database.check_request_hash( self.request_json["request_hash"]) if not self.request: self.response_status = HTTPStatus.NOT_FOUND return self.respond() else: return self.return_status() # TODO check for profile or board # generic approach for # https://github.com/aparcar/attendedsysupgrade-server/issues/91 self.request_json["board"] = self.request_json["board"].replace( ",", "_") self.request_json["profile"] = self.request_json[ "board"] # TODO fix this workaround request_hash = get_request_hash(self.request_json) request_database = self.database.check_request_hash(request_hash) # if found return instantly the status if request_database: self.log.debug("found image in database: %s", request_database["request_status"]) self.request = request_database return self.return_status() else: self.request["request_hash"] = request_hash self.response_json["request_hash"] = self.request["request_hash"] # if not perform various checks to see if the request is acutally valid # validate distro and version if "distro" not in self.request_json: self.response_status = HTTPStatus.PRECONDITION_FAILED # 412 self.response_header["X-Missing-Param"] = "distro" return self.respond() else: bad_request = self.check_bad_distro() if bad_request: return bad_request if "version" not in self.request_json: self.request["version"] = self.config.get( self.request["distro"]).get("latest") else: bad_request = self.check_bad_version() if bad_request: return bad_request # check for valid target bad_target = self.check_bad_target() if bad_target: return bad_target # validate attached defaults if "defaults" in self.request_json: if self.request_json["defaults"]: # check if the uci file exceeds the max file size. this should # be done as the uci-defaults are at least temporary stored in # the database to be passed to a worker if getsizeof(self.request_json["defaults"]) > self.config.get( "max_defaults_size", 1024): self.response_json[ "error"] = "attached defaults exceed max size" self.response_status = ( 420) # this error code is the best I could find self.respond() else: self.request["defaults_hash"] = get_hash( self.request_json["defaults"], 32) self.database.insert_defaults( self.request["defaults_hash"], self.request_json["defaults"]) # add package_hash to database if "packages" in self.request_json: # check for existing packages bad_packages = self.check_bad_packages( self.request_json["packages"]) if bad_packages: return bad_packages self.request["packages_hash"] = get_packages_hash( self.request_json["packages"]) self.database.insert_packages_hash(self.request["packages_hash"], self.request["packages"]) # now some heavy guess work is done to figure out the profile # eventually this could be simplified if upstream unifirm the # profiles/boards if "board" in self.request_json: self.log.debug("board in request, search for %s", self.request_json["board"]) self.request["profile"] = self.database.check_profile( self.request["distro"], self.request["version"], self.request["target"], self.request_json["board"], ) if not self.request["profile"]: if "model" in self.request_json: self.log.debug("model in request, search for %s", self.request_json["model"]) self.request["profile"] = self.database.check_model( self.request["distro"], self.request["version"], self.request["target"], self.request_json["model"], ) self.log.debug("model search found profile %s", self.request["profile"]) if not self.request["profile"]: if self.database.check_profile( self.request["distro"], self.request["version"], self.request["target"], "Generic", ): self.request["profile"] = "Generic" elif self.database.check_profile( self.request["distro"], self.request["version"], self.request["target"], "generic", ): self.request["profile"] = "generic" else: self.response_json[ "error"] = "unknown device, please check model and board params" self.response_status = HTTPStatus.PRECONDITION_FAILED # 412 return self.respond() # all checks passed, eventually add to queue! self.log.debug("add build job %s", self.request) self.database.add_build_job(self.request) return self.return_queued()