diff --git a/cloud-init.changes b/cloud-init.changes index 11c21d7..ffeb7a5 100644 --- a/cloud-init.changes +++ b/cloud-init.changes @@ -1,3 +1,43 @@ +------------------------------------------------------------------- +Mon Jul 7 17:21:54 UTC 2014 - rschweikert@suse.com + +- fix "typo" the rhel_util module is imported as rhutil, use the + proper name when accessing (modifies suseIntegratedHandler.patch) + +------------------------------------------------------------------- +Thu Jun 26 18:53:21 UTC 2014 - rschweikert@suse.com + +- add rsyslog filter rule to send cloud-init messages to + /var/log/cloud-init.log + +------------------------------------------------------------------- +Wed Jun 25 22:24:31 UTC 2014 - rschweikert@suse.com + +- initialize variable in method setting the instance hostname (BNC #884392) + modifies: suseIntegratedHandler.patch + +------------------------------------------------------------------- +Tue Jun 24 19:49:34 UTC 2014 - rschweikert@suse.com + +- add the python magic for package build on SLE 11 + +------------------------------------------------------------------- +Tue Jun 24 19:23:07 UTC 2014 - rschweikert@suse.com + +- add more dependencies to ensure commands used by the scripts are present +- add dynamicInitCmd.diff + + support diffirent init systems across distribution versions for + service restart +- add suseSetInitCmd.patch + + properly setup the init command to support proper service restart + +------------------------------------------------------------------- +Fri Jun 20 17:59:37 UTC 2014 - rschweikert@suse.com + +- integrate openSUSE and SLE handler code + + remove openSUSEHandler.diff + + add suseIntegratedHandler.patch + ------------------------------------------------------------------- Mon Apr 14 18:58:18 UTC 2014 - rschweikert@suse.com diff --git a/cloud-init.spec b/cloud-init.spec index 3e25d48..15f07b4 100644 --- a/cloud-init.spec +++ b/cloud-init.spec @@ -24,16 +24,27 @@ Url: http://launchpad.net/cloud-init/ Group: System/Management Source0: %{name}-%{version}.tar.gz Source1: cloud.cfg.suse +Source2: rsyslog-cloud-init.cfg Patch0: suseSysVInit.diff +# FIXME addopenSUSEBase.patch proposed for upstream merge Patch1: addopenSUSEBase.patch -Patch2: openSUSEHandler.diff +# FIXME suseIntegratedHandler.patch proposed for upstream merge +Patch2: suseIntegratedHandler.patch Patch3: setupSUSEsysVInit.diff +# FIXME openSUSEhostsTemplate.diff proposed for upstream merge Patch5: openSUSEhostsTemplate.diff +# FIXME dynamicInitCmd.patch proposed for upstream merge +Patch6: dynamicInitCmd.diff +# FIXME suseSetInitCmd.patch send upstream once the SUSE handlers are accepted +Patch7: suseSetInitCmd.patch BuildRequires: fdupes BuildRequires: filesystem BuildRequires: python-devel BuildRequires: python-setuptools +Requires: bash +Requires: file Requires: growpart +Requires: openssh Requires: python-argparse Requires: python-boto >= 2.7 Requires: python-cheetah @@ -46,9 +57,12 @@ Requires: python-PyYAML Requires: python-requests Requires: python-xml Requires: python-yaml +Requires: sudo +Requires: util-linux BuildRoot: %{_tmppath}/%{name}-%{version}-build %define docdir %{_defaultdocdir}/%{name} %if 0%{?suse_version} && 0%{?suse_version} <= 1110 +%{!?python_sitelib: %global python_sitelib %(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")} %else BuildArch: noarch %endif @@ -57,6 +71,7 @@ BuildArch: noarch %else %define initsys systemd BuildRequires: systemd +Requires: systemd %{?systemd_requires} %if 0%{?suse_version} && 0%{?suse_version} == 1220 %define systemd_prefix /lib @@ -64,6 +79,15 @@ BuildRequires: systemd %define systemd_prefix /usr/lib %endif %endif +%if 0%{?suse_version} && 0%{?suse_version} >= 1315 +Requires: wicked-service +%else +%if 0%{?suse_version} && 0%{?suse_version} <= 1110 +Requires: sysconfig +%else +Requires: sysconfig-network +%endif +%endif %description Cloud-init is an init script that initializes a cloud node (VM) @@ -95,9 +119,11 @@ Unit tests for the cloud-init tools %setup -q %patch0 -p1 %patch1 -p1 -%patch2 -p1 +%patch2 %patch3 -p1 %patch5 +%patch6 +%patch7 %if 0%{?suse_version} <= 1130 # disable ecdsa for SLE 11 (not available) @@ -138,6 +164,10 @@ sed -i s/INSERT_SUSE_DISTRO/opensuse/ %{buildroot}/%{_sysconfdir}/cloud/cloud.cf %endif %endif %endif +%if 0%{?suse_version} && 0%{?suse_version} > 1110 +mkdir %{buildroot}/%{_sysconfdir}/rsyslog.d +cp -a %{SOURCE2} %{buildroot}/%{_sysconfdir}/rsyslog.d/21-cloudinit.conf +%endif # remove debian/ubuntu specific profile.d file (bnc#779553) rm -f %{buildroot}%{_sysconfdir}/profile.d/Z99-cloud-locale-test.sh @@ -192,8 +222,12 @@ popd %{systemd_prefix}/systemd/system/cloud-init.service %{systemd_prefix}/systemd/system/cloud-final.service %endif +%if 0%{?suse_version} && 0%{?suse_version} > 1110 +%{_sysconfdir}/rsyslog.d/21-cloudinit.conf +%endif %dir %attr(0755, root, root) %{_localstatedir}/lib/cloud %dir %{docdir} +%dir %{_sysconfdir}/rsyslog.d %files doc %defattr(-,root,root) diff --git a/dynamicInitCmd.diff b/dynamicInitCmd.diff new file mode 100644 index 0000000..22180de --- /dev/null +++ b/dynamicInitCmd.diff @@ -0,0 +1,27 @@ +=== modified file 'cloudinit/config/cc_set_passwords.py' +--- cloudinit/config/cc_set_passwords.py 2014-02-06 21:38:30 +0000 ++++ cloudinit/config/cc_set_passwords.py 2014-06-24 18:39:33 +0000 +@@ -136,7 +136,7 @@ + util.write_file(ssh_util.DEF_SSHD_CFG, "\n".join(lines)) + + try: +- cmd = cloud.distro.init_cmd # Default service ++ cmd = cloud.distro.get_init_cmd() + cmd.append(cloud.distro.get_option('ssh_svcname', 'ssh')) + cmd.append('restart') + if 'systemctl' in cmd: # Switch action ordering + +=== modified file 'cloudinit/distros/__init__.py' +--- cloudinit/distros/__init__.py 2014-02-12 19:56:55 +0000 ++++ cloudinit/distros/__init__.py 2014-06-24 18:39:33 +0000 +@@ -79,6 +79,9 @@ + " no file found at %s") % (tz, tz_file)) + return tz_file + ++ def get_init_cmd(self): ++ return self.init_cmd ++ + def get_option(self, opt_name, default=None): + return self._cfg.get(opt_name, default) + + diff --git a/openSUSEHandler.diff b/openSUSEHandler.diff deleted file mode 100644 index 9966cec..0000000 --- a/openSUSEHandler.diff +++ /dev/null @@ -1,91 +0,0 @@ -diff -urN cloud-init-0.7.4/cloudinit/distros/opensuse.py cloud-init-0.7.4.os/cloudinit/distros/opensuse.py ---- cloud-init-0.7.4/cloudinit/distros/opensuse.py 1969-12-31 19:00:00.000000000 -0500 -+++ cloud-init-0.7.4.os/cloudinit/distros/opensuse.py 2013-06-15 06:26:15.312348359 -0400 -@@ -0,0 +1,87 @@ -+# vi: ts=4 expandtab -+# -+# Copyright (C) 2013 SUSE LLC -+# -+# Author: Robert Schweikert -+# -+# Leaning very heavily on the RHEL implementation -+# -+# This program is free software: you can redistribute it and/or modify -+# it under the terms of the GNU General Public License version 3, as -+# published by the Free Software Foundation. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+import os -+ -+from cloudinit.distros import sles -+from cloudinit.distros import rhel_util -+ -+from cloudinit.distros.parsers.resolv_conf import ResolvConf -+from cloudinit.distros.parsers.sys_conf import SysConf -+ -+from cloudinit import helpers -+from cloudinit import log as logging -+from cloudinit import util -+ -+from cloudinit.settings import PER_INSTANCE -+ -+LOG = logging.getLogger(__name__) -+ -+class Distro(sles.Distro): -+ systemd_locale_conf_fn = '/etc/locale.conf' -+ -+ def __init__(self, name, cfg, paths): -+ sles.Distro.__init__(self, name, cfg, paths) -+ -+ def apply_locale(self, locale, out_fn=None): -+ if os.path.exists('/usr/bin/localectl'): -+ if not out_fn: -+ out_fn = systemd_locale_conf_fn -+ locale_cfg = { -+ 'LANG': locale, -+ } -+ else: -+ if not out_fn: -+ out_fn = self.locale_conf_fn -+ locale_cfg = { -+ 'RC_LANG': locale, -+ } -+ util.update_sysconfig_file(out_fn, locale_cfg) -+ -+ def _write_hostname(self, hostname, out_fn): -+ if os.path.exists('/usr/bin/hostnamectl'): -+ util.subp(['hostnamectl', 'set-hostname', str(hostname)]) -+ else: -+ host_cfg = { -+ 'HOSTNAME': hostname, -+ } -+ util.update_sysconfig_file(out_fn, host_cfg) -+ -+ def _select_hostname(self, hostname, fqdn): -+ if fqdn: -+ return fqdn -+ return hostname -+ -+ def _read_system_hostname(self): -+ host_fn = self.hostname_conf_fn -+ return (host_fn, self._read_hostname(host_fn)) -+ -+ def _read_hostname(self, filename, default=None): -+ (out, _err) = util.subp(['hostname']) -+ if len(out): -+ return out -+ else: -+ (_exists, contents) = rhel_util.read_sysconfig_file(filename) -+ if 'HOSTNAME' in contents: -+ return contents['HOSTNAME'] -+ else: -+ return default -+ -+ diff --git a/rsyslog-cloud-init.cfg b/rsyslog-cloud-init.cfg new file mode 100644 index 0000000..b47ffe5 --- /dev/null +++ b/rsyslog-cloud-init.cfg @@ -0,0 +1,6 @@ +# Log cloudinit generated log messages to file +:syslogtag, isequal, "[CLOUDINIT]" /var/log/cloud-init.log + +# comment out the following line to allow CLOUDINIT messages through. +# Doing so means you'll also get CLOUDINIT messages in /var/log/syslog +& ~ diff --git a/suseIntegratedHandler.patch b/suseIntegratedHandler.patch new file mode 100644 index 0000000..be384c2 --- /dev/null +++ b/suseIntegratedHandler.patch @@ -0,0 +1,401 @@ +--- /dev/null ++++ cloudinit/distros/opensuse.py +@@ -0,0 +1,210 @@ ++# vi: ts=4 expandtab ++# ++# Copyright (C) 2014 SUSE LLC ++# Copyright (C) 2013 Hewlett-Packard Development Company, L.P. ++# ++# Author: Robert Schweikert ++# Author: Juerg Haefliger ++# ++# Leaning very heavily on the RHEL and Debian implementation ++# ++# This program is free software: you can redistribute it and/or modify ++# it under the terms of the GNU General Public License version 3, as ++# published by the Free Software Foundation. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++from cloudinit import distros ++ ++from cloudinit.distros.parsers.hostname import HostnameConf ++ ++from cloudinit import helpers ++from cloudinit import log as logging ++from cloudinit import util ++ ++from cloudinit.distros import net_util ++from cloudinit.distros import rhel_util as rhutil ++from cloudinit.settings import PER_INSTANCE ++ ++LOG = logging.getLogger(__name__) ++ ++class Distro(distros.Distro): ++ clock_conf_fn = '/etc/sysconfig/clock' ++ locale_conf_fn = '/etc/sysconfig/language' ++ network_conf_fn = '/etc/sysconfig/network' ++ hostname_conf_fn = '/etc/HOSTNAME' ++ network_script_tpl = '/etc/sysconfig/network/ifcfg-%s' ++ resolve_conf_fn = '/etc/resolv.conf' ++ tz_local_fn = '/etc/localtime' ++ systemd_locale_conf_fn = '/etc/locale.conf' ++ ++ def __init__(self, name, cfg, paths): ++ distros.Distro.__init__(self, name, cfg, paths) ++ # This will be used to restrict certain ++ # calls from repeatly happening (when they ++ # should only happen say once per instance...) ++ self._runner = helpers.Runners(paths) ++ self.osfamily = 'suse' ++ self.systemdDist = util.which('systemctl') ++ ++ def apply_locale(self, locale, out_fn=None): ++ if self.systemdDist: ++ if not out_fn: ++ out_fn = self.systemd_locale_conf_fn ++ locale_cfg = {'LANG': locale} ++ else: ++ if not out_fn: ++ out_fn = self.locale_conf_fn ++ locale_cfg = {'RC_LANG': locale} ++ rhutil.update_sysconfig_file(out_fn, locale_cfg) ++ ++ def install_packages(self, pkglist): ++ self.package_command('install', args='-l', pkgs=pkglist) ++ ++ def package_command(self, command, args=None, pkgs=None): ++ if pkgs is None: ++ pkgs = [] ++ ++ cmd = ['zypper'] ++ # No user interaction possible, enable non-interactive mode ++ cmd.append('--non-interactive') ++ ++ # Comand is the operation, such as install ++ cmd.append(command) ++ ++ # args are the arguments to the command, not global options ++ if args and isinstance(args, str): ++ cmd.append(args) ++ elif args and isinstance(args, list): ++ cmd.extend(args) ++ ++ pkglist = util.expand_package_list('%s-%s', pkgs) ++ cmd.extend(pkglist) ++ ++ # Allow the output of this to flow outwards (ie not be captured) ++ util.subp(cmd, capture=False) ++ ++ def set_timezone(self, tz): ++ tz_file = self._find_tz_file(tz) ++ if self.systemdDist: ++ # Currently, timedatectl complains if invoked during startup ++ # so for compatibility, create the link manually. ++ util.del_file(self.tz_local_fn) ++ util.sym_link(tz_file, self.tz_local_fn) ++ else: ++ # Adjust the sysconfig clock zone setting ++ clock_cfg = { ++ 'TIMEZONE': str(tz), ++ } ++ rhutil.update_sysconfig_file(self.clock_conf_fn, clock_cfg) ++ # This ensures that the correct tz will be used for the system ++ util.copy(tz_file, self.tz_local_fn) ++ ++ def update_package_sources(self): ++ self._runner.run("update-sources", self.package_command, ++ ['refresh'], freq=PER_INSTANCE) ++ ++ ++ def _bring_up_interfaces(self, device_names): ++ if device_names and 'all' in device_names: ++ raise RuntimeError(('Distro %s can not translate ' ++ 'the device name "all"') % (self.name)) ++ return distros.Distro._bring_up_interfaces(self, device_names) ++ ++ ++ def _read_hostname(self, filename, default=None): ++ (out, _err) = util.subp(['hostname']) ++ if len(out): ++ return out ++ else: ++ try: ++ conf = self._read_hostname_conf(filename) ++ hostname = conf.hostname ++ except IOError: ++ pass ++ if not hostname: ++ return default ++ return hostname ++ ++ def _read_hostname_conf(self, filename): ++ conf = HostnameConf(util.load_file(filename)) ++ conf.parse() ++ return conf ++ ++ def _read_system_hostname(self): ++ host_fn = self.hostname_conf_fn ++ return (host_fn, self._read_hostname(host_fn)) ++ ++ def _select_hostname(self, hostname, fqdn): ++ if fqdn: ++ return fqdn ++ return hostname ++ ++ def _write_hostname(self, hostname, out_fn): ++ if self.systemdDist: ++ util.subp(['hostnamectl', 'set-hostname', str(hostname)]) ++ else: ++ conf = None ++ try: ++ # Try to update the previous one ++ # so lets see if we can read it first. ++ conf = self._read_hostname_conf(out_fn) ++ except IOError: ++ pass ++ if not conf: ++ conf = HostnameConf('') ++ conf.set_hostname(hostname) ++ util.write_file(out_fn, str(conf), 0644) ++ ++ def _write_network(self, settings): ++ # Convert debian settings to ifcfg format ++ entries = net_util.translate_network(settings) ++ LOG.debug("Translated ubuntu style network settings %s into %s", ++ settings, entries) ++ # Make the intermediate format as the suse format... ++ nameservers = [] ++ searchservers = [] ++ dev_names = entries.keys() ++ for (dev, info) in entries.iteritems(): ++ net_fn = self.network_script_tpl % (dev) ++ mode = info.get('auto') ++ if mode and mode.lower() == 'true': ++ mode = 'auto' ++ else: ++ mode = 'manual' ++ net_cfg = { ++ 'BOOTPROTO': info.get('bootproto'), ++ 'BROADCAST': info.get('broadcast'), ++ 'GATEWAY': info.get('gateway'), ++ 'IPADDR': info.get('address'), ++ 'LLADDR': info.get('hwaddress'), ++ 'NETMASK': info.get('netmask'), ++ 'STARTMODE': mode, ++ 'USERCONTROL': 'no' ++ } ++ if dev != 'lo': ++ net_cfg['ETHERDEVICE'] = dev ++ net_cfg['ETHTOOL_OPTIONS'] = '' ++ else: ++ net_cfg['FIREWALL'] = 'no' ++ rhutil.update_sysconfig_file(net_fn, net_cfg, True) ++ if 'dns-nameservers' in info: ++ nameservers.extend(info['dns-nameservers']) ++ if 'dns-search' in info: ++ searchservers.extend(info['dns-search']) ++ if nameservers or searchservers: ++ rhutil.update_resolve_conf_file(self.resolve_conf_fn, ++ nameservers, searchservers) ++ return dev_names ++ ++ ++ ++ ++ ++ +--- cloudinit/distros/sles.py.orig ++++ cloudinit/distros/sles.py +@@ -1,10 +1,8 @@ + # vi: ts=4 expandtab + # +-# Copyright (C) 2013 Hewlett-Packard Development Company, L.P. ++# Copyright (C) 2014 SUSE LLC + # +-# Author: Juerg Haefliger +-# +-# Leaning very heavily on the RHEL and Debian implementation ++# Author: Robert Schweikert + # + # This program is free software: you can redistribute it and/or modify + # it under the terms of the GNU General Public License version 3, as +@@ -18,169 +16,11 @@ + # You should have received a copy of the GNU General Public License + # along with this program. If not, see . + +-from cloudinit import distros +- +-from cloudinit.distros.parsers.hostname import HostnameConf ++from cloudinit.distros import opensuse + +-from cloudinit import helpers + from cloudinit import log as logging +-from cloudinit import util +- +-from cloudinit.distros import net_util +-from cloudinit.distros import rhel_util +-from cloudinit.settings import PER_INSTANCE + + LOG = logging.getLogger(__name__) + +- +-class Distro(distros.Distro): +- clock_conf_fn = '/etc/sysconfig/clock' +- locale_conf_fn = '/etc/sysconfig/language' +- network_conf_fn = '/etc/sysconfig/network' +- hostname_conf_fn = '/etc/HOSTNAME' +- network_script_tpl = '/etc/sysconfig/network/ifcfg-%s' +- resolve_conf_fn = '/etc/resolv.conf' +- tz_local_fn = '/etc/localtime' +- +- def __init__(self, name, cfg, paths): +- distros.Distro.__init__(self, name, cfg, paths) +- # This will be used to restrict certain +- # calls from repeatly happening (when they +- # should only happen say once per instance...) +- self._runner = helpers.Runners(paths) +- self.osfamily = 'suse' +- +- def install_packages(self, pkglist): +- self.package_command('install', args='-l', pkgs=pkglist) +- +- def _write_network(self, settings): +- # Convert debian settings to ifcfg format +- entries = net_util.translate_network(settings) +- LOG.debug("Translated ubuntu style network settings %s into %s", +- settings, entries) +- # Make the intermediate format as the suse format... +- nameservers = [] +- searchservers = [] +- dev_names = entries.keys() +- for (dev, info) in entries.iteritems(): +- net_fn = self.network_script_tpl % (dev) +- mode = info.get('auto') +- if mode and mode.lower() == 'true': +- mode = 'auto' +- else: +- mode = 'manual' +- net_cfg = { +- 'BOOTPROTO': info.get('bootproto'), +- 'BROADCAST': info.get('broadcast'), +- 'GATEWAY': info.get('gateway'), +- 'IPADDR': info.get('address'), +- 'LLADDR': info.get('hwaddress'), +- 'NETMASK': info.get('netmask'), +- 'STARTMODE': mode, +- 'USERCONTROL': 'no' +- } +- if dev != 'lo': +- net_cfg['ETHERDEVICE'] = dev +- net_cfg['ETHTOOL_OPTIONS'] = '' +- else: +- net_cfg['FIREWALL'] = 'no' +- rhel_util.update_sysconfig_file(net_fn, net_cfg, True) +- if 'dns-nameservers' in info: +- nameservers.extend(info['dns-nameservers']) +- if 'dns-search' in info: +- searchservers.extend(info['dns-search']) +- if nameservers or searchservers: +- rhel_util.update_resolve_conf_file(self.resolve_conf_fn, +- nameservers, searchservers) +- return dev_names +- +- def apply_locale(self, locale, out_fn=None): +- if not out_fn: +- out_fn = self.locale_conf_fn +- locale_cfg = { +- 'RC_LANG': locale, +- } +- rhel_util.update_sysconfig_file(out_fn, locale_cfg) +- +- def _write_hostname(self, hostname, out_fn): +- conf = None +- try: +- # Try to update the previous one +- # so lets see if we can read it first. +- conf = self._read_hostname_conf(out_fn) +- except IOError: +- pass +- if not conf: +- conf = HostnameConf('') +- conf.set_hostname(hostname) +- util.write_file(out_fn, str(conf), 0644) +- +- def _select_hostname(self, hostname, fqdn): +- # Prefer the short hostname over the long +- # fully qualified domain name +- if not hostname: +- return fqdn +- return hostname +- +- def _read_system_hostname(self): +- host_fn = self.hostname_conf_fn +- return (host_fn, self._read_hostname(host_fn)) +- +- def _read_hostname_conf(self, filename): +- conf = HostnameConf(util.load_file(filename)) +- conf.parse() +- return conf +- +- def _read_hostname(self, filename, default=None): +- hostname = None +- try: +- conf = self._read_hostname_conf(filename) +- hostname = conf.hostname +- except IOError: +- pass +- if not hostname: +- return default +- return hostname +- +- def _bring_up_interfaces(self, device_names): +- if device_names and 'all' in device_names: +- raise RuntimeError(('Distro %s can not translate ' +- 'the device name "all"') % (self.name)) +- return distros.Distro._bring_up_interfaces(self, device_names) +- +- def set_timezone(self, tz): +- tz_file = self._find_tz_file(tz) +- # Adjust the sysconfig clock zone setting +- clock_cfg = { +- 'TIMEZONE': str(tz), +- } +- rhel_util.update_sysconfig_file(self.clock_conf_fn, clock_cfg) +- # This ensures that the correct tz will be used for the system +- util.copy(tz_file, self.tz_local_fn) +- +- def package_command(self, command, args=None, pkgs=None): +- if pkgs is None: +- pkgs = [] +- +- cmd = ['zypper'] +- # No user interaction possible, enable non-interactive mode +- cmd.append('--non-interactive') +- +- # Comand is the operation, such as install +- cmd.append(command) +- +- # args are the arguments to the command, not global options +- if args and isinstance(args, str): +- cmd.append(args) +- elif args and isinstance(args, list): +- cmd.extend(args) +- +- pkglist = util.expand_package_list('%s-%s', pkgs) +- cmd.extend(pkglist) +- +- # Allow the output of this to flow outwards (ie not be captured) +- util.subp(cmd, capture=False) +- +- def update_package_sources(self): +- self._runner.run("update-sources", self.package_command, +- ['refresh'], freq=PER_INSTANCE) ++class Distro(opensuse.Distro): ++ pass diff --git a/suseSetInitCmd.patch b/suseSetInitCmd.patch new file mode 100644 index 0000000..a7f5a1d --- /dev/null +++ b/suseSetInitCmd.patch @@ -0,0 +1,25 @@ +--- cloudinit/distros/opensuse.py.orig ++++ cloudinit/distros/opensuse.py +@@ -43,6 +43,7 @@ class Distro(distros.Distro): + resolve_conf_fn = '/etc/resolv.conf' + tz_local_fn = '/etc/localtime' + systemd_locale_conf_fn = '/etc/locale.conf' ++ init_cmd = ['service'] + + def __init__(self, name, cfg, paths): + distros.Distro.__init__(self, name, cfg, paths) +@@ -50,9 +51,13 @@ class Distro(distros.Distro): + # calls from repeatly happening (when they + # should only happen say once per instance...) + self._runner = helpers.Runners(paths) ++ cfg['ssh_svcname'] = 'sshd' + self.osfamily = 'suse' + self.systemdDist = util.which('systemctl') +- ++ if self.systemdDist: ++ self.init_cmd = ['systemctl'] ++ cfg['ssh_svcname'] = 'sshd.service' ++ + def apply_locale(self, locale, out_fn=None): + if self.systemdDist: + if not out_fn: