forked from pool/cloud-init
Accepting request 179244 from Base:System
- add the distro specific handler for openSUSE + patch openSUSEHandler.diff - fix syntax in SLE handler + dict access uses [] not {}, duh (forwarded request 179074 from rjschwei) OBS-URL: https://build.opensuse.org/request/show/179244 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/cloud-init?expand=0&rev=3
This commit is contained in:
parent
04e3dd1a0d
commit
5ee9623a83
@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:643b54792d0a4e6578678c6ac4cceab600a030539dc0d73575442713fc3e834c
|
|
||||||
size 102993
|
|
3
cloud-init-0.7.2.tar.bz2
Normal file
3
cloud-init-0.7.2.tar.bz2
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
version https://git-lfs.github.com/spec/v1
|
||||||
|
oid sha256:cc5ab984596100f76e95c7a02dabb2ac7ce27cd2e46a590f793fca2afe121ab0
|
||||||
|
size 377139
|
@ -1,3 +1,30 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Sat Jun 15 10:40:42 UTC 2013 - rschweikert@suse.com
|
||||||
|
|
||||||
|
- 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 - rschweikert@suse.com
|
||||||
|
|
||||||
|
- add the distro specific handler for SLE
|
||||||
|
+ patch slesHandler.diff
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Wed Jun 5 15:12:52 UTC 2013 - rschweikert@suse.com
|
||||||
|
|
||||||
|
- 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
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Mon May 6 14:50:17 UTC 2013 - jdsn@suse.de
|
Mon May 6 14:50:17 UTC 2013 - jdsn@suse.de
|
||||||
|
|
||||||
|
@ -1,74 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
# Copyright (c) 2012 SUSE LINUX Products GmbH, Nuernberg, Germany.
|
|
||||||
# Author: J. Daniel Schmidt <jdsn@suse.de>
|
|
||||||
#
|
|
||||||
# This library is free software; you can redistribute it and/or modify it
|
|
||||||
# under the terms of the GNU Lesser General Public License as published by
|
|
||||||
# the Free Software Foundation; version 2.1 of the License
|
|
||||||
#
|
|
||||||
# /etc/init.d/cloud-init
|
|
||||||
# and its symbolic link
|
|
||||||
# /usr/sbin/rccloud-init
|
|
||||||
#
|
|
||||||
#
|
|
||||||
### BEGIN INIT INFO
|
|
||||||
# Provides: cloud-init
|
|
||||||
# Required-Start: $network $syslog $remote_fs $named
|
|
||||||
# Should-Start: $time
|
|
||||||
# Required-Stop: $null
|
|
||||||
# Should-Stop: $null
|
|
||||||
# Default-Start: 3 5
|
|
||||||
# Default-Stop: 0 1 2 6
|
|
||||||
# Short-Description: Starts the cloud-init process
|
|
||||||
# Description: Starts the cloud-init process that fetches
|
|
||||||
# the configuration for the system from a cloud controller.
|
|
||||||
### END INIT INFO
|
|
||||||
|
|
||||||
|
|
||||||
# Check for missing binaries (stale symlinks should not happen)
|
|
||||||
# Note: Special treatment of stop for LSB conformance
|
|
||||||
CLOUDINIT_BIN=/usr/bin/cloud-init
|
|
||||||
test -x $CLOUDINIT_BIN || { echo "$CLOUDINIT_BIN not installed";
|
|
||||||
if [ "$1" = "stop" ]; then exit 0;
|
|
||||||
else exit 5; fi; }
|
|
||||||
|
|
||||||
# Check for existence of needed config file and read it
|
|
||||||
#CLOUDINIT_CONFIG=/etc/cloud/cloud.cfg
|
|
||||||
#test -r $CLOUDINIT_CONFIG || { echo "$CLOUDINIT_CONFIG not existing";
|
|
||||||
# if [ "$1" = "stop" ]; then exit 0;
|
|
||||||
# else exit 6; fi; }
|
|
||||||
|
|
||||||
|
|
||||||
. /etc/rc.status
|
|
||||||
rc_reset
|
|
||||||
|
|
||||||
case "$1" in
|
|
||||||
start)
|
|
||||||
echo -n "Starting cloud-init "
|
|
||||||
startproc $CLOUDINIT_BIN start
|
|
||||||
rc_status -v
|
|
||||||
;;
|
|
||||||
|
|
||||||
stop)
|
|
||||||
echo -n "Shutting down cloud-init "
|
|
||||||
killall `basename $CLOUDINIT_BIN`
|
|
||||||
rc_status -v
|
|
||||||
;;
|
|
||||||
|
|
||||||
restart)
|
|
||||||
$0 stop
|
|
||||||
$0 start
|
|
||||||
rc_status
|
|
||||||
;;
|
|
||||||
|
|
||||||
status)
|
|
||||||
echo -n "Checking for service cloud-init"
|
|
||||||
[ -e /root/.ssh/authorized_keys ]
|
|
||||||
rc_status -v
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "Usage: $0 {start|stop|restart|status}"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
rc_exit
|
|
@ -19,7 +19,7 @@
|
|||||||
%define component cloud-init
|
%define component cloud-init
|
||||||
|
|
||||||
Name: %{component}
|
Name: %{component}
|
||||||
Version: 0.6.3
|
Version: 0.7.2
|
||||||
Release: 0
|
Release: 0
|
||||||
Summary: Cloud node initialization tool
|
Summary: Cloud node initialization tool
|
||||||
License: GPL-3.0
|
License: GPL-3.0
|
||||||
@ -27,14 +27,13 @@ Group: System/Management
|
|||||||
Url: http://launchpad.net/cloud-init/
|
Url: http://launchpad.net/cloud-init/
|
||||||
Source0: %{component}-%{version}.tar.bz2
|
Source0: %{component}-%{version}.tar.bz2
|
||||||
Source1: cloud.cfg.suse
|
Source1: cloud.cfg.suse
|
||||||
Source2: cloud-init.init
|
Patch0: fixupSysVinit.patch
|
||||||
Patch0: drop-MAAS-datasource.diff
|
Patch1: slesHandler.diff
|
||||||
Patch1: drop-python27-only-code.diff
|
Patch2: openSUSEHandler.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
|
|
||||||
Requires: python-boto
|
Requires: python-boto
|
||||||
Requires: python-cheetah
|
Requires: python-cheetah
|
||||||
|
Requires: python-prettytable
|
||||||
|
Requires: python-requests
|
||||||
Requires: python-xml
|
Requires: python-xml
|
||||||
Requires: python-yaml
|
Requires: python-yaml
|
||||||
BuildRequires: filesystem
|
BuildRequires: filesystem
|
||||||
@ -51,36 +50,54 @@ BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
|||||||
BuildArch: noarch
|
BuildArch: noarch
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
|
%if 0%{?suse_version} && 0%{?suse_version} <= 1210
|
||||||
|
%define initsys sysvinit
|
||||||
|
%else
|
||||||
|
%define initsys systemd
|
||||||
|
%endif
|
||||||
|
|
||||||
%{py_requires}
|
%{py_requires}
|
||||||
|
|
||||||
%description
|
%description
|
||||||
Cloud-init is an init script that initializes a cloud node (VM)
|
Cloud-init is an init script that initializes a cloud node (VM)
|
||||||
according to the fetched configuration data from the admin node.
|
according to the fetched configuration data from the admin node.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Authors:
|
Authors:
|
||||||
--------
|
--------
|
||||||
Scott Moser <scott.moser@canonical.com>
|
Scott Moser <scott.moser@canonical.com>
|
||||||
|
|
||||||
|
%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
|
%prep
|
||||||
%setup -q -n %{component}-%{version}
|
%setup -q -n %{component}-%{version}
|
||||||
%patch0 -p1
|
%patch0
|
||||||
%if 0%{?suse_version} <= 1130
|
|
||||||
%patch1 -p1
|
%patch1 -p1
|
||||||
|
%patch2 -p1
|
||||||
|
%if 0%{?suse_version} <= 1130
|
||||||
# disable ecdsa for SLE 11 (not available)
|
# disable ecdsa for SLE 11 (not available)
|
||||||
echo "ssh_genkeytypes: ['rsa', 'dsa']" >> %{S:1}
|
echo "ssh_genkeytypes: ['rsa', 'dsa']" >> %{S:1}
|
||||||
%endif
|
%endif
|
||||||
%patch2 -p1
|
|
||||||
%patch3 -p1
|
|
||||||
|
|
||||||
%build
|
%build
|
||||||
python setup.py build
|
python setup.py build
|
||||||
|
|
||||||
%install
|
%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
|
find %{buildroot} \( -name .gitignore -o -name .placeholder \) -delete
|
||||||
mv %{buildroot}/%{_sysconfdir}/init %{buildroot}/%{_sysconfdir}/cloud/
|
|
||||||
# from debian install script
|
# from debian install script
|
||||||
for x in "%{buildroot}%{_bindir}/"*.py; do
|
for x in "%{buildroot}%{_bindir}/"*.py; do
|
||||||
[ -f "${x}" ] && mv "${x}" "${x%.py}"
|
[ -f "${x}" ] && mv "${x}" "${x%.py}"
|
||||||
@ -90,13 +107,22 @@ mkdir -p %{buildroot}%{_localstatedir}/lib/cloud
|
|||||||
mkdir -p %{buildroot}%{_defaultdocdir}
|
mkdir -p %{buildroot}%{_defaultdocdir}
|
||||||
mv %{buildroot}/usr/share/doc/%{component} %{buildroot}%{docdir}
|
mv %{buildroot}/usr/share/doc/%{component} %{buildroot}%{docdir}
|
||||||
cp -a %{S:1} %{buildroot}/%{_sysconfdir}/cloud/cloud.cfg
|
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)
|
# remove debian/ubuntu specific profile.d file (bnc#779553)
|
||||||
rm -f %{buildroot}%{_sysconfdir}/profile.d/Z99-cloud-locale-test.sh
|
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
|
# remove duplicate files
|
||||||
%if 0%{?suse_version}
|
%if 0%{?suse_version}
|
||||||
%fdupes %{buildroot}%{python_sitelib}
|
%fdupes %{buildroot}%{python_sitelib}
|
||||||
@ -108,14 +134,26 @@ rm -f %{buildroot}%{_sysconfdir}/profile.d/Z99-cloud-locale-test.sh
|
|||||||
%{python_sitelib}/cloud_init*egg-info
|
%{python_sitelib}/cloud_init*egg-info
|
||||||
%{_bindir}/cloud-init
|
%{_bindir}/cloud-init
|
||||||
%{_bindir}/cloud-init-per
|
%{_bindir}/cloud-init-per
|
||||||
%{_bindir}/cloud-init-cfg
|
|
||||||
%{_sbindir}/rc%{component}
|
|
||||||
%config(noreplace) %{_sysconfdir}/cloud/
|
%config(noreplace) %{_sysconfdir}/cloud/
|
||||||
%doc %{docdir}
|
|
||||||
/usr/lib/cloud-init
|
/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
|
%dir %attr(0755, root, root) %{_localstatedir}/lib/cloud
|
||||||
|
|
||||||
|
%files doc
|
||||||
|
%defattr(-,root,root)
|
||||||
|
%doc %{docdir}
|
||||||
|
|
||||||
|
%files test
|
||||||
|
%defattr(-,root,root)
|
||||||
|
%{python_sitelib}/tests
|
||||||
|
|
||||||
%postun
|
%postun
|
||||||
%insserv_cleanup
|
%insserv_cleanup
|
||||||
|
|
||||||
|
@ -1,13 +0,0 @@
|
|||||||
Index: cloud-init-0.6.3/cloudinit/__init__.py
|
|
||||||
===================================================================
|
|
||||||
--- cloud-init-0.6.3.orig/cloudinit/__init__.py
|
|
||||||
+++ cloud-init-0.6.3/cloudinit/__init__.py
|
|
||||||
@@ -29,7 +29,7 @@ cfg_env_name = "CLOUD_CFG"
|
|
||||||
|
|
||||||
cfg_builtin = """
|
|
||||||
log_cfgs: []
|
|
||||||
-datasource_list: ["NoCloud", "ConfigDrive", "OVF", "MAAS", "Ec2", "CloudStack"]
|
|
||||||
+datasource_list: ["NoCloud", "ConfigDrive", "OVF", "Ec2", "CloudStack"]
|
|
||||||
def_log_file: /var/log/cloud-init.log
|
|
||||||
syslog_fix_perms: syslog:adm
|
|
||||||
"""
|
|
@ -1,22 +0,0 @@
|
|||||||
Index: cloud-init-0.6.3/cloudinit/netinfo.py
|
|
||||||
===================================================================
|
|
||||||
--- cloud-init-0.6.3.orig/cloudinit/netinfo.py
|
|
||||||
+++ cloud-init-0.6.3/cloudinit/netinfo.py
|
|
||||||
@@ -24,7 +24,7 @@ import subprocess
|
|
||||||
|
|
||||||
def netdev_info(empty=""):
|
|
||||||
fields = ("hwaddr", "addr", "bcast", "mask")
|
|
||||||
- ifcfg_out = str(subprocess.check_output(["ifconfig", "-a"]))
|
|
||||||
+ ifcfg_out = str(subprocess.Popen(["ifconfig", "-a"], stdout=subprocess.PIPE).communicate()[0])
|
|
||||||
devs = {}
|
|
||||||
for line in ifcfg_out.splitlines():
|
|
||||||
if len(line) == 0:
|
|
||||||
@@ -70,7 +70,7 @@ def netdev_info(empty=""):
|
|
||||||
|
|
||||||
|
|
||||||
def route_info():
|
|
||||||
- route_out = str(subprocess.check_output(["route", "-n"]))
|
|
||||||
+ route_out = str(subprocess.Popen(["route", "-n"], stdout=subprocess.PIPE).communicate()[0])
|
|
||||||
routes = []
|
|
||||||
for line in route_out.splitlines()[1:]:
|
|
||||||
if not line:
|
|
@ -1,39 +0,0 @@
|
|||||||
Index: cloud-init-0.6.3/cloudinit/CloudConfig/cc_byobu.py
|
|
||||||
===================================================================
|
|
||||||
--- cloud-init-0.6.3.orig/cloudinit/CloudConfig/cc_byobu.py
|
|
||||||
+++ cloud-init-0.6.3/cloudinit/CloudConfig/cc_byobu.py
|
|
||||||
@@ -55,7 +55,7 @@ def handle(_name, cfg, _cloud, log, args
|
|
||||||
|
|
||||||
shcmd = ""
|
|
||||||
if mod_user:
|
|
||||||
- user = util.get_cfg_option_str(cfg, "user", "ubuntu")
|
|
||||||
+ user = util.get_cfg_option_str(cfg, "user", "root")
|
|
||||||
shcmd += " sudo -Hu \"%s\" byobu-launcher-%s" % (user, bl_inst)
|
|
||||||
shcmd += " || X=$(($X+1)); "
|
|
||||||
if mod_sys:
|
|
||||||
Index: cloud-init-0.6.3/cloudinit/CloudConfig/cc_set_passwords.py
|
|
||||||
===================================================================
|
|
||||||
--- cloud-init-0.6.3.orig/cloudinit/CloudConfig/cc_set_passwords.py
|
|
||||||
+++ cloud-init-0.6.3/cloudinit/CloudConfig/cc_set_passwords.py
|
|
||||||
@@ -44,7 +44,7 @@ def handle(_name, cfg, _cloud, log, args
|
|
||||||
expire = util.get_cfg_option_bool(chfg, 'expire', expire)
|
|
||||||
|
|
||||||
if not plist and password:
|
|
||||||
- user = util.get_cfg_option_str(cfg, "user", "ubuntu")
|
|
||||||
+ user = util.get_cfg_option_str(cfg, "user", "root")
|
|
||||||
plist = "%s:%s" % (user, password)
|
|
||||||
|
|
||||||
errors = []
|
|
||||||
Index: cloud-init-0.6.3/cloudinit/CloudConfig/cc_ssh_import_id.py
|
|
||||||
===================================================================
|
|
||||||
--- cloud-init-0.6.3.orig/cloudinit/CloudConfig/cc_ssh_import_id.py
|
|
||||||
+++ cloud-init-0.6.3/cloudinit/CloudConfig/cc_ssh_import_id.py
|
|
||||||
@@ -30,7 +30,7 @@ def handle(_name, cfg, _cloud, log, args
|
|
||||||
if len(args) > 1:
|
|
||||||
ids = args[1:]
|
|
||||||
else:
|
|
||||||
- user = util.get_cfg_option_str(cfg, "user", "ubuntu")
|
|
||||||
+ user = util.get_cfg_option_str(cfg, "user", "root")
|
|
||||||
ids = util.get_cfg_option_list_or_str(cfg, "ssh_import_id", [])
|
|
||||||
|
|
||||||
if len(ids) == 0:
|
|
52
fixupSysVinit.patch
Normal file
52
fixupSysVinit.patch
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
--- 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)
|
90
openSUSEHandler.diff
Normal file
90
openSUSEHandler.diff
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
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 <rjschwei@suse.com>
|
||||||
|
+#
|
||||||
|
+# 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
|
||||||
|
+
|
||||||
|
+
|
@ -1,13 +0,0 @@
|
|||||||
Index: cloud-init-0.6.3/cloudinit/SshUtil.py
|
|
||||||
===================================================================
|
|
||||||
--- cloud-init-0.6.3.orig/cloudinit/SshUtil.py
|
|
||||||
+++ cloud-init-0.6.3/cloudinit/SshUtil.py
|
|
||||||
@@ -155,6 +155,8 @@ def setup_user_keys(keys, user, key_pref
|
|
||||||
akeys = ssh_cfg.get("AuthorizedKeysFile", "%h/.ssh/authorized_keys")
|
|
||||||
akeys = akeys.replace("%h", pwent.pw_dir)
|
|
||||||
akeys = akeys.replace("%u", user)
|
|
||||||
+ if not akeys.startswith('/'):
|
|
||||||
+ akeys = os.path.join(pwent.pw_dir, akeys)
|
|
||||||
authorized_keys = akeys
|
|
||||||
except Exception:
|
|
||||||
authorized_keys = '%s/.ssh/authorized_keys' % pwent.pw_dir
|
|
384
slesHandler.diff
Normal file
384
slesHandler.diff
Normal file
@ -0,0 +1,384 @@
|
|||||||
|
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 <rjschwei@suse.com>
|
||||||
|
+#
|
||||||
|
+# 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
|
||||||
|
+
|
Loading…
Reference in New Issue
Block a user