diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a95df21 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/boom-1.3.tar.gz diff --git a/0001-etc-Remove-executable-permission-from-etc-default-bo.patch b/0001-etc-Remove-executable-permission-from-etc-default-bo.patch new file mode 100644 index 0000000..d454da1 --- /dev/null +++ b/0001-etc-Remove-executable-permission-from-etc-default-bo.patch @@ -0,0 +1,22 @@ + etc/default/boom | 0 + tests/bootloader_configs/boom_off/etc/default/boom | 0 + tests/bootloader_configs/boom_on/etc/default/boom | 0 + tests/bootloader_configs/no_grub_d/etc/default/boom | 0 + 4 files changed, 0 insertions(+), 0 deletions(-) + mode change 100755 => 100644 etc/default/boom + mode change 100755 => 100644 tests/bootloader_configs/boom_off/etc/default/boom + mode change 100755 => 100644 tests/bootloader_configs/boom_on/etc/default/boom + mode change 100755 => 100644 tests/bootloader_configs/no_grub_d/etc/default/boom + +diff --git a/etc/default/boom b/etc/default/boom +old mode 100755 +new mode 100644 +diff --git a/tests/bootloader_configs/boom_off/etc/default/boom b/tests/bootloader_configs/boom_off/etc/default/boom +old mode 100755 +new mode 100644 +diff --git a/tests/bootloader_configs/boom_on/etc/default/boom b/tests/bootloader_configs/boom_on/etc/default/boom +old mode 100755 +new mode 100644 +diff --git a/tests/bootloader_configs/no_grub_d/etc/default/boom b/tests/bootloader_configs/no_grub_d/etc/default/boom +old mode 100755 +new mode 100644 diff --git a/0002-man-Fix-line-starting-with.patch b/0002-man-Fix-line-starting-with.patch new file mode 100644 index 0000000..f747576 --- /dev/null +++ b/0002-man-Fix-line-starting-with.patch @@ -0,0 +1,18 @@ + man/man8/boom.8 | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/man/man8/boom.8 b/man/man8/boom.8 +index 7b862e7..9eee048 100644 +--- a/man/man8/boom.8 ++++ b/man/man8/boom.8 +@@ -1168,8 +1168,8 @@ describing the properties of the configured host profiles. + + The list of fields to display is given with \fB--options\fP as a comma + separated list of field names. To obtain a list of available fields run +-'\fBboom host list -o help\fP'. If the list of fields begins with the +-'\fB+\fP' character the specified fields are appended to the default ++\&'\fBboom host list -o help\fP'. If the list of fields begins with the ++\&'\fB+\fP' character the specified fields are appended to the default + field list. Otherwise the given list of fields replaces the default set + of report fields. + diff --git a/0003-report-fix-docstring-typo-objecct.patch b/0003-report-fix-docstring-typo-objecct.patch new file mode 100644 index 0000000..4610b09 --- /dev/null +++ b/0003-report-fix-docstring-typo-objecct.patch @@ -0,0 +1,16 @@ + boom/report.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/boom/report.py b/boom/report.py +index 8e55aa3..f7ff4a1 100644 +--- a/boom/report.py ++++ b/boom/report.py +@@ -121,7 +121,7 @@ class BoomReportOpts(object): + + class BoomReportObjType(object): + """BoomReportObjType() +- Class representing a type of objecct to be reported on. ++ Class representing a type of object to be reported on. + Instances of ``BoomReportObjType`` must specify an identifier, + a description, and a data function that will return the correct + type of object from a compound object containing data objects diff --git a/0004-command-fix-docstring-typo-or-OsError.patch b/0004-command-fix-docstring-typo-or-OsError.patch new file mode 100644 index 0000000..db01831 --- /dev/null +++ b/0004-command-fix-docstring-typo-or-OsError.patch @@ -0,0 +1,16 @@ + boom/command.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/boom/command.py b/boom/command.py +index be638df..c9c2f6b 100644 +--- a/boom/command.py ++++ b/boom/command.py +@@ -657,7 +657,7 @@ def create_entry(title, version, machine_id, root_device, lvm_root_lv=None, + :returns: a ``BootEntry`` object corresponding to the new entry. + :rtype: ``BootEntry`` + :raises: ``ValueError`` if either required values are missing or +- a duplicate entry exists, or``OsError`` if an error ++ a duplicate entry exists, or ``OsError`` if an error + occurs while writing the entry file. + """ + if not title and not profile.title: diff --git a/0005-command-fix-optional-BLS-key-to-command-line-argumen.patch b/0005-command-fix-optional-BLS-key-to-command-line-argumen.patch new file mode 100644 index 0000000..ef83d6a --- /dev/null +++ b/0005-command-fix-optional-BLS-key-to-command-line-argumen.patch @@ -0,0 +1,54 @@ + boom/command.py | 5 +++-- + tests/command_tests.py | 16 ++++++++++++++++ + 2 files changed, 19 insertions(+), 2 deletions(-) + +diff --git a/boom/command.py b/boom/command.py +index c9c2f6b..feb5b65 100644 +--- a/boom/command.py ++++ b/boom/command.py +@@ -1883,7 +1883,8 @@ def _optional_key_to_arg(optional_key): + _key_map = { + BOOM_ENTRY_GRUB_USERS: "--grub-users", + BOOM_ENTRY_GRUB_ARG: "--grub-arg", +- BOOM_ENTRY_GRUB_CLASS: "--grub-class" ++ BOOM_ENTRY_GRUB_CLASS: "--grub-class", ++ BOOM_ENTRY_GRUB_ID: "--grub-id" + } + return _key_map[optional_key] if optional_key in _key_map else None + +@@ -1914,7 +1915,7 @@ def _set_optional_key_defaults(profile, cmd_args): + if bls_key not in profile.optional_keys: + if getattr(cmd_args, bls_key) is not None: + print("Profile with os_id='%s' does not support %s" % +- (profile.disp_os_id, _optional_key_to_arg(bls_key))) ++ (profile.disp_os_id, _optional_key_to_arg(opt_key))) + return 1 + else: + if getattr(cmd_args, bls_key) is None: +diff --git a/tests/command_tests.py b/tests/command_tests.py +index 00cda3b..d7a766a 100644 +--- a/tests/command_tests.py ++++ b/tests/command_tests.py +@@ -244,6 +244,22 @@ class CommandHelperTests(unittest.TestCase): + (add_opts, del_opts) = _merge_add_del_opts(bp, to_add, to_del) + self.assertEqual(["log_buf_len=16M", "debug"], add_opts) + ++ def test__optional_key_to_arg_valid(self): ++ _optional_key_to_arg = boom.command._optional_key_to_arg ++ valid_keys_and_args = { ++ "BOOM_ENTRY_GRUB_USERS": "--grub-users", ++ "BOOM_ENTRY_GRUB_ARG": "--grub-arg", ++ "BOOM_ENTRY_GRUB_CLASS": "--grub-class", ++ "BOOM_ENTRY_GRUB_ID": "--grub-id" ++ } ++ for opt_key in valid_keys_and_args.keys(): ++ self.assertEqual(_optional_key_to_arg(opt_key), ++ valid_keys_and_args[opt_key]) ++ ++ def test__optional_key_to_arg_invalid(self): ++ _optional_key_to_arg = boom.command._optional_key_to_arg ++ self.assertEqual(_optional_key_to_arg("INVALID_KEY"), None) ++ + + # Default test OsProfile identifiers + test_os_id = "9cb53ddda889d6285fd9ab985a4c47025884999f" diff --git a/Disable-GRUB2-plugin-on-RHEL-8.patch b/Disable-GRUB2-plugin-on-RHEL-8.patch new file mode 100644 index 0000000..f755ea6 --- /dev/null +++ b/Disable-GRUB2-plugin-on-RHEL-8.patch @@ -0,0 +1,13 @@ + etc/default/boom | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/etc/default/boom b/etc/default/boom +index cd5f772..451cb37 100755 +--- a/etc/default/boom ++++ b/etc/default/boom +@@ -1,3 +1,3 @@ +-BOOM_USE_SUBMENU="yes" ++BOOM_USE_SUBMENU="no" + BOOM_SUBMENU_NAME="Snapshots" +-BOOM_ENABLE_GRUB="yes" ++BOOM_ENABLE_GRUB="no" diff --git a/EMPTY b/EMPTY deleted file mode 100644 index 0519ecb..0000000 --- a/EMPTY +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/boom-boot.spec b/boom-boot.spec new file mode 100644 index 0000000..8a5c6a4 --- /dev/null +++ b/boom-boot.spec @@ -0,0 +1,255 @@ +%global summary A set of libraries and tools for managing boot loader entries +%global sphinx_docs 1 + +Name: boom-boot +Version: 1.3 +Release: 2%{?dist} +Summary: %{summary} + +License: GPLv2 +URL: https://github.com/snapshotmanager/boom +Source0: https://github.com/snapshotmanager/boom/archive/%{version}/boom-%{version}.tar.gz +Patch0: Disable-GRUB2-plugin-on-RHEL-8.patch +Patch1: 0001-etc-Remove-executable-permission-from-etc-default-bo.patch +Patch2: 0002-man-Fix-line-starting-with.patch +Patch3: 0003-report-fix-docstring-typo-objecct.patch +Patch4: 0004-command-fix-docstring-typo-or-OsError.patch +# BZ 1929838: +Patch5: 0005-command-fix-optional-BLS-key-to-command-line-argumen.patch + +BuildArch: noarch + +BuildRequires: python3-setuptools +BuildRequires: python3-devel +%if 0%{?sphinx_docs} +BuildRequires: python3-sphinx +%endif +BuildRequires: make + +Requires: python3-boom = %{version}-%{release} +Requires: %{name}-conf = %{version}-%{release} + +%package -n python3-boom +Summary: %{summary} +# Unsupported on RHEL-8 :-( +#%%{?python_provide:%%python_provide python%%{__python_pkgversion}-boom} +# Do we need this??? IMO not +#Provides: python3-boom = %%{version}-%%{release} +Requires: %{__python3} +Recommends: (lvm2 or brtfs-progs) +Recommends: %{name}-conf = %{version}-%{release} + +# There used to be a boom package in fedora, and there is boom packaged in +# copr. How to tell which one is installed? We need python3-boom and no boom +# only. +Conflicts: boom + +%package conf +Summary: %{summary} + +%package grub2 +Summary: %{summary} +Supplements: (grub2 and boom-boot = %{version}-%{release}) + +%description +Boom is a boot manager for Linux systems using boot loaders that support +the BootLoader Specification for boot entry configuration. + +Boom requires a BLS compatible boot loader to function: either the +systemd-boot project, or Grub2 with the BLS patch (Red Hat Grub2 builds +include this support in both Red Hat Enterprise Linux 7 and Fedora). + +%description -n python3-boom +Boom is a boot manager for Linux systems using boot loaders that support +the BootLoader Specification for boot entry configuration. + +Boom requires a BLS compatible boot loader to function: either the +systemd-boot project, or Grub2 with the BLS patch (Red Hat Grub2 builds +include this support in both Red Hat Enterprise Linux 7 and Fedora). + +This package provides python3 boom module. + +%description conf +Boom is a boot manager for Linux systems using boot loaders that support +the BootLoader Specification for boot entry configuration. + +Boom requires a BLS compatible boot loader to function: either the +systemd-boot project, or Grub2 with the BLS patch (Red Hat Grub2 builds +include this support in both Red Hat Enterprise Linux 7 and Fedora). + +This package provides configuration files for boom. + +%description grub2 +Boom is a boot manager for Linux systems using boot loaders that support +the BootLoader Specification for boot entry configuration. + +Boom requires a BLS compatible boot loader to function: either the +systemd-boot project, or Grub2 with the BLS patch (Red Hat Grub2 builds +include this support in both Red Hat Enterprise Linux 7 and Fedora). + +This package provides integration scripts for grub2 bootloader. + +%prep +%setup -n boom-%{version} +# NOTE: Do not use backup extension - MANIFEST.in is picking them +%patch0 -p1 +%patch1 -p1 +%patch2 -p1 +%patch3 -p1 +%patch4 -p1 +%patch5 -p1 + +%build +%if 0%{?sphinx_docs} +make -C doc html +rm doc/_build/html/.buildinfo +mv doc/_build/html doc/html +rm -r doc/_build +%endif + +%py3_build + +%install +%py3_install + +# Install Grub2 integration scripts +mkdir -p ${RPM_BUILD_ROOT}/etc/grub.d +mkdir -p ${RPM_BUILD_ROOT}/etc/default +install -m 755 etc/grub.d/42_boom ${RPM_BUILD_ROOT}/etc/grub.d +install -m 644 etc/default/boom ${RPM_BUILD_ROOT}/etc/default + +# Make configuration directories +# mode 0700 - in line with /boot/grub2 directory: +install -d -m 700 ${RPM_BUILD_ROOT}/boot/boom/profiles +install -d -m 700 ${RPM_BUILD_ROOT}/boot/boom/hosts +install -d -m 700 ${RPM_BUILD_ROOT}/boot/loader/entries +install -d -m 700 ${RPM_BUILD_ROOT}/boot/boom/cache +install -m 644 examples/boom.conf ${RPM_BUILD_ROOT}/boot/boom +install -m 644 examples/profiles/*.profile ${RPM_BUILD_ROOT}/boot/boom/profiles + +mkdir -p ${RPM_BUILD_ROOT}/%{_mandir}/man8 +mkdir -p ${RPM_BUILD_ROOT}/%{_mandir}/man5 +install -m 644 man/man8/boom.8 ${RPM_BUILD_ROOT}/%{_mandir}/man8 +install -m 644 man/man5/boom.5 ${RPM_BUILD_ROOT}/%{_mandir}/man5 + +rm doc/Makefile +rm doc/conf.py + +# Test suite currently does not operate in rpmbuild environment +#%%check +#%%{__python3} setup.py test + +%files +%license COPYING +%doc README.md +%{_bindir}/boom +%doc %{_mandir}/man*/boom.* + +%files -n python3-boom +%license COPYING +%doc README.md +%{python3_sitelib}/* +%doc doc +%doc examples +%doc tests + +%files conf +%license COPYING +%doc README.md +%dir /boot/boom +%config(noreplace) /boot/boom/boom.conf +%dir /boot/boom/profiles +%config(noreplace) /boot/boom/profiles/* +%dir /boot/boom/hosts +%dir /boot/boom/cache +%dir /boot/loader/entries + +%files grub2 +%license COPYING +%doc README.md +%{_sysconfdir}/grub.d/42_boom +%config(noreplace) %{_sysconfdir}/default/boom + + +%changelog +* Tue Jun 15 2021 Marian Csontos 1.3-2 +- Fix --grub-id option handling. + +* Sat Jan 30 2021 Marian Csontos 1.3-1 +- Check for duplicates consistently in the clone and edit commands. +- Apply correct command line precedence to --add-opts and --del-opts. +- Correctly merge multiple --add/del-opts when editing or cloning. +- Correctly propagate --add/del-opts in boom edit commands. +- Enhanced logging of --add/del-opts merge logic. +- The default Python interpreter is now /usr/bin/python. +- Fixed re-ordering of options modifications when read from disk. +- Do not set BootParams attributes for anonymous option words. +- Make lvm_root_lv validation checks more strict. +- Improve BootParams.from_entry() parameter recovery debug logging. +- Include sample OsProfile for Fedora 32. +- Re-set sandbox state in test suite to ensure run-to-run consistency. +- Improve compatibility with Red Hat BLS implementation. +- Allow non-boom managed entries to be listed and displayed. +- Handle quirks in Red Hat's use of the BLS machine_id key. +- Allow grub2 bootloader variables to be expanded when cloning entries. +- Simplify clone_entry logic and make consistent with edit_entry. +- Ensure stable ordering of legacy boot entry configuration. + +* Mon Jun 29 2020 Marian Csontos 1.2-2 +- Fix RHEL-8 profiles. +- Fix --add/del-opt precedence. +- Fix backup image reference counting. + +* Sun Jun 07 2020 Marian Csontos 1.2-1 +- Update to bug fix release 1.2. + +* Tue May 26 2020 Marian Csontos 1.1-2 +- Fix unicode entries handling. +- Add tracebacks when --debug is used. + +* Thu May 14 2020 Marian Csontos 1.1-1 +- Update to new upstream release 1.1. +- Add caching of kernel and init ramdisk images. + +* Fri Nov 29 2019 Marian Csontos 1.0-1 +- Update to new upstream release 1.0. + +* Mon Jun 10 2019 Marian Csontos 1.0-0.2.20190610git246b116 +- Fix packaging issues. + +* Mon May 06 2019 Marian Csontos 1.0-0.1.20190329git6ff3e08 +- Test upstream packaging. + +* Mon Jan 14 2019 Marian Csontos 0.9-7 +- Reduce log level of "Could not load BootEntry" messages. +- Raise more appropriate LookupError on unknown BLS keys. + +* Tue Dec 18 2018 Marian Csontos 0.9-6 +- Disable GRUB2 plugin on RHEL-8. + +* Mon Sep 17 2018 Tomas Orsava - 0.9-5 +- Require the Python interpreter directly instead of using the package name +- Related: rhbz#1619153 + +* Tue Jul 17 2018 Marian Csontos 0.9-4 +- Change dependencies. + +* Mon Jul 16 2018 Marian Csontos 0.9-3 +- Split executable, python module and configuration. + +* Wed Jun 27 2018 Marian Csontos 0.9-2 +- Spin off grub2 into subpackage + +* Wed Jun 27 2018 Marian Csontos 0.9-1 +- Update to new upstream 0.9. +- Fix boot_id caching. + +* Fri Jun 08 2018 Marian Csontos 0.8.5-6.2 +- Remove example files from /boot/boom/profiles. + +* Fri May 11 2018 Marian Csontos 0.8.5-6.1 +- Files in /boot are treated as configuration files. + +* Thu Apr 26 2018 Marian Csontos 0.8.5-6 +- Package upstream version 0.8-5.6 + diff --git a/sources b/sources new file mode 100644 index 0000000..e62edbd --- /dev/null +++ b/sources @@ -0,0 +1 @@ +SHA512 (boom-1.3.tar.gz) = b11ba8c81b2d70104181065620948f51b0999dbccff42b7af71e31a0c1ab3e3730dab739be7f08024f0df1eafabc4e33b747518e816b314a54d30769c5622b0a