From: Arvin Schnell Date: Wed, 9 Oct 2013 07:49:24 +0000 (+0200) Subject: - Provide "atomic" functions to create and modify snapshots including extra data... X-Git-Tag: v0.1.8~32 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5003dfb04fc44b661fbc83c4a93525ce96bfd041;p=thirdparty%2Fsnapper.git - Provide "atomic" functions to create and modify snapshots including extra data (e.g. cleanup and userdata). Needed for plugin scripts. --- diff --git a/LIBVERSION b/LIBVERSION index 7ec1d6db..ccbccc3d 100644 --- a/LIBVERSION +++ b/LIBVERSION @@ -1 +1 @@ -2.1.0 +2.2.0 diff --git a/server/Client.cc b/server/Client.cc index 09453fc1..cd094f20 100644 --- a/server/Client.cc +++ b/server/Client.cc @@ -810,10 +810,7 @@ Client::set_snapshot(DBus::Connection& conn, DBus::Message& msg) if (snap == snapshots.end()) throw IllegalSnapshotException(); - snap->setDescription(description); - snap->setCleanup(cleanup); - snap->setUserdata(userdata); - snap->flushInfo(); + snapper->modifySnapshot(snap, description, cleanup, userdata); DBus::MessageMethodReturn reply(msg); @@ -845,11 +842,8 @@ Client::create_single_snapshot(DBus::Connection& conn, DBus::Message& msg) Snapper* snapper = it->getSnapper(); - Snapshots::iterator snap1 = snapper->createSingleSnapshot(description); - snap1->setUid(conn.get_unix_userid(msg)); - snap1->setCleanup(cleanup); - snap1->setUserdata(userdata); - snap1->flushInfo(); + Snapshots::iterator snap1 = snapper->createSingleSnapshot(conn.get_unix_userid(msg), + description, cleanup, userdata); DBus::MessageMethodReturn reply(msg); @@ -884,11 +878,8 @@ Client::create_pre_snapshot(DBus::Connection& conn, DBus::Message& msg) Snapper* snapper = it->getSnapper(); - Snapshots::iterator snap1 = snapper->createPreSnapshot(description); - snap1->setUid(conn.get_unix_userid(msg)); - snap1->setCleanup(cleanup); - snap1->setUserdata(userdata); - snap1->flushInfo(); + Snapshots::iterator snap1 = snapper->createPreSnapshot(conn.get_unix_userid(msg), description, + cleanup, userdata); DBus::MessageMethodReturn reply(msg); @@ -927,11 +918,8 @@ Client::create_post_snapshot(DBus::Connection& conn, DBus::Message& msg) Snapshots::iterator snap1 = snapshots.find(pre_num); - Snapshots::iterator snap2 = snapper->createPostSnapshot(description, snap1); - snap2->setUid(conn.get_unix_userid(msg)); - snap2->setCleanup(cleanup); - snap2->setUserdata(userdata); - snap2->flushInfo(); + Snapshots::iterator snap2 = snapper->createPostSnapshot(snap1, conn.get_unix_userid(msg), + description, cleanup, userdata); bool tmp; if (it->getConfigInfo().getValue("BACKGROUND_COMPARISON", tmp) && tmp) diff --git a/snapper/Snapper.cc b/snapper/Snapper.cc index 11a6ac49..4aef880c 100644 --- a/snapper/Snapper.cc +++ b/snapper/Snapper.cc @@ -180,21 +180,54 @@ namespace snapper Snapshots::iterator Snapper::createSingleSnapshot(string description) { - return snapshots.createSingleSnapshot(description); + return snapshots.createSingleSnapshot(0, description, "", map()); } Snapshots::iterator Snapper::createPreSnapshot(string description) { - return snapshots.createPreSnapshot(description); + return snapshots.createPreSnapshot(0, description, "", map()); } Snapshots::iterator Snapper::createPostSnapshot(string description, Snapshots::const_iterator pre) { - return snapshots.createPostSnapshot(description, pre); + return snapshots.createPostSnapshot(pre, 0, description, "", map()); + } + + + Snapshots::iterator + Snapper::createSingleSnapshot(uid_t uid, const string& description, const string& cleanup, + const map& userdata) + { + return snapshots.createSingleSnapshot(uid, description, cleanup, userdata); + } + + + + Snapshots::iterator + Snapper::createPreSnapshot(uid_t uid, const string& description, const string& cleanup, + const map& userdata) + { + return snapshots.createPreSnapshot(uid, description, cleanup, userdata); + } + + + Snapshots::iterator + Snapper::createPostSnapshot(Snapshots::const_iterator pre, uid_t uid, const string& description, + const string& cleanup, const map& userdata) + { + return snapshots.createPostSnapshot(pre, uid, description, cleanup, userdata); + } + + + void + Snapper::modifySnapshot(Snapshots::iterator snapshot, const string& description, + const string& cleanup, const map& userdata) + { + snapshots.modifySnapshot(snapshot, description, cleanup, userdata); } diff --git a/snapper/Snapper.h b/snapper/Snapper.h index 8f77a2e7..1f30b74a 100644 --- a/snapper/Snapper.h +++ b/snapper/Snapper.h @@ -125,9 +125,22 @@ namespace snapper Snapshots::const_iterator getSnapshotCurrent() const; - Snapshots::iterator createSingleSnapshot(string description); - Snapshots::iterator createPreSnapshot(string description); - Snapshots::iterator createPostSnapshot(string description, Snapshots::const_iterator pre); + Snapshots::iterator createSingleSnapshot(string description) __attribute__ ((deprecated)); + Snapshots::iterator createPreSnapshot(string description) __attribute__ ((deprecated)); + Snapshots::iterator createPostSnapshot(string description, Snapshots::const_iterator pre) __attribute__ ((deprecated)); + + Snapshots::iterator createSingleSnapshot(uid_t uid, const string& description, + const string& cleanup, + const map& userdata); + Snapshots::iterator createPreSnapshot(uid_t uid, const string& description, + const string& cleanup, + const map& userdata); + Snapshots::iterator createPostSnapshot(Snapshots::const_iterator pre, uid_t uid, + const string& description, const string& cleanup, + const map& userdata); + + void modifySnapshot(Snapshots::iterator snapshot, const string& description, + const string& cleanup, const map& userdata); void deleteSnapshot(Snapshots::iterator snapshot); diff --git a/snapper/Snapshot.cc b/snapper/Snapshot.cc index 2b80a6c2..499862ca 100644 --- a/snapper/Snapshot.cc +++ b/snapper/Snapshot.cc @@ -315,6 +315,20 @@ namespace snapper } + void + Snapshots::checkUserdata(const map& userdata) const + { + for (map::const_iterator it = userdata.begin(); it != userdata.end(); ++it) + { + if (it->first.empty() || it->first.find_first_of(",=") != string::npos) + throw InvalidUserdataException(); + + if (it->second.find_first_of(",=") != string::npos) + throw InvalidUserdataException(); + } + } + + void Snapshots::initialize() { @@ -555,36 +569,72 @@ namespace snapper Snapshots::iterator Snapshots::createSingleSnapshot(string description) { + return createSingleSnapshot(0, description, "", map()); + } + + + Snapshots::iterator + Snapshots::createPreSnapshot(string description) + { + return createPreSnapshot(0, description, "", map()); + } + + + Snapshots::iterator + Snapshots::createPostSnapshot(string description, Snapshots::const_iterator pre) + { + return createPostSnapshot(pre, 0, description, "", map()); + } + + + Snapshots::iterator + Snapshots::createSingleSnapshot(uid_t uid, const string& description, const string& cleanup, + const map& userdata) + { + checkUserdata(userdata); + Snapshot snapshot(snapper, SINGLE, nextNumber(), time(NULL)); + snapshot.uid = uid; snapshot.description = description; - snapshot.info_modified = true; + snapshot.cleanup = cleanup; + snapshot.userdata = userdata; return createHelper(snapshot); } Snapshots::iterator - Snapshots::createPreSnapshot(string description) + Snapshots::createPreSnapshot(uid_t uid, const string& description, const string& cleanup, + const map& userdata) { + checkUserdata(userdata); + Snapshot snapshot(snapper, PRE, nextNumber(), time(NULL)); + snapshot.uid = uid; snapshot.description = description; - snapshot.info_modified = true; + snapshot.cleanup = cleanup; + snapshot.userdata = userdata; return createHelper(snapshot); } Snapshots::iterator - Snapshots::createPostSnapshot(string description, Snapshots::const_iterator pre) + Snapshots::createPostSnapshot(Snapshots::const_iterator pre, uid_t uid, const string& description, + const string& cleanup, const map& userdata) { if (pre == entries.end() || pre->isCurrent() || pre->getType() != PRE || findPost(pre) != entries.end()) throw IllegalSnapshotException(); + checkUserdata(userdata); + Snapshot snapshot(snapper, POST, nextNumber(), time(NULL)); - snapshot.description = description; snapshot.pre_num = pre->getNum(); - snapshot.info_modified = true; + snapshot.uid = uid; + snapshot.description = description; + snapshot.cleanup = cleanup; + snapshot.userdata = userdata; return createHelper(snapshot); } @@ -606,7 +656,7 @@ namespace snapper try { - snapshot.flushInfo(); + snapshot.writeInfo(); } catch (const IOErrorException& e) { @@ -627,6 +677,23 @@ namespace snapper } + void + Snapshots::modifySnapshot(iterator snapshot, const string& description, const string& cleanup, + const map& userdata) + { + if (snapshot == entries.end() || snapshot->isCurrent()) + throw IllegalSnapshotException(); + + checkUserdata(userdata); + + snapshot->description = description; + snapshot->cleanup = cleanup; + snapshot->userdata = userdata; + + snapshot->writeInfo(); + } + + void Snapshots::deleteSnapshot(iterator snapshot) { diff --git a/snapper/Snapshot.h b/snapper/Snapshot.h index 99d53754..d75e248d 100644 --- a/snapper/Snapshot.h +++ b/snapper/Snapshot.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011 Novell, Inc. + * Copyright (c) [2011-2013] Novell, Inc. * * All Rights Reserved. * @@ -94,21 +94,21 @@ namespace snapper time_t getDate() const { return date; } - void setUid(uid_t uid); + void setUid(uid_t uid) __attribute__ ((deprecated)); uid_t getUid() const { return uid; } unsigned int getPreNum() const { return pre_num; } - void setDescription(const string& description); + void setDescription(const string& description) __attribute__ ((deprecated)); string getDescription() const { return description; } - void setCleanup(const string& cleanup); + void setCleanup(const string& cleanup) __attribute__ ((deprecated)); string getCleanup() const { return cleanup; } - void setUserdata(const map& userdata); + void setUserdata(const map& userdata) __attribute__ ((deprecated)); map getUserdata() const { return userdata; } - void flushInfo(); + void flushInfo() __attribute__ ((deprecated)); string snapshotDir() const; @@ -200,12 +200,24 @@ namespace snapper void check() const; - iterator createSingleSnapshot(string description); - iterator createPreSnapshot(string description); - iterator createPostSnapshot(string description, const_iterator pre); + void checkUserdata(const map& userdata) const; + + iterator createSingleSnapshot(string description) __attribute__ ((deprecated)); + iterator createPreSnapshot(string description) __attribute__ ((deprecated)); + iterator createPostSnapshot(string description, const_iterator pre) __attribute__ ((deprecated)); + + iterator createSingleSnapshot(uid_t uid, const string& description, const string& cleanup, + const map& userdata); + iterator createPreSnapshot(uid_t uid, const string& description, const string& cleanup, + const map& userdata); + iterator createPostSnapshot(const_iterator pre, uid_t uid, const string& description, + const string& cleanup, const map& userdata); iterator createHelper(Snapshot& snapshot); + void modifySnapshot(iterator snapshot, const string& description, const string& cleanup, + const map& userdata); + void deleteSnapshot(iterator snapshot); unsigned int nextNumber();