示例#1
0
    def fetch_ftp_release(self, eol, _list=False):
        """
        Fetch a user specified RELEASE from FreeBSD's ftp server or a user
        supplied one. The user can also specify the user, password and
        root-directory containing the release tree that looks like so:
            - XX.X-RELEASE
            - XX.X-RELEASE
            - XX.X_RELEASE
        """

        ftp = self.__fetch_ftp_connect__()
        ftp_list = ftp.nlst()

        if not self.release:
            ftp_list = [rel for rel in ftp_list if "-RELEASE" in rel]
            releases = sort_release(ftp_list)

            for r in releases:
                if r in eol:
                    self.lgr.info("[{}] {} (EOL)".format(releases.index(r), r))
                else:
                    self.lgr.info("[{}] {}".format(releases.index(r), r))

            if _list:
                return

            self.release = input("\nWhich release do you want to fetch?"
                                 " (EXIT) ")

            self.release = self.__fetch_validate_release__(releases)

        # This has the benefit of giving us a list of files, but also as a
        # easy sanity check for the existence of the RELEASE before we reuse
        #  it below.
        try:
            ftp.cwd(self.release)
        except error_perm:
            raise RuntimeError("{} was not found!".format(self.release))

        ftp_list = self.files
        ftp.quit()

        self.lgr.info("Fetching: {}\n".format(self.release))
        self.fetch_download(ftp_list, ftp=True)
        missing = self.__fetch_check__(ftp_list, ftp=True)

        if missing:
            self.fetch_download(missing, ftp=True, missing=True)
            self.__fetch_check__(missing, ftp=True, _missing=True)

        if self.update:
            self.fetch_update()
示例#2
0
    def list_bases(self, datasets):
        """Lists all bases."""
        base_list = sort_release(datasets, self.iocroot, split=True)
        table = Texttable(max_width=0)

        if self.header:
            base_list.insert(0, ["Bases fetched"])
            table.add_rows(base_list)
            # We get an infinite float otherwise.
            table.set_cols_dtype(["t"])

            return table.draw()
        else:
            flat_base = [b for b in base_list for b in b]

            return flat_base
示例#3
0
    def fetch_http_release(self, eol, _list=False):
        """
        Fetch a user specified RELEASE from FreeBSD's http server or a user
        supplied one. The user can also specify the user, password and
        root-directory containing the release tree that looks like so:
            - XX.X-RELEASE
            - XX.X-RELEASE
            - XX.X_RELEASE
        """
        if self.hardened:
            if self.server == "ftp.freebsd.org":
                self.server = "http://installer.hardenedbsd.org"
                rdir = "releases/pub/HardenedBSD/releases/{0}/{0}".format(
                    self.arch)

        if self.server == "ftp.freebsd.org":
            self.server = "https://download.freebsd.org"
            self.root_dir = "ftp/releases/{}".format(self.arch)

        if self.auth and "https" not in self.server:
            self.server = "https://" + self.server
        elif "http" not in self.server:
            self.server = "http://" + self.server

        logging.getLogger("requests").setLevel(logging.WARNING)

        if self.hardened:
            if self.auth == "basic":
                req = requests.get("{}/releases".format(self.server),
                                   auth=(self.user, self.password),
                                   verify=self.verify)
            elif self.auth == "digest":
                req = requests.get("{}/releases".format(self.server),
                                   auth=HTTPDigestAuth(self.user,
                                                       self.password),
                                   verify=self.verify)
            else:
                req = requests.get("{}/releases".format(self.server))

            releases = []
            status = req.status_code == requests.codes.ok
            if not status:
                req.raise_for_status()

            if not self.release:
                for rel in req.content.split():
                    rel = rel.strip("href=").strip("/").split(">")
                    if "_stable" in rel[0]:
                        rel = rel[0].strip('"').strip("/").strip("/</a")
                        rel = rel.replace("hardened_", "").replace(
                            "_master-LAST", "").replace("_", "-").upper()
                        if rel not in releases:
                            releases.append(rel)

                releases = sort_release(releases, self.iocroot)
                for r in releases:
                    self.lgr.info("[{}] {}".format(releases.index(r), r))
                self.release = input(
                    "\nWhich release do you want to fetch?"
                    " (EXIT) ")
                self.release = self.__fetch_validate_release__(releases)
        else:
            if self.auth == "basic":
                req = requests.get("{}/{}".format(self.server, self.root_dir),
                                   auth=(self.user, self.password),
                                   verify=self.verify)
            elif self.auth == "digest":
                req = requests.get("{}/{}".format(self.server, self.root_dir),
                                   auth=HTTPDigestAuth(self.user,
                                                       self.password),
                                   verify=self.verify)
            else:
                req = requests.get("{}/{}".format(self.server, self.root_dir))

            releases = []
            status = req.status_code == requests.codes.ok
            if not status:
                req.raise_for_status()

            if not self.release:
                for rel in req.content.split():
                    rel = rel.strip("href=").strip("/").split(">")
                    if "-RELEASE" in rel[0]:
                        rel = rel[0].strip('"').strip("/").strip("/</a")
                        if rel not in releases:
                            releases.append(rel)

                releases = sort_release(releases, self.iocroot)
                for r in releases:
                    if r in eol:
                        self.lgr.info(
                            "[{}] {} (EOL)".format(releases.index(r), r))
                    else:
                        self.lgr.info("[{}] {}".format(releases.index(r), r))

                if _list:
                    return

                self.release = input(
                    "\nWhich release do you want to fetch?"
                    " (EXIT) ")
                self.release = self.__fetch_validate_release__(releases)

        if self.hardened:
            self.root_dir = "{}/hardenedbsd-{}-LAST".format(rdir,
                                                            self.release.lower())
        self.lgr.info("Fetching: {}\n".format(self.release))
        self.fetch_download(self.files)
        missing = self.__fetch_check__(self.files)

        if missing:
            self.fetch_download(missing, missing=True)
            self.__fetch_check__(missing, _missing=True)

        if not self.hardened:
            self.fetch_update()