1. Fixup the setup.py to not include custom startup scripts, let the packaging solutions handle these

2. Get the cloud-init specfile working for the init.d case (with the right postun and post and install sections)
   a. It works!!!
This commit is contained in:
Joshua Harlow 2012-07-02 15:40:51 -07:00
parent 2d96020385
commit 545fd9c3b9
3 changed files with 169 additions and 120 deletions

View File

@ -71,6 +71,7 @@ def get_log_header(version):
def format_change_line(ds, who, comment=None): def format_change_line(ds, who, comment=None):
# Rpmbuild seems to be pretty strict about the date format
d = ds.strftime("%a %b %d %Y") d = ds.strftime("%a %b %d %Y")
d += " - %s" % (who) d += " - %s" % (who)
if comment: if comment:
@ -134,104 +135,31 @@ def generate_spec_contents(args, tmpl_fn):
changelog_lines.append(line) changelog_lines.append(line)
subs['changelog'] = "\n".join(changelog_lines) subs['changelog'] = "\n".join(changelog_lines)
# See: http://www.zarb.org/~jasonc/macros.php if args.boot == 'initd':
# Pickup any special files subs['init_d'] = True
docs = [ subs['init_d_local'] = False
'TODO', elif args.boot == 'initd-local':
'LICENSE', subs['init_d'] = True
'ChangeLog', subs['init_d_local'] = True
'Requires', else:
'%{_defaultdocdir}/cloud-init/*', subs['init_d'] = False
] subs['init_d_local'] = False
subs['docs'] = docs
configs = [ if args.boot == 'systemd':
'cloud/cloud.cfg', subs['systemd'] = True
'cloud/cloud.cfg.d/*.cfg', else:
'cloud/cloud.cfg.d/README', subs['systemd'] = False
'cloud/templates/*',
]
subs['configs'] = configs
other_files = [
'%{_bindir}/*',
'/usr/lib/cloud-init/*',
]
# Since setup.py installs them all, we need to selectively
# remove the wrong ones and ensure the right one/s are kept
# for the boot mode that is desired...
boot_remove = {
'initd': [
'/etc/init.d/cloud-init-local',
# Remove the other auto-start folders
'/etc/systemd/',
'/etc/init/',
],
'initd-local': [
'/etc/init.d/cloud-init',
# Remove the other auto-start folders
'/etc/systemd/',
'/etc/init/',
],
# It seems like systemd can work with
# all of its files being 'active' (and not have naming
# or event name conflicts??)
'systemd': [
# Remove the other auto-start folders
'/etc/init.d/',
'/etc/init/',
],
'upstart': [
'/etc/init/cloud-init-nonet.conf',
'/etc/init/cloud-init-local.conf',
# Remove the other auto-start folders
'/etc/init.d/',
'/etc/systemd/',
],
'upstart-local': [
'/etc/init/cloud-init.conf',
# Remove the other auto-start folders
'/etc/init.d/',
'/etc/systemd/',
]
}
boot_keep = {
'systemd': [
'/etc/systemd/*',
],
'upstart': [
'/etc/init/*',
],
'upstart-local': [
'/etc/init/*',
],
'initd-local': [
'/etc/init.d/*',
],
'initd': [
'/etc/init.d/*',
],
}
subs['post_remove'] = boot_remove[args.boot]
other_files.extend(boot_keep[args.boot])
subs['files'] = other_files
return templater.render_from_file(tmpl_fn, params=subs) return templater.render_from_file(tmpl_fn, params=subs)
def archive_code():
(stdout, _stderr) = tiny_p([sys.executable,
join(os.getcwd(), 'make-tarball')])
(revno, version, bname, arc_fn) = stdout.split(None)
return (revno, version, arc_fn)
def main(): def main():
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument("-b", "--boot", dest="boot", parser.add_argument("-b", "--boot", dest="boot",
help="select boot type (default: %(default)s)", help="select boot type (default: %(default)s)",
metavar="TYPE", default='initd', metavar="TYPE", default='initd',
choices=('upstart', 'initd', 'systemd', choices=('initd', 'systemd', 'initd-local'))
'upstart-local', 'initd-local'))
parser.add_argument("-v", "--verbose", dest="verbose", parser.add_argument("-v", "--verbose", dest="verbose",
help=("run verbosely" help=("run verbosely"
" (default: %(default)s)"), " (default: %(default)s)"),

View File

@ -1,5 +1,9 @@
%{!?python_sitelib: %global python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")} %{!?python_sitelib: %global python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")}
# See: See: http://www.zarb.org/~jasonc/macros.php
# Or: http://fedoraproject.org/wiki/Packaging:ScriptletSnippets
# Or: http://www.rpm.org/max-rpm/ch-rpm-inside.html
Name: cloud-init Name: cloud-init
Version: {{version}} Version: {{version}}
Release: {{release}}%{?dist} Release: {{release}}%{?dist}
@ -10,27 +14,45 @@ License: GPLv3
URL: http://launchpad.net/cloud-init URL: http://launchpad.net/cloud-init
Source0: {{archive_name}} Source0: {{archive_name}}
BuildArch: noarch BuildArch: noarch
BuildRoot: %{_tmppath} BuildRoot: %{_tmppath}
BuildRequires: python-devel
BuildRequires: python-setuptools
{{for r in bd_requires}} # System util packages needed
BuildRequires: {{r}} Requires: shadow-utils
{{endfor}} Requires: rsyslog
Requires: iproute
Requires: e2fsprogs
Requires: net-tools
Requires: procps
Requires: shadow-utils
# Install requirements # Install pypi 'dynamic' requirements
{{for r in requires}} {{for r in requires}}
Requires: {{r}} Requires: {{r}}
{{endfor}} {{endfor}}
{{if init_d}}
Requires(post): chkconfig
Requires(postun): initscripts
Requires(preun): chkconfig
Requires(preun): initscripts
{{endif}}
{{if systemd}}
BuildRequires: systemd-units
Requires(post): systemd-units
Requires(postun): systemd-units
Requires(preun): systemd-units
{{endif}}
%description %description
Cloud-init is a set of init scripts for cloud instances. Cloud instances Cloud-init is a set of init scripts for cloud instances. Cloud instances
need special scripts to run during initialization to retrieve and install need special scripts to run during initialization to retrieve and install
ssh keys and to let the user run various scripts. ssh keys and to let the user run various scripts.
%prep %prep
%setup -q -n %{name}-%{version}-{{revno}} %setup -q -n %{name}-%{version}-{{revno}}
@ -41,32 +63,139 @@ ssh keys and to let the user run various scripts.
rm -rf $RPM_BUILD_ROOT rm -rf $RPM_BUILD_ROOT
%{__python} setup.py install -O1 --skip-build --root $RPM_BUILD_ROOT %{__python} setup.py install -O1 --skip-build --root $RPM_BUILD_ROOT
# Remove anything after it was installed?? # Note that /etc/rsyslog.d didn't exist by default until F15.
{{for r in post_remove}} # el6 request: https://bugzilla.redhat.com/show_bug.cgi?id=740420
rm -rfv $RPM_BUILD_ROOT/{{r}} mkdir -p $RPM_BUILD_ROOT/%{_sysconfdir}/rsyslog.d
{{endfor}} cp -p tools/21-cloudinit.conf \
$RPM_BUILD_ROOT/%{_sysconfdir}/rsyslog.d/21-cloudinit.conf
{{if init_d}}
mkdir -p $RPM_BUILD_ROOT/%{_initddir}/
{{endif}}
{{if init_d_local}}
cp -p initd/cloud-init-local $RPM_BUILD_ROOT/%{_initddir}/
cp -p initd/cloud-config $RPM_BUILD_ROOT/%{_initddir}/
cp -p initd/cloud-final $RPM_BUILD_ROOT/%{_initddir}/
{{elif init_d}}
cp -p initd/cloud-init $RPM_BUILD_ROOT/%{_initddir}/
cp -p initd/cloud-config $RPM_BUILD_ROOT/%{_initddir}/
cp -p initd/cloud-final $RPM_BUILD_ROOT/%{_initddir}/
{{endif}}
{{if systemd}}
mkdir -p $RPM_BUILD_ROOT/%{_unitdir}
cp -p systemd/* $RPM_BUILD_ROOT/%{_unitdir}
{{endif}}
%clean %clean
rm -rf $RPM_BUILD_ROOT rm -rf $RPM_BUILD_ROOT
%post
{{if systemd}}
if [ $1 -eq 1 ]
then
/bin/systemctl enable cloud-config.service >/dev/null 2>&1 || :
/bin/systemctl enable cloud-final.service >/dev/null 2>&1 || :
/bin/systemctl enable cloud-init.service >/dev/null 2>&1 || :
/bin/systemctl enable cloud-init-local.service >/dev/null 2>&1 || :
fi
{{endif}}
{{if init_d_local}}
/sbin/chkconfig --add /etc/rc.d/init.d/cloud-init-local
{{elif init_d}}
/sbin/chkconfig --add /etc/rc.d/init.d/cloud-init
{{endif}}
{{if init_d}}
/sbin/chkconfig --add /etc/rc.d/init.d/cloud-config
/sbin/chkconfig --add /etc/rc.d/init.d/cloud-final
{{endif}}
%preun
{{if init_d_local}}
if [ $1 -eq 0 ]
then
/sbin/service cloud-init-local stop >/dev/null 2>&1
/sbin/chkconfig --del cloud-init-local
fi
{{elif init_d}}
if [ $1 -eq 0 ]
then
/sbin/service cloud-init stop >/dev/null 2>&1
/sbin/chkconfig --del cloud-init
fi
{{endif}}
{{if init_d}}
if [ $1 -eq 0 ]
then
/sbin/service cloud-config stop >/dev/null 2>&1
/sbin/chkconfig --del cloud-config
/sbin/service cloud-final stop >/dev/null 2>&1
/sbin/chkconfig --del cloud-final
fi
{{endif}}
{{if systemd}}
if [ $1 -eq 0 ]
then
/bin/systemctl --no-reload disable cloud-config.service >/dev/null 2>&1 || :
/bin/systemctl --no-reload disable cloud-final.service >/dev/null 2>&1 || :
/bin/systemctl --no-reload disable cloud-init.service >/dev/null 2>&1 || :
/bin/systemctl --no-reload disable cloud-init-local.service >/dev/null 2>&1 || :
fi
{{endif}}
%postun
{{if systemd}}
/bin/systemctl daemon-reload >/dev/null 2>&1 || :
{{endif}}
%files %files
{{if init_d}}
%attr(0755, root, root) %{_initddir}/cloud-config
%attr(0755, root, root) %{_initddir}/cloud-final
{{endif}}
{{if init_d_local}}
%attr(0755, root, root) %{_initddir}/cloud-init-local
{{elif init_d}}
%attr(0755, root, root) %{_initddir}/cloud-init
{{endif}}
{{if systemd}}
%{_unitdir}/cloud-config.service
%{_unitdir}/cloud-config.target
%{_unitdir}/cloud-init.service
%{_unitdir}/cloud-init-local.service
%{_unitdir}/cloud-final.service
{{endif}}
# Program binaries
%{_bindir}/cloud-init*
# There doesn't seem to be an agreed upon place for these
# although it appears the standard says /usr/lib but rpmbuild
# will try /usr/lib64 ??
/usr/lib/%{name}/uncloud-init
/usr/lib/%{name}/write-ssh-key-fingerprints
# Docs # Docs
{{for r in docs}} %doc TODO LICENSE ChangeLog Requires
%doc {{r}} %doc %{_defaultdocdir}/cloud-init/*
{{endfor}}
# Configs # Configs
{{for r in configs}} %config(noreplace) %{_sysconfdir}/cloud/cloud.cfg
%config(noreplace) %{_sysconfdir}/{{r}} %dir %{_sysconfdir}/cloud/cloud.cfg.d
{{endfor}} %config(noreplace) %{_sysconfdir}/cloud/cloud.cfg.d/*.cfg
%config(noreplace) %{_sysconfdir}/cloud/cloud.cfg.d/README
%dir %{_sysconfdir}/cloud/templates
%config(noreplace) %{_sysconfdir}/cloud/templates/*
%config(noreplace) %{_sysconfdir}/rsyslog.d/21-cloudinit.conf
# Other files # Python code is here...
{{for r in files}}
{{r}}
{{endfor}}
# Python sitelib
%{python_sitelib}/* %{python_sitelib}/*
%changelog %changelog

View File

@ -76,20 +76,12 @@ setuptools.setup(name='cloud-init',
data_files=[('/etc/cloud', glob('config/*.cfg')), data_files=[('/etc/cloud', glob('config/*.cfg')),
('/etc/cloud/cloud.cfg.d', glob('config/cloud.cfg.d/*')), ('/etc/cloud/cloud.cfg.d', glob('config/cloud.cfg.d/*')),
('/etc/cloud/templates', glob('templates/*')), ('/etc/cloud/templates', glob('templates/*')),
# Only really need for upstart based systems
('/etc/init', glob('upstart/*.conf')),
# Only really need for systemd based systems
('/etc/systemd/system', glob('systemd/*.service')),
# Only really need for init.d based system
('/etc/init.d', glob('initd/*')),
('/usr/share/cloud-init', []), ('/usr/share/cloud-init', []),
('/usr/lib/cloud-init', ('/usr/lib/cloud-init',
['tools/uncloud-init', 'tools/write-ssh-key-fingerprints']), ['tools/uncloud-init', 'tools/write-ssh-key-fingerprints']),
('/usr/share/doc/cloud-init', filter(is_f, glob('doc/*'))), ('/usr/share/doc/cloud-init', filter(is_f, glob('doc/*'))),
('/usr/share/doc/cloud-init/examples', filter(is_f, glob('doc/examples/*'))), ('/usr/share/doc/cloud-init/examples', filter(is_f, glob('doc/examples/*'))),
('/usr/share/doc/cloud-init/examples/seed', filter(is_f, glob('doc/examples/seed/*'))), ('/usr/share/doc/cloud-init/examples/seed', filter(is_f, glob('doc/examples/seed/*'))),
# ??
# ('/etc/profile.d', ['tools/Z99-cloud-locale-test.sh']),
], ],
install_requires=read_requires(), install_requires=read_requires(),
) )