]> git.ipfire.org Git - pakfire.git/commitdiff
Improve offline mode.
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 3 Apr 2012 14:01:36 +0000 (16:01 +0200)
committerMichael Tremer <michael.tremer@ipfire.org>
Tue, 3 Apr 2012 14:01:36 +0000 (16:01 +0200)
examples/general.conf
python/pakfire/base.py
python/pakfire/cli.py
python/pakfire/config.py
python/pakfire/downloader.py
python/pakfire/repository/remote.py

index 4b0821713d3b14b0426633b2d45350f59c86f6a7..40ec06296eb24de56f5fe7b230f84ba3a7e944a0 100644 (file)
@@ -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
index f2615d11c6085083f3dc879be2ee6acb48a89d1a..c9a8b4e67d56192710f8e1e1e641702541b50cef 100644 (file)
@@ -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:
index 2353b84cc25797d16d2ccc89c6c949cf06d8d1f3..2275ded31fd33a23355c2a2842bcbff07ea6665e 100644 (file)
@@ -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
 
index a051910d796dd3358a3f73bdbc429d1e75078c56..a3fa45c2e787c1c2f89d1a2fb2cb828e46e43d8f 100644 (file)
@@ -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:
index b3406787a7f66284c73debc3a21c78682e37a3fc..e2f49e9b36f1985f78e55932e98265d3385a0ff6 100644 (file)
@@ -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)
index 3d8c1ca005a088e92193602b4672be4012a7e402..305d45e031a395f6c3042d3d53a802917c805705 100644 (file)
@@ -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,