]> git.ipfire.org Git - thirdparty/snapper.git/commitdiff
- record user id during snapshot creation
authorArvin Schnell <aschnell@suse.de>
Wed, 5 Sep 2012 16:32:23 +0000 (18:32 +0200)
committerArvin Schnell <aschnell@suse.de>
Wed, 5 Sep 2012 16:32:23 +0000 (18:32 +0200)
12 files changed:
client/snapper.cc
client/types.cc
client/types.h
examples/python/get-snapshot.py
examples/python/list-snapshots.py
examples/qt/client-qt.cc
server/Client.cc
server/Types.cc
snapper/AppUtil.cc
snapper/AppUtil.h
snapper/Snapshot.cc
snapper/Snapshot.h

index 1b504561ee37eb9ae184fe10cbe4df6dd24a7a29..111a83288a0aecb830f463a115d4de7d362b86b6 100644 (file)
@@ -373,6 +373,7 @@ command_list(DBus::Connection& conn)
            header.add(_("#"));
            header.add(_("Pre #"));
            header.add(_("Date"));
+           header.add(_("User"));
            header.add(_("Cleanup"));
            header.add(_("Description"));
            header.add(_("Userdata"));
@@ -386,6 +387,7 @@ command_list(DBus::Connection& conn)
                row.add(decString(it1->getNum()));
                row.add(it1->getType() == POST ? decString(it1->getPreNum()) : "");
                row.add(it1->isCurrent() ? "" : datetime(it1->getDate(), false, false));
+               row.add(username(it1->getUid()));
                row.add(it1->getCleanup());
                row.add(it1->getDescription());
                row.add(show_userdata(it1->getUserdata()));
@@ -399,6 +401,7 @@ command_list(DBus::Connection& conn)
            TableHeader header;
            header.add(_("#"));
            header.add(_("Date"));
+           header.add(_("User"));
            header.add(_("Description"));
            header.add(_("Userdata"));
            table.setHeader(header);
@@ -412,6 +415,7 @@ command_list(DBus::Connection& conn)
                TableRow row;
                row.add(decString(it1->getNum()));
                row.add(it1->isCurrent() ? "" : datetime(it1->getDate(), false, false));
+               row.add(username(it1->getUid()));
                row.add(it1->getDescription());
                row.add(show_userdata(it1->getUserdata()));
                table.add(row);
index 9f8819086c7db4cd2c1cbdd712ad0dfa46b5910a..a74c9a23ebd2367341a25efbebdcdd917086a9b4 100644 (file)
@@ -73,7 +73,7 @@ XSnapshots::findPost(const_iterator pre) const
 namespace DBus
 {
     const char* TypeInfo<XConfigInfo>::signature = "(ssa{ss})";
-    const char* TypeInfo<XSnapshot>::signature = "(uqutssa{ss})";
+    const char* TypeInfo<XSnapshot>::signature = "(uqutussa{ss})";
     const char* TypeInfo<XFile>::signature = "(su)";
 
 
@@ -101,7 +101,7 @@ namespace DBus
     operator>>(Hihi& hihi, XSnapshot& data)
     {
        hihi.open_recurse();
-       hihi >> data.num >> data.type >> data.pre_num >> data.date >> data.description
+       hihi >> data.num >> data.type >> data.pre_num >> data.date >> data.uid >> data.description
             >> data.cleanup >> data.userdata;
        hihi.close_recurse();
        return hihi;
index 2ac8a9696f02a73715e17f2b300ec762b9997137..30becc25091e7f6a195ad9e7ee5381c9cda89af4 100644 (file)
@@ -54,6 +54,8 @@ struct XSnapshot
 
     time_t getDate() const { return date; }
 
+    uid_t getUid() const { return uid; }
+
     unsigned int getPreNum() const { return pre_num; }
 
     string getDescription() const { return description; }
@@ -65,6 +67,7 @@ struct XSnapshot
     SnapshotType type;
     unsigned int num;
     time_t date;
+    uid_t uid;
     unsigned int pre_num;
     string description;
     string cleanup;
index 082dfeb19e6e0b3e691fdeee1c2436096ed3129d..e940812c96c0d6a9d030fd4b619f6529c34226ca 100755 (executable)
@@ -1,5 +1,7 @@
 #!/usr/bin/python
 
+from time import gmtime, asctime
+from pwd import getpwuid
 import dbus
 
 bus = dbus.SystemBus()
@@ -10,7 +12,9 @@ snapper = dbus.Interface(bus.get_object('org.opensuse.Snapper', '/org/opensuse/S
 
 snapshot = snapper.GetSnapshot("root", 1)
 
-print snapshot[0], snapshot[1], snapshot[2], snapshot[3], snapshot[4], snapshot[5],
-for k, v in snapshot[6].items():
+print snapshot[0], snapshot[1], snapshot[2], asctime(gmtime(snapshot[3])),
+print getpwuid(snapshot[4])[0], snapshot[5], snapshot[6],
+for k, v in snapshot[7].items():
     print "%s=%s" % (k, v),
 print
+
index f21b70ae86b2ba09ac51806f0a5d16aeabb1dc04..540df211f26e9b08ec4a0bffd909211b2d669244 100755 (executable)
@@ -1,5 +1,7 @@
 #!/usr/bin/python
 
+from time import gmtime, asctime
+from pwd import getpwuid
 import dbus
 
 bus = dbus.SystemBus()
@@ -11,8 +13,15 @@ snapper = dbus.Interface(bus.get_object('org.opensuse.Snapper', '/org/opensuse/S
 snapshots = snapper.ListSnapshots("root")
 
 for snapshot in snapshots:
-    print snapshot[0], snapshot[1], snapshot[2], snapshot[3], snapshot[4], snapshot[5],
-    for k, v in snapshot[6].items():
+    print snapshot[0], snapshot[1], snapshot[2],
+
+    if snapshot[3] != 0xFFFFFFFFFFFFFFFF:
+        print asctime(gmtime(snapshot[3])),
+    else:
+        print "now",
+
+    print getpwuid(snapshot[4])[0], snapshot[5], snapshot[6],
+    for k, v in snapshot[7].items():
         print "%s=%s" % (k, v),
     print
 
index 073f67b4086c3940d6f0f01fb9cfbbad0578288f..e3dcf9d2492ee33691c31c0245764220c834c1ca 100644 (file)
@@ -15,6 +15,7 @@ struct Snapshot
     SnapshotType type;
     unsigned int pre_num;
     QDateTime date;
+    uid_t uid;
     QString description;
     QString cleanup;
     QMap<QString, QString> userdata;
@@ -28,8 +29,8 @@ QDBusArgument& operator<<(QDBusArgument& argument, const Snapshot& mystruct)
 {
     argument.beginStructure();
     argument << mystruct.num << static_cast<unsigned short>(mystruct.type) << mystruct.pre_num
-            << mystruct.date.toTime_t() << mystruct.description << mystruct.cleanup
-            << mystruct.userdata;
+            << mystruct.date.toTime_t() << mystruct.uid << mystruct.description
+            << mystruct.cleanup << mystruct.userdata;
     argument.endStructure();
     return argument;
 }
@@ -41,8 +42,8 @@ const QDBusArgument& operator>>(const QDBusArgument& argument, Snapshot& mystruc
     unsigned long long tmp2;
 
     argument.beginStructure();
-    argument >> mystruct.num >> tmp1 >> mystruct.pre_num >> tmp2 >> mystruct.description
-            >> mystruct.cleanup >> mystruct.userdata;
+    argument >> mystruct.num >> tmp1 >> mystruct.pre_num >> tmp2 >> mystruct.uid
+            >> mystruct.description >> mystruct.cleanup >> mystruct.userdata;
     argument.endStructure();
 
     mystruct.type = static_cast<SnapshotType>(tmp1);
@@ -80,6 +81,7 @@ command_list_snapshots()
            printf(" %s", "now");
        else
            printf(" %s", qPrintable(snapshot.date.toString()));
+       printf(" %d", snapshot.uid);
        printf(" %s", qPrintable(snapshot.description));
        QMapIterator<QString, QString> it2(snapshot.userdata);
        while (it2.hasNext())
index 13a95f43924447cb606527b97797d67f9e6ac4c9..7208aa2d5952f92fed0fd6560d059804fd53ce52 100644 (file)
@@ -183,7 +183,7 @@ Client::introspect(DBus::Connection& conn, DBus::Message& msg)
        "    <method name='GetSnapshot'>\n"
        "      <arg name='config-name' type='s' direction='in'/>\n"
        "      <arg name='number' type='u' direction='in'/>\n"
-       "      <arg name='type' type='(uqutssa{ss})' direction='out'/>\n"
+       "      <arg name='type' type='(uqutussa{ss})' direction='out'/>\n"
        "    </method>\n"
 
        "    <method name='SetSnapshot'>\n"
@@ -666,6 +666,7 @@ 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();
@@ -704,6 +705,7 @@ 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();
@@ -746,6 +748,7 @@ Client::create_post_snapshot(DBus::Connection& conn, DBus::Message& msg)
     Snapshots::iterator snap1 = snapshots.find(pre_num);
 
     Snapshots::iterator snap2 = snapper->createPostSnapshot(description, snap1);
+    snap1->setUid(conn.get_unix_userid(msg));
     snap2->setCleanup(cleanup);
     snap2->setUserdata(userdata);
     snap2->flushInfo();
index 9dc391d9124da13a23b46e43bb8f119a89f31194..619ab65fd7cf2bae85fbac93184fdf0839a58d3b 100644 (file)
@@ -26,7 +26,7 @@
 namespace DBus
 {
     const char* TypeInfo<ConfigInfo>::signature = "(ssa{ss})";
-    const char* TypeInfo<Snapshot>::signature = "(uqutssa{ss})";
+    const char* TypeInfo<Snapshot>::signature = "(uqutussa{ss})";
     const char* TypeInfo<File>::signature = "(su)";
 
 
@@ -63,7 +63,8 @@ namespace DBus
     {
        hoho.open_struct();
        hoho << data.getNum() << data.getType() << data.getPreNum() << data.getDate()
-            << data.getDescription() << data.getCleanup() << data.getUserdata();
+            << data.getUid() << data.getDescription() << data.getCleanup()
+            << data.getUserdata();
        hoho.close_struct();
        return hoho;
     }
index 3fdec2067239a4a779dd0dd97259f9ab09bf198a..5874d4f9b144d10fb091cf137535e715c6cc6e2b 100644 (file)
@@ -30,6 +30,8 @@
 #include <sys/types.h>
 #include <sys/utsname.h>
 #include <sys/ioctl.h>
+#include <sys/types.h>
+#include <pwd.h>
 #include <dirent.h>
 #include <mntent.h>
 #include <string>
@@ -299,6 +301,22 @@ namespace snapper
     }
 
 
+    string
+    username(uid_t uid)
+    {
+       struct passwd pwd;
+       struct passwd* result;
+
+       long bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
+       char buf[bufsize];
+
+       if (getpwuid_r(uid, &pwd, buf, bufsize, &result) != 0 || result != &pwd)
+           return "unknown";
+
+       return pwd.pw_name;
+    }
+
+
     StopWatch::StopWatch()
     {
        gettimeofday(&start_tv, NULL);
index f235e5ba7f762c7c8020d89291000fc4cf8e148d..f9cee595b14220587b93d357e6bca30bf13e541c 100644 (file)
@@ -83,6 +83,8 @@ namespace snapper
     string datetime(time_t time, bool utc, bool classic);
     time_t scan_datetime(const string& str, bool utc);
 
+    string username(uid_t uid);
+
 
     class StopWatch
     {
index 457f11f2971441d461f974115d72d88509879d9b..023ac8d0b81de2091419eb7f5b9a5b252e1143d5 100644 (file)
@@ -54,6 +54,8 @@ namespace snapper
 
        s << " date:\"" << datetime(snapshot.date, true, true) << "\"";
 
+       s << "uid:" << snapshot.uid;
+
        if (!snapshot.description.empty())
            s << " description:\"" << snapshot.description << "\"";
 
@@ -117,6 +119,17 @@ namespace snapper
     }
 
 
+    void
+    Snapshot::setUid(uid_t val)
+    {
+       if (isCurrent())
+           throw IllegalSnapshotException();
+
+       uid = val;
+       info_modified = true;
+    }
+
+
     void
     Snapshot::setDescription(const string& val)
     {
@@ -208,6 +221,8 @@ namespace snapper
                    continue;
                }
 
+               getChildValue(node, "uid", snapshot.uid);
+
                getChildValue(node, "pre_num", snapshot.pre_num);
 
                getChildValue(node, "description", snapshot.description);
@@ -429,6 +444,8 @@ namespace snapper
 
        setChildValue(node, "date", datetime(date, true, true));
 
+       setChildValue(node, "uid", uid);
+
        if (type == POST)
            setChildValue(node, "pre_num", pre_num);
 
index b33b09f37945dcf4f67ec16975330b84eeb3ff01..969236cf0f54523fbb6a41ff1340ec9a0b46cdb3 100644 (file)
@@ -85,7 +85,7 @@ namespace snapper
        friend class Snapshots;
 
        Snapshot(const Snapper* snapper, SnapshotType type, unsigned int num, time_t date)
-           : snapper(snapper), type(type), num(num), date(date), pre_num(0),
+           : snapper(snapper), type(type), num(num), date(date), uid(0), pre_num(0),
              info_modified(false) {}
 
        SnapshotType getType() const { return type; }
@@ -95,6 +95,9 @@ namespace snapper
 
        time_t getDate() const { return date; }
 
+       void setUid(uid_t uid);
+       uid_t getUid() const { return uid; }
+
        unsigned int getPreNum() const { return pre_num; }
 
        void setDescription(const string& description);
@@ -131,6 +134,8 @@ namespace snapper
 
        time_t date;
 
+       uid_t uid;
+
        unsigned int pre_num;   // valid only for type=POST
 
        string description;     // likely empty for type=POST