Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package libdnf-plugin-txnupd for openSUSE:Factory checked in at 2021-03-06 21:18:40 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libdnf-plugin-txnupd (Old) and /work/SRC/openSUSE:Factory/.libdnf-plugin-txnupd.new.2378 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libdnf-plugin-txnupd" Sat Mar 6 21:18:40 2021 rev:3 rq:877295 version:0.1.2 Changes: -------- --- /work/SRC/openSUSE:Factory/libdnf-plugin-txnupd/libdnf-plugin-txnupd.changes 2021-02-25 18:29:47.686272354 +0100 +++ /work/SRC/openSUSE:Factory/.libdnf-plugin-txnupd.new.2378/libdnf-plugin-txnupd.changes 2021-03-06 21:18:40.689238909 +0100 @@ -1,0 +2,17 @@ +Fri Mar 5 19:50:03 UTC 2021 - Neal Gompa <ngomp...@gmail.com> + +- Update to 0.1.2 + + Add handling for externally invoked transactional updates + +------------------------------------------------------------------- +Thu Mar 4 13:44:04 UTC 2021 - Neal Gompa <ngomp...@gmail.com> + +- Update to 0.1.1 + + Disable protection of the running kernel in transactions + +------------------------------------------------------------------- +Tue Mar 2 04:02:59 UTC 2021 - Neal Gompa <ngomp...@gmail.com> + +- Update libdnf build dependency to require 0.60+ + +------------------------------------------------------------------- Old: ---- libdnf-plugin-txnupd-0.1.0.tar.gz New: ---- libdnf-plugin-txnupd-0.1.2.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libdnf-plugin-txnupd.spec ++++++ --- /var/tmp/diff_new_pack.aw8OcA/_old 2021-03-06 21:18:41.133239364 +0100 +++ /var/tmp/diff_new_pack.aw8OcA/_new 2021-03-06 21:18:41.133239364 +0100 @@ -17,7 +17,7 @@ Name: libdnf-plugin-txnupd -Version: 0.1.0 +Version: 0.1.2 Release: 0 Summary: Plugin for libdnf to implement transactional updates License: LGPL-2.1-or-later @@ -35,7 +35,7 @@ BuildRequires: gcc-c++ >= 10 %endif -BuildRequires: pkgconfig(libdnf) >= 0.58 +BuildRequires: pkgconfig(libdnf) >= 0.60 BuildRequires: pkgconfig(tukit) >= 3.1.2 # To keep OBS and rpmlint from complaining about directory ownership @@ -67,9 +67,6 @@ %prep %autosetup -p1 -# Fix libdnf dependency for openSUSE to account for backported fixes -sed -e "s/'libdnf', version : '>=0.60'/'libdnf', version : '>=0.58'/" -i meson.build - %build %if 0%{?suse_version} && 0%{?suse_version} < 1550 ++++++ libdnf-plugin-txnupd-0.1.0.tar.gz -> libdnf-plugin-txnupd-0.1.2.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libdnf-plugin-txnupd-0.1.0/meson.build new/libdnf-plugin-txnupd-0.1.2/meson.build --- old/libdnf-plugin-txnupd-0.1.0/meson.build 2021-02-19 04:19:40.000000000 +0100 +++ new/libdnf-plugin-txnupd-0.1.2/meson.build 2021-03-05 20:36:59.000000000 +0100 @@ -1,5 +1,5 @@ project('libdnf-plugin-txnupd', 'cpp', - version : '0.1.0', + version : '0.1.2', license : 'LGPL-2.1-or-later', default_options : [ 'buildtype=debugoptimized', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libdnf-plugin-txnupd-0.1.0/src/txnupd.cpp new/libdnf-plugin-txnupd-0.1.2/src/txnupd.cpp --- old/libdnf-plugin-txnupd-0.1.0/src/txnupd.cpp 2021-02-19 04:19:40.000000000 +0100 +++ new/libdnf-plugin-txnupd-0.1.2/src/txnupd.cpp 2021-03-05 20:36:59.000000000 +0100 @@ -14,6 +14,7 @@ */ // Standard library includes +#include <cstdlib> #include <filesystem> #include <string> @@ -39,8 +40,9 @@ // Pointer to instance of this structure is returned by pluginInitHandle() as handle. struct _PluginHandle { PluginMode mode; - DnfContext * context; // store plugin context specific init data - bool transactional_update; // flag to determine if doing a transactional update + DnfContext * context; // store plugin context specific init data + bool transactional_update; // flag to determine if doing a transactional update + bool ext_transactional_update; // flag to determine if within an existing transactional update TransactionalUpdate::Transaction transaction{}; // transactional update object }; @@ -54,26 +56,27 @@ PluginHandle * pluginInitHandle(int version, PluginMode mode, DnfPluginInitData * initData) { auto logger(libdnf::Log::getLogger()); if (version != 1) { - auto msg = std::string(info.name) + ": " + __func__ + ": Error: Unsupported API version"; - logger->error(msg); - return nullptr; + auto msg = std::string(info.name) + ": " + __func__ + ": Error: Unsupported API version"; + logger->error(msg); + return nullptr; } if (mode != PLUGIN_MODE_CONTEXT) { - auto msg = std::string(info.name) + ": " + __func__ + ": Warning: Unsupported mode"; - logger->warning(msg); - return nullptr; + auto msg = std::string(info.name) + ": " + __func__ + ": Warning: Unsupported mode"; + logger->warning(msg); + return nullptr; } auto handle = new PluginHandle; handle->mode = mode; handle->context = pluginGetContext(initData); handle->transactional_update = false; + handle->ext_transactional_update = (std::getenv("TRANSACTIONAL_UPDATE") != NULL); return handle; } // Destroys the plugin instance identified by given handle. void pluginFreeHandle(PluginHandle * handle) { if (handle) - delete handle; + delete handle; } @@ -94,10 +97,10 @@ */ const std::string installRoot = dnf_context_get_install_root(handle->context); if (!installRoot.empty() && installRoot.compare("/") != 0) { - auto instroot_msg = - std::string(info.name) + ": " + __func__ + ": Warning: Using installroot, disabling transactional-update!"; - logger->warning(instroot_msg); - return true; + auto instroot_msg = + std::string(info.name) + ": " + __func__ + ": Warning: Using installroot, disabling transactional-update!"; + logger->warning(instroot_msg); + return true; } /* Also, all of the transactional-update stuff only works as root. @@ -106,10 +109,30 @@ * as non-root. */ if (getuid() != 0) { - auto rootuid_msg = std::string(info.name) + ": " + __func__ + - ": Warning: operating as non-root, disabling transactional-update!"; - logger->warning(rootuid_msg); - return true; + auto rootuid_msg = std::string(info.name) + ": " + __func__ + + ": Warning: operating as non-root, disabling transactional-update!"; + logger->warning(rootuid_msg); + return true; + } + + /* Disable SWDB when in transactional update mode, as it + * it currently causes crashes with transactional updates, + * and it is not particularly useful for our case anyway. + */ + if ((handle->transactional_update) || (handle->ext_transactional_update)) { + dnf_context_set_write_history(handle->context, FALSE); + } + + /* Check if we're already in a transactional update, possibly + * externally invoked by tukit or some other consumer of tukit. + * In this scenario, bail early to stop us from attempting to + * create a transactional update inside of one in progress. + */ + if (handle->ext_transactional_update) { + auto txnupdsnap_msg = std::string(info.name) + ": " + __func__ + + ": Warning: running within transactional update, disabling snapshot handling!"; + logger->warning(txnupdsnap_msg); + return true; } /* Now that we've gotten the basic early-bail conditions handled, @@ -122,23 +145,18 @@ * we try to proceed any further. */ if (!(handle->transaction.isInitialized())) { - auto txnfail_msg = - std::string(info.name) + ": " + __func__ + ": Error: failed to initialize transactional update!"; - logger->error(txnfail_msg); - return false; + auto txnfail_msg = + std::string(info.name) + ": " + __func__ + ": Error: failed to initialize transactional update!"; + logger->error(txnfail_msg); + return false; } auto txnupd_snapid_msg = - std::string(info.name) + ": " + __func__ + ": Info: Created snapshot ID " + handle->transaction.getSnapshot(); + std::string(info.name) + ": " + __func__ + ": Info: Created snapshot ID " + handle->transaction.getSnapshot(); logger->debug(txnupd_snapid_msg); auto transactionRoot = handle->transaction.getRoot(); dnf_context_set_install_root(handle->context, transactionRoot.c_str()); - /* Disable SWDB as it currently causes crashes with transactional updates, - * and it is not particularly useful for our case anyway. - */ - dnf_context_set_write_history (handle->context, FALSE); - /* Mark as being in the transactional update mode, so that * other functions using the handle can do the right thing later. */ @@ -158,13 +176,33 @@ static bool configureTransactionContext(PluginHandle * handle) { auto logger(libdnf::Log::getLogger()); + /* Check to see if we are actually in transactional update mode, + * and bail out early if we are not. + */ + if ((!(handle->transactional_update)) && (!(handle->ext_transactional_update))) { + auto txnupd_msg = + std::string(info.name) + ": " + __func__ + ": Warning: Not a transactional update, so doing nothing!"; + logger->warning(txnupd_msg); + return true; + } + /* Set installonlypkgs to nothing to disable multiversioned kernel installation, * as we need it disabled for this type of transaction. */ if (!dnf_conf_main_set_option("installonlypkgs", DNF_CONF_PLUGINDEFAULT, "", NULL)) { - auto instonlypkgs_msg = std::string(info.name) + ": " + __func__ + - ": Error: installonlypkgs was not successfully overridden!"; - logger->error(instonlypkgs_msg); + auto instonlypkgs_msg = + std::string(info.name) + ": " + __func__ + ": Error: installonlypkgs was not successfully overridden!"; + logger->error(instonlypkgs_msg); + return false; + } + + /* Disable protection of the running kernel, as this type of transaction never + * impacts the running system and it could misguidedly stop upgrades. + */ + if (!dnf_conf_main_set_option("protect_running_kernel", DNF_CONF_PLUGINDEFAULT, "0", NULL)) { + auto protectkernel_msg = + std::string(info.name) + ": " + __func__ + ": Error: protect_running_kernel was not successfully disabled!"; + logger->error(protectkernel_msg); return false; } @@ -186,10 +224,10 @@ * and bail out early if we are not. */ if (!(handle->transactional_update)) { - auto txnupd_msg = - std::string(info.name) + ": " + __func__ + ": Warning: Not a transactional update, so doing nothing!"; - logger->warning(txnupd_msg); - return true; + auto txnupd_msg = + std::string(info.name) + ": " + __func__ + ": Warning: Not a transactional update, so doing nothing!"; + logger->warning(txnupd_msg); + return true; } /* Finally, complete the transaction and finalize @@ -203,17 +241,17 @@ // The plugin "main loop" int pluginHook(PluginHandle * handle, PluginHookId id, DnfPluginHookData * hookData, DnfPluginError * error) { if (!handle) - return 1; + return 1; switch (id) { - case PLUGIN_HOOK_ID_CONTEXT_PRE_REPOS_RELOAD: - return setupTransactionalUpdate(handle); - case PLUGIN_HOOK_ID_CONTEXT_CONF: - return configureTransactionContext(handle); - case PLUGIN_HOOK_ID_CONTEXT_TRANSACTION: - return completeTransactionalUpdate(handle); - default: - break; + case PLUGIN_HOOK_ID_CONTEXT_PRE_REPOS_RELOAD: + return setupTransactionalUpdate(handle); + case PLUGIN_HOOK_ID_CONTEXT_CONF: + return configureTransactionContext(handle); + case PLUGIN_HOOK_ID_CONTEXT_TRANSACTION: + return completeTransactionalUpdate(handle); + default: + break; } return 1; }