From: Michael Tremer Date: Tue, 3 Apr 2012 14:01:36 +0000 (+0200) Subject: Improve offline mode. X-Git-Tag: 0.9.22~34 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=98733451a83496f1a6a1e5e4a43f650d86eb811f;p=pakfire.git Improve offline mode. --- diff --git a/examples/general.conf b/examples/general.conf index 4b0821713..40ec06296 100644 --- a/examples/general.conf +++ b/examples/general.conf @@ -32,4 +32,7 @@ # parameter. Unit: bytes per second. #bandwidth_throttle = 10240 - +# Offline mode. +# You may disable any kind of download action. +# Howevery, pakfire won't be fully functionable. +#offline = False diff --git a/python/pakfire/base.py b/python/pakfire/base.py index f2615d11c..c9a8b4e67 100644 --- a/python/pakfire/base.py +++ b/python/pakfire/base.py @@ -53,10 +53,6 @@ class Pakfire(object): def __init__(self, mode=None, path="/", config=None, configs=None, arch=None, enable_repos=None, disable_repos=None, **kwargs): - - if kwargs: - print _("Ignored arguments:"), kwargs - # Set the mode. assert mode in ("normal", "builder", "server",) self.mode = mode @@ -84,6 +80,10 @@ class Pakfire(object): # Read configuration file(s). self.config = Config(files=configs) + # Update configuration with additional arguments. + for section, settings in kwargs.items(): + self.config.update(section, settings) + # Dump the configuration. self.config.dump() @@ -199,7 +199,7 @@ class Pakfire(object): """ A shortcut that indicates if the system is running in offline mode. """ - return self.config.get("offline", False) + return self.config.get("downloader", "offline", False) def check_root_user(self): if not os.getuid() == 0 or not os.getgid() == 0: diff --git a/python/pakfire/cli.py b/python/pakfire/cli.py index 2353b84cc..2275ded31 100644 --- a/python/pakfire/cli.py +++ b/python/pakfire/cli.py @@ -109,8 +109,10 @@ class Cli(object): if hasattr(self.args, "enable_repo"): ret["enable_repos"] = self.args.enable_repo - if hasattr(self.args, "offline"): - ret["offline"] = self.args.offline + if hasattr(self.args, "offline") and self.args.offline: + ret["downloader"] = { + "offline" : self.args.offline, + } if hasattr(self.args, "config"): ret["configs"] = self.args.config @@ -429,8 +431,10 @@ class CliBuilder(Cli): if hasattr(self.args, "enable_repo"): ret["enable_repos"] = self.args.enable_repo - if hasattr(self.args, "offline"): - ret["offline"] = self.args.offline + if hasattr(self.args, "offline") and self.args.offline: + ret["downloader"] = { + "offline" : self.args.offline, + } return ret @@ -624,8 +628,10 @@ class CliServer(Cli): def pakfire_args(self): ret = { "mode" : "server" } - if hasattr(self.args, "offline"): - ret["offline"] = self.args.offline + if hasattr(self.args, "offline") and self.args.offline: + ret["downloader"] = { + "offline" : self.args.offline, + } return ret diff --git a/python/pakfire/config.py b/python/pakfire/config.py index a051910d7..a3fa45c2e 100644 --- a/python/pakfire/config.py +++ b/python/pakfire/config.py @@ -187,6 +187,10 @@ class _Config(object): return default def update(self, section, what): + if not type(what) == type({}): + log.error(_("Unhandled configuration update: %s") % what) + return + try: self._config[section].update(what) except KeyError: diff --git a/python/pakfire/downloader.py b/python/pakfire/downloader.py index b3406787a..e2f49e9b3 100644 --- a/python/pakfire/downloader.py +++ b/python/pakfire/downloader.py @@ -52,9 +52,7 @@ class PakfireGrabber(URLGrabber): config = pakfire else: config = pakfire.config - - if config.get("downloader", "offline"): - raise OfflineModeError, "Cannot use %s in offline mode." % self.__class__.__name__ + self.config = config # Set throttle setting. bandwidth_throttle = config.get("downloader", "bandwidth_throttle") @@ -74,13 +72,24 @@ class PakfireGrabber(URLGrabber): URLGrabber.__init__(self, *args, **kwargs) + def check_offline_mode(self): + offline = self.config.get("downloader", "offline") + if not offline: + return + + raise OfflineModeError + def urlread(self, filename, *args, **kwargs): + self.check_offline_mode() + # This is for older versions of urlgrabber which are packaged in Debian # and Ubuntu and cannot handle filenames as a normal Python string but need # a unicode string. return URLGrabber.urlread(self, filename.encode("utf-8"), *args, **kwargs) def urlopen(self, filename, *args, **kwargs): + self.check_offline_mode() + # However, urlopen requires the filename to be an ordinary string object. filename = str(filename) @@ -145,6 +154,9 @@ class SourceDownloader(object): if download_files: log.info(_("Downloading source files:")) + if self.pakfire.offline: + raise OfflineModeError, _("Cannot download source code in offline mode.") + # Create source download directory. if not os.path.exists(SOURCE_CACHE_DIR): os.makedirs(SOURCE_CACHE_DIR) diff --git a/python/pakfire/repository/remote.py b/python/pakfire/repository/remote.py index 3d8c1ca00..305d45e03 100644 --- a/python/pakfire/repository/remote.py +++ b/python/pakfire/repository/remote.py @@ -118,6 +118,9 @@ class RepositoryRemote(base.RepositoryFactory): self.cache.destroy() def update(self, force=False, offline=False): + if force and offline: + raise OfflineModeError, _("You cannot force to update metadata in offline mode.") + # First update the repository metadata. self.update_metadata(force=force, offline=offline) self.update_database(force=force, offline=offline) @@ -138,28 +141,25 @@ class RepositoryRemote(base.RepositoryFactory): cache_filename = self.cache_path(os.path.basename(filename)) # Check if the metadata is already recent enough... - if self.cache.exists(cache_filename): - age = self.cache.age(cache_filename) - if age and age < TIME_10M: - log.debug("Metadata is recent enough. I don't download it again.") - else: - log.debug("Metadata needs an update.") - force = True + exists = self.cache.exists(cache_filename) - # If no metadata exists, yet we need an update. - else: - force = True + if not exists and offline: + raise OfflineModeError, _("No metadata available for repository %s. Cannot download any.") \ + % self.name - # Raise an exception when we are running in offline mode but an update is required. - if force and offline: - raise OfflineModeError, _("Cannot update repository metadata for %s when in offline mode.") % self.name - - # If no download is required, we exit here. - if not force: + elif exists and offline: + # Repository metadata exists. We cannot update anything because of the offline mode. return + if not force and exists: + age = self.cache.age(cache_filename) + if age and age < TIME_10M: + log.debug("Metadata is recent enough. I don't download it again.") + return + # Going to download metada. log.debug("Going to download repository metadata for %s..." % self.name) + assert not offline grabber = downloader.MetadataDownloader(self.pakfire) grabber = self.mirrors.group(grabber) @@ -206,7 +206,7 @@ class RepositoryRemote(base.RepositoryFactory): self.index.read(filename) def update_database(self, force=False, offline=False): - assert self.metadata + assert self.metadata, "Metadata needs to be openend first." # Construct cache and download filename. filename = os.path.join(METADATA_DOWNLOAD_PATH, self.metadata.database) @@ -222,6 +222,9 @@ class RepositoryRemote(base.RepositoryFactory): elif not force: return + # Just make sure we don't try to download anything in offline mode. + assert not offline + # Initialize a grabber for download. grabber = downloader.DatabaseDownloader( self.pakfire,