Пример #1
0
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)
Пример #2
0
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()