# HG changeset patch # User Tero Marttila # Date 1329310423 -7200 # Node ID b88653920e7a6b5ea20e407e6cf2c11635951429 # Parent d4b9954273a1a57fbb0729b515adabd70e381e91 fix up --destination/--source to --target/--source to run manually; specify list of targets to run as args diff -r d4b9954273a1 -r b88653920e7a rsync-snapshot.conf --- a/rsync-snapshot.conf Wed Feb 15 14:15:38 2012 +0200 +++ b/rsync-snapshot.conf Wed Feb 15 14:53:43 2012 +0200 @@ -43,3 +43,11 @@ [targets:test:rsync_options] exclude-from = ignore.list +[targets:test-lvm] +path = ./test-lvm +source = backups_test:lvm:asdf:test + +[targets:test-lvm:intervals] +recent = 4 + + diff -r d4b9954273a1 -r b88653920e7a scripts/pvlbackup-rsync-snapshot --- a/scripts/pvlbackup-rsync-snapshot Wed Feb 15 14:15:38 2012 +0200 +++ b/scripts/pvlbackup-rsync-snapshot Wed Feb 15 14:53:43 2012 +0200 @@ -30,7 +30,7 @@ parser = optparse.OptionParser( prog = argv[0], - usage = '%prog: [options] --source --destination ', + usage = '%prog: [options] [ --config | --target [ --source ] [ --interval ] ]', # module docstring # XXX: breaks multi-line descriptions.. @@ -74,21 +74,22 @@ parser.add_option('-c', '--config', metavar='FILE', help="Load configuration file") - # - parser.add_option('-s', '--source', metavar='RSYNC-PATH', - help="Backup source in rsync-syntax") + parser.add_option('-T', '--target', metavar='PATH', + help="Target path") - parser.add_option('-d', '--destination', metavar='RSYNC-PATH', - help="Backup destination in rsync-syntax") + parser.add_option('-s', '--source', metavar='RSYNC-PATH', dest='target_source', default=False, + help="Run target backup from source in rsync-syntax") parser.add_option('--interval', metavar='NAME', action='append', dest='target_intervals', - help="Enable given interval") + help="Run target with given given interval(s)") # defaults parser.set_defaults( - loglevel = logging.WARNING, + loglevel = logging.WARNING, + + target_intervals = [], ) parser.set_defaults(**defaults) @@ -257,7 +258,7 @@ # partial instance with keep return cls(name, format = base.format, - keep = config_int('keep', arg), + keep = config_int('keep', arg) if arg else base.keep, ) def __init__ (self, name, format, keep) : @@ -286,7 +287,7 @@ intervals = None, rsync_options = None, ) : - if not source : + if not source and source is not False : raise ConfigError("Missing required option: source for [target:{name}]".format(name=name)) # global defaults @@ -338,17 +339,25 @@ # 'current' symlink self.current_path = os.path.join(self.path, 'current') + def prepare (self, options) : + """ + Prepare dir for usage + """ + + if not os.path.exists(self.path) : + raise Exception("Missing target dir: {path}".format(path=self.path)) + + if not os.path.exists(self.snapshots_dir) : + log.warn("Creating snapshots dir: %s", self.snapshots_dir) + os.mkdir(self.snapshots_dir) + def snapshot (self, options, now) : """ Perform the rsync from our source to self.snapshot_dir. XXX: allocate snapshot_name here? """ - - if not os.path.exists(self.snapshots_dir) : - log.warn("Creating snapshots dir: %s", self.snapshots_dir) - os.mkdir(self.snapshots_dir) - + # new snapshot snapshot_name = now.strftime(options.snapshot_format) snapshot_path = os.path.join(self.snapshots_dir, snapshot_name) @@ -574,6 +583,9 @@ Execute """ + # prep + self.prepare(options) + # clean intervals? if options.clean_intervals: for interval in self.intervals : @@ -606,7 +618,7 @@ def __str__ (self) : return self.name -def run (options) : +def run (options, targets) : # default config config = dict( rsync_options = {}, @@ -619,11 +631,11 @@ config = parse_config(options.config, config) # manual? - if options.destination : - config['targets'][''] = dict( - path = options.destination, - source = options.source, - intervals = options.target_intervals, + if options.target : + config['targets'][options.target] = dict( + path = options.target, + source = options.target_source, + intervals = dict((name, None) for name in options.target_intervals), ) # intervals @@ -649,7 +661,12 @@ # store options.rsync_options[option] = value - for name in config['targets'] : + # all targets? + if not targets : + targets = list(config['targets']) + + # targets + for name in targets : target_config = config['targets'][name] # parse @@ -712,14 +729,13 @@ # global options + args options, args = parse_options(argv, defaults) - # XXX: args? - if args : - log.error("No arguments are handled") - return 2 + # args: filter targets + # XXX: fix name mangling + targets = [target.replace('-', '_') for target in args] try : # handle it - return run(options) + return run(options, targets) except Exception, e: log.error("Internal error:", exc_info=e)