From: Arvin Schnell Date: Fri, 2 Mar 2012 15:27:27 +0000 (+0100) Subject: - added option --command to snapper create X-Git-Tag: v0.1.3~248 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=467e1a30632ca837ca7678eb503589310c0d449e;p=thirdparty%2Fsnapper.git - added option --command to snapper create --- diff --git a/VERSION b/VERSION index d169b2f2..c5d54ec3 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.0.8 +0.0.9 diff --git a/doc/snapper.8.in b/doc/snapper.8.in index 5ecee0b1..72b4c138 100644 --- a/doc/snapper.8.in +++ b/doc/snapper.8.in @@ -157,6 +157,9 @@ Set the cleanup-algorithm for the snapshot. Set userdata for the snapshot. The key-value pairs must be seperated by comma and the key and value must be seperated by an equal sign, e.g. requestid=42,user=arthur. +.TP +\fI\-\-pre\-number\fR +Create a pre and post snapshot and run command in between. .TP .B modify [options] diff --git a/package/snapper.changes b/package/snapper.changes index 7d18d705..dda6fa63 100644 --- a/package/snapper.changes +++ b/package/snapper.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Fri Mar 02 16:25:26 CET 2012 - aschnell@suse.de + +- added option --command to snapper create +- 0.0.9 + ------------------------------------------------------------------- Fri Feb 24 19:21:15 CET 2012 - aschnell@suse.de diff --git a/tools/snapper.cc b/tools/snapper.cc index c5233e3c..20c398e1 100644 --- a/tools/snapper.cc +++ b/tools/snapper.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011 Novell, Inc. + * Copyright (c) 2011-2012 Novell, Inc. * * All Rights Reserved. * @@ -463,6 +463,7 @@ help_create() << _("\t--description, -d \tDescription for snapshot.") << endl << _("\t--cleanup-algorithm, -c \tCleanup algorithm for snapshot.") << endl << _("\t--userdata, -u \tUserdata for snapshot.") << endl + << _("\t--command \tRun command and create pre and post snapshots.") << endl << endl; } @@ -477,6 +478,7 @@ command_create() { "description", required_argument, 0, 'd' }, { "cleanup-algorithm", required_argument, 0, 'c' }, { "userdata", required_argument, 0, 'u' }, + { "command", required_argument, 0, 0 }, { 0, 0, 0, 0 } }; @@ -487,20 +489,31 @@ command_create() exit(EXIT_FAILURE); } + enum CreateType { CT_SINGLE, CT_PRE, CT_POST, CT_PRE_POST }; + const Snapshots& snapshots = sh->getSnapshots(); - SnapshotType type = SINGLE; + CreateType type = CT_SINGLE; Snapshots::const_iterator snap1 = snapshots.end(); bool print_number = false; string description; string cleanup; map userdata; + string command; GetOpts::parsed_opts::const_iterator opt; if ((opt = opts.find("type")) != opts.end()) { - if (!toValue(opt->second, type, SINGLE)) + if (opt->second == "single") + type = CT_SINGLE; + else if (opt->second == "pre") + type = CT_PRE; + else if (opt->second == "post") + type = CT_POST; + else if (opt->second == "pre-post") + type = CT_PRE_POST; + else { cerr << _("Unknown type of snapshot.") << endl; exit(EXIT_FAILURE); @@ -522,17 +535,29 @@ command_create() if ((opt = opts.find("userdata")) != opts.end()) userdata = read_userdata(opt->second); - if (type == POST && (snap1 == snapshots.end() || snap1->isCurrent())) + if ((opt = opts.find("command")) != opts.end()) + { + command = opt->second; + type = CT_PRE_POST; + } + + if (type == CT_POST && (snap1 == snapshots.end() || snap1->isCurrent())) { cerr << _("Missing or invalid pre-number.") << endl; exit(EXIT_FAILURE); } + if (type == CT_PRE_POST && command.empty()) + { + cerr << _("Missing command argument.") << endl; + exit(EXIT_FAILURE); + } + try { switch (type) { - case SINGLE: { + case CT_SINGLE: { Snapshots::iterator snap1 = sh->createSingleSnapshot(description); snap1->setCleanup(cleanup); snap1->setUserdata(userdata); @@ -541,7 +566,7 @@ command_create() cout << snap1->getNum() << endl; } break; - case PRE: { + case CT_PRE: { Snapshots::iterator snap1 = sh->createPreSnapshot(description); snap1->setCleanup(cleanup); snap1->setUserdata(userdata); @@ -550,7 +575,7 @@ command_create() cout << snap1->getNum() << endl; } break; - case POST: { + case CT_POST: { Snapshots::iterator snap2 = sh->createPostSnapshot(description, snap1); snap2->setCleanup(cleanup); snap2->setUserdata(userdata); @@ -559,6 +584,23 @@ command_create() cout << snap2->getNum() << endl; sh->startBackgroundComparsion(snap1, snap2); } break; + + case CT_PRE_POST: { + Snapshots::iterator snap1 = sh->createPreSnapshot(description); + snap1->setCleanup(cleanup); + snap1->setUserdata(userdata); + snap1->flushInfo(); + + system(command.c_str()); + + Snapshots::iterator snap2 = sh->createPostSnapshot(description, snap1); + snap2->setCleanup(cleanup); + snap2->setUserdata(userdata); + snap2->flushInfo(); + if (print_number) + cout << snap1->getNum() << ".." << snap2->getNum() << endl; + sh->startBackgroundComparsion(snap1, snap2); + } break; } } catch (const InvalidUserdataException& e)