From 394ca586eb47178cd35e7ed5bf72502f5f4346d2 Mon Sep 17 00:00:00 2001 From: Marcin Krol Date: Mon, 11 Jan 2021 21:01:40 +0100 Subject: [PATCH] - merged PLD changes, TLDized --- dbupgrade.sh | 40 ------- rpm.spec | 98 +++++++--------- rpmdb_checkversion.c | 121 -------------------- rpmdb_reset.c | 248 ---------------------------------------- sqlite-db-backend.patch | 11 ++ 5 files changed, 50 insertions(+), 468 deletions(-) delete mode 100755 dbupgrade.sh delete mode 100644 rpmdb_checkversion.c delete mode 100644 rpmdb_reset.c create mode 100644 sqlite-db-backend.patch diff --git a/dbupgrade.sh b/dbupgrade.sh deleted file mode 100755 index 575aeb2..0000000 --- a/dbupgrade.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/sh - -ROOTDIR= -if [ "$1" = "-r" ]; then - shift - ROOTDIR="$1" - - if [ ! -d "$ROOTDIR" ]; then - echo "Specified root directory ($ROOTDIR) does not exist!" - echo "Bailing out!" - exit - fi -fi - -if [ -f "$ROOTDIR"/var/lib/rpm/Packages ]; then - if ! /usr/lib/rpm/rpmdb_reset -r lsn "$ROOTDIR"/var/lib/rpm/Packages ; then - echo - echo "rpm database conversion failed!" - echo - echo "You have to run:" - echo - echo " /usr/lib/rpm/rpmdb_reset -r lsn /var/lib/rpm/Packages" - echo " /bin/rm -f /var/lib/rpm/__db.00*" - echo " /bin/rm -rf /var/lib/rpm/log" - echo " /usr/bin/rpmdb --rebuilddb" - echo - exit - fi - - /bin/rm --interactive=never -f "$ROOTDIR"/var/lib/rpm/__db.00* >/dev/null 2>/dev/null || : - /bin/rm --interactive=never -rf "$ROOTDIR"/var/lib/rpm/log >/dev/null 2>/dev/null || : - /bin/rm --interactive=never -rf "$ROOTDIR"/var/lib/rpm/tmp >/dev/null 2>/dev/null || : -fi - -if ! /usr/bin/rpmdb --rebuilddb ${ROOTDIR:+--root="$ROOTDIR"}; then - echo - echo "rpm database conversion failed!" - echo "You have to run /usr/bin/rpmdb manually" - echo -fi diff --git a/rpm.spec b/rpm.spec index 97ab2c8..18c81df 100644 --- a/rpm.spec +++ b/rpm.spec @@ -6,7 +6,7 @@ %bcond_without apidocs # don't generate documentation with doxygen %bcond_without python3 # don't build python bindings %bcond_without plugins # build plugins -%bcond_with recommends_tags # build without Recommends tag (bootstrapping) +%bcond_without recommends_tags # build without Recommends tag (bootstrapping) %bcond_with imaevm # build with IMA/EVM support (requires libimaevm from ima-evm-utils) %define db_ver 5.3.28.0 @@ -26,7 +26,7 @@ Summary(ru.UTF-8): Менеджер пакетов от RPM Summary(uk.UTF-8): Менеджер пакетів від RPM Name: rpm Version: 4.16.1.2 -Release: 0.1 +Release: 0.3 Epoch: 1 License: GPL v2 / LGPL v2.1 Group: Base @@ -48,9 +48,6 @@ Source12: %{name}.noautoprovfiles Source13: %{name}.noautoreq Source14: %{name}.noautoreqfiles Source15: perl.prov -Source16: %{name}db_checkversion.c -Source17: %{name}db_reset.c -Source18: dbupgrade.sh Patch0: %{name}-man_pl.patch Patch1: %{name}-popt-aliases.patch Patch2: %{name}-perl-macros.patch @@ -83,6 +80,7 @@ Patch29: %{name}-noarch_py_prov.patch Patch30: missing-ghost-terminate-build.patch Patch31: missing-doc-terminate-build.patch Patch32: noexpand.patch +Patch33: sqlite-db-backend.patch Patch100: build-id-links.patch URL: https://rpm.org/ BuildRequires: acl-devel @@ -105,7 +103,6 @@ BuildRequires: libselinux-devel >= 2.1.0 # needed only for AM_PROG_CXX used for CXX substitution in rpm.macros BuildRequires: libstdc++-devel BuildRequires: libtool >= 1:1.4.2-9 -BuildRequires: ossp-uuid-devel BuildRequires: patch >= 2.2 BuildRequires: pkgconfig(lua) >= 5.1 BuildRequires: popt-devel >= %{popt_ver} @@ -133,12 +130,11 @@ Requires: rpm-tld-macros >= 1.744 Requires: FHS >= 3.0-2 Requires: libgcrypt Requires: popt >= %{popt_ver} -#%if %{with recommends_tags} -#Recommends: rpm-plugin-audit -#Recommends: rpm-plugin-prioreset -#Recommends: rpm-plugin-syslog -#Recommends: rpm-plugin-systemd-inhibit -#%endif +%if %{with recommends_tags} +Recommends: rpm-plugin-audit +Recommends: rpm-plugin-prioreset +Recommends: rpm-plugin-syslog +%endif Obsoletes: rpm-utils-perl Obsoletes: rpm-utils-static Conflicts: glibc < 2.2.92 @@ -321,10 +317,10 @@ Summary(pl.UTF-8): Dodatkowe narzędzia do zarządzania bazą RPM-a i pakietami Group: Applications/File Requires: %{name} = %{epoch}:%{version}-%{release} Requires: popt >= %{popt_ver} -#%if %{with recommends_tags} -#Recommends: bzip2 -#Recommends: gzip -#%endif +%if %{with recommends_tags} +Recommends: bzip2 +Recommends: gzip +%endif Conflicts: filesystem-debuginfo < 3.0-16 %description utils @@ -489,15 +485,6 @@ Requires: %{name}-lib = %{epoch}:%{version}-%{release} %description plugin-syslog This plugin exports RPM actions to the system log. -%package plugin-systemd-inhibit -Summary: Plugin for systemd inhibit functionality -Group: Base -Requires: %{name}-lib = %{epoch}:%{version}-%{release} - -%description plugin-systemd-inhibit -This plugin blocks systemd from entering idle, sleep or shutdown while -an rpm transaction is running using the systemd-inhibit mechanism. - %package plugin-ima Summary: Plugin for IMA file signatures Group: Base @@ -514,8 +501,7 @@ Requires: %{name}-lib = %{epoch}:%{version}-%{release} %description plugin-prioreset This plugin is useful on legacy SysV init systems if you run rpm -transactions with nice/ionice priorities. Should not be used on -systemd systems. +transactions with nice/ionice priorities. %package plugin-selinux Summary: Plugin for SELinux functionality @@ -582,6 +568,7 @@ Dokumentacja API RPM-a oraz przewodniki w formacie HTML generowane ze %patch30 -p1 %patch31 -p1 %patch32 -p1 +%patch33 -p1 %patch100 -p1 install %{SOURCE15} scripts/perl.prov.in @@ -591,9 +578,6 @@ install %{SOURCE15} scripts/perl.prov.in # generate Group translations to *.po awk -f %{SOURCE6} %{SOURCE5} -install %{SOURCE16} tools/rpmdb_checkversion.c -install %{SOURCE17} tools/rpmdb_reset.c - %{__sed} -i -e '1s,/usr/bin/python,%{__python3},' scripts/pythondistdeps.py %build @@ -618,6 +602,7 @@ sed -i \ PYTHON=python3 \ --enable-python \ %endif + --disable-inhibit-plugin \ --disable-silent-rules \ --enable-shared \ --enable-bdb \ @@ -637,18 +622,6 @@ sed -i \ %{__make} -%{__cc} %{rpmcflags} tools/rpmdb_checkversion.c -o tools/rpmdb_checkversion -ldb -%{__cc} %{rpmcflags} tools/rpmdb_reset.c -o tools/rpmdb_reset -ldb - -if tools/rpmdb_checkversion -V 2>&1 | grep "t match library version"; then - echo "Error linking rpmdb tools!" - exit 1 -fi -if tools/rpmdb_reset -V 2>&1 | grep "t match library version"; then - echo "Error linking rpmdb tools!" - exit 1 -fi - %if %{with python3} cd python %py3_build @@ -735,10 +708,6 @@ cp -p %{SOURCE12} $RPM_BUILD_ROOT%{_sysconfdir}/rpm/noautoprovfiles cp -p %{SOURCE13} $RPM_BUILD_ROOT%{_sysconfdir}/rpm/noautoreq cp -p %{SOURCE14} $RPM_BUILD_ROOT%{_sysconfdir}/rpm/noautoreqfiles -cp -p tools/rpmdb_checkversion $RPM_BUILD_ROOT%{_rpmlibdir}/ -cp -p tools/rpmdb_reset $RPM_BUILD_ROOT%{_rpmlibdir}/ -cp -p %{SOURCE18} $RPM_BUILD_ROOT%{_rpmlibdir}/dbupgrade.sh - # move rpm to /bin %{__mv} $RPM_BUILD_ROOT%{_bindir}/rpm $RPM_BUILD_ROOT/bin ln -sf /bin/rpm $RPM_BUILD_ROOT%{_bindir}/rpmquery @@ -750,8 +719,16 @@ for a in librpm.so librpmbuild.so librpmio.so librpmsign.so; do ln -sf /%{_lib}/$(basename $RPM_BUILD_ROOT/%{_lib}/${a}.*.*.*) $RPM_BUILD_ROOT%{_libdir}/${a} done -# Make sure we have bdb set a default backend -grep -qE "db_backend[[:blank:]]+bdb" $RPM_BUILD_ROOT%{_rpmlibdir}/macros +# init an empty database for %ghost'ing for all supported backends +for be in sqlite bdb ndb; do + ./rpmdb \ + --macros=$RPM_BUILD_ROOT%{_rpmlibdir}/macros \ + --rcfile=$RPM_BUILD_ROOT%{_rpmlibdir}/rpmrc \ + --dbpath=${PWD}/${be} \ + --define "_db_backend ${be}" \ + --initdb + cp -va ${be}/. $RPM_BUILD_ROOT/var/lib/rpm/ +done %if %{with python3} # Remove anything that rpm make install might put there @@ -772,8 +749,7 @@ cd .. rm -rf $RPM_BUILD_ROOT %posttrans -if [ -e /var/lib/rpm/Packages ] && \ - ! %{_rpmlibdir}/rpmdb_checkversion -h /var/lib/rpm -d /var/lib/rpm; then +if [ -e /var/lib/rpm/Packages ]; then if [ ! -e /var/lib/rpm.rpmbackup-%{version}-%{release} ] && \ /bin/cp -a /var/lib/rpm /var/lib/rpm.rpmbackup-%{version}-%{release}; then echo @@ -784,7 +760,17 @@ if [ -e /var/lib/rpm/Packages ] && \ echo 'If poldek aborts after migration with rpmdb error, this is expected behaviour,' echo 'you should ignore it and restart poldek' echo - %{_rpmlibdir}/dbupgrade.sh + %{__rm} -rf /var/lib/rpm/log >/dev/null 2>/dev/null || : + %{__rm} -rf /var/lib/rpm/tmp >/dev/null 2>/dev/null || : + # Unlock database for rebuild, safe since this is posttrans + %{__rm} -rf /var/lib/rpm/.rpm.lock >/dev/null 2>/dev/null || : + if ! /usr/bin/rpmdb --rebuilddb; then + echo + echo "rpm database conversion failed!" + echo "You have to run '/usr/bin/rpmdb --rebuilddb' manually" + echo + exit 1 + fi fi %post lib -p /sbin/ldconfig @@ -824,6 +810,8 @@ find %{_rpmlibdir} -name '*-linux' -type l | xargs rm -f %lang(sk) %{_mandir}/sk/man8/rpm.8* %dir /var/lib/rpm +%ghost %config(missingok,noreplace) /var/lib/rpm/* +%ghost /var/lib/rpm/.*.lock %{_rpmlibdir}/rpmpopt* %{_rpmlibdir}/rpmrc @@ -867,9 +855,6 @@ find %{_rpmlibdir} -name '*-linux' -type l | xargs rm -f %dir %{_rpmlibdir}/tld -%attr(755,root,root) %{_rpmlibdir}/dbupgrade.sh -%attr(755,root,root) %{_rpmlibdir}/rpmdb_checkversion -%attr(755,root,root) %{_rpmlibdir}/rpmdb_reset %attr(755,root,root) %{_rpmlibdir}/rpmdb_dump %attr(755,root,root) %{_rpmlibdir}/rpmdb_load @@ -1018,11 +1003,6 @@ find %{_rpmlibdir} -name '*-linux' -type l | xargs rm -f %attr(755,root,root) %{_libdir}/rpm-plugins/syslog.so %{_mandir}/man8/rpm-plugin-syslog.8* -%files plugin-systemd-inhibit -%defattr(644,root,root,755) -%attr(755,root,root) %{_libdir}/rpm-plugins/systemd_inhibit.so -%{_mandir}/man8/rpm-plugin-systemd-inhibit.8* - %files plugin-ima %defattr(644,root,root,755) %attr(755,root,root) %{_libdir}/rpm-plugins/ima.so diff --git a/rpmdb_checkversion.c b/rpmdb_checkversion.c deleted file mode 100644 index 58a169c..0000000 --- a/rpmdb_checkversion.c +++ /dev/null @@ -1,121 +0,0 @@ -#include -#include -#include -#include -#include -#include - -int version_check __P((void)); - -const char *progname = "rpmdb_checkversion"; /* Program name. */ - -/* - * A very simple program to check for a Berkeley DB environment mismatch. - */ -int -main(int argc, char *argv[]) -{ - extern char *optarg; - extern int optind; - const char *data_dir, *home; - int ch, quiet; - DB_ENV *dbenv; - int ret; - - if ((ret = version_check()) != 0) - return (EXIT_FAILURE); - - /* - * All of the shared database files live in home, but - * data files will live in data_dir. - */ - quiet = 0; - home = "/var/lib/rpm"; - data_dir = "/var/lib/rpm"; - while ((ch = getopt(argc, argv, "h:d:qV")) != EOF) - switch (ch) { - case 'h': - home = optarg; - break; - case 'd': - data_dir = optarg; - break; - case 'q': - quiet = 1; - break; - case 'V': - printf("%s\n", db_version(NULL, NULL, NULL)); - return (EXIT_SUCCESS); - case '?': - default: - (void)fprintf(stderr, "usage: %s [-h home] [-d data_dir]\n", progname); - return (1); - } - argc -= optind; - argv += optind; - - if (argc != 0) { - (void)fprintf(stderr, "usage: %s [-h home] [-d data_dir]\n", progname); - return (1); - } - - /* - * Create an environment object and initialize it for error - * reporting. - */ - if ((ret = db_env_create(&dbenv, 0)) != 0) { - if (!quiet) - fprintf(stderr, "%s: %s\n", progname, db_strerror(ret)); - return (1); - } - if (quiet) { - dbenv->set_errfile(dbenv, NULL); - } else { - dbenv->set_errfile(dbenv, stderr); - } - dbenv->set_errpfx(dbenv, progname); - - /* - * We want to specify the shared memory buffer pool cachesize, - * but everything else is the default. - */ - if ((ret = dbenv->set_cachesize(dbenv, 0, 64 * 1024, 0)) != 0) { - dbenv->err(dbenv, ret, "set_cachesize"); - dbenv->close(dbenv, 0); - return (1); - } - - /* Databases are in a subdirectory. */ - (void)dbenv->set_data_dir(dbenv, data_dir); - - /* Open the environment with full transactional support. */ - ret = dbenv->open(dbenv, home, DB_INIT_MPOOL, 0644); - /* Close the environment handle. */ - dbenv->close(dbenv, 0); -#if 0 - if (ret == DB_VERSION_MISMATCH) { -#else - if (ret != 0) { -#endif - return (1); - } - - return (0); -} - -int -version_check() -{ - int v_major, v_minor, v_patch; - - /* Make sure we're loaded with the right version of the DB library. */ - (void)db_version(&v_major, &v_minor, &v_patch); - if (v_major != DB_VERSION_MAJOR || v_minor != DB_VERSION_MINOR) { - fprintf(stderr, - "%s: version %d.%d doesn't match library version %d.%d\n", - progname, DB_VERSION_MAJOR, - DB_VERSION_MINOR, v_major, v_minor); - return (EXIT_FAILURE); - } - return (0); -} diff --git a/rpmdb_reset.c b/rpmdb_reset.c deleted file mode 100644 index 431d7cb..0000000 --- a/rpmdb_reset.c +++ /dev/null @@ -1,248 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -typedef struct { /* XXX: Globals. */ - const char *progname; /* Program name. */ - char *hdrbuf; /* Input file header. */ - u_long lineno; /* Input file line number. */ - u_long origline; /* Original file line number. */ - int endodata; /* Reached the end of a database. */ - int endofile; /* Reached the end of the input. */ - int version; /* Input version. */ - char *home; /* Env home. */ - char *passwd; /* Env passwd. */ - int private; /* Private env. */ - u_int32_t cache; /* Env cache size. */ -} LDG; - -int db_init __P((DB_ENV *, char *, u_int32_t, int *)); -int env_create __P((DB_ENV **, LDG *)); -int main __P((int, char *[])); -int usage __P((void)); -int version_check __P((void)); - -const char *progname = "rpmdb_reset"; - -int -main(argc, argv) - int argc; - char *argv[]; -{ - enum { NOTSET, FILEID_RESET, LSN_RESET, STANDARD_LOAD } mode; - extern char *optarg; - extern int optind; - DBTYPE dbtype; - DB_ENV *dbenv; - LDG ldg; - u_int ldf; - int ch, exitval, ret; - - if ((exitval = version_check()) != 0) - goto done; - - ldg.progname = progname; - ldg.lineno = 0; - ldg.endodata = ldg.endofile = 0; - ldg.version = 1; - ldg.cache = (1024 * 1024); - ldg.hdrbuf = NULL; - ldg.home = NULL; - ldg.passwd = NULL; - - mode = NOTSET; - ldf = 0; - exitval = 0; - dbtype = DB_UNKNOWN; - - /* - * There are two modes for db_load: -r and everything else. The -r - * option zeroes out the database LSN's or resets the file ID, it - * doesn't really "load" a new database. The functionality is in - * db_load because we don't have a better place to put it, and we - * don't want to create a new utility for just that functionality. - */ - while ((ch = getopt(argc, argv, "h:r:V")) != EOF) - switch (ch) { - case 'h': - ldg.home = optarg; - break; - case 'r': - if (strcmp(optarg, "lsn") == 0) - mode = LSN_RESET; - else if (strcmp(optarg, "fileid") == 0) - mode = FILEID_RESET; - else { - exitval = usage(); - goto done; - } - break; - case 'V': - printf("%s\n", db_version(NULL, NULL, NULL)); - return (EXIT_SUCCESS); - case '?': - default: - exitval = usage(); - goto done; - } - argc -= optind; - argv += optind; - - if (argc != 1 || mode == NOTSET) { - exitval = usage(); - goto done; - } - - /* - * Create an environment object initialized for error reporting, and - * then open it. - */ - if (env_create(&dbenv, &ldg) != 0) - goto err; - - /* If we're resetting the LSNs, that's an entirely separate path. */ - switch (mode) { - case FILEID_RESET: - exitval = dbenv->fileid_reset(dbenv, argv[0], 0); - break; - case LSN_RESET: - exitval = dbenv->lsn_reset(dbenv, argv[0], 0); - break; - case NOTSET: - break; - } - - if (0) { -err: exitval = 1; - } - if ((ret = dbenv->close(dbenv, 0)) != 0) { - exitval = 1; - fprintf(stderr, - "%s: dbenv->close: %s\n", ldg.progname, db_strerror(ret)); - } - - if (ldg.passwd != NULL) - free(ldg.passwd); - -done: - return (exitval); -} - -/* - * env_create -- - * Create the environment and initialize it for error reporting. - */ -int -env_create(dbenvp, ldg) - DB_ENV **dbenvp; - LDG *ldg; -{ - DB_ENV *dbenv; - int ret; - - if ((ret = db_env_create(dbenvp, 0)) != 0) { - fprintf(stderr, "%s: db_env_create: %s\n", - ldg->progname, db_strerror(ret)); - return (ret); - } - dbenv = *dbenvp; - dbenv->set_errfile(dbenv, stderr); - dbenv->set_errpfx(dbenv, ldg->progname); - if (ldg->passwd != NULL && (ret = dbenv->set_encrypt(dbenv, - ldg->passwd, DB_ENCRYPT_AES)) != 0) { - dbenv->err(dbenv, ret, "set_passwd"); - return (ret); - } - if ((ret = db_init(dbenv, ldg->home, ldg->cache, &ldg->private)) != 0) - return (ret); - dbenv->app_private = ldg; - - return (0); -} - -/* - * db_init -- - * Initialize the environment. - */ -int -db_init(dbenv, home, cache, is_private) - DB_ENV *dbenv; - char *home; - u_int32_t cache; - int *is_private; -{ - u_int32_t flags; - int ret; - - *is_private = 0; - /* We may be loading into a live environment. Try and join. */ - flags = DB_USE_ENVIRON | - DB_INIT_LOCK | DB_INIT_LOG | DB_INIT_MPOOL | DB_INIT_TXN; - if ((ret = dbenv->open(dbenv, home, flags, 0)) == 0) - return (0); - if (ret == DB_VERSION_MISMATCH) - goto err; - - /* - * We're trying to load a database. - * - * An environment is required because we may be trying to look at - * databases in directories other than the current one. We could - * avoid using an environment iff the -h option wasn't specified, - * but that seems like more work than it's worth. - * - * No environment exists (or, at least no environment that includes - * an mpool region exists). Create one, but make it private so that - * no files are actually created. - */ -#define LF_SET(f) ((flags) |= (f)) -#define LF_CLR(f) ((flags) &= ~(f)) - LF_CLR(DB_INIT_LOCK | DB_INIT_LOG | DB_INIT_TXN); - LF_SET(DB_CREATE | DB_PRIVATE); - *is_private = 1; - if ((ret = dbenv->set_cachesize(dbenv, 0, cache, 1)) != 0) { - dbenv->err(dbenv, ret, "set_cachesize"); - return (1); - } - if ((ret = dbenv->open(dbenv, home, flags, 0)) == 0) - return (0); - - /* An environment is required. */ -err: dbenv->err(dbenv, ret, "DB_ENV->open"); - return (1); -} - -/* - * usage -- - * Display the usage message. - */ -int -usage() -{ - (void)fprintf(stderr, "usage: %s %s\n\t%s %s\n", - progname, "[-V]", - progname, "-r lsn | fileid [-h home] db_file"); - return (EXIT_FAILURE); -} - -int -version_check() -{ - int v_major, v_minor, v_patch; - - /* Make sure we're loaded with the right version of the DB library. */ - (void)db_version(&v_major, &v_minor, &v_patch); - if (v_major != DB_VERSION_MAJOR || v_minor != DB_VERSION_MINOR) { - fprintf(stderr, - "%s: version %d.%d doesn't match library version %d.%d\n", - progname, DB_VERSION_MAJOR, - DB_VERSION_MINOR, v_major, v_minor); - return (EXIT_FAILURE); - } - return (0); -} diff --git a/sqlite-db-backend.patch b/sqlite-db-backend.patch new file mode 100644 index 0000000..12b4160 --- /dev/null +++ b/sqlite-db-backend.patch @@ -0,0 +1,11 @@ +--- rpm-4.16.1.2/macros.in~ 2020-12-25 11:29:20.000000000 +0100 ++++ rpm-4.16.1.2/macros.in 2021-01-05 22:55:49.955934996 +0100 +@@ -627,7 +627,7 @@ + # sqlite Sqlite database + # dummy dummy backend (no actual functionality) + # +-%_db_backend bdb ++%_db_backend sqlite + + # + # Macros used to configure Berkley db parameters. -- 2.46.0