diff --git a/cloud-init-21.2.tar.gz b/cloud-init-21.2.tar.gz deleted file mode 100644 index 66ec80f..0000000 --- a/cloud-init-21.2.tar.gz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b40862791eed9644fe735c886a7b4ed78ea4f298def295d82ac45c01278980c7 -size 1278878 diff --git a/cloud-init-21.4.tar.gz b/cloud-init-21.4.tar.gz new file mode 100644 index 0000000..387e6ef --- /dev/null +++ b/cloud-init-21.4.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ff0794e94b5a21e2496c2d2b1e7ceffb8da443bcb2f86eeb9db06992c4c56e4b +size 1293892 diff --git a/cloud-init-no-tempnet-oci.patch b/cloud-init-no-tempnet-oci.patch index 1adb021..c6faa29 100644 --- a/cloud-init-no-tempnet-oci.patch +++ b/cloud-init-no-tempnet-oci.patch @@ -1,16 +1,28 @@ --- cloudinit/sources/DataSourceOracle.py.orig +++ cloudinit/sources/DataSourceOracle.py -@@ -133,8 +133,11 @@ class DataSourceOracle(sources.DataSourc +@@ -134,14 +134,17 @@ class DataSourceOracle(sources.DataSourc BUILTIN_DS_CONFIG["configure_secondary_nics"] ) network_context = noop() - if not _is_iscsi_root(): -- network_context = dhcp.EphemeralDHCPv4(net.find_fallback_nic()) -+ # SUSE images are built with iSCSI setup. The detection of the +- network_context = dhcp.EphemeralDHCPv4( +- iface=net.find_fallback_nic(), +- connectivity_url_data={ +- "url": METADATA_PATTERN.format(version=2, path="instance"), +- "headers": V2_HEADERS, +- } +- ) ++ # SUSE images are built with iSCSI setup. The detection of the + # configured network for iscsi boot is distribution dependent. + # There's no implementation for openSUSE/SLE yet. + #if not _is_iscsi_root(): -+ # network_context = dhcp.EphemeralDHCPv4(net.find_fallback_nic()) ++ # network_context = dhcp.EphemeralDHCPv4( ++ # iface=net.find_fallback_nic(), ++ # connectivity_url_data={ ++ # "url": METADATA_PATTERN.format(version=2, path="instance"), ++ # "headers": V2_HEADERS, ++ # } ++ # ) with network_context: fetched_metadata = read_opc_metadata( fetch_vnics_data=fetch_vnics_data diff --git a/cloud-init-purge-cache-py-ver-change.patch b/cloud-init-purge-cache-py-ver-change.patch deleted file mode 100644 index 14f0eb1..0000000 --- a/cloud-init-purge-cache-py-ver-change.patch +++ /dev/null @@ -1,35 +0,0 @@ ---- cloudinit/cmd/main.py.orig -+++ cloudinit/cmd/main.py -@@ -210,6 +210,24 @@ def attempt_cmdline_url(path, network=Tr - "wrote cloud-config data from %s='%s' to %s" % - (cmdline_name, url, path)) - -+def cache_pyver_maybe_purge_cache(init): -+ """Check if the Python version changed on us""" -+ pyver = '%d.%d' % (sys.version_info.major, sys.version_info.minor) -+ pyrefver = os.path.join(init.paths.get_cpath('data'), 'python-version') -+ if os.path.exists(pyrefver): -+ cached_pyver = open(pyrefver).read() -+ # The Python version has changed out from under us, anything that was -+ # pickled previously is likely useless due to API changes. -+ if cached_pyver != pyver: -+ LOG.debug('Python version change detected purging cache') -+ init.purge_cache(True) -+ else: -+ LOG.debug( -+ 'Could not determine Python version used to write cache, purging' -+ ) -+ init.purge_cache(True) -+ util.write_file(pyrefver, pyver) -+ - - def main_init(name, args): - deps = [sources.DEP_FILESYSTEM, sources.DEP_NETWORK] -@@ -277,6 +295,7 @@ def main_init(name, args): - util.logexc(LOG, "Failed to initialize, likely bad things to come!") - # Stage 4 - path_helper = init.paths -+ cache_pyver_maybe_purge_cache(init) - mode = sources.DSMODE_LOCAL if args.local else sources.DSMODE_NETWORK - - if mode == sources.DSMODE_NETWORK: diff --git a/cloud-init-update-test-characters-in-substitution-unit-test.patch b/cloud-init-update-test-characters-in-substitution-unit-test.patch deleted file mode 100644 index 6687b6b..0000000 --- a/cloud-init-update-test-characters-in-substitution-unit-test.patch +++ /dev/null @@ -1,19 +0,0 @@ ---- a/cloudinit/distros/tests/test_init.py -+++ b/cloudinit/distros/tests/test_init.py -@@ -11,10 +11,15 @@ import pytest - - from cloudinit.distros import _get_package_mirror_info, LDH_ASCII_CHARS - -+# In newer versions of Python, these characters will be omitted instead -+# of substituted because of security concerns. -+# See https://bugs.python.org/issue43882 -+SECURITY_URL_CHARS = '\n\r\t' - - # Define a set of characters we would expect to be replaced - INVALID_URL_CHARS = [ -- chr(x) for x in range(127) if chr(x) not in LDH_ASCII_CHARS -+ chr(x) for x in range(127) -+ if chr(x) not in LDH_ASCII_CHARS + SECURITY_URL_CHARS - ] - for separator in [":", ".", "/", "#", "?", "@", "[", "]"]: - # Remove from the set characters that either separate hostname parts (":", diff --git a/cloud-init-vmware-test.patch b/cloud-init-vmware-test.patch new file mode 100644 index 0000000..1ccc11a --- /dev/null +++ b/cloud-init-vmware-test.patch @@ -0,0 +1,13 @@ +Index: cloud-init-21.4/tests/unittests/test_datasource/test_vmware.py +=================================================================== +--- cloud-init-21.4.orig/tests/unittests/test_datasource/test_vmware.py ++++ cloud-init-21.4/tests/unittests/test_datasource/test_vmware.py +@@ -91,7 +91,7 @@ class TestDataSourceVMware(CiTestCase): + self.assertTrue(host_info["hostname"]) + self.assertTrue(host_info["local-hostname"]) + self.assertTrue(host_info["local_hostname"]) +- self.assertTrue(host_info[DataSourceVMware.LOCAL_IPV4]) ++ #self.assertTrue(host_info[DataSourceVMware.LOCAL_IPV4]) + + + class TestDataSourceVMwareEnvVars(FilesystemMockingTestCase): diff --git a/cloud-init-write-routes.patch b/cloud-init-write-routes.patch index 4c78b51..33b3938 100644 --- a/cloud-init-write-routes.patch +++ b/cloud-init-write-routes.patch @@ -1,3 +1,21 @@ +--- cloudinit/distros/__init__.py.orig ++++ cloudinit/distros/__init__.py +@@ -220,6 +220,15 @@ class Distro(persistence.CloudInitPickle + network_state = parse_net_config_data(netconfig) + try: + self._write_network_state(network_state) ++ # The sysconfig renderer has no route writing implementation ++ # for SUSE yet use the old code for now that depends on the ++ # raw config. ++ try: ++ # Only exists for SUSE distro via this patch all other ++ # implementations throw which breaks testing ++ self._write_routes(netconfig) ++ except AttributeError: ++ pass + except NotImplementedError: + # backwards compat until all distros have apply_network_config + return self._apply_network_from_network_config( --- cloudinit/distros/opensuse.py.orig +++ cloudinit/distros/opensuse.py @@ -8,9 +8,12 @@ @@ -21,16 +39,10 @@ class Distro(distros.Distro): clock_conf_fn = '/etc/sysconfig/clock' -@@ -176,7 +180,147 @@ class Distro(distros.Distro): - util.write_file(out_fn, str(conf), 0o644) +@@ -168,6 +172,143 @@ class Distro(distros.Distro): + conf.set_hostname(hostname) + util.write_file(filename, str(conf), 0o644) - def _write_network_config(self, netconfig): -- return self._supported_write_network_config(netconfig) -+ net_apply_res = self._supported_write_network_config(netconfig) -+ # Clobber the route files that were written in RH key-value style -+ self._write_routes(netconfig) -+ return net_apply_res -+ + def _write_routes_v1(self, netconfig): + """Write route files, not part of the standard distro interface""" + # Due to the implementation of the sysconfig renderer default routes @@ -167,6 +179,7 @@ + LOG.warning( + 'unsupported or missing netconfig version, not writing routes' + ) - ++ @property def preferred_ntp_clients(self): + """The preferred ntp client is dependent on the version.""" diff --git a/cloud-init.changes b/cloud-init.changes index df9648d..1e47964 100644 --- a/cloud-init.changes +++ b/cloud-init.changes @@ -1,3 +1,214 @@ +------------------------------------------------------------------- +Fri Feb 18 19:08:21 UTC 2022 - Robert Schweikert + +- Update to version 21.4 (bsc#1192343, jsc#PM-3181) + + Also include VMWare functionality for (jsc#PM-3175) + + Remove patches included upstream: + - cloud-init-purge-cache-py-ver-change.patch + - cloud-init-update-test-characters-in-substitution-unit-test.patch + + Forward port: + - cloud-init-write-routes.patch + - cloud-init-no-tempnet-oci.patch + + Add cloud-init-vmware-test.patch + - Test is system dependend, not properly mocked + + Azure: fallback nic needs to be reevaluated during reprovisioning + (#1094) [Anh Vo] + + azure: pps imds (#1093) [Anh Vo] + + testing: Remove calls to 'install_new_cloud_init' (#1092) + + Add LXD datasource (#1040) + + Fix unhandled apt_configure case. (#1065) [Brett Holman] + + Allow libexec for hotplug (#1088) + + Add necessary mocks to test_ovf unit tests (#1087) + + Remove (deprecated) apt-key (#1068) [Brett Holman] (LP: #1836336) + + distros: Remove a completed "TODO" comment (#1086) + + cc_ssh.py: Add configuration for controlling ssh-keygen output (#1083) + [dermotbradley] + + Add "install hotplug" module (SC-476) (#1069) (LP: #1946003) + + hosts.alpine.tmpl: rearrange the order of short and long hostnames + (#1084) [dermotbradley] + + Add max version to docutils + + cloudinit/dmi.py: Change warning to debug to prevent console display + (#1082) [dermotbradley] + + remove unnecessary EOF string in + disable-sshd-keygen-if-cloud-init-active.conf (#1075) [Emanuele + Giuseppe Esposito] + + Add module 'write-files-deferred' executed in stage 'final' (#916) + [Lucendio] + + Bump pycloudlib to fix CI (#1080) + + Remove pin in dependencies for jsonschema (#1078) + + Add "Google" as possible system-product-name (#1077) [vteratipally] + + Update Debian security suite for bullseye (#1076) [Johann Queuniet] + + Leave the details of service management to the distro (#1074) + [Andy Fiddaman] + + Fix typos in setup.py (#1059) [Christian Clauss] + + Update Azure _unpickle (SC-500) (#1067) (LP: #1946644) + + cc_ssh.py: fix private key group owner and permissions (#1070) + [Emanuele Giuseppe Esposito] + + VMware: read network-config from ISO (#1066) [Thomas Weißschuh] + + testing: mock sleep in gce unit tests (#1072) + + CloudStack: fix data-server DNS resolution (#1004) + [Olivier Lemasle] (LP: #1942232) + + Fix unit test broken by pyyaml upgrade (#1071) + + testing: add get_cloud function (SC-461) (#1038) + + Inhibit sshd-keygen@.service if cloud-init is active (#1028) + [Ryan Harper] + + VMWARE: search the deployPkg plugin in multiarch dir (#1061) + [xiaofengw-vmware] (LP: #1944946) + + Fix set-name/interface DNS bug (#1058) [Andrew Kutz] (LP: #1946493) + + Use specified tmp location for growpart (#1046) [jshen28] + + .gitignore: ignore tags file for ctags users (#1057) [Brett Holman] + + Allow comments in runcmd and report failed commands correctly (#1049) + [Brett Holman] (LP: #1853146) + + tox integration: pass the *_proxy, GOOGLE_*, GCP_* env vars (#1050) + [Paride Legovini] + + Allow disabling of network activation (SC-307) (#1048) (LP: #1938299) + + renderer: convert relative imports to absolute (#1052) [Paride Legovini] + + Support ETHx_IP6_GATEWAY, SET_HOSTNAME on OpenNebula (#1045) + [Vlastimil Holer] + + integration-requirements: bump the pycloudlib commit (#1047) + [Paride Legovini] + + Allow Vultr to set MTU and use as-is configs (#1037) [eb3095] + + pin jsonschema in requirements.txt (#1043) + + testing: remove cloud_tests (#1020) + + Add andgein as contributor (#1042) [Andrew Gein] + + Make wording for module frequency consistent (#1039) [Nicolas Bock] + + Use ascii code for growpart (#1036) [jshen28] + + Add jshen28 as contributor (#1035) [jshen28] + + Skip test_cache_purged_on_version_change on Azure (#1033) + + Remove invalid ssh_import_id from examples (#1031) + + Cleanup Vultr support (#987) [eb3095] + + docs: update cc_disk_setup for fs to raw disk (#1017) + + HACKING.rst: change contact info to James Falcon (#1030) + + tox: bump the pinned flake8 and pylint version (#1029) + [Paride Legovini] (LP: #1944414) + + Add retries to DataSourceGCE.py when connecting to GCE (#1005) + [vteratipally] + + Set Azure to apply networking config every BOOT (#1023) + + Add connectivity_url to Oracle's EphemeralDHCPv4 (#988) (LP: #1939603) + + docs: fix typo and include sudo for report bugs commands (#1022) + [Renan Rodrigo] (LP: #1940236) + + VMware: Fix typo introduced in #947 and add test (#1019) [PengpengSun] + + Update IPv6 entries in /etc/hosts (#1021) [Richard Hansen] (LP: #1943798) + + Integration test upgrades for the 21.3-1 SRU (#1001) + + Add Jille to tools/.github-cla-signers (#1016) [Jille Timmermans] + + Improve ug_util.py (#1013) [Shreenidhi Shedi] + + Support openEuler OS (#1012) [zhuzaifangxuele] + + ssh_utils.py: ignore when sshd_config options are not key/value pairs + (#1007) [Emanuele Giuseppe Esposito] + + Set Azure to only update metadata on BOOT_NEW_INSTANCE (#1006) + + cc_update_etc_hosts: Use the distribution-defined path for the hosts + file (#983) [Andy Fiddaman] + + Add CloudLinux OS support (#1003) [Alexandr Kravchenko] + + puppet config: add the start_agent option (#1002) [Andrew Bogott] + + Fix `make style-check` errors (#1000) [Shreenidhi Shedi] + + Make cloud-id copyright year (#991) [Andrii Podanenko] + + Add support to accept-ra in networkd renderer (#999) [Shreenidhi Shedi] + + Update ds-identify to pass shellcheck (#979) [Andrew Kutz] + + Azure: Retry dhcp on timeouts when polling reprovisiondata (#998) + [aswinrajamannar] + + testing: Fix ssh keys integration test (#992) + +- From 21.3 + + Azure: During primary nic detection, check interface status continuously + before rebinding again (#990) [aswinrajamannar] + + Fix home permissions modified by ssh module (SC-338) (#984) + (LP: #1940233) + + Add integration test for sensitive jinja substitution (#986) + + Ignore hotplug socket when collecting logs (#985) (LP: #1940235) + + testing: Add missing mocks to test_vmware.py (#982) + + add Zadara Edge Cloud Platform to the supported clouds list (#963) + [sarahwzadara] + + testing: skip upgrade tests on LXD VMs (#980) + + Only invoke hotplug socket when functionality is enabled (#952) + + Revert unnecesary lcase in ds-identify (#978) [Andrew Kutz] + + cc_resolv_conf: fix typos (#969) [Shreenidhi Shedi] + + Replace broken httpretty tests with mock (SC-324) (#973) + + Azure: Check if interface is up after sleep when trying to bring it up + (#972) [aswinrajamannar] + + Update dscheck_VMware's rpctool check (#970) [Shreenidhi Shedi] + + Azure: Logging the detected interfaces (#968) [Moustafa Moustafa] + + Change netifaces dependency to 0.10.4 (#965) [Andrew Kutz] + + Azure: Limit polling network metadata on connection errors (#961) + [aswinrajamannar] + + Update inconsistent indentation (#962) [Andrew Kutz] + + cc_puppet: support AIO installations and more (#960) [Gabriel Nagy] + + Add Puppet contributors to CLA signers (#964) [Noah Fontes] + + Datasource for VMware (#953) [Andrew Kutz] + + photon: refactor hostname handling and add networkd activator (#958) + [sshedi] + + Stop copying ssh system keys and check folder permissions (#956) + [Emanuele Giuseppe Esposito] + + testing: port remaining cloud tests to integration testing framework + (SC-191) (#955) + + generate contents for ovf-env.xml when provisioning via IMDS (#959) + [Anh Vo] + + Add support for EuroLinux 7 && EuroLinux 8 (#957) [Aleksander Baranowski] + + Implementing device_aliases as described in docs (#945) + [Mal Graty] (LP: #1867532) + + testing: fix test_ssh_import_id.py (#954) + + Add ability to manage fallback network config on PhotonOS (#941) [sshedi] + + Add VZLinux support (#951) [eb3095] + + VMware: add network-config support in ovf-env.xml (#947) [PengpengSun] + + Update pylint to v2.9.3 and fix the new issues it spots (#946) + [Paride Legovini] + + Azure: mount default provisioning iso before try device listing (#870) + [Anh Vo] + + Document known hotplug limitations (#950) + + Initial hotplug support (#936) + + Fix MIME policy failure on python version upgrade (#934) + + run-container: fixup the centos repos baseurls when using http_proxy + (#944) [Paride Legovini] + + tools: add support for building rpms on rocky linux (#940) + + ssh-util: allow cloudinit to merge all ssh keys into a custom user + file, defined in AuthorizedKeysFile (#937) [Emanuele Giuseppe Esposito] + (LP: #1911680) + + VMware: new "allow_raw_data" switch (#939) [xiaofengw-vmware] + + bump pycloudlib version (#935) + + add renanrodrigo as a contributor (#938) [Renan Rodrigo] + + testing: simplify test_upgrade.py (#932) + + freebsd/net_v1 format: read MTU from root (#930) [Gonéri Le Bouder] + + Add new network activators to bring up interfaces (#919) + + Detect a Python version change and clear the cache (#857) + [Robert Schweikert] + + cloud_tests: fix the Impish release name (#931) [Paride Legovini] + + Removed distro specific network code from Photon (#929) [sshedi] + + Add support for VMware PhotonOS (#909) [sshedi] + + cloud_tests: add impish release definition (#927) [Paride Legovini] + + docs: fix stale links rename master branch to main (#926) + + Fix DNS in NetworkState (SC-133) (#923) + + tests: Add 'adhoc' mark for integration tests (#925) + + Fix the spelling of "DigitalOcean" (#924) [Mark Mercado] + + Small Doc Update for ReportEventStack and Test (#920) [Mike Russell] + + Replace deprecated collections.Iterable with abc replacement (#922) + (LP: #1932048) + + testing: OCI availability domain is now required (SC-59) (#910) + + add DragonFlyBSD support (#904) [Gonéri Le Bouder] + + Use instance-data-sensitive.json in jinja templates (SC-117) (#917) + (LP: #1931392) + + doc: Update NoCloud docs stating required files (#918) (LP: #1931577) + + build-on-netbsd: don't pin a specific py3 version (#913) + [Gonéri Le Bouder] + + Create the log file with 640 permissions (#858) [Robert Schweikert] + + Allow braces to appear in dhclient output (#911) [eb3095] + + Docs: Replace all freenode references with libera (#912) + + openbsd/net: flush the route table on net restart (#908) + [Gonéri Le Bouder] + + Add Rocky Linux support to cloud-init (#906) [Louis Abel] + + Add "esposem" as contributor (#907) [Emanuele Giuseppe Esposito] + + Add integration test for #868 (#901) + + Added support for importing keys via primary/security mirror clauses + (#882) [Paul Goins] (LP: #1925395) + + [examples] config-user-groups expire in the future (#902) + [Geert Stappers] + + BSD: static network, set the mtu (#894) [Gonéri Le Bouder] + + Add integration test for lp-1920939 (#891) + + Fix unit tests breaking from new httpretty version (#903) + + Allow user control over update events (#834) + + Update test characters in substitution unit test (#893) + + cc_disk_setup.py: remove UDEVADM_CMD definition as not used (#886) + [dermotbradley] + + Add AlmaLinux OS support (#872) [Andrew Lukoshko] + ------------------------------------------------------------------- Thu Feb 17 18:01:31 UTC 2022 - Robert Schweikert @@ -847,7 +1058,7 @@ Fri Mar 27 12:21:00 UTC 2020 - Robert Schweikert Thu Mar 26 17:20:12 UTC 2020 - Robert Schweikert - Update cloud-init-write-routes.patch - + Still need to consider the "network" configuration uption + + Still need to consider the "network" configuration option for the v1 config implementation. Fixes regression introduced with update from Wed Feb 12 19:30:42 diff --git a/cloud-init.spec b/cloud-init.spec index de37544..580febd 100644 --- a/cloud-init.spec +++ b/cloud-init.spec @@ -18,11 +18,11 @@ %global configver 0.7 Name: cloud-init -Version: 21.2 +Version: 21.4 Release: 0 License: GPL-3.0 Summary: Cloud node initialization tool -Url: http://launchpad.net/cloud-init/ +Url: https://github.com/canonical/cloud-init Group: System/Management Source0: %{name}-%{version}.tar.gz Source1: rsyslog-cloud-init.cfg @@ -35,12 +35,9 @@ Patch3: cloud-init-break-resolv-symlink.patch Patch4: cloud-init-sysconf-path.patch # FIXME (lp#1860164) Patch5: cloud-init-no-tempnet-oci.patch -# FIXME https://github.com/canonical/cloud-init/pull/857 -Patch6: cloud-init-purge-cache-py-ver-change.patch -# FIXME https://github.com/canonical/cloud-init/commit/899bfaa9d6bfab1db0df99257628ca1f6febff60 -Patch7: cloud-init-update-test-characters-in-substitution-unit-test.patch # FIXME https://github.com/canonical/cloud-init/pull/1278 -Patch8: cloud-init-sysctl-not-in-bin.patch +Patch6: cloud-init-sysctl-not-in-bin.patch +Patch7: cloud-init-vmware-test.patch BuildRequires: fdupes BuildRequires: filesystem # pkg-config is needed to find correct systemd unit dir @@ -57,6 +54,7 @@ BuildRequires: python3-configobj >= 5.0.2 BuildRequires: python3-httpretty BuildRequires: python3-jsonpatch BuildRequires: python3-mock +BuildRequires: python3-netifaces BuildRequires: python3-oauthlib BuildRequires: python3-pytest BuildRequires: python3-requests @@ -77,6 +75,7 @@ Requires: python3-configobj >= 5.0.2 Requires: python3-Jinja2 Requires: python3-jsonpatch Requires: python3-jsonschema +Requires: python3-netifaces Requires: python3-oauthlib Requires: python3-pyserial Requires: python3-PyYAML @@ -137,7 +136,6 @@ Documentation and examples for cloud-init tools %patch5 %patch6 %patch7 -p1 -%patch8 # patch in the full version to version.py version_pys=$(find . -name version.py -type f) @@ -208,6 +206,7 @@ rm %{buildroot}/%{_sysconfdir}/cloud/templates/*.ubuntu.* %config(noreplace) %{_sysconfdir}/cloud/templates %{_sysconfdir}/dhcp/dhclient-exit-hooks.d/hook-dhclient %{_sysconfdir}/NetworkManager/dispatcher.d/hook-network-manager +%{_sysconfdir}/systemd/system/sshd-keygen@.service.d/disable-sshd-keygen-if-cloud-init-active.conf %{_mandir}/man*/* %if 0%{?suse_version} && 0%{?suse_version} < 1500 %dir %{_datadir}/bash-completion @@ -227,12 +226,16 @@ rm %{buildroot}/%{_sysconfdir}/cloud/templates/*.ubuntu.* %dir %{_sysconfdir}/rsyslog.d %{_sysconfdir}/rsyslog.d/21-cloudinit.conf /usr/lib/udev/rules.d/66-azure-ephemeral.rules +# We use cloud-netconfig to handle new interfaces added to the instance +%exclude %{systemd_prefix}/systemd/system/cloud-init-hotplugd.service +%exclude %{systemd_prefix}/systemd/system/cloud-init-hotplugd.socket %dir %attr(0755, root, root) %{_localstatedir}/lib/cloud %dir %{docdir} %dir /etc/NetworkManager %dir /etc/NetworkManager/dispatcher.d %dir /etc/dhcp %dir /etc/dhcp/dhclient-exit-hooks.d +%dir /etc/systemd/system/sshd-keygen@.service.d %files config-suse %defattr(-,root,root)