diff --git a/.files b/.files
index 620cb4b..ae9ecc1 100644
Binary files a/.files and b/.files differ
diff --git a/.rev b/.rev
index 5ef25fa..cdd91c8 100644
--- a/.rev
+++ b/.rev
@@ -1255,4 +1255,12 @@ D fixes-a-template-rendering-error.patch
990580
+
+ 350de775a4459daa4e82cb7a4adfae59
+ 3.3.3
+
+ dimstar_suse
+
+ 1087750
+
diff --git a/.servicemark b/.servicemark
deleted file mode 100644
index 726629b..0000000
--- a/.servicemark
+++ /dev/null
@@ -1 +0,0 @@
-2166a19cc04ca5ad228ffb7a4c701509
diff --git a/_service b/_service
index a3cfe38..f54da26 100644
--- a/_service
+++ b/_service
@@ -1,9 +1,10 @@
- https://github.com/cobbler/cobbler.git
+ https://github.com/openSUSE/cobbler.git
git
- 3.3.3.@TAG_OFFSET@+git.%h
- v3.3.3
+ @PARENT_TAG@
+ v(.*)
+ openSUSE/factory
cobbler.spec
diff --git a/backport_complex_xmlrpc_objects_and_logger_spam.patch b/backport_complex_xmlrpc_objects_and_logger_spam.patch
deleted file mode 100644
index 3f911ef..0000000
--- a/backport_complex_xmlrpc_objects_and_logger_spam.patch
+++ /dev/null
@@ -1,294 +0,0 @@
-Index: cobbler/items/item.py
-IDEA additional info:
-Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
-<+>UTF-8
-===================================================================
-diff --git a/cobbler/items/item.py b/cobbler/items/item.py
---- a/cobbler/items/item.py (revision 5c498dbf2af6e3782b37605a477759e1aacc16b2)
-+++ b/cobbler/items/item.py (revision 7371e1eeb7b735edd22897c5aba35987f295391f)
-@@ -974,7 +974,7 @@
- parent = parent.parent
- # FIXME: Now get the object and check its existence
- results.append(self.api.settings())
-- self.logger.info(
-+ self.logger.debug(
- "grab_tree found %s children (including settings) of this object",
- len(results),
- )
-Index: config/cobbler/logging_config.conf
-IDEA additional info:
-Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
-<+>UTF-8
-===================================================================
-diff --git a/config/cobbler/logging_config.conf b/config/cobbler/logging_config.conf
---- a/config/cobbler/logging_config.conf (revision 5c498dbf2af6e3782b37605a477759e1aacc16b2)
-+++ b/config/cobbler/logging_config.conf (revision 7371e1eeb7b735edd22897c5aba35987f295391f)
-@@ -19,7 +19,7 @@
-
- [handler_stdout]
- class=StreamHandler
--level=WARNING
-+level=INFO
- formatter=stdout
- args=(sys.stdout,)
-
-@@ -34,7 +34,7 @@
-
- [handler_FileLogger]
- class=FileHandler
--level=DEBUG
-+level=INFO
- formatter=Logfile
- args=('/var/log/cobbler/cobbler.log', 'a')
-
-Index: cobbler/items/distro.py
-IDEA additional info:
-Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
-<+>UTF-8
-===================================================================
-diff --git a/cobbler/items/distro.py b/cobbler/items/distro.py
---- a/cobbler/items/distro.py (revision 7371e1eeb7b735edd22897c5aba35987f295391f)
-+++ b/cobbler/items/distro.py (revision e72a03db09397a5dde1b16d0d831a549e0a86bd2)
-@@ -34,6 +34,8 @@
- A Cobbler distribution object
- """
-
-+ # Constants
-+ TYPE_NAME = "distro"
- COLLECTION_TYPE = "distro"
-
- def __init__(self, api, *args, **kwargs):
-Index: cobbler/items/system.py
-IDEA additional info:
-Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
-<+>UTF-8
-===================================================================
-diff --git a/cobbler/items/system.py b/cobbler/items/system.py
---- a/cobbler/items/system.py (revision 7371e1eeb7b735edd22897c5aba35987f295391f)
-+++ b/cobbler/items/system.py (revision e72a03db09397a5dde1b16d0d831a549e0a86bd2)
-@@ -730,6 +730,8 @@
- A Cobbler system object.
- """
-
-+ # Constants
-+ TYPE_NAME = "system"
- COLLECTION_TYPE = "system"
-
- def __init__(self, api, *args, **kwargs):
-Index: cobbler/remote.py
-IDEA additional info:
-Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
-<+>UTF-8
-===================================================================
-diff --git a/cobbler/remote.py b/cobbler/remote.py
---- a/cobbler/remote.py (revision 7371e1eeb7b735edd22897c5aba35987f295391f)
-+++ b/cobbler/remote.py (revision e72a03db09397a5dde1b16d0d831a549e0a86bd2)
-@@ -34,6 +34,7 @@
- from typing import Dict, List, Optional, Union
- from xmlrpc.server import SimpleXMLRPCRequestHandler
-
-+from cobbler import enums
- from cobbler import autoinstall_manager
- from cobbler import configgen
- from cobbler.items import item, package, system, image, profile, repo, mgmtclass, distro, file, menu
-@@ -712,7 +713,38 @@
- .. seealso:: Logically identical to :func:`~cobbler.api.CobblerAPI.get_item_resolved_value`
- """
- self._log("get_item_resolved_value(%s)" % item_uuid, attribute=attribute)
-- return self.api.get_item_resolved_value(item_uuid, attribute)
-+ return_value = self.api.get_item_resolved_value(item_uuid, attribute)
-+ if return_value is None:
-+ self._log(
-+ "get_item_resolved_value(%s): returned None" % item_uuid,
-+ attribute=attribute,
-+ )
-+ raise ValueError(
-+ 'None is not a valid value for the resolved attribute "%s". Please fix the item(s) '
-+ 'starting at uuid "%s"' % (attribute, item_uuid)
-+ )
-+ elif isinstance(return_value, enums.ConvertableEnum):
-+ return return_value.value
-+ elif isinstance(
-+ return_value,
-+ (utils.DHCP, enums.NetworkInterfaceType, enums.BaudRates, item.Item),
-+ ):
-+ return return_value.name
-+ elif isinstance(return_value, dict):
-+ return self.xmlrpc_hacks(return_value)
-+
-+ if not isinstance(
-+ return_value, (str, int, float, bool, tuple, bytes, bytearray, dict, list)
-+ ):
-+ self._log(
-+ "get_item_resolved_value(%s): Cannot return XML-RPC compliant type. Please add a case to convert"
-+ ' type "%s" to an XML-RPC compliant type!'
-+ % (item_uuid, type(return_value))
-+ )
-+ raise ValueError(
-+ "Cannot return XML-RPC compliant type. See logs for more information!"
-+ )
-+ return return_value
-
- def get_item(self, what: str, name: str, flatten=False, resolved: bool = False):
- """
-Index: tests/xmlrpcapi/non_object_calls_test.py
-IDEA additional info:
-Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
-<+>UTF-8
-===================================================================
-diff --git a/tests/xmlrpcapi/non_object_calls_test.py b/tests/xmlrpcapi/non_object_calls_test.py
---- a/tests/xmlrpcapi/non_object_calls_test.py (revision 7371e1eeb7b735edd22897c5aba35987f295391f)
-+++ b/tests/xmlrpcapi/non_object_calls_test.py (revision e72a03db09397a5dde1b16d0d831a549e0a86bd2)
-@@ -4,6 +4,8 @@
- import time
- import re
-
-+from tests.conftest import does_not_raise
-+
- TEST_POWER_MANAGEMENT = True
- TEST_SYSTEM = ""
-
-@@ -186,8 +188,26 @@
- assert match_obj
-
-
-+@pytest.mark.parametrize(
-+ "input_attribute,checked_object,expected_result,expected_exception",
-+ [
-+ ("kernel_options", "system", {"a": "1", "b": "2", "d": "~"}, does_not_raise()),
-+ ("arch", "distro", "x86_64", does_not_raise()),
-+ ("distro", "profile", "testdistro_item_resolved_value", does_not_raise()),
-+ ("profile", "system", "testprofile_item_resolved_value", does_not_raise()),
-+ ],
-+)
- def test_get_item_resolved_value(
-- remote, token, create_distro, create_profile, create_system, create_kernel_initrd
-+ remote,
-+ token,
-+ create_distro,
-+ create_profile,
-+ create_system,
-+ create_kernel_initrd,
-+ input_attribute,
-+ checked_object,
-+ expected_result,
-+ expected_exception,
- ):
- # Arrange
- fk_kernel = "vmlinuz1"
-@@ -203,11 +223,18 @@
- create_profile(name_profile, name_distro, "a=1 b=2 c=3 c=4 c=5 d e")
- test_system_handle = create_system(name_system, name_profile)
- remote.modify_system(test_system_handle, "kernel_options", "!c !e", token=token)
-- test_system = remote.get_system(name_system, token=token)
-- expected_result = {"a": "1", "b": "2", "d": None}
-+ if checked_object == "distro":
-+ test_item = remote.get_distro(name_distro, token=token)
-+ elif checked_object == "profile":
-+ test_item = remote.get_profile(name_profile, token=token)
-+ elif checked_object == "system":
-+ test_item = remote.get_system(name_system, token=token)
-+ else:
-+ raise ValueError("checked_object has wrong value")
-
- # Act
-- result = remote.get_item_resolved_value(test_system.get("uid"), "kernel_options")
-+ with expected_exception:
-+ result = remote.get_item_resolved_value(test_item.get("uid"), input_attribute)
-
-- # Assert
-- assert expected_result == result
-+ # Assert
-+ assert expected_result == result
-Index: cobbler/remote.py
-IDEA additional info:
-Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
-<+>UTF-8
-===================================================================
-diff --git a/cobbler/remote.py b/cobbler/remote.py
---- a/cobbler/remote.py (revision cb840ce25e78aa26349e3b23065b0fdf78fbadbc)
-+++ b/cobbler/remote.py (revision 8398a921c898744929afa1620efa70859d5463bb)
-@@ -731,6 +731,20 @@
- ):
- return return_value.name
- elif isinstance(return_value, dict):
-+ if (
-+ attribute == "interfaces"
-+ and len(return_value) > 0
-+ and all(
-+ isinstance(value, system.NetworkInterface)
-+ for value in return_value.values()
-+ )
-+ ):
-+ interface_return_value = {}
-+ for interface_name in return_value:
-+ interface_return_value[interface_name] = return_value[
-+ interface_name
-+ ].to_dict(resolved=True)
-+ return interface_return_value
- return self.xmlrpc_hacks(return_value)
-
- if not isinstance(
-Index: tests/xmlrpcapi/non_object_calls_test.py
-IDEA additional info:
-Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
-<+>UTF-8
-===================================================================
-diff --git a/tests/xmlrpcapi/non_object_calls_test.py b/tests/xmlrpcapi/non_object_calls_test.py
---- a/tests/xmlrpcapi/non_object_calls_test.py (revision cb840ce25e78aa26349e3b23065b0fdf78fbadbc)
-+++ b/tests/xmlrpcapi/non_object_calls_test.py (revision 8398a921c898744929afa1620efa70859d5463bb)
-@@ -195,6 +195,40 @@
- ("arch", "distro", "x86_64", does_not_raise()),
- ("distro", "profile", "testdistro_item_resolved_value", does_not_raise()),
- ("profile", "system", "testprofile_item_resolved_value", does_not_raise()),
-+ (
-+ "interfaces",
-+ "system",
-+ {
-+ "eth0": {
-+ "bonding_opts": "",
-+ "bridge_opts": "",
-+ "cnames": [],
-+ "connected_mode": False,
-+ "dhcp_tag": "",
-+ "dns_name": "",
-+ "if_gateway": "",
-+ "interface_master": "",
-+ "interface_type": "NA",
-+ "ip_address": "",
-+ "ipv6_address": "",
-+ "ipv6_default_gateway": "",
-+ "ipv6_mtu": "",
-+ "ipv6_prefix": "",
-+ "ipv6_secondaries": [],
-+ "ipv6_static_routes": [],
-+ "mac_address": "aa:bb:cc:dd:ee:ff",
-+ "management": False,
-+ "mtu": "",
-+ "netmask": "",
-+ "static": False,
-+ "static_routes": [],
-+ "virt_bridge": "",
-+ }
-+ },
-+ does_not_raise(),
-+ ),
-+ ("modify_interface", "system", {}, pytest.raises(ValueError)),
-+ ("doesnt_exist", "system", {}, pytest.raises(AttributeError)),
- ],
- )
- def test_get_item_resolved_value(
-@@ -223,6 +257,12 @@
- create_profile(name_profile, name_distro, "a=1 b=2 c=3 c=4 c=5 d e")
- test_system_handle = create_system(name_system, name_profile)
- remote.modify_system(test_system_handle, "kernel_options", "!c !e", token=token)
-+ remote.modify_system(
-+ test_system_handle,
-+ "modify_interface",
-+ {"macaddress-eth0": "aa:bb:cc:dd:ee:ff"},
-+ token=token,
-+ )
- if checked_object == "distro":
- test_item = remote.get_distro(name_distro, token=token)
- elif checked_object == "profile":
-
diff --git a/backport_kernel_regex_error_message.patch b/backport_kernel_regex_error_message.patch
deleted file mode 100644
index 32b7094..0000000
--- a/backport_kernel_regex_error_message.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-Index: cobbler/items/distro.py
-IDEA additional info:
-Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
-<+>UTF-8
-===================================================================
-diff --git a/cobbler/items/distro.py b/cobbler/items/distro.py
---- a/cobbler/items/distro.py (revision a211328ef9d13e37b89665aefad97071ada682fb)
-+++ b/cobbler/items/distro.py (revision de8bf224cef0040c3d26dd4be009fe2d87434223)
-@@ -164,7 +164,10 @@
- if not isinstance(kernel, str):
- raise TypeError("kernel was not of type str")
- if not utils.find_kernel(kernel):
-- raise ValueError("kernel not found: %s" % kernel)
-+ raise ValueError(
-+ "kernel not found or it does not match with allowed kernel filename pattern [%s]: %s."
-+ % (utils._re_kernel.pattern, kernel)
-+ )
- self._kernel = kernel
-
- @property
-Index: cobbler/utils.py
-===================================================================
-diff --git a/cobbler/utils.py b/cobbler/utils.py
---- a/cobbler/utils.py (revision a211328ef9d13e37b89665aefad97071ada682fb)
-+++ b/cobbler/utils.py (revision de8bf224cef0040c3d26dd4be009fe2d87434223)
-@@ -69,8 +69,8 @@
- MODULE_CACHE = {}
- SIGNATURE_CACHE = {}
-
--_re_kernel = re.compile(r'(vmlinu[xz]|(kernel|linux(\.img)?)|pxeboot\.n12|wimboot)')
--_re_initrd = re.compile(r'(initrd(.*)\.img|ramdisk\.image\.gz|boot\.sdi)')
-+_re_kernel = re.compile(r'(vmlinu[xz]|(kernel|linux(\.img)?)|pxeboot\.n12|wimboot|mboot\.c32|.+\.kernel)')
-+_re_initrd = re.compile(r'(initrd(.*)\.img|ramdisk\.image\.gz|boot\.sdi|imgpayld\.tgz)')
-
-
- class DHCP(enum.Enum):
-
diff --git a/cobbler-3.3.3.0+git.5c498dbf.obscpio b/cobbler-3.3.3.0+git.5c498dbf.obscpio
deleted file mode 120000
index 3239dde..0000000
--- a/cobbler-3.3.3.0+git.5c498dbf.obscpio
+++ /dev/null
@@ -1 +0,0 @@
-/ipfs/bafybeidkjmfexv6firaxpxasrme2yp2ahts77horfjnvme5kszr7n5dkde
\ No newline at end of file
diff --git a/cobbler-3.3.3.obscpio b/cobbler-3.3.3.obscpio
new file mode 120000
index 0000000..f6f3ec5
--- /dev/null
+++ b/cobbler-3.3.3.obscpio
@@ -0,0 +1 @@
+/ipfs/bafybeidxrc337zv5lbzmktwegli7pyznnhhsfljeo4glgoel4xgudlog6q
\ No newline at end of file
diff --git a/cobbler.changes b/cobbler.changes
index 64e7872..e04ec79 100644
--- a/cobbler.changes
+++ b/cobbler.changes
@@ -1,4 +1,44 @@
-------------------------------------------------------------------
+Wed May 17 15:40:31 UTC 2023 - Pablo Suárez Hernández
+
+- Fix package building with Sphinx >= 7.0.0
+- Switch packaging from patch based to Git tree based development
+- All patches that are being removed in this revision are contained in
+ the new Git tree.
+- Do generate boot menus even if no profiles or systems - only local boot
+- Avoid crashing running buildiso in certain conditions.
+- Fix settings migration schema to work while upgrading on existing running
+ Uyuni and SUSE Manager servers running with old Cobbler settings (bsc#1203478)
+- Consider case of "next_server" being a hostname during migration
+ of Cobbler collections.
+- Fix problem with "proxy_url_ext" setting being None type.
+- Update v2 to v3 migration script to allow migration of collections
+ that contains settings from Cobbler 2. (bsc#1203478)
+- Fix problem for the migration of "autoinstall" collection attribute.
+- Fix failing Cobbler tests after upgrading to 3.3.3.
+- Fix regression: allow empty string as interface_type value (bsc#1203478)
+- Avoid possible override of existing values during migration
+ of collections to 3.0.0 (bsc#1206160)
+- Add new "cobbler-tests-containers" subpackage which contains setup and
+ configuration files to run Cobbler tests in containers.
+- Add missing code for previous patch file around boot_loaders migration.
+- Improve Cobbler performance with item cache and threadpool (bsc#1205489)
+- Skip collections that are inconsistent instead of crashing (bsc#1205749)
+- Items: Fix creation of "default" NetworkInterface (bsc#1206520)
+- S390X systems require their kernel options to have a linebreak at
+ 79 characters (bsc#1207595)
+- settings-migration-v1-to-v2.sh will now handle paths with whitespace
+ correct
+- Fix renaming Cobbler items (bsc#1204900, bsc#1209149)
+- Fix cobbler buildiso so that the artifact can be booted by EFI firmware.
+ (bsc#1206060)
+- Add input_string_*, input_boolean, input_int functiont to public API
+
+- Removed:
+ * backport_complex_xmlrpc_objects_and_logger_spam.patch
+ * backport_kernel_regex_error_message.patch
+
+-------------------------------------------------------------------
Thu Jul 21 08:52:17 UTC 2022 - Enno Gotthold
- Fix issue that a custom kernel with the extension ".kernel" is not
diff --git a/cobbler.obsinfo b/cobbler.obsinfo
index 4433f05..3866f00 100644
--- a/cobbler.obsinfo
+++ b/cobbler.obsinfo
@@ -1,4 +1,4 @@
name: cobbler
-version: 3.3.3.0+git.5c498dbf
-mtime: 1654185693
-commit: 5c498dbf2af6e3782b37605a477759e1aacc16b2
+version: 3.3.3
+mtime: 1684337086
+commit: d6c763f7d66fb7bde900720633c4caa7ee7ccb10
diff --git a/cobbler.spec b/cobbler.spec
index d5681c3..64329aa 100644
--- a/cobbler.spec
+++ b/cobbler.spec
@@ -1,6 +1,7 @@
#
# spec file for package cobbler
#
+# Copyright (c) 2023 SUSE LLC
# Copyright (c) 2006 Michael DeHaan
#
# All modifications and additions to the file contributed by third parties
@@ -21,6 +22,7 @@
# - Ubuntu: 18.04
#
# If it doesn't build on the Open Build Service (OBS) it's a bug.
+# Please submit bugfixes or comments via https://bugs.opensuse.org/
#
# Force bash instead of Debian dash
@@ -67,7 +69,7 @@
%define apache_group www
%define apache_dir /srv/www
-%define apache_webconfigdir /etc/apache2/vhosts.d
+%define apache_webconfigdir /etc/apache2/conf.d
%define apache_mod_wsgi apache2-mod_wsgi-python%{python3_pkgversion}
%define tftpboot_dir /srv/tftpboot
@@ -151,7 +153,7 @@
%endif
Name: cobbler
-Version: 3.3.3.0+git.5c498dbf
+Version: 3.3.3
Release: 0%{?dist}
Summary: Boot server configurator
URL: https://cobbler.github.io/
@@ -168,11 +170,6 @@ Group: Development/System
License: GPL-2.0-or-later
Source: %{name}-%{version}.tar.gz
-####################
-# Already merged upstream
-Patch0: backport_complex_xmlrpc_objects_and_logger_spam.patch
-# Already merged upstream
-Patch1: backport_kernel_regex_error_message.patch
BuildArch: noarch
BuildRequires: git-core
@@ -227,6 +224,7 @@ Requires: %{createrepo_pkg}
Requires: fence-agents
Requires: rsync
Requires: xorriso
+Requires: dosfstools
%{?python_enable_dependency_generator}
%if ! (%{defined python_enable_dependency_generator} || %{defined python_disable_dependency_generator})
Requires: %{py3_module_cheetah}
@@ -283,10 +281,16 @@ Requires: cobbler = %{version}-%{release}
%description tests
Unit test files from the Cobbler project
+%package tests-containers
+Summary: Dockerfiles and scripts to setup testing containers
+Requires: cobbler = %{version}-%{release}
+
+%description tests-containers
+Dockerfiles and scripts to setup testing containers
+
%prep
%setup
-%autopatch -p1
%if 0%{?suse_version}
# Set tftpboot location correctly for SUSE distributions
@@ -310,6 +314,7 @@ sed -e "s|/var/lib/tftpboot|%{tftpboot_dir}|g" -i config/cobbler/settings.yaml
[ "${TFTPROOT}" != %{tftpboot_dir} ] && echo "ERROR: TFTPROOT: ${TFTPROOT} does not match %{tftpboot_dir}"
%py3_build
+make man
%install
. distro_build_configs.sh
@@ -419,6 +424,8 @@ chgrp %{apache_group} %{_sysconfdir}/cobbler/settings.yaml
%config(noreplace) %{_sysconfdir}/cobbler/import_rsync_whitelist
%dir %{_sysconfdir}/cobbler/iso
%config(noreplace) %{_sysconfdir}/cobbler/iso/buildiso.template
+%config(noreplace) %{_sysconfdir}/cobbler/iso/isolinux_menuentry.template
+%config(noreplace) %{_sysconfdir}/cobbler/iso/grub_menuentry.template
%config(noreplace) %{_sysconfdir}/cobbler/logging_config.conf
%attr(640, root, root) %config(noreplace) %{_sysconfdir}/cobbler/modules.conf
%attr(600, root, root) %config(noreplace) %{_sysconfdir}/cobbler/mongodb.conf
@@ -486,6 +493,10 @@ chgrp %{apache_group} %{_sysconfdir}/cobbler/settings.yaml
%dir %{_datadir}/cobbler/tests
%{_datadir}/cobbler/tests/*
+%files tests-containers
+%dir %{_datadir}/cobbler/docker
+%{_datadir}/cobbler/docker/*
+
%changelog
* Thu Dec 19 2019 Neal Gompa
- Initial rewrite of packaging