class Config:
"""Encapsules the configuration for the backup program."""
- class ReadException(Exception):
+ class ReadError(RuntimeError):
"""An exception raised when reading configurations."""
- pass
+ def __init__(self, value):
+ self.value = value
+ self.message = value
class FileSet:
"""A fileset has a name and a list of directories."""
"""Read configuration from file"""
if not os.path.isfile(filename):
- raise Config.ReadException("No file '" + filename + "'.")
+ raise Config.ReadError("Cannot read config file '" + filename + "'.")
config = configparser.RawConfigParser()
config.read(filename)
for reqsec in ["destination"]:
if not config.has_section(reqsec):
- raise Config.ReadException("Section '" + reqsec + "' is missing.")
+ raise Config.ReadError("Section '" + reqsec + "' is missing.")
self.directory = config.get("destination", "directory")
+ if not os.path.isdir(self.directory):
+ raise Config.ReadError("Directory '{0}' does not exist.".format(self.directory))
self.format = config.get("destination", "format")
if not self.format in Config.formats:
- raise Config.ReadException("Invalid 'format' given.")
+ raise Config.ReadError("Invalid 'format' given.")
if config.has_section("history"):
if opt.startswith("keep"):
epoch = opt[4:]
if not epoch in RealEpoch.keys():
- raise Config.ReadException("Invalid option 'keep" + epoch + "'.")
- self.epochkeeps[epoch] = int(config.getint("history", opt))
+ raise Config.ReadError("Invalid option 'keep" + epoch + "'.")
+ try:
+ self.epochkeeps[epoch] = int(config.getint("history", opt))
+ except ValueError:
+ raise Config.ReadError("Invalid integer given for '" + opt + "'.")
elif opt.startswith("mode"):
epoch = opt[4:]
if not epoch in RealEpoch.keys():
- raise Config.ReadException("Invalid option 'mode" + epoch + "'.")
+ raise Config.ReadError("Invalid option 'mode" + epoch + "'.")
self.epochmodes[epoch] = config.get("history", opt)
if not self.epochmodes[epoch] in Mode:
- raise Config.ReadException("Invalid mode given.")
+ raise Config.ReadError("Invalid mode given.")
else:
- raise Config.ReadException("Invalid option '" + opt + "'.")
+ raise Config.ReadError("Invalid option '" + opt + "'.")
if config.has_section("input"):
for opt in config.options("input"):
if opt.startswith("exclude"):
self.exclpatterns += [ config.get("input", opt) ]
else:
- raise Config.ReadException("Invalid option '" + opt + "'.")
+ raise Config.ReadError("Invalid option '" + opt + "'.")
for sec in config.sections():
if sec in ["destination", "history", "input"]:
for opt in config.options(sec):
if not opt.startswith("dir"):
- raise Config.ReadException("Unknown option '" + opt + "'.")
+ raise Config.ReadError("Unknown option '" + opt + "'.")
else:
dirs += [config.get(sec, opt)]
self.sets += [Config.FileSet(name, dirs)]
else:
- raise Config.ReadException("Unknown section '" + sec + "'.")
+ raise Config.ReadError("Unknown section '" + sec + "'.")
# Compute checksum of config file
m = hashlib.sha1()
if cmd == "prune":
man.prune()
- except Config.ReadException as e:
- print("Error reading config file: ", end="")
- for a in e.args:
- print(a, end=" ")
- print()
+ except (Config.ReadError, configparser.DuplicateOptionError) as e:
+ print("Error reading config file: " + e.message)