]> git.ipfire.org Git - thirdparty/snapper.git/commitdiff
- report plugin failures
authorArvin Schnell <aschnell@suse.de>
Tue, 28 Nov 2023 07:35:35 +0000 (08:35 +0100)
committerArvin Schnell <aschnell@suse.de>
Tue, 28 Nov 2023 07:35:35 +0000 (08:35 +0100)
37 files changed:
client/cleanup.cc
client/cleanup.h
client/cmd-cleanup.cc
client/cmd-create-config.cc
client/cmd-create.cc
client/cmd-debug.cc
client/cmd-delete-config.cc
client/cmd-delete.cc
client/cmd-diff.cc
client/cmd-get-config.cc
client/cmd-list-configs.cc
client/cmd-list.cc
client/cmd-modify.cc
client/cmd-mount.cc
client/cmd-rollback.cc
client/cmd-set-config.cc
client/cmd-setup-quota.cc
client/cmd-status.cc
client/cmd-umount.cc
client/cmd-undochange.cc
client/cmd-xadiff.cc
client/cmd.h
client/commands.cc
client/commands.h
client/installation-helper.cc
client/proxy-dbus.cc
client/proxy-dbus.h
client/proxy-lib.cc
client/proxy-lib.h
client/proxy.h
client/snapper.cc
client/systemd-helper.cc
client/types.cc
client/types.h
data/systemd-sandboxing.txt
doc/snapper.xml.in
package/snapper.changes

index e57a0a8082444df0edd8b62569107ddb63021d44..626a0b653427a5753aba6e937a341244ae1b4e08 100644 (file)
@@ -110,8 +110,8 @@ public:
 
     virtual ~Cleaner() {}
 
-    void cleanup();
-    void cleanup(std::function<bool()> condition);
+    void cleanup(Plugins::Report& report);
+    void cleanup(std::function<bool()> condition, Plugins::Report& report);
 
 protected:
 
@@ -139,7 +139,7 @@ protected:
     // snapshot but which is not included in tmp.
     void filter_pre_post(ProxySnapshots& snapshots, list<ProxySnapshots::iterator>& tmp) const;
 
-    void remove(const list<ProxySnapshots::iterator>& tmp);
+    void remove(const list<ProxySnapshots::iterator>& tmp, Plugins::Report& report);
 
     // Should the cleanup with quota space be run?
     bool is_quota_aware() const;
@@ -153,8 +153,8 @@ protected:
     // Is the free space condition satisfied?
     bool is_free_satisfied() const;
 
-    void cleanup(ProxySnapshots& snapshots);
-    void cleanup(ProxySnapshots& snapshots, std::function<bool()> condition);
+    void cleanup(ProxySnapshots& snapshots, Plugins::Report& report);
+    void cleanup(ProxySnapshots& snapshots, std::function<bool()> condition, Plugins::Report& report);
 
     ProxySnapper* snapper;
 
@@ -240,11 +240,11 @@ Cleaner::filter_pre_post(ProxySnapshots& snapshots, list<ProxySnapshots::iterato
 
 
 void
-Cleaner::remove(const list<ProxySnapshots::iterator>& tmp)
+Cleaner::remove(const list<ProxySnapshots::iterator>& tmp, Plugins::Report& report)
 {
     for (list<ProxySnapshots::iterator>::const_iterator it = tmp.begin(); it != tmp.end(); ++it)
     {
-       snapper->deleteSnapshots({ *it }, verbose);
+       snapper->deleteSnapshots({ *it }, verbose, report);
     }
 }
 
@@ -334,18 +334,18 @@ Cleaner::is_free_satisfied() const
 
 
 void
-Cleaner::cleanup(ProxySnapshots& snapshots)
+Cleaner::cleanup(ProxySnapshots& snapshots, Plugins::Report& report)
 {
     list<ProxySnapshots::iterator> candidates = calculate_candidates(snapshots, Range::MAX);
 
     filter(snapshots, candidates);
 
-    remove(candidates);
+    remove(candidates, report);
 }
 
 
 void
-Cleaner::cleanup(ProxySnapshots& snapshots, std::function<bool()> condition)
+Cleaner::cleanup(ProxySnapshots& snapshots, std::function<bool()> condition, Plugins::Report& report)
 {
     while (!condition())
     {
@@ -374,7 +374,7 @@ Cleaner::cleanup(ProxySnapshots& snapshots, std::function<bool()> condition)
 
            if (!tmp.empty())
            {
-               remove(tmp);
+               remove(tmp, report);
 
                // after removing snapshots the condition must be reevaluated
                break;
@@ -400,7 +400,7 @@ Cleaner::cleanup(ProxySnapshots& snapshots, std::function<bool()> condition)
 
 
 void
-Cleaner::cleanup()
+Cleaner::cleanup(Plugins::Report& report)
 {
     ProxySnapshots& snapshots = snapper->getSnapshots();
 
@@ -408,7 +408,7 @@ Cleaner::cleanup()
     cout << "cleanup without condition" << '\n';
 #endif
 
-    cleanup(snapshots);
+    cleanup(snapshots, report);
 
     if (is_quota_aware())
     {
@@ -416,7 +416,7 @@ Cleaner::cleanup()
        cout << "cleanup with quota condition" << '\n';
 #endif
 
-       cleanup(snapshots, std::bind(&Cleaner::is_quota_satisfied, this));
+       cleanup(snapshots, std::bind(&Cleaner::is_quota_satisfied, this), report);
     }
     else
     {
@@ -431,7 +431,7 @@ Cleaner::cleanup()
        cout << "cleanup with free condition" << '\n';
 #endif
 
-       cleanup(snapshots, std::bind(&Cleaner::is_free_satisfied, this));
+       cleanup(snapshots, std::bind(&Cleaner::is_free_satisfied, this), report);
     }
     else
     {
@@ -443,7 +443,7 @@ Cleaner::cleanup()
 
 
 void
-Cleaner::cleanup(std::function<bool()> condition)
+Cleaner::cleanup(std::function<bool()> condition, Plugins::Report& report)
 {
     ProxySnapshots& snapshots = snapper->getSnapshots();
 
@@ -451,7 +451,7 @@ Cleaner::cleanup(std::function<bool()> condition)
     cout << "cleanup with user condition" << '\n';
 #endif
 
-    cleanup(snapshots, condition);
+    cleanup(snapshots, condition, report);
 }
 
 
@@ -562,20 +562,20 @@ private:
 
 
 void
-do_cleanup_number(ProxySnapper* snapper, bool verbose)
+do_cleanup_number(ProxySnapper* snapper, bool verbose, Plugins::Report& report)
 {
     NumberParameters parameters(snapper);
     NumberCleaner cleaner(snapper, verbose, parameters);
-    cleaner.cleanup();
+    cleaner.cleanup(report);
 }
 
 
 void
-do_cleanup_number(ProxySnapper* snapper, bool verbose, std::function<bool()> condition)
+do_cleanup_number(ProxySnapper* snapper, bool verbose, std::function<bool()> condition, Plugins::Report& report)
 {
     NumberParameters parameters(snapper);
     NumberCleaner cleaner(snapper, verbose, parameters);
-    cleaner.cleanup(condition);
+    cleaner.cleanup(condition, report);
 }
 
 
@@ -778,20 +778,20 @@ private:
 
 
 void
-do_cleanup_timeline(ProxySnapper* snapper, bool verbose)
+do_cleanup_timeline(ProxySnapper* snapper, bool verbose, Plugins::Report& report)
 {
     TimelineParameters parameters(snapper);
     TimelineCleaner cleaner(snapper, verbose, parameters);
-    cleaner.cleanup();
+    cleaner.cleanup(report);
 }
 
 
 void
-do_cleanup_timeline(ProxySnapper* snapper, bool verbose, std::function<bool()> condition)
+do_cleanup_timeline(ProxySnapper* snapper, bool verbose, std::function<bool()> condition, Plugins::Report& report)
 {
     TimelineParameters parameters(snapper);
     TimelineCleaner cleaner(snapper, verbose, parameters);
-    cleaner.cleanup(condition);
+    cleaner.cleanup(condition, report);
 }
 
 
@@ -852,18 +852,19 @@ private:
 
 
 void
-do_cleanup_empty_pre_post(ProxySnapper* snapper, bool verbose)
+do_cleanup_empty_pre_post(ProxySnapper* snapper, bool verbose, Plugins::Report& report)
 {
     EmptyPrePostParameters parameters(snapper);
     EmptyPrePostCleaner cleaner(snapper, verbose, parameters);
-    cleaner.cleanup();
+    cleaner.cleanup(report);
 }
 
 
 void
-do_cleanup_empty_pre_post(ProxySnapper* snapper, bool verbose, std::function<bool()> condition)
+do_cleanup_empty_pre_post(ProxySnapper* snapper, bool verbose, std::function<bool()> condition,
+                         Plugins::Report& report)
 {
     EmptyPrePostParameters parameters(snapper);
     EmptyPrePostCleaner cleaner(snapper, verbose, parameters);
-    cleaner.cleanup(condition);
+    cleaner.cleanup(condition, report);
 }
index 6d250079a9de6f034c5f1b6f6e3999f586271618..aceaab803b5d590b0f4163447e4e4ee0414eca89 100644 (file)
  */
 
 void
-do_cleanup_number(ProxySnapper* snapper, bool verbose);
+do_cleanup_number(ProxySnapper* snapper, bool verbose, Plugins::Report& report);
 
 void
-do_cleanup_timeline(ProxySnapper* snapper, bool verbose);
+do_cleanup_timeline(ProxySnapper* snapper, bool verbose, Plugins::Report& report);
 
 void
-do_cleanup_empty_pre_post(ProxySnapper* snapper, bool verbose);
+do_cleanup_empty_pre_post(ProxySnapper* snapper, bool verbose, Plugins::Report& report);
 
 
 /*
@@ -47,10 +47,13 @@ do_cleanup_empty_pre_post(ProxySnapper* snapper, bool verbose);
  */
 
 void
-do_cleanup_number(ProxySnapper* snapper, bool verbose, std::function<bool()> condition);
+do_cleanup_number(ProxySnapper* snapper, bool verbose, std::function<bool()> condition,
+                 Plugins::Report& report);
 
 void
-do_cleanup_timeline(ProxySnapper* snapper, bool verbose, std::function<bool()> condition);
+do_cleanup_timeline(ProxySnapper* snapper, bool verbose, std::function<bool()> condition,
+                   Plugins::Report& report);
 
 void
-do_cleanup_empty_pre_post(ProxySnapper* snapper, bool verbose, std::function<bool()> condition);
+do_cleanup_empty_pre_post(ProxySnapper* snapper, bool verbose, std::function<bool()> condition,
+                         Plugins::Report& report);
index 3fd90e37cb0804a010cc3ef2020802f9e444f42c..42e28b126cf778a72f80174cf29e02bfc02fa3b7 100644 (file)
@@ -109,26 +109,26 @@ namespace snapper
 
 
        void
-       run_cleanup(ProxySnapper* snapper, CleanupAlgorithm cleanup_algorithm, bool verbose)
+       run_cleanup(ProxySnapper* snapper, CleanupAlgorithm cleanup_algorithm, bool verbose, Plugins::Report& report)
        {
            switch (cleanup_algorithm)
            {
                case CleanupAlgorithm::NUMBER:
-                   do_cleanup_number(snapper, verbose);
+                   do_cleanup_number(snapper, verbose, report);
                    break;
 
                case CleanupAlgorithm::TIMELINE:
-                   do_cleanup_timeline(snapper, verbose);
+                   do_cleanup_timeline(snapper, verbose, report);
                    break;
 
                case CleanupAlgorithm::EMPTY_PRE_POST:
-                   do_cleanup_empty_pre_post(snapper, verbose);
+                   do_cleanup_empty_pre_post(snapper, verbose, report);
                    break;
 
                case CleanupAlgorithm::ALL:
-                   do_cleanup_number(snapper, verbose);
-                   do_cleanup_timeline(snapper, verbose);
-                   do_cleanup_empty_pre_post(snapper, verbose);
+                   do_cleanup_number(snapper, verbose, report);
+                   do_cleanup_timeline(snapper, verbose, report);
+                   do_cleanup_empty_pre_post(snapper, verbose, report);
                    break;
            }
        }
@@ -136,7 +136,7 @@ namespace snapper
 
        void
        run_cleanup(ProxySnapper* snapper, CleanupAlgorithm cleanup_algorithm, bool verbose,
-                   const FreeSpaceCondition& free_space_condition)
+                   const FreeSpaceCondition& free_space_condition, Plugins::Report& report)
        {
            std::function<bool()> condition = [snapper, &free_space_condition]() {
                return free_space_condition.is_satisfied(snapper);
@@ -145,28 +145,29 @@ namespace snapper
            switch (cleanup_algorithm)
            {
                case CleanupAlgorithm::NUMBER:
-                   do_cleanup_number(snapper, verbose, condition);
+                   do_cleanup_number(snapper, verbose, condition, report);
                    break;
 
                case CleanupAlgorithm::TIMELINE:
-                   do_cleanup_timeline(snapper, verbose, condition);
+                   do_cleanup_timeline(snapper, verbose, condition, report);
                    break;
 
                case CleanupAlgorithm::EMPTY_PRE_POST:
-                   do_cleanup_empty_pre_post(snapper, verbose, condition);
+                   do_cleanup_empty_pre_post(snapper, verbose, condition, report);
                    break;
 
                case CleanupAlgorithm::ALL:
-                   do_cleanup_number(snapper, verbose, condition);
-                   do_cleanup_timeline(snapper, verbose, condition);
-                   do_cleanup_empty_pre_post(snapper, verbose, condition);
+                   do_cleanup_number(snapper, verbose, condition, report);
+                   do_cleanup_timeline(snapper, verbose, condition, report);
+                   do_cleanup_empty_pre_post(snapper, verbose, condition, report);
                    break;
            }
        }
 
 
        void
-       run_cleanup(const vector<ProxySnapper*>& snappers, CleanupAlgorithm cleanup_algorithm, bool verbose)
+       run_cleanup(const vector<ProxySnapper*>& snappers, CleanupAlgorithm cleanup_algorithm, bool verbose,
+                   Plugins::Report& report)
        {
            for (ProxySnapper* snapper : snappers)
            {
@@ -174,14 +175,14 @@ namespace snapper
                cout << "config " << snapper->configName() << '\n';
 #endif
 
-               run_cleanup(snapper, cleanup_algorithm, verbose);
+               run_cleanup(snapper, cleanup_algorithm, verbose, report);
            }
        }
 
 
        void
        run_cleanup(const vector<ProxySnapper*>& snappers, CleanupAlgorithm cleanup_algorithm, bool verbose,
-                   const FreeSpaceCondition& free_space_condition)
+                   const FreeSpaceCondition& free_space_condition, Plugins::Report& report)
        {
            for (ProxySnapper* snapper : snappers)
            {
@@ -194,7 +195,7 @@ namespace snapper
 
                try
                {
-                   run_cleanup(snapper, cleanup_algorithm, verbose, free_space_condition);
+                   run_cleanup(snapper, cleanup_algorithm, verbose, free_space_condition, report);
                }
                catch (...)
                {
@@ -209,7 +210,8 @@ namespace snapper
 
 
     void
-    command_cleanup(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers, ProxySnapper*)
+    command_cleanup(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers,
+                   ProxySnapper*, Plugins::Report& report)
     {
        const vector<Option> options = {
            Option("path",              required_argument),
@@ -273,7 +275,7 @@ namespace snapper
 
            if (free_space == 0)
            {
-               run_cleanup(snapper, cleanup_algorithm, global_options.verbose());
+               run_cleanup(snapper, cleanup_algorithm, global_options.verbose(), report);
            }
            else
            {
@@ -291,7 +293,7 @@ namespace snapper
 
                if (!free_space_condition->is_satisfied())
                {
-                   run_cleanup(snapper, cleanup_algorithm, global_options.verbose(), *free_space_condition);
+                   run_cleanup(snapper, cleanup_algorithm, global_options.verbose(), *free_space_condition, report);
 
                    if (!free_space_condition->is_satisfied())
                    {
@@ -342,7 +344,7 @@ namespace snapper
 
            if (free_space == 0)
            {
-               run_cleanup(affected_snappers, cleanup_algorithm, global_options.verbose());
+               run_cleanup(affected_snappers, cleanup_algorithm, global_options.verbose(), report);
            }
            else
            {
@@ -361,7 +363,7 @@ namespace snapper
                if (!free_space_condition->is_satisfied())
                {
                    run_cleanup(affected_snappers, cleanup_algorithm, global_options.verbose(),
-                               *free_space_condition);
+                               *free_space_condition, report);
 
                    if (!free_space_condition->is_satisfied())
                    {
index b7e426b905374edda62f7ff9f064339a8e1f0983..ed6e2f73df796526303baff2bb81cee2e9a1ccd5 100644 (file)
@@ -50,7 +50,8 @@ namespace snapper
 
 
     void
-    command_create_config(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers, ProxySnapper*)
+    command_create_config(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers,
+                         ProxySnapper*, Plugins::Report& report)
     {
        const vector<Option> options = {
            Option("fstype",    required_argument,      'f'),
@@ -88,7 +89,7 @@ namespace snapper
            exit(EXIT_FAILURE);
        }
 
-       snappers->createConfig(global_options.config(), subvolume, fstype, template_name);
+       snappers->createConfig(global_options.config(), subvolume, fstype, template_name, report);
     }
 
 }
index e9fc5beab2690fe09e584414f303bc135dd9ebd9..d003eb7c7e6019f490f8eef4a6dc6b988c5cf954 100644 (file)
@@ -67,7 +67,8 @@ namespace snapper
 
 
     void
-    command_create(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers*, ProxySnapper* snapper)
+    command_create(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers*,
+                  ProxySnapper* snapper, Plugins::Report& report)
     {
        const vector<Option> options = {
            Option("type",                      required_argument,      't'),
@@ -165,27 +166,27 @@ namespace snapper
        switch (type)
        {
            case CreateType::SINGLE: {
-               snapshot1 = snapper->createSingleSnapshot(parent, scd);
+               snapshot1 = snapper->createSingleSnapshot(parent, scd, report);
                if (print_number)
                    cout << snapshot1->getNum() << endl;
            } break;
 
            case CreateType::PRE: {
-               snapshot1 = snapper->createPreSnapshot(scd);
+               snapshot1 = snapper->createPreSnapshot(scd, report);
                if (print_number)
                    cout << snapshot1->getNum() << endl;
            } break;
 
            case CreateType::POST: {
-               snapshot2 = snapper->createPostSnapshot(snapshot1, scd);
+               snapshot2 = snapper->createPostSnapshot(snapshot1, scd, report);
                if (print_number)
                    cout << snapshot2->getNum() << endl;
            } break;
 
            case CreateType::PRE_POST: {
-               snapshot1 = snapper->createPreSnapshot(scd);
+               snapshot1 = snapper->createPreSnapshot(scd, report);
                system(command.c_str());
-               snapshot2 = snapper->createPostSnapshot(snapshot1, scd);
+               snapshot2 = snapper->createPostSnapshot(snapshot1, scd, report);
                if (print_number)
                    cout << snapshot1->getNum() << ".." << snapshot2->getNum() << endl;
            } break;
index e2531af9cb47ab7633fd9e2f191109fcb7c79718..18a7bbdb641b8a47916382923f0b68ce6e39cd8b 100644 (file)
@@ -41,7 +41,8 @@ namespace snapper
 
 
     void
-    command_debug(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers, ProxySnapper*)
+    command_debug(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers,
+                 ProxySnapper*, Plugins::Report& report)
     {
        get_opts.parse("debug", GetOpts::no_options);
        if (get_opts.has_args())
index bf9b665c301b7ada7bb52d6f16c6cd8c28e8070b..6ad506e8244ed850325479b1718bbade8f165aa3 100644 (file)
@@ -44,7 +44,8 @@ namespace snapper
 
 
     void
-    command_delete_config(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers, ProxySnapper*)
+    command_delete_config(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers,
+                         ProxySnapper*, Plugins::Report& report)
     {
        get_opts.parse("delete-config", GetOpts::no_options);
        if (get_opts.has_args())
@@ -53,7 +54,7 @@ namespace snapper
            exit(EXIT_FAILURE);
        }
 
-       snappers->deleteConfig(global_options.config());
+       snappers->deleteConfig(global_options.config(), report);
     }
 
 }
index c566e1783f667943ed5e227b05283e1a9791c106..28d652455ef169b8391c55f539bc17d60eb0ec71 100644 (file)
@@ -80,7 +80,8 @@ namespace snapper
 
 
     void
-    command_delete(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers*, ProxySnapper* snapper)
+    command_delete(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers*,
+                  ProxySnapper* snapper, Plugins::Report& report)
     {
        const vector<Option> options = {
            Option("sync",      no_argument,    's')
@@ -136,7 +137,7 @@ namespace snapper
 
        filter_undeletables(snapshots, nums);
 
-       snapper->deleteSnapshots(nums, global_options.verbose());
+       snapper->deleteSnapshots(nums, global_options.verbose(), report);
 
        if (sync)
            snapper->syncFilesystem();
index 551632198c1abda57384073f6944ed750a388bfb..2bd116cf8f81330880787b3a2ca1f2ac5e366fc1 100644 (file)
@@ -53,7 +53,8 @@ namespace snapper
 
 
     void
-    command_diff(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers*, ProxySnapper* snapper)
+    command_diff(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers*,
+                ProxySnapper* snapper, Plugins::Report& report)
     {
        const vector<Option> options = {
            Option("input",             required_argument,      'i'),
index b6a5a081c7197c1602da5ab5a1370b1c36420f25..98e02601140fa1d10cc40aaed9734b018a69fc86 100644 (file)
@@ -161,7 +161,8 @@ namespace snapper
 
 
     void
-    command_get_config(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers*, ProxySnapper* snapper)
+    command_get_config(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers*,
+                      ProxySnapper* snapper, Plugins::Report& report)
     {
        const vector<Option> options = {
            Option("columns",   required_argument)
index 699712e2731ba45737eb81c18d030606b3f3ad81..73cc60614080277c943dc5a8b06256c1ad4eb176 100644 (file)
@@ -167,7 +167,8 @@ namespace snapper
 
 
     void
-    command_list_configs(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers, ProxySnapper*)
+    command_list_configs(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers,
+                        ProxySnapper*, Plugins::Report& report)
     {
        const vector<Option> options = {
            Option("columns",   required_argument)
index c693f8b8dcdc2080157341dbca4bde45e7530743..352a8f03626a87957cb4922265f17c6ca4e0e2ba 100644 (file)
@@ -705,7 +705,8 @@ namespace snapper
 
 
     void
-    command_list(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers, ProxySnapper* snapper)
+    command_list(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers,
+                ProxySnapper* snapper, Plugins::Report& report)
     {
        const vector<Option> options = {
            Option("type",                      required_argument,      't'),
index 2cc384caeabfe5a10e4c3445224c45fa1c079181..bc66630f6495d0190ebe942a21731203d510e4f3 100644 (file)
@@ -55,7 +55,8 @@ namespace snapper
 
 
     void
-    command_modify(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers*, ProxySnapper* snapper)
+    command_modify(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers*,
+                  ProxySnapper* snapper, Plugins::Report& report)
     {
        const vector<Option> options = {
            Option("description",               required_argument,      'd'),
@@ -126,7 +127,7 @@ namespace snapper
 
            if (set_smd)
            {
-               snapper->modifySnapshot(snapshot, smd);
+               snapper->modifySnapshot(snapshot, smd, report);
            }
 
            if (set_read_only)
@@ -138,7 +139,7 @@ namespace snapper
            {
                ProxyConfig config = snapper->getConfig();
                const Filesystem* filesystem = get_filesystem(config, global_options.root());
-               filesystem->setDefault(snapshot->getNum());
+               filesystem->setDefault(snapshot->getNum(), report);
            }
        }
     }
index 4cd6d6e25052aa6eab75f541f7738c7d81315a5d..8cd541bae8a221812ec424d230b8098ef6405100 100644 (file)
@@ -44,7 +44,8 @@ namespace snapper
 
 
     void
-    command_mount(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers*, ProxySnapper* snapper)
+    command_mount(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers*,
+                 ProxySnapper* snapper, Plugins::Report& report)
     {
        get_opts.parse("mount", GetOpts::no_options);
        if (!get_opts.has_args())
index 863b39f2d019975a0ec8c0d3e992e3e7cb9e8dc2..b2b854d5950febe9b5486a095cd52642c42ed8b9 100644 (file)
@@ -27,7 +27,7 @@
 
 #include <snapper/AppUtil.h>
 #include <snapper/Filesystem.h>
-#include <snapper/Hooks.h>
+#include <snapper/PluginsImpl.h>
 
 #include "utils/text.h"
 #include "GlobalOptions.h"
@@ -59,7 +59,8 @@ namespace snapper
 
 
     void
-    command_rollback(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers*, ProxySnapper* snapper)
+    command_rollback(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers*, ProxySnapper* snapper,
+                    Plugins::Report& report)
     {
        const vector<Option> options = {
            Option("print-number",              no_argument,            'p'),
@@ -161,7 +162,7 @@ namespace snapper
                        cout << _("Creating read-only snapshot of default subvolume.") << flush;
 
                    scd1.read_only = true;
-                   snapshot1 = snapper->createSingleSnapshotOfDefault(scd1);
+                   snapshot1 = snapper->createSingleSnapshotOfDefault(scd1, report);
 
                    if (!global_options.quiet())
                        cout << " " << sformat(_("(Snapshot %d.)"), snapshot1->getNum()) << endl;
@@ -174,7 +175,7 @@ namespace snapper
                        scd2.description += sformat(" of #%d", active->getNum());
 
                    scd2.read_only = false;
-                   snapshot2 = snapper->createSingleSnapshot(snapshots.getCurrent(), scd2);
+                   snapshot2 = snapper->createSingleSnapshot(snapshots.getCurrent(), scd2, report);
 
                    if (!global_options.quiet())
                        cout << " " << sformat(_("(Snapshot %d.)"), snapshot2->getNum()) << endl;
@@ -186,7 +187,7 @@ namespace snapper
                    if (!global_options.quiet())
                        cout << _("Creating read-only snapshot of current system.") << flush;
 
-                   snapshot1 = snapper->createSingleSnapshot(scd1);
+                   snapshot1 = snapper->createSingleSnapshot(scd1, report);
 
                    if (!global_options.quiet())
                        cout << " " << sformat(_("(Snapshot %d.)"), snapshot1->getNum()) << endl;
@@ -198,7 +199,7 @@ namespace snapper
                        scd2.description += sformat(" of #%d", tmp->getNum());
 
                    scd2.read_only = false;
-                   snapshot2 = snapper->createSingleSnapshot(tmp, scd2);
+                   snapshot2 = snapper->createSingleSnapshot(tmp, scd2, report);
 
                    if (!global_options.quiet())
                        cout << " " << sformat(_("(Snapshot %d.)"), snapshot2->getNum()) << endl;
@@ -208,18 +209,18 @@ namespace snapper
                {
                    SMD smd = previous_default->getSmd();
                    smd.cleanup = "number";
-                   snapper->modifySnapshot(previous_default, smd);
+                   snapper->modifySnapshot(previous_default, smd, report);
                }
 
                if (!global_options.quiet())
                    cout << sformat(_("Setting default subvolume to snapshot %d."), snapshot2->getNum()) << endl;
 
-               filesystem->setDefault(snapshot2->getNum());
+               filesystem->setDefault(snapshot2->getNum(), report);
 
-               Hooks::rollback(filesystem->snapshotDir(snapshot1->getNum()),
-                               filesystem->snapshotDir(snapshot2->getNum()));
-               Hooks::rollback(Hooks::Stage::POST_ACTION, subvolume, filesystem, snapshot1->getNum(),
-                               snapshot2->getNum());
+               Plugins::rollback(filesystem->snapshotDir(snapshot1->getNum()),
+                                 filesystem->snapshotDir(snapshot2->getNum()), report);
+               Plugins::rollback(Plugins::Stage::POST_ACTION, subvolume, filesystem, snapshot1->getNum(),
+                                 snapshot2->getNum(), report);
 
                if (print_number)
                    cout << snapshot2->getNum() << endl;
@@ -255,17 +256,17 @@ namespace snapper
 
                SMD smd = snapshot->getSmd();
                smd.cleanup = "";
-               snapper->modifySnapshot(snapshot, smd);
+               snapper->modifySnapshot(snapshot, smd, report);
 
                if (!global_options.quiet())
                    cout << sformat(_("Setting default subvolume to snapshot %d."), snapshot->getNum()) << endl;
 
-               filesystem->setDefault(snapshot->getNum());
+               filesystem->setDefault(snapshot->getNum(), report);
 
-               Hooks::rollback(filesystem->snapshotDir(previous_default->getNum()),
-                               filesystem->snapshotDir(snapshot->getNum()));
-               Hooks::rollback(Hooks::Stage::POST_ACTION, subvolume, filesystem, previous_default->getNum(),
-                               snapshot->getNum());
+               Plugins::rollback(filesystem->snapshotDir(previous_default->getNum()),
+                                 filesystem->snapshotDir(snapshot->getNum()), report);
+               Plugins::rollback(Plugins::Stage::POST_ACTION, subvolume, filesystem, previous_default->getNum(),
+                                 snapshot->getNum(), report);
            }
            break;
 
index 92493dfd752336c03afebad6d8f9d40a1ecfcde2..8122de5e274af43ee229d8ed80e1a907239d69ee 100644 (file)
@@ -45,7 +45,8 @@ namespace snapper
 
 
     void
-    command_set_config(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers*, ProxySnapper* snapper)
+    command_set_config(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers*,
+                      ProxySnapper* snapper, Plugins::Report& report)
     {
        get_opts.parse("set-config", GetOpts::no_options);
        if (!get_opts.has_args())
index 3703a1d086e153bec2e2bcb87d667012844821f6..7e1a16459d0a3fc97584e6616c1c7af31768b3ab 100644 (file)
@@ -44,7 +44,8 @@ namespace snapper
 
 
     void
-    command_setup_quota(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers*, ProxySnapper* snapper)
+    command_setup_quota(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers*,
+                       ProxySnapper* snapper, Plugins::Report& report)
     {
        ParsedOpts opts = get_opts.parse("setup-quota", GetOpts::no_options);
        if (get_opts.num_args() != 0)
index 399f06086bc0a7b5955a94eab0bf65c38706df25..6f286a706e55f1ee3b22a9daac3f2ed105774187 100644 (file)
@@ -50,7 +50,8 @@ namespace snapper
 
 
     void
-    command_status(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers*, ProxySnapper* snapper)
+    command_status(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers*,
+                  ProxySnapper* snapper, Plugins::Report& report)
     {
        const vector<Option> options = {
            Option("output",    required_argument,      'o')
index b364ab9b10790a1a15dcd59f89b9d7aa97dae4c4..996df7a946c84f5fc8eb6991e8b495614cdd7e33 100644 (file)
@@ -44,7 +44,8 @@ namespace snapper
 
 
     void
-    command_umount(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers*, ProxySnapper* snapper)
+    command_umount(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers*,
+                  ProxySnapper* snapper, Plugins::Report& report)
     {
        get_opts.parse("umount", GetOpts::no_options);
        if (!get_opts.has_args())
index e64f10c2fa5bc7127c1fef6f3364e7fb7aa0f08d..01e804ae8081b4ed19a753cd3a4cc1cb4c360193 100644 (file)
@@ -50,7 +50,8 @@ namespace snapper
 
 
     void
-    command_undochange(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers*, ProxySnapper* snapper)
+    command_undochange(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers*,
+                      ProxySnapper* snapper, Plugins::Report& report)
     {
        const vector<Option> options = {
            Option("input",             required_argument,      'i')
index 0ef6f95d9f26b63b457647f9c1e3e44de9fad4d4..dd8b1f21805089d14474a0a05956adf2e24dca5f 100644 (file)
@@ -71,7 +71,8 @@ namespace snapper
 
 
     void
-    command_xadiff(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers*, ProxySnapper* snapper)
+    command_xadiff(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers*,
+                  ProxySnapper* snapper, Plugins::Report& report)
     {
        ParsedOpts opts = get_opts.parse("xadiff", GetOpts::no_options);
        if (get_opts.num_args() < 1)
index df59cd1b9df8628d325b7ff34e2a2eb7d124ade7..37ede8c6e0725e3c881c6912ca24999daf546ab4 100644 (file)
@@ -34,91 +34,104 @@ namespace snapper
     help_list_configs();
 
     void
-    command_list_configs(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers, ProxySnapper*);
+    command_list_configs(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers,
+                        ProxySnapper*, Plugins::Report& report);
 
 
     void
     help_create_config();
 
     void
-    command_create_config(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers, ProxySnapper*);
+    command_create_config(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers,
+                         ProxySnapper*, Plugins::Report& report);
 
 
     void
     help_delete_config();
 
     void
-    command_delete_config(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers, ProxySnapper*);
+    command_delete_config(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers,
+                         ProxySnapper*, Plugins::Report& report);
 
 
     void
     help_get_config();
 
     void
-    command_get_config(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers, ProxySnapper*);
+    command_get_config(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers,
+                      ProxySnapper*, Plugins::Report& report);
 
 
     void
     help_set_config();
 
     void
-    command_set_config(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers, ProxySnapper*);
+    command_set_config(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers,
+                      ProxySnapper*, Plugins::Report& report);
 
 
     void
     help_list();
 
     void
-    command_list(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers, ProxySnapper*);
+    command_list(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers,
+                ProxySnapper*, Plugins::Report& report);
 
 
     void
     help_create();
 
     void
-    command_create(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers, ProxySnapper* snapper);
+    command_create(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers,
+                  ProxySnapper* snapper, Plugins::Report& report);
 
 
     void
     help_modify();
 
     void
-    command_modify(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers, ProxySnapper* snapper);
+    command_modify(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers,
+                  ProxySnapper* snapper, Plugins::Report& report);
 
 
     void
     help_delete();
 
     void
-    command_delete(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers, ProxySnapper* snapper);
+    command_delete(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers,
+                  ProxySnapper* snapper, Plugins::Report& report);
 
 
     void
     help_mount();
 
     void
-    command_mount(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers, ProxySnapper* snapper);
+    command_mount(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers,
+                 ProxySnapper* snapper, Plugins::Report& report);
 
 
     void
     help_umount();
 
     void
-    command_umount(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers, ProxySnapper* snapper);
+    command_umount(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers,
+                  ProxySnapper* snapper, Plugins::Report& report);
 
 
     void
     help_status();
 
     void
-    command_status(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers, ProxySnapper* snapper);
+    command_status(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers,
+                  ProxySnapper* snapper, Plugins::Report& report);
 
 
     void
     help_diff();
 
     void
-    command_diff(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers, ProxySnapper* snapper);
+    command_diff(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers,
+                ProxySnapper* snapper, Plugins::Report& report);
 
 
 #ifdef ENABLE_XATTRS
@@ -127,7 +140,8 @@ namespace snapper
     help_xadiff();
 
     void
-    command_xadiff(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers, ProxySnapper* snapper);
+    command_xadiff(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers,
+                  ProxySnapper* snapper, Plugins::Report& report);
 
 #endif
 
@@ -136,7 +150,8 @@ namespace snapper
     help_undochange();
 
     void
-    command_undochange(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers, ProxySnapper* snapper);
+    command_undochange(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers,
+                      ProxySnapper* snapper, Plugins::Report& report);
 
 
 #ifdef ENABLE_ROLLBACK
@@ -145,7 +160,8 @@ namespace snapper
     help_rollback();
 
     void
-    command_rollback(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers, ProxySnapper* snapper);
+    command_rollback(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers,
+                    ProxySnapper* snapper, Plugins::Report& report);
 
 #endif
 
@@ -154,7 +170,8 @@ namespace snapper
     help_setup_quota();
 
     void
-    command_setup_quota(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers, ProxySnapper* snapper);
+    command_setup_quota(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers,
+                       ProxySnapper* snapper, Plugins::Report& report);
 
 
     struct CleanupException : public Exception
@@ -167,13 +184,15 @@ namespace snapper
     help_cleanup();
 
     void
-    command_cleanup(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers, ProxySnapper* snapper);
+    command_cleanup(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers,
+                   ProxySnapper* snapper, Plugins::Report& report);
 
 
     void
     help_debug();
 
     void
-    command_debug(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers, ProxySnapper* snapper);
+    command_debug(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers,
+                 ProxySnapper* snapper, Plugins::Report& report);
 
 }
index 143d04eada288183f2ad34859f41f3c68674994d..54fd6fd3859994da6cb0f5c4a283d3c14499fa6c 100644 (file)
@@ -690,6 +690,22 @@ command_sync(DBus::Connection& conn, const string& config_name)
 }
 
 
+vector<XReport>
+command_get_plugins_report(DBus::Connection& conn)
+{
+    DBus::MessageMethodCall call(SERVICE, OBJECT, INTERFACE, "GetPluginsReport");
+
+    DBus::Message reply = conn.send_with_reply_and_block(call);
+
+    vector<XReport> xreport;
+
+    DBus::Unmarshaller unmarshaller(reply);
+    unmarshaller >> xreport;
+
+    return xreport;
+}
+
+
 vector<string>
 command_debug(DBus::Connection& conn)
 {
index f4552f023d021e290491f4fb5b188f4c2dcf0cdc..6550b0b56e46bc5d287419760718d78100082b59 100644 (file)
@@ -152,5 +152,8 @@ command_query_free_space(DBus::Connection& conn, const string& config_name);
 void
 command_sync(DBus::Connection& conn, const string& config_name);
 
+vector<XReport>
+command_get_plugins_report(DBus::Connection& conn);
+
 vector<string>
 command_debug(DBus::Connection& conn);
index 4869c8e1fb89e40ff79cd58656f8464f419616cb..33b21e0ea7c4d91f9c842e3a37e57d60ffc165c6 100644 (file)
@@ -35,7 +35,7 @@
 #include <snapper/SnapperDefines.h>
 #include <snapper/Btrfs.h>
 #include <snapper/FileUtils.h>
-#include <snapper/Hooks.h>
+#include <snapper/PluginsImpl.h>
 #include "snapper/Log.h"
 
 #include "utils/GetOpts.h"
@@ -47,6 +47,9 @@ using namespace snapper;
 using namespace std;
 
 
+Plugins::Report report;
+
+
 void
 step1(const string& device, const string& description, const string& cleanup,
       const map<string, string>& userdata)
@@ -105,7 +108,7 @@ step1(const string& device, const string& description, const string& cleanup,
     scd.cleanup = cleanup;
     scd.userdata = userdata;
 
-    Snapshots::iterator snapshot = snapper.createSingleSnapshot(scd);
+    Snapshots::iterator snapshot = snapper.createSingleSnapshot(scd, report);
 
     cout << "again copying config-file" << endl;
 
@@ -120,7 +123,7 @@ step1(const string& device, const string& description, const string& cleanup,
 
     cout << "setting default subvolume" << endl;
 
-    snapshot->setDefault();
+    snapshot->setDefault(report);
 
     cout << "done" << endl;
 }
@@ -189,8 +192,8 @@ step4()
 
     // preconditions (maybe incomplete):
     // snapper rpms installed in chroot
-    // all programs for snapper hooks installed in chroot
-    // all preconditions for hooks satisfied
+    // all programs for snapper plugins installed in chroot
+    // all preconditions for plugins satisfied
 
     cout << "step 4" << endl;
 
@@ -214,7 +217,7 @@ step4()
 
     cout << "running external programs" << endl;
 
-    Hooks::create_config(Hooks::Stage::POST_ACTION, "/", &btrfs);
+    Plugins::create_config(Plugins::Stage::POST_ACTION, "/", &btrfs, report);
 
     cout << "done" << endl;
 }
@@ -242,13 +245,13 @@ step5(const string& root_prefix, const string& snapshot_type, unsigned int pre_n
     try
     {
         if (snapshot_type == "single") {
-            snapshot = snapper.createSingleSnapshot(scd);
+            snapshot = snapper.createSingleSnapshot(scd, report);
         } else if (snapshot_type == "pre") {
-            snapshot = snapper.createPreSnapshot(scd);
+            snapshot = snapper.createPreSnapshot(scd, report);
         } else if (snapshot_type == "post") {
             Snapshots snapshots = snapper.getSnapshots();
             Snapshots::iterator pre = snapshots.find(pre_num);
-            snapshot = snapper.createPostSnapshot(pre, scd);
+            snapshot = snapper.createPostSnapshot(pre, scd, report);
         }
     }
     catch (const runtime_error& e)
index 6341affbe3dcee4ee0898618904fe08d39f451af..eba552c6d7113af66827a53c3cc543052835baa0 100644 (file)
@@ -215,7 +215,7 @@ ProxySnapperDbus::queryFreeSpaceData() const
 
 
 ProxySnapshots::const_iterator
-ProxySnapperDbus::createSingleSnapshot(const SCD& scd)
+ProxySnapperDbus::createSingleSnapshot(const SCD& scd, Plugins::Report& report)
 {
     unsigned int num = command_create_single_snapshot(conn(), config_name, scd.description,
                                                      scd.cleanup, scd.userdata);
@@ -227,7 +227,7 @@ ProxySnapperDbus::createSingleSnapshot(const SCD& scd)
 
 
 ProxySnapshots::const_iterator
-ProxySnapperDbus::createSingleSnapshot(ProxySnapshots::const_iterator parent, const SCD& scd)
+ProxySnapperDbus::createSingleSnapshot(ProxySnapshots::const_iterator parent, const SCD& scd, Plugins::Report& report)
 {
     unsigned int num = command_create_single_snapshot_v2(conn(), config_name, parent->getNum(),
                                                         scd.read_only, scd.description, scd.cleanup,
@@ -240,7 +240,7 @@ ProxySnapperDbus::createSingleSnapshot(ProxySnapshots::const_iterator parent, co
 
 
 ProxySnapshots::const_iterator
-ProxySnapperDbus::createSingleSnapshotOfDefault(const SCD& scd)
+ProxySnapperDbus::createSingleSnapshotOfDefault(const SCD& scd, Plugins::Report& report)
 {
     unsigned int num = command_create_single_snapshot_of_default(conn(), config_name, scd.read_only,
                                                                 scd.description, scd.cleanup,
@@ -253,7 +253,7 @@ ProxySnapperDbus::createSingleSnapshotOfDefault(const SCD& scd)
 
 
 ProxySnapshots::const_iterator
-ProxySnapperDbus::createPreSnapshot(const SCD& scd)
+ProxySnapperDbus::createPreSnapshot(const SCD& scd, Plugins::Report& report)
 {
     unsigned int num = command_create_pre_snapshot(conn(), config_name, scd.description,
                                                   scd.cleanup, scd.userdata);
@@ -265,7 +265,7 @@ ProxySnapperDbus::createPreSnapshot(const SCD& scd)
 
 
 ProxySnapshots::const_iterator
-ProxySnapperDbus::createPostSnapshot(ProxySnapshots::const_iterator pre, const SCD& scd)
+ProxySnapperDbus::createPostSnapshot(ProxySnapshots::const_iterator pre, const SCD& scd, Plugins::Report& report)
 {
     unsigned int num = command_create_post_snapshot(conn(), config_name, pre->getNum(),
                                                    scd.description, scd.cleanup, scd.userdata);
@@ -277,14 +277,14 @@ ProxySnapperDbus::createPostSnapshot(ProxySnapshots::const_iterator pre, const S
 
 
 void
-ProxySnapperDbus::modifySnapshot(ProxySnapshots::iterator snapshot, const SMD& smd)
+ProxySnapperDbus::modifySnapshot(ProxySnapshots::iterator snapshot, const SMD& smd, Plugins::Report& report)
 {
     command_set_snapshot(conn(), config_name, snapshot->getNum(), smd);
 }
 
 
 void
-ProxySnapperDbus::deleteSnapshots(vector<ProxySnapshots::iterator> snapshots, bool verbose)
+ProxySnapperDbus::deleteSnapshots(vector<ProxySnapshots::iterator> snapshots, bool verbose, Plugins::Report& report)
 {
     vector<unsigned int> nums;
     for (const ProxySnapshots::iterator& proxy_snapshot : snapshots)
@@ -321,14 +321,14 @@ ProxySnapperDbus::conn() const
 
 void
 ProxySnappersDbus::createConfig(const string& config_name, const string& subvolume,
-                               const string& fstype, const string& template_name)
+                               const string& fstype, const string& template_name, Plugins::Report& report)
 {
     command_create_config(conn, config_name, subvolume, fstype, template_name);
 }
 
 
 void
-ProxySnappersDbus::deleteConfig(const string& config_name)
+ProxySnappersDbus::deleteConfig(const string& config_name, Plugins::Report& report)
 {
     command_delete_config(conn, config_name);
 }
@@ -362,6 +362,31 @@ ProxySnappersDbus::getConfigs() const
 }
 
 
+Plugins::Report
+ProxySnappersDbus::get_plugins_report() const
+{
+    Plugins::Report ret;
+
+    try
+    {
+       for (const XReport& xreport : command_get_plugins_report(conn))
+           ret.entries.emplace_back(xreport.name, xreport.args, xreport.exit_status);
+    }
+    catch (const DBus::ErrorException& e)
+    {
+       SN_CAUGHT(e);
+
+       // If snapper was just updated and the old snapperd is still
+       // running it might not know the GetPluginsReport method.
+
+       if (strcmp(e.name(), "error.unknown_method") != 0)
+           SN_RETHROW(e);
+    }
+
+    return ret;
+}
+
+
 vector<string>
 ProxySnappersDbus::debug() const
 {
index 1ac929b39f05f9f42602547dee4c0fa110519183..f7f06adc0716dd3e09e6ec5c916cd29b5ced1366 100644 (file)
@@ -125,17 +125,17 @@ public:
     virtual ProxyConfig getConfig() const override;
     virtual void setConfig(const ProxyConfig& proxy_config) override;
 
-    virtual ProxySnapshots::const_iterator createSingleSnapshot(const SCD& scd) override;
+    virtual ProxySnapshots::const_iterator createSingleSnapshot(const SCD& scd, Plugins::Report& report) override;
     virtual ProxySnapshots::const_iterator createSingleSnapshot(ProxySnapshots::const_iterator parent,
-                                                               const SCD& scd) override;
-    virtual ProxySnapshots::const_iterator createSingleSnapshotOfDefault(const SCD& scd) override;
-    virtual ProxySnapshots::const_iterator createPreSnapshot(const SCD& scd) override;
+                                                               const SCD& scd, Plugins::Report& report) override;
+    virtual ProxySnapshots::const_iterator createSingleSnapshotOfDefault(const SCD& scd, Plugins::Report& report) override;
+    virtual ProxySnapshots::const_iterator createPreSnapshot(const SCD& scd, Plugins::Report& report) override;
     virtual ProxySnapshots::const_iterator createPostSnapshot(ProxySnapshots::const_iterator pre,
-                                                             const SCD& scd) override;
+                                                             const SCD& scd, Plugins::Report& report) override;
 
-    virtual void modifySnapshot(ProxySnapshots::iterator snapshot, const SMD& smd) override;
+    virtual void modifySnapshot(ProxySnapshots::iterator snapshot, const SMD& smd, Plugins::Report& report) override;
 
-    virtual void deleteSnapshots(vector<ProxySnapshots::iterator> snapshots, bool verbose) override;
+    virtual void deleteSnapshots(vector<ProxySnapshots::iterator> snapshots, bool verbose, Plugins::Report& report) override;
 
     virtual ProxyComparison createComparison(const ProxySnapshot& lhs, const ProxySnapshot& rhs,
                                             bool mount) override;
@@ -180,14 +180,16 @@ public:
     {}
 
     virtual void createConfig(const string& config_name, const string& subvolume,
-                             const string& fstype, const string& template_name) override;
+                             const string& fstype, const string& template_name, Plugins::Report& report) override;
 
-    virtual void deleteConfig(const string& config_name) override;
+    virtual void deleteConfig(const string& config_name, Plugins::Report& report) override;
 
     virtual ProxySnapper* getSnapper(const string& config_name) override;
 
     virtual map<string, ProxyConfig> getConfigs() const override;
 
+    virtual Plugins::Report get_plugins_report() const override;
+
     virtual vector<string> debug() const override;
 
     mutable DBus::Connection conn;
index b7981e13ceef58f7581cb6073c61849315c47c7c..cb8f973f33385ab5e245c2bed4ce8fe14895ae04 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) [2016-2020] SUSE LLC
+ * Copyright (c) [2016-2023] SUSE LLC
  *
  * All Rights Reserved.
  *
@@ -85,62 +85,62 @@ ProxySnapperLib::setConfig(const ProxyConfig& proxy_config)
 
 
 ProxySnapshots::const_iterator
-ProxySnapperLib::createSingleSnapshot(const SCD& scd)
+ProxySnapperLib::createSingleSnapshot(const SCD& scd, Plugins::Report& report)
 {
-    proxy_snapshots.emplace_back(new ProxySnapshotLib(snapper->createSingleSnapshot(scd)));
+    proxy_snapshots.emplace_back(new ProxySnapshotLib(snapper->createSingleSnapshot(scd, report)));
 
     return --proxy_snapshots.end();
 }
 
 
 ProxySnapshots::const_iterator
-ProxySnapperLib::createSingleSnapshot(ProxySnapshots::const_iterator parent, const SCD& scd)
+ProxySnapperLib::createSingleSnapshot(ProxySnapshots::const_iterator parent, const SCD& scd, Plugins::Report& report)
 {
-    proxy_snapshots.emplace_back(new ProxySnapshotLib(snapper->createSingleSnapshot(to_lib(*parent).it, scd)));
+    proxy_snapshots.emplace_back(new ProxySnapshotLib(snapper->createSingleSnapshot(to_lib(*parent).it, scd, report)));
 
     return --proxy_snapshots.end();
 }
 
 
 ProxySnapshots::const_iterator
-ProxySnapperLib::createSingleSnapshotOfDefault(const SCD& scd)
+ProxySnapperLib::createSingleSnapshotOfDefault(const SCD& scd, Plugins::Report& report)
 {
-    proxy_snapshots.emplace_back(new ProxySnapshotLib(snapper->createSingleSnapshotOfDefault(scd)));
+    proxy_snapshots.emplace_back(new ProxySnapshotLib(snapper->createSingleSnapshotOfDefault(scd, report)));
 
     return --proxy_snapshots.end();
 }
 
 
 ProxySnapshots::const_iterator
-ProxySnapperLib::createPreSnapshot(const SCD& scd)
+ProxySnapperLib::createPreSnapshot(const SCD& scd, Plugins::Report& report)
 {
-    proxy_snapshots.emplace_back(new ProxySnapshotLib(snapper->createPreSnapshot(scd)));
+    proxy_snapshots.emplace_back(new ProxySnapshotLib(snapper->createPreSnapshot(scd, report)));
 
     return --proxy_snapshots.end();
 }
 
 
 ProxySnapshots::const_iterator
-ProxySnapperLib::createPostSnapshot(ProxySnapshots::const_iterator pre, const SCD& scd)
+ProxySnapperLib::createPostSnapshot(ProxySnapshots::const_iterator pre, const SCD& scd, Plugins::Report& report)
 {
-    proxy_snapshots.emplace_back(new ProxySnapshotLib(snapper->createPostSnapshot(to_lib(*pre).it, scd)));
+    proxy_snapshots.emplace_back(new ProxySnapshotLib(snapper->createPostSnapshot(to_lib(*pre).it, scd, report)));
 
     return --proxy_snapshots.end();
 }
 
 
 void
-ProxySnapperLib::modifySnapshot(ProxySnapshots::iterator snapshot, const SMD& smd)
+ProxySnapperLib::modifySnapshot(ProxySnapshots::iterator snapshot, const SMD& smd, Plugins::Report& report)
 {
-    snapper->modifySnapshot(to_lib(*snapshot).it, smd);
+    snapper->modifySnapshot(to_lib(*snapshot).it, smd, report);
 }
 
 
 void
-ProxySnapperLib::deleteSnapshots(vector<ProxySnapshots::iterator> snapshots, bool verbose)
+ProxySnapperLib::deleteSnapshots(vector<ProxySnapshots::iterator> snapshots, bool verbose, Plugins::Report& report)
 {
     for (ProxySnapshots::iterator& snapshot : snapshots)
-       snapper->deleteSnapshot(to_lib(*snapshot).it);
+       snapper->deleteSnapshot(to_lib(*snapshot).it, report);
 
     ProxySnapshots& proxy_snapshots = getSnapshots();
     for (ProxySnapshots::iterator& proxy_snapshot : snapshots)
@@ -166,16 +166,16 @@ ProxySnapshotsLib::ProxySnapshotsLib(ProxySnapperLib* backref)
 
 void
 ProxySnappersLib::createConfig(const string& config_name, const string& subvolume,
-                              const string& fstype, const string& template_name)
+                              const string& fstype, const string& template_name, Plugins::Report& report)
 {
-    Snapper::createConfig(config_name, target_root, subvolume, fstype, template_name);
+    Snapper::createConfig(config_name, target_root, subvolume, fstype, template_name, report);
 }
 
 
 void
-ProxySnappersLib::deleteConfig(const string& config_name)
+ProxySnappersLib::deleteConfig(const string& config_name, Plugins::Report& report)
 {
-    Snapper::deleteConfig(config_name, target_root);
+    Snapper::deleteConfig(config_name, target_root, report);
 }
 
 
index e525f6c76a866e9b35e20bdff7e6b8e45e6f2732..89357f0da138390f068d2504560618cf7067cf5e 100644 (file)
@@ -108,17 +108,17 @@ public:
     virtual ProxyConfig getConfig() const override;
     virtual void setConfig(const ProxyConfig& proxy_config) override;
 
-    virtual ProxySnapshots::const_iterator createSingleSnapshot(const SCD& scd) override;
+    virtual ProxySnapshots::const_iterator createSingleSnapshot(const SCD& scd, Plugins::Report& report) override;
     virtual ProxySnapshots::const_iterator createSingleSnapshot(ProxySnapshots::const_iterator parent,
-                                                               const SCD& scd) override;
-    virtual ProxySnapshots::const_iterator createSingleSnapshotOfDefault(const SCD& scd) override;
-    virtual ProxySnapshots::const_iterator createPreSnapshot(const SCD& scd) override;
+                                                               const SCD& scd, Plugins::Report& report) override;
+    virtual ProxySnapshots::const_iterator createSingleSnapshotOfDefault(const SCD& scd, Plugins::Report& report) override;
+    virtual ProxySnapshots::const_iterator createPreSnapshot(const SCD& scd, Plugins::Report& report) override;
     virtual ProxySnapshots::const_iterator createPostSnapshot(ProxySnapshots::const_iterator pre,
-                                                             const SCD& scd) override;
+                                                             const SCD& scd, Plugins::Report& report) override;
 
-    virtual void modifySnapshot(ProxySnapshots::iterator snapshot, const SMD& smd) override;
+    virtual void modifySnapshot(ProxySnapshots::iterator snapshot, const SMD& smd, Plugins::Report& report) override;
 
-    virtual void deleteSnapshots(vector<ProxySnapshots::iterator> snapshots, bool verbose) override;
+    virtual void deleteSnapshots(vector<ProxySnapshots::iterator> snapshots, bool verbose, Plugins::Report& report) override;
 
     virtual ProxyComparison createComparison(const ProxySnapshot& lhs, const ProxySnapshot& rhs,
                                             bool mount) override;
@@ -156,15 +156,17 @@ public:
        : target_root(target_root)
     {}
 
-    virtual void createConfig(const string& config_name, const string& subvolume,
-                             const string& fstype, const string& template_name) override;
+    virtual void createConfig(const string& config_name, const string& subvolume, const string& fstype,
+                             const string& template_name, Plugins::Report& report) override;
 
-    virtual void deleteConfig(const string& config_name) override;
+    virtual void deleteConfig(const string& config_name, Plugins::Report& report) override;
 
     virtual ProxySnapper* getSnapper(const string& config_name) override;
 
     virtual map<string, ProxyConfig> getConfigs() const override;
 
+    virtual Plugins::Report get_plugins_report() const override { return {}; }
+
     virtual vector<string> debug() const override { return Snapper::debug(); }
 
 private:
index 751a9045ed9fce12f0f835325840f2b0da2f0cc5..56a46a6fa8f6f53f4e6887d9e62d33188c5ea27a 100644 (file)
@@ -223,17 +223,17 @@ public:
     virtual ProxyConfig getConfig() const = 0;
     virtual void setConfig(const ProxyConfig& proxy_config) = 0;
 
-    virtual ProxySnapshots::const_iterator createSingleSnapshot(const SCD& scd) = 0;
+    virtual ProxySnapshots::const_iterator createSingleSnapshot(const SCD& scd, Plugins::Report& report) = 0;
     virtual ProxySnapshots::const_iterator createSingleSnapshot(ProxySnapshots::const_iterator parent,
-                                                               const SCD& scd) = 0;
-    virtual ProxySnapshots::const_iterator createSingleSnapshotOfDefault(const SCD& scd) = 0;
-    virtual ProxySnapshots::const_iterator createPreSnapshot(const SCD& scd) = 0;
+                                                               const SCD& scd, Plugins::Report& report) = 0;
+    virtual ProxySnapshots::const_iterator createSingleSnapshotOfDefault(const SCD& scd, Plugins::Report& report) = 0;
+    virtual ProxySnapshots::const_iterator createPreSnapshot(const SCD& scd, Plugins::Report& report) = 0;
     virtual ProxySnapshots::const_iterator createPostSnapshot(ProxySnapshots::const_iterator pre,
-                                                             const SCD& scd) = 0;
+                                                             const SCD& scd, Plugins::Report& report) = 0;
 
-    virtual void modifySnapshot(ProxySnapshots::iterator snapshot, const SMD& smd) = 0;
+    virtual void modifySnapshot(ProxySnapshots::iterator snapshot, const SMD& smd, Plugins::Report& report) = 0;
 
-    virtual void deleteSnapshots(vector<ProxySnapshots::iterator> snapshots, bool verbose) = 0;
+    virtual void deleteSnapshots(vector<ProxySnapshots::iterator> snapshots, bool verbose, Plugins::Report& report) = 0;
 
     virtual ProxyComparison createComparison(const ProxySnapshot& lhs, const ProxySnapshot& rhs,
                                             bool mount) = 0;
@@ -265,11 +265,11 @@ public:
     static ProxySnappers createLib(const string& target_root);
 
     void createConfig(const string& config_name, const string& subvolume, const string& fstype,
-                     const string& template_name)
-       { return impl->createConfig(config_name, subvolume, fstype, template_name); }
+                     const string& template_name, Plugins::Report& report)
+       { return impl->createConfig(config_name, subvolume, fstype, template_name, report); }
 
-    void deleteConfig(const string& config_name)
-       { return impl->deleteConfig(config_name); }
+    void deleteConfig(const string& config_name, Plugins::Report& report)
+       { return impl->deleteConfig(config_name, report); }
 
     ProxySnapper* getSnapper(const string& config_name)
        { return impl->getSnapper(config_name); }
@@ -277,6 +277,15 @@ public:
     map<string, ProxyConfig> getConfigs() const
        { return impl->getConfigs(); }
 
+    /**
+     * This function needs a few works: The Snapper class does not have a Plugin::Report
+     * object. The individual functions of the Snapper class have. For for proxy-lib this
+     * call is a no-op. For proxy-dbus the server is queried which has a per client
+     * Plugin::Report object.
+     */
+    Plugins::Report get_plugins_report() const
+       { return impl->get_plugins_report(); }
+
     vector<string> debug() const
        { return impl->debug(); }
 
@@ -290,14 +299,16 @@ public:
        virtual ~Impl() {}
 
        virtual void createConfig(const string& config_name, const string& subvolume,
-                                 const string& fstype, const string& template_name) = 0;
+                                 const string& fstype, const string& template_name, Plugins::Report& report) = 0;
 
-       virtual void deleteConfig(const string& config_name) = 0;
+       virtual void deleteConfig(const string& config_name, Plugins::Report& report) = 0;
 
        virtual ProxySnapper* getSnapper(const string& config_name) = 0;
 
        virtual map<string, ProxyConfig> getConfigs() const = 0;
 
+       virtual Plugins::Report get_plugins_report() const = 0;
+
        virtual vector<string> debug() const = 0;
 
     };
index 0f8e532a1574fd4063c1c664aff6e20529c0135c..72e534d319987f152a2f16ecbeda6ef166b9ae95 100644 (file)
@@ -26,6 +26,7 @@
 #include <cstdlib>
 #include <cstring>
 #include <iostream>
+#include <boost/algorithm/string.hpp>
 
 #include <snapper/Snapper.h>
 #include <snapper/SnapperTmpl.h>
@@ -49,7 +50,7 @@ using namespace std;
 struct Cmd
 {
     typedef void (*cmd_func_t)(GlobalOptions& global_options, GetOpts& get_opts, ProxySnappers* snappers,
-                              ProxySnapper* snapper);
+                              ProxySnapper* snapper, Plugins::Report& report);
 
     typedef void (*help_func_t)();
 
@@ -165,6 +166,8 @@ main(int argc, char** argv)
        Cmd("debug", command_debug, help_debug, false)
     };
 
+    int exit_status = EXIT_SUCCESS;
+
     try
     {
        GetOpts get_opts(argc, argv);
@@ -221,10 +224,42 @@ main(int argc, char** argv)
 
            y2mil("executing command");
 
+           Plugins::Report client_report;
+
            if (cmd->needs_snapper)
-               (*cmd->cmd_func)(global_options, get_opts, &snappers, snappers.getSnapper(global_options.config()));
+               (*cmd->cmd_func)(global_options, get_opts, &snappers, snappers.getSnapper(global_options.config()),
+                                client_report);
            else
-               (*cmd->cmd_func)(global_options, get_opts, &snappers, nullptr);
+               (*cmd->cmd_func)(global_options, get_opts, &snappers, nullptr, client_report);
+
+           Plugins::Report server_report = snappers.get_plugins_report();
+
+           // Plugins can be started from the client or server. So we have to check both
+           // reports.
+
+           for (const Plugins::Report::Entry& entry : client_report.entries)
+           {
+               y2deb("client: " << entry.name << " " << boost::join(entry.args, " ") << " exit-status: " <<
+                     entry.exit_status);
+
+               if (entry.exit_status != 0)
+               {
+                   cerr << sformat(_("Client-side plugin '%s' failed."), entry.name.c_str()) << '\n';
+                   exit_status = EXIT_FAILURE;
+               }
+           }
+
+           for (const Plugins::Report::Entry& entry : server_report.entries)
+           {
+               y2deb("server: " << entry.name << " " << boost::join(entry.args, " ") << " exit-status: " <<
+                     entry.exit_status);
+
+               if (entry.exit_status != 0)
+               {
+                   cerr << sformat(_("Server-side plugin '%s' failed."), entry.name.c_str()) << '\n';
+                   exit_status = EXIT_FAILURE;
+               }
+           }
        }
        catch (const DBus::ErrorException& e)
        {
@@ -352,5 +387,6 @@ main(int argc, char** argv)
        exit(EXIT_FAILURE);
     }
 
-    exit(EXIT_SUCCESS);
+    y2deb("exit-status: " << exit_status);
+    exit(exit_status);
 }
index 9589e5d876357b6855a3902326fa753bb4a07c07..dd3c81c17258a035be43c4a028c8fbcd1845aa63 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) [2014-2015] Novell, Inc.
- * Copyright (c) [2016-2020] SUSE LLC
+ * Copyright (c) [2016-2023] SUSE LLC
  *
  * All Rights Reserved.
  *
@@ -23,7 +23,7 @@
 
 #include "config.h"
 
-#include <stdlib.h>
+#include <cstdlib>
 #include <iostream>
 
 #include "utils/text.h"
@@ -43,6 +43,9 @@ using namespace std;
 // snapper-<name>.service'.
 
 
+Plugins::Report report;
+
+
 bool
 call_with_error_check(std::function<void()> func)
 {
@@ -93,7 +96,7 @@ timeline(ProxySnappers* snappers, const map<string, string>& userdata)
        scd.cleanup = "timeline";
        scd.userdata = userdata;
 
-       if (!call_with_error_check([snapper, scd](){ snapper->createSingleSnapshot(scd); }))
+       if (!call_with_error_check([snapper, scd](){ snapper->createSingleSnapshot(scd, report); }))
        {
            cerr << "timeline for '" << value.first << "' failed." << endl;
            ok = false;
@@ -136,7 +139,7 @@ cleanup(ProxySnappers* snappers)
        {
            cout << "running number cleanup for '" << value.first << "'." << endl;
 
-           if (!call_with_error_check([snapper](){ do_cleanup_number(snapper, false); }))
+           if (!call_with_error_check([snapper](){ do_cleanup_number(snapper, false, report); }))
            {
                cerr << "number cleanup for '" << value.first << "' failed." << endl;
                ok = false;
@@ -147,7 +150,7 @@ cleanup(ProxySnappers* snappers)
        {
            cout << "running timeline cleanup for '" << value.first << "'." << endl;
 
-           if (!call_with_error_check([snapper](){ do_cleanup_timeline(snapper, false); }))
+           if (!call_with_error_check([snapper](){ do_cleanup_timeline(snapper, false, report); }))
            {
                cerr << "timeline cleanup for '" << value.first << "' failed." << endl;
                ok = false;
@@ -158,7 +161,7 @@ cleanup(ProxySnappers* snappers)
        {
            cout << "running empty-pre-post cleanup for '" << value.first << "'." << endl;
 
-           if (!call_with_error_check([snapper](){ do_cleanup_empty_pre_post(snapper, false); }))
+           if (!call_with_error_check([snapper](){ do_cleanup_empty_pre_post(snapper, false, report); }))
            {
                cerr << "empty-pre-post cleanup for " << value.first << " failed." << endl;
                ok = false;
@@ -228,5 +231,14 @@ main(int argc, char** argv)
        ok = false;
     }
 
+    for (const Plugins::Report::Entry& entry : report.entries)
+    {
+       if (entry.exit_status != 0)
+       {
+           cerr << "server-side plugin '" << entry.name << "' failed\n";
+           ok = false;
+       }
+    }
+
     exit(ok ? EXIT_SUCCESS : EXIT_FAILURE);
 }
index e1c00f109b96374640413c52bacfa91a7094157f..056d632c86ea4fe013f1c8e81ee269bd125c072d 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2012 Novell, Inc.
- * Copyright (c) [2016,2018] SUSE LLC
+ * Copyright (c) [2016-2023] SUSE LLC
  *
  * All Rights Reserved.
  *
@@ -32,6 +32,7 @@ namespace DBus
     const char* TypeInfo<XConfigInfo>::signature = "(ssa{ss})";
     const char* TypeInfo<XSnapshot>::signature = "(uquxussa{ss})";
     const char* TypeInfo<XFile>::signature = "(su)";
+    const char* TypeInfo<XReport>::signature = "(sasi)";
 
 
     Unmarshaller&
@@ -59,7 +60,7 @@ namespace DBus
     {
        unmarshaller.open_recurse();
        unmarshaller >> data.num >> data.type >> data.pre_num >> data.date >> data.uid >> data.description
-            >> data.cleanup >> data.userdata;
+                    >> data.cleanup >> data.userdata;
        unmarshaller.close_recurse();
        return unmarshaller;
     }
@@ -102,4 +103,14 @@ namespace DBus
        return marshaller;
     }
 
+
+    Unmarshaller&
+    operator>>(Unmarshaller& unmarshaller, XReport& data)
+    {
+       unmarshaller.open_recurse();
+       unmarshaller >> data.name >> data.args >> data.exit_status;
+       unmarshaller.close_recurse();
+       return unmarshaller;
+    }
+
 }
index fa808895750230bc6d3c9cd6948cc541589bd6ae..585f57b281b85f7da30d358354ea38ba5d75cbc6 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2012 Novell, Inc.
- * Copyright (c) [2016,2018] SUSE LLC
+ * Copyright (c) [2016-2023] SUSE LLC
  *
  * All Rights Reserved.
  *
@@ -95,12 +95,21 @@ struct XFile
 };
 
 
+struct XReport
+{
+    string name;
+    vector<string> args;
+    int exit_status;
+};
+
+
 namespace DBus
 {
 
     template <> struct TypeInfo<XSnapshot> { static const char* signature; };
     template <> struct TypeInfo<XConfigInfo> { static const char* signature; };
     template <> struct TypeInfo<XFile> { static const char* signature; };
+    template <> struct TypeInfo<XReport> { static const char* signature; };
 
     Unmarshaller& operator>>(Unmarshaller& unmarshaller, XConfigInfo& data);
 
@@ -115,4 +124,6 @@ namespace DBus
 
     Unmarshaller& operator>>(Unmarshaller& unmarshaller, FreeSpaceData& data);
 
+    Unmarshaller& operator>>(Unmarshaller& unmarshaller, XReport& data);
+
 }
index b27fcae811b4b029bfdbfaee47f328f72dd4d4d6..71a5e076d50faaed8e8a0283834d4bb309af3ac2 100644 (file)
@@ -25,7 +25,7 @@ CapabilityBoundingSet=CAP_FOWNER is needed if for home directories.
 CapabilityBoundingSet=CAP_DAC_OVERRIDE is needed for directory
 comparison (in some cases) - but not if using btrfs send/receive.
 
-Finally do not forget the hooks.
+Finally do not forget the plugins.
 
 Have a lot of fun...
 
index 0ac3ea2188a747b7a34e396af2951f803b1be7a9..acfbc4053f7f58776be430421075ca6d1d13b9ef 100644 (file)
@@ -2,13 +2,13 @@
 <refentry id='snapper8' xmlns:xlink="http://www.w3.org/1999/xlink">
 
   <refentryinfo>
-    <date>2023-04-19</date>
+    <date>2023-11-28</date>
   </refentryinfo>
 
   <refmeta>
     <refentrytitle>snapper</refentrytitle>
     <manvolnum>8</manvolnum>
-    <refmiscinfo class='date'>2023-04-19</refmiscinfo>
+    <refmiscinfo class='date'>2023-11-28</refmiscinfo>
     <refmiscinfo class='version'>@VERSION@</refmiscinfo>
     <refmiscinfo class='manual'>Filesystem Snapshot Management</refmiscinfo>
   </refmeta>
     </variablelist>
   </refsect1>
 
+  <refsect1 id='exit_status'>
+    <title>EXIT STATUS</title>
+    <para>Normally the exit status is 0. If an error occured the exit status is
+    1. It is also an error if the exit status of a plugin is not 0.</para>
+  </refsect1>
+
   <refsect1 id='notes'>
     <title>NOTES</title>
     <para>There is no mechanism to ensure consistency of the files while a
index 4daa59be2f9ed0a963796c2acea095a84d20b89d..d405645b0c01ccf06a64e058dcc3034edb8e4671 100644 (file)
@@ -1,3 +1,8 @@
+-------------------------------------------------------------------
+Tue Nov 28 08:22:41 CET 2023 - aschnell@suse.com
+
+- report plugin failures (gh#openSUSE/snapper#846)
+
 -------------------------------------------------------------------
 Wed Nov 22 16:15:37 CET 2023 - aschnell@suse.com