# 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
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
# 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()
"""
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:
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
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
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
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:
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")
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)
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)
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)
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)
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)
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,