Hello community, here is the log from the commit of package cloud-init for openSUSE:Factory checked in at 2014-07-10 14:55:23 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/cloud-init (Old) and /work/SRC/openSUSE:Factory/.cloud-init.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "cloud-init" Changes: -------- --- /work/SRC/openSUSE:Factory/cloud-init/cloud-init.changes 2014-06-04 18:39:03.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.cloud-init.new/cloud-init.changes 2014-07-10 14:55:35.000000000 +0200 @@ -1,0 +2,40 @@ +Mon Jul 7 17:21:54 UTC 2014 - [email protected] + +- 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 - [email protected] + +- add rsyslog filter rule to send cloud-init messages to + /var/log/cloud-init.log + +------------------------------------------------------------------- +Wed Jun 25 22:24:31 UTC 2014 - [email protected] + +- initialize variable in method setting the instance hostname (BNC #884392) + modifies: suseIntegratedHandler.patch + +------------------------------------------------------------------- +Tue Jun 24 19:49:34 UTC 2014 - [email protected] + +- add the python magic for package build on SLE 11 + +------------------------------------------------------------------- +Tue Jun 24 19:23:07 UTC 2014 - [email protected] + +- 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 - [email protected] + +- integrate openSUSE and SLE handler code + + remove openSUSEHandler.diff + + add suseIntegratedHandler.patch + +------------------------------------------------------------------- Old: ---- openSUSEHandler.diff New: ---- dynamicInitCmd.diff rsyslog-cloud-init.cfg suseIntegratedHandler.patch suseSetInitCmd.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ cloud-init.spec ++++++ --- /var/tmp/diff_new_pack.QoxPb4/_old 2014-07-10 14:55:36.000000000 +0200 +++ /var/tmp/diff_new_pack.QoxPb4/_new 2014-07-10 14:55:36.000000000 +0200 @@ -24,16 +24,27 @@ 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-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 @@ %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 @@ %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 @@ %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 @@ %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 @@ %{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) ++++++ dynamicInitCmd.diff ++++++ === 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) ++++++ rsyslog-cloud-init.cfg ++++++ # 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 & ~ ++++++ suseIntegratedHandler.patch ++++++ --- /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 <[email protected]> +# Author: Juerg Haefliger <[email protected]> +# +# 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 <http://www.gnu.org/licenses/>. + +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 <[email protected]> -# -# Leaning very heavily on the RHEL and Debian implementation +# Author: Robert Schweikert <[email protected]> # # 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 <http://www.gnu.org/licenses/>. -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 ++++++ suseSetInitCmd.patch ++++++ --- 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: -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
