def _quick_http_test(self): """ Run a simple 30 second wget on the repository to see if it is reachable. This avoids the need to wait for a full 10min timeout. """ # just make a temp file to write a test fetch into mktemp = 'mktemp -u /tmp/tmp.XXXXXX' dest_file_path = self.run_command(mktemp).stdout.strip() try: # build up a wget command http_cmd = self.wget_cmd_pattern % (self.url, dest_file_path) try: self.run_command(http_cmd, _run_command_dargs={'timeout': 30}) except Exception, e: msg = 'HTTP test failed, unable to contact %s: %s' raise error.PackageFetchError(msg % (self.url, e)) finally: self.run_command('rm -rf %s' % dest_file_path)
def fetch_pkg(self, pkg_name, dest_path, repo_url=None, use_checksum=False): ''' Fetch the package into dest_dir from repo_url. By default repo_url is None and the package is looked in all the repositories specified. Otherwise it fetches it from the specific repo_url. pkg_name : name of the package (ex: test-sleeptest.tar.bz2, dep-gcc.tar.bz2, kernel.1-1.rpm) repo_url : the URL of the repository where the package is located. dest_path : complete path of where the package will be fetched to. use_checksum : This is set to False to fetch the packages.checksum file so that the checksum comparison is bypassed for the checksum file itself. This is used internally by the packaging system. It should be ignored by externals callers of this method who use it fetch custom packages. ''' # Check if the destination dir exists. if not self.exists(os.path.dirname(dest_path), target='dir'): raise error.PackageFetchError("Please provide a valid " "destination: %s " % dest_path) # See if the package was already fetched earlier, if so # the checksums need to be compared and the package is now # fetched only if they differ. pkg_exists = self.exists(dest_path) # if a repository location is explicitly provided, fetch the package # from there and return if repo_url: repositories = [self.get_fetcher(repo_url)] elif self.repositories: repositories = self.repositories else: raise error.PackageFetchError("No repository urls specified") # install the package from the package repos, try the repos in # reverse order, assuming that the 'newest' repos are most desirable for fetcher in reversed(repositories): try: # Fetch the package if it is not there, the checksum does # not match, or checksums are disabled entirely need_to_fetch = (not use_checksum or not pkg_exists or not self.compare_checksum(dest_path)) if need_to_fetch: fetcher.fetch_pkg_file(pkg_name, dest_path) # update checksum so we won't refetch next time. if use_checksum: self.update_checksum(dest_path) return except (error.PackageFetchError, error.AutoservRunError) as e: # The package could not be found in this repo, continue looking logging.debug(e) repo_url_list = [repo.url for repo in repositories] message = ('%s could not be fetched from any of the repos %s' % (pkg_name, repo_url_list)) logging.error(message) # if we got here then that means the package is not found # in any of the repositories. raise error.PackageFetchError(message)