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()
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
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()