Hello community,

here is the log from the commit of package cloud-init for openSUSE:Factory 
checked in at 2013-06-18 10:29: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    2013-05-07 
15:10:39.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.cloud-init.new/cloud-init.changes       
2013-06-18 10:29:24.000000000 +0200
@@ -1,0 +2,27 @@
+Sat Jun 15 10:40:42 UTC 2013 - [email protected]
+
+- add the distro specific handler for openSUSE
+  + patch openSUSEHandler.diff
+- fix syntax in SLE handler
+  + dict access uses [] not {}, duh
+
+-------------------------------------------------------------------
+Fri Jun 14 00:57:18 UTC 2013 - [email protected]
+
+- add the distro specific handler for SLE
+  + patch slesHandler.diff
+
+-------------------------------------------------------------------
+Wed Jun  5 15:12:52 UTC 2013 - [email protected]
+
+- update to version 0.7.2, see Changelog in source for fixes
+- use the upstream sysvinit and systemd files
+- remove all previously created patches
+  + drop-MAAS-datasource.diff
+  + drop-python27-only-code.diff
+  + drop-ubuntu-default-username.diff
+  + relative-authorized-keys-file.diff
+- create a doc and test package to reduce size of main package
+- add patch (fixupSysVinit.patch) to fix the upstream sysvinit LSB headers
+
+-------------------------------------------------------------------

Old:
----
  cloud-init-0.6.3.tar.bz2
  cloud-init.init
  drop-MAAS-datasource.diff
  drop-python27-only-code.diff
  drop-ubuntu-default-username.diff
  relative-authorized-keys-file.diff

New:
----
  cloud-init-0.7.2.tar.bz2
  fixupSysVinit.patch
  openSUSEHandler.diff
  slesHandler.diff

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ cloud-init.spec ++++++
--- /var/tmp/diff_new_pack.dBQ38m/_old  2013-06-18 10:29:25.000000000 +0200
+++ /var/tmp/diff_new_pack.dBQ38m/_new  2013-06-18 10:29:25.000000000 +0200
@@ -19,7 +19,7 @@
 %define component cloud-init
 
 Name:           %{component}
-Version:        0.6.3
+Version:        0.7.2
 Release:        0
 Summary:        Cloud node initialization tool
 License:        GPL-3.0
@@ -27,14 +27,13 @@
 Url:            http://launchpad.net/cloud-init/
 Source0:        %{component}-%{version}.tar.bz2
 Source1:        cloud.cfg.suse
-Source2:        cloud-init.init
-Patch0:         drop-MAAS-datasource.diff
-Patch1:         drop-python27-only-code.diff
-Patch2:         drop-ubuntu-default-username.diff
-# backport fix from upstream version 0.7.1 for bug bnc#818306
-Patch3:         relative-authorized-keys-file.diff
+Patch0:         fixupSysVinit.patch
+Patch1:         slesHandler.diff
+Patch2:         openSUSEHandler.diff
 Requires:       python-boto
 Requires:       python-cheetah
+Requires:       python-prettytable
+Requires:       python-requests
 Requires:       python-xml
 Requires:       python-yaml
 BuildRequires:  filesystem
@@ -51,36 +50,54 @@
 BuildArch:      noarch
 %endif
 
+%if 0%{?suse_version} && 0%{?suse_version} <= 1210
+%define initsys sysvinit
+%else
+%define initsys systemd
+%endif
+
 %{py_requires}
 
 %description
 Cloud-init is an init script that initializes a cloud node (VM)
 according to the fetched configuration data from the admin node.
 
-
-
 Authors:
 --------
     Scott Moser <[email protected]>
 
+%package doc
+Summary:        Cloud node initialization tool doc
+Group:          System/Management
+Recommends:     cloud-init = %version
+
+%description doc
+Documentation and examples for cloud-init tools
+
+%package test
+Summary:        Cloud node initialization tool tests
+Group:          System/Management
+Requires:       cloud-init = %version
+
+%description test
+Unit tests for the cloud-init tools
+
 %prep
 %setup -q -n %{component}-%{version}
-%patch0 -p1
-%if 0%{?suse_version} <= 1130
+%patch0
 %patch1 -p1
+%patch2 -p1
+%if 0%{?suse_version} <= 1130
 # disable ecdsa for SLE 11 (not available)
 echo "ssh_genkeytypes: ['rsa', 'dsa']" >> %{S:1}
 %endif
-%patch2 -p1
-%patch3 -p1
 
 %build
 python setup.py build
 
 %install
-python setup.py install --skip-build --root=%{buildroot} --prefix=%{_prefix} 
--record-rpm=INSTALLED_FILES --install-lib=%{python_sitelib}
+python setup.py install --skip-build --root=%{buildroot} --prefix=%{_prefix} 
--record-rpm=INSTALLED_FILES --install-lib=%{python_sitelib} 
--init-system=%{initsys}
 find %{buildroot} \( -name .gitignore -o -name .placeholder \) -delete
-mv %{buildroot}/%{_sysconfdir}/init %{buildroot}/%{_sysconfdir}/cloud/
 # from debian install script
 for x in "%{buildroot}%{_bindir}/"*.py; do
    [ -f "${x}" ] && mv "${x}" "${x%.py}"
@@ -90,13 +107,22 @@
 mkdir -p %{buildroot}%{_defaultdocdir}
 mv %{buildroot}/usr/share/doc/%{component} %{buildroot}%{docdir}
 cp -a %{S:1} %{buildroot}/%{_sysconfdir}/cloud/cloud.cfg
-mkdir -p %{buildroot}/%{_initddir} %{buildroot}/%{_sbindir}
-cp -a %SOURCE2 %{buildroot}/%{_initddir}/%{component}
-ln -s %{_initddir}/%{component} %{buildroot}/%{_sbindir}/rc%{component}
 
 # remove debian/ubuntu specific profile.d file (bnc#779553)
 rm -f %{buildroot}%{_sysconfdir}/profile.d/Z99-cloud-locale-test.sh
 
+# move sysvinit scripts into the "right" place
+%if 0%{?suse_version} && 0%{?suse_version} <= 1210
+mkdir -p %{buildroot}/%{_initddir}
+mv %{buildroot}%{_sysconfdir}/rc.d/init.d/* %{buildroot}%{_initddir}/
+mkdir -p %{buildroot}/%{_sbindir}
+pushd "%{buildroot}%{_initddir}"
+for iniF in *; do
+    ln -s "%{_initddir}/${iniF}" "%{buildroot}/%{_sbindir}/rc${iniF}"
+done
+popd
+%endif
+
 # remove duplicate files
 %if 0%{?suse_version}
 %fdupes %{buildroot}%{python_sitelib}
@@ -108,14 +134,26 @@
 %{python_sitelib}/cloud_init*egg-info
 %{_bindir}/cloud-init
 %{_bindir}/cloud-init-per
-%{_bindir}/cloud-init-cfg
-%{_sbindir}/rc%{component}
 %config(noreplace) %{_sysconfdir}/cloud/
-%doc %{docdir}
 /usr/lib/cloud-init
-%attr(0755, root, root) %{_initddir}/%{component}
+%if 0%{?suse_version} && 0%{?suse_version} <= 1210
+%{_sbindir}/rc*
+%attr(0755, root, root) %{_initddir}/*
+%else
+%dir /etc/systemd
+%dir /etc/systemd/system
+%{_sysconfdir}/systemd/system/*
+%endif
 %dir %attr(0755, root, root) %{_localstatedir}/lib/cloud
 
+%files doc
+%defattr(-,root,root)
+%doc %{docdir}
+
+%files test
+%defattr(-,root,root)
+%{python_sitelib}/tests
+
 %postun
 %insserv_cleanup
 

++++++ cloud-init-0.6.3.tar.bz2 -> cloud-init-0.7.2.tar.bz2 ++++++
++++ 48746 lines of diff (skipped)

++++++ fixupSysVinit.patch ++++++
--- sysvinit/cloud-config.orig
+++ sysvinit/cloud-config
@@ -27,8 +27,8 @@
 # Provides:          cloud-config
 # Required-Start:    cloud-init cloud-init-local
 # Should-Start:      $time
-# Required-Stop:
-# Should-Stop:
+# Required-Stop:     $null
+# Should-Stop:       $null
 # Default-Start:     2 3 4 5
 # Default-Stop:      0 1 6
 # Short-Description: The config cloud-init job
--- sysvinit/cloud-final.orig
+++ sysvinit/cloud-final
@@ -27,8 +27,8 @@
 # Provides:          cloud-final
 # Required-Start:    $all cloud-config
 # Should-Start:      $time
-# Required-Stop:
-# Should-Stop:
+# Required-Stop:     $null
+# Should-Stop:       $null
 # Default-Start:     2 3 4 5
 # Default-Stop:      0 1 6
 # Short-Description: The final cloud-init job
--- sysvinit/cloud-init.orig
+++ sysvinit/cloud-init
@@ -27,8 +27,8 @@
 # Provides:          cloud-init
 # Required-Start:    $local_fs $network $named $remote_fs cloud-init-local
 # Should-Start:      $time
-# Required-Stop:
-# Should-Stop:
+# Required-Stop:     $null
+# Should-Stop:       $null
 # Default-Start:     2 3 4 5
 # Default-Stop:      0 1 6
 # Short-Description: The initial cloud-init job (net and fs contingent)
--- sysvinit/cloud-init-local.orig
+++ sysvinit/cloud-init-local
@@ -27,8 +27,8 @@
 # Provides:          cloud-init-local
 # Required-Start:    $local_fs $remote_fs
 # Should-Start:      $time
-# Required-Stop:
-# Should-Stop:
+# Required-Stop:     $null
+# Should-Stop:       $null
 # Default-Start:     2 3 4 5
 # Default-Stop:      0 1 6
 # Short-Description: The initial cloud-init job (local fs contingent)
++++++ openSUSEHandler.diff ++++++
diff -urN cloud-init-0.7.2/cloudinit/distros/opensuse.py 
cloud-init-0.7.2.os/cloudinit/distros/opensuse.py
--- cloud-init-0.7.2/cloudinit/distros/opensuse.py      1969-12-31 
19:00:00.000000000 -0500
+++ cloud-init-0.7.2.os/cloudinit/distros/opensuse.py   2013-06-15 
06:26:15.312348359 -0400
@@ -0,0 +1,86 @@
+# vi: ts=4 expandtab
+#
+#    Copyright (C) 2013 SUSE LLC
+#
+#    Author: Robert Schweikert <[email protected]>
+#
+#    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 <http://www.gnu.org/licenses/>.
+
+import os
+
+from cloudinit.distros import sles
+
+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) = self._read_conf(filename)
+            if 'HOSTNAME' in contents:
+                return contents['HOSTNAME']
+            else:
+                return default
+
+
++++++ slesHandler.diff ++++++
diff -urN cloud-init-0.7.2.orig/cloudinit/config/cc_resolv_conf.py 
cloud-init-0.7.2/cloudinit/config/cc_resolv_conf.py
--- cloud-init-0.7.2.orig/cloudinit/config/cc_resolv_conf.py    2013-05-15 
16:48:22.000000000 -0400
+++ cloud-init-0.7.2/cloudinit/config/cc_resolv_conf.py 2013-06-13 
19:13:57.269300572 -0400
@@ -53,7 +53,7 @@
 
 frequency = PER_INSTANCE
 
-distros = ['fedora', 'rhel']
+distros = ['fedora', 'opensuse', 'rhel', 'sles']
 
 
 def generate_resolv_conf(cloud, log, params):
diff -urN cloud-init-0.7.2.orig/cloudinit/distros/__init__.py 
cloud-init-0.7.2/cloudinit/distros/__init__.py
--- cloud-init-0.7.2.orig/cloudinit/distros/__init__.py 2013-05-15 
16:48:22.000000000 -0400
+++ cloud-init-0.7.2/cloudinit/distros/__init__.py      2013-06-13 
19:23:03.874975271 -0400
@@ -38,7 +38,8 @@
 
 OSFAMILIES = {
     'debian': ['debian', 'ubuntu'],
-    'redhat': ['fedora', 'rhel']
+    'redhat': ['fedora', 'rhel'],
+    'suse'  : ['opensuse', 'sles']
 }
 
 LOG = logging.getLogger(__name__)
diff -urN cloud-init-0.7.2.orig/cloudinit/distros/sles.py 
cloud-init-0.7.2/cloudinit/distros/sles.py
--- cloud-init-0.7.2.orig/cloudinit/distros/sles.py     1969-12-31 
19:00:00.000000000 -0500
+++ cloud-init-0.7.2/cloudinit/distros/sles.py  2013-06-13 19:00:56.837634255 
-0400
@@ -0,0 +1,212 @@
+# vi: ts=4 expandtab
+#
+#    Copyright (C) 2013 SUSE LLC
+#
+#    Author: Robert Schweikert <[email protected]>
+#
+#    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 <http://www.gnu.org/licenses/>.
+
+import os
+
+from cloudinit import distros
+
+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(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'
+    tz_zone_dir = '/usr/share/zoneinfo'
+
+    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 _adjust_resolve(self, dns_servers, search_servers):
+        try:
+            r_conf = ResolvConf(util.load_file(self.resolve_conf_fn))
+            r_conf.parse()
+        except IOError:
+            util.logexc(LOG,
+                        "Failed at parsing %s reverting to an empty instance",
+                        self.resolve_conf_fn)
+            r_conf = ResolvConf('')
+            r_conf.parse()
+        if dns_servers:
+            for s in dns_servers:
+                try:
+                    r_conf.add_nameserver(s)
+                except ValueError:
+                    util.logexc(LOG, "Failed at adding nameserver %s", s)
+        if search_servers:
+            for s in search_servers:
+                try:
+                    r_conf.add_search_domain(s)
+                except ValueError:
+                    util.logexc(LOG, "Failed at adding search domain %s", s)
+        util.write_file(self.resolve_conf_fn, str(r_conf), 0644)
+
+    def _write_network(self, settings):
+        # Convert debian settings to ifcfg format
+        entries = 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'
+            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:
+            self._adjust_resolve(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,
+        }
+        util.update_sysconfig_file(out_fn, locale_cfg)
+
+    def _write_hostname(self, hostname, out_fn):
+        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):
+        (_exists, contents) = self._read_conf(filename)
+        if 'HOSTNAME' in contents:
+            return contents['HOSTNAME']
+        else:
+            return default
+
+    def _read_conf(self, fn):
+        exists = False
+        try:
+            contents = util.load_file(fn).splitlines()
+            exists = True
+        except IOError:
+            contents = []
+        return (exists,
+                SysConf(contents))
+
+    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):
+        # TODO(harlowja): move this code into
+        # the parent distro...
+        tz_file = os.path.join(self.tz_zone_dir, str(tz))
+        if not os.path.isfile(tz_file):
+            raise RuntimeError(("Invalid timezone %s,"
+                                " no file found at %s") % (tz, tz_file))
+        # Adjust the sysconfig clock zone setting
+        clock_cfg = {
+            'TIMEZONE': str(tz),
+        }
+        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('-t')
+        # Do not check the keys, we assume that the initial repos configured
+        # in the image can be trusted
+        cmd.append('--no-gpg-checks')
+
+        # 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)
+
+
diff -urN cloud-init-0.7.2.orig/cloudinit/util.py 
cloud-init-0.7.2/cloudinit/util.py
--- cloud-init-0.7.2.orig/cloudinit/util.py     2013-05-15 16:48:22.000000000 
-0400
+++ cloud-init-0.7.2/cloudinit/util.py  2013-06-13 19:27:57.877749273 -0400
@@ -1744,3 +1744,110 @@
     mountinfo_path = '/proc/%s/mountinfo' % os.getpid()
     lines = load_file(mountinfo_path).splitlines()
     return parse_mount_info(path, lines, log)
+
+def translate_network(settings):
+    # Translate Debian based distro interface blobs as given in
+    # /etc/network/interfaces to an equivalent format for distributions
+    # that use ifcfg-* style (RedHat and SUSE). (copied from rhel.py)
+    # Get the standard cmd, args from the ubuntu format
+    entries = []
+    for line in settings.splitlines():
+        line = line.strip()
+        if not line or line.startswith("#"):
+            continue
+        split_up = line.split(None, 1)
+        if len(split_up) <= 1:
+            continue
+        entries.append(split_up)
+    # Figure out where each iface section is
+    ifaces = []
+    consume = {}
+    for (cmd, args) in entries:
+        if cmd == 'iface':
+            if consume:
+                ifaces.append(consume)
+                consume = {}
+            consume[cmd] = args
+        else:
+            consume[cmd] = args
+    # Check if anything left over to consume
+    absorb = False
+    for (cmd, args) in consume.iteritems():
+        if cmd == 'iface':
+            absorb = True
+    if absorb:
+        ifaces.append(consume)
+    # Now translate
+    real_ifaces = {}
+    for info in ifaces:
+        if 'iface' not in info:
+            continue
+        iface_details = info['iface'].split(None)
+        dev_name = None
+        if len(iface_details) >= 1:
+            dev = iface_details[0].strip().lower()
+            if dev:
+                dev_name = dev
+        if not dev_name:
+            continue
+        iface_info = {}
+        if len(iface_details) >= 3:
+            proto_type = iface_details[2].strip().lower()
+            # Seems like this can be 'loopback' which we don't
+            # really care about
+            if proto_type in ['dhcp', 'static']:
+                iface_info['bootproto'] = proto_type
+        # These can just be copied over
+        for k in ['netmask', 'address', 'gateway', 'broadcast']:
+            if k in info:
+                val = info[k].strip().lower()
+                if val:
+                    iface_info[k] = val
+        # Name server info provided??
+        if 'dns-nameservers' in info:
+            iface_info['dns-nameservers'] = info['dns-nameservers'].split()
+        # Name server search info provided??
+        if 'dns-search' in info:
+            iface_info['dns-search'] = info['dns-search'].split()
+        # Is any mac address spoofing going on??
+        if 'hwaddress' in info:
+            hw_info = info['hwaddress'].lower().strip()
+            hw_split = hw_info.split(None, 1)
+            if len(hw_split) == 2 and hw_split[0].startswith('ether'):
+                hw_addr = hw_split[1]
+                if hw_addr:
+                    iface_info['hwaddress'] = hw_addr
+        real_ifaces[dev_name] = iface_info
+    # Check for those that should be started on boot via 'auto'
+    for (cmd, args) in entries:
+        if cmd == 'auto':
+            # Seems like auto can be like 'auto eth0 eth0:1' so just get the
+            # first part out as the device name
+            args = args.split(None)
+            if not args:
+                continue
+            dev_name = args[0].strip().lower()
+            if dev_name in real_ifaces:
+                real_ifaces[dev_name]['auto'] = True
+    return real_ifaces
+
+def update_sysconfig_file(self, fn, adjustments, allow_empty=False):
+    if not adjustments:
+        return
+    (exists, contents) = self._read_conf(fn)
+    updated_am = 0
+    for (k, v) in adjustments.items():
+        if v is None:
+            continue
+        v = str(v)
+        if len(v) == 0 and not allow_empty:
+            continue
+        contents[k] = v
+        updated_am += 1
+    if updated_am:
+        lines = [
+            str(contents),
+        ]
+        if not exists:
+            lines.insert(0, make_header())
+        write_file(fn, "\n".join(lines) + "\n", 0644)
diff -urN cloud-init-0.7.2.orig/templates/hosts.suse.tmpl 
cloud-init-0.7.2/templates/hosts.suse.tmpl
--- cloud-init-0.7.2.orig/templates/hosts.suse.tmpl     1969-12-31 
19:00:00.000000000 -0500
+++ cloud-init-0.7.2/templates/hosts.suse.tmpl  2013-06-13 19:26:00.120234961 
-0400
@@ -0,0 +1,25 @@
+#*
+    This file /etc/cloud/templates/hosts.suse.tmpl is only utilized
+    if enabled in cloud-config.  Specifically, in order to enable it
+    you need to add the following to config:
+      manage_etc_hosts: True
+*#
+# Your system has configured 'manage_etc_hosts' as True.
+# As a result, if you wish for changes to this file to persist
+# then you will need to either
+# a.) make changes to the master file in /etc/cloud/templates/hosts.suse.tmpl
+# b.) change or remove the value of 'manage_etc_hosts' in
+#     /etc/cloud/cloud.cfg or cloud-config from user-data
+# 
+# The following lines are desirable for IPv4 capable hosts
+127.0.0.1 localhost
+
+# The following lines are desirable for IPv6 capable hosts
+::1 localhost ipv6-localhost ipv6-loopback
+fe00::0 ipv6-localnet
+
+ff00::0 ipv6-mcastprefix
+ff02::1 ipv6-allnodes
+ff02::2 ipv6-allrouters
+ff02::3 ipv6-allhosts
+
-- 
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to