From 6d74afcd0e11de5cb56623d9121472e9212e8481 Mon Sep 17 00:00:00 2001 From: Joshua Harlow Date: Mon, 25 Jun 2012 12:28:59 -0700 Subject: 1. Moving around the packages dir. 2. Adjusting the bddep shell script 3. Starting to add a brpm --- packages/bddeb | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100755 packages/bddeb (limited to 'packages/bddeb') diff --git a/packages/bddeb b/packages/bddeb new file mode 100755 index 00000000..74932985 --- /dev/null +++ b/packages/bddeb @@ -0,0 +1,62 @@ +#!/bin/sh + +# Ensure we can find the setup.py file which +# should be at the root of the cloud-init tree +PKG_DIR=`pwd` +ROOT="$PKG_DIR/../" +if [ ! -e "$ROOT/setup.py" ]; then + echo "No setup.py found at $ROOT" + exit 1 +fi +echo "Using root directory $ROOT for building your debian package" + +# Ensure tempdir is cleaned and ready to go +TEMP_D=$(mktemp -d "${TMPDIR:-/tmp}/${0##*/}.XXXXXXX") +echo "With $TEMP_D as a temporary workspace" +rm -Rf "${TEMP_D}"; mkdir "${TEMP_D}" +set -e + +# Ensure tempdir removed if breaks... +trap "rm -Rf '${TEMP_D}'" EXIT SIGINT SIGTERM + +# Go to the root and start making a package! +cd $ROOT +files=$(bzr ls --versioned) +revno=$(bzr revno) +version=$(awk -F: \ + '$1 ~ /[0-9][.][0-9]+[.][0-9]+/ { print $1 ; exit(0); }' ChangeLog ) + +# Ensure that the version found in 'Changelog' is the same in the python +# cloud-init version directory +py_version=$(python -c 'from cloudinit import version; import sys; \ +sys.stdout.write(version.version_string())') + +# Canonicalize the changelog version +ch_version=$(python -c "from distutils import version; import sys; \ +sys.stdout.write(str(version.StrictVersion('$version')));") + +if [ "$py_version" != "$ch_version" ]; then + echo "Cloud-init python version $py_version" \ + " != changelog version $ch_version" + echo "Please ensure they are the same!" + exit 1 +fi + +mkdir "${TEMP_D}/cloud-init" +otar="$TEMP_D/cloud-init_$version~bzr${revno}.orig.tar.gz" +tar -czf - ${files} > "$otar" +tar -C "${TEMP_D}/cloud-init" -xzf - < "$otar" + +if [ ! -d "${TEMP_D}/cloud-init/debian" ]; then + rsync -a $PKG_DIR/debian.trunk/ "${TEMP_D}/cloud-init/debian" +fi + +sed -i -e "s,VERSION,$version," -e "s,REVNO,bzr$revno," \ + "$TEMP_D/cloud-init/debian/changelog" + +cd "${TEMP_D}/cloud-init" +debuild "$@" +debname="cloud-init_${version}~bzr${revno}-1_all.deb" +mv "../$debname" "$PKG_DIR" +echo "Wrote $debname to $PKG_DIR" + -- cgit v1.2.3 From fcb055e3a58d50352e7c3f84fe42b8c71268b3b8 Mon Sep 17 00:00:00 2001 From: Joshua Harlow Date: Mon, 25 Jun 2012 13:07:40 -0700 Subject: Use the new version extraction tool to get the current active version. --- packages/bddeb | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) (limited to 'packages/bddeb') diff --git a/packages/bddeb b/packages/bddeb index 74932985..2a089295 100755 --- a/packages/bddeb +++ b/packages/bddeb @@ -23,24 +23,7 @@ trap "rm -Rf '${TEMP_D}'" EXIT SIGINT SIGTERM cd $ROOT files=$(bzr ls --versioned) revno=$(bzr revno) -version=$(awk -F: \ - '$1 ~ /[0-9][.][0-9]+[.][0-9]+/ { print $1 ; exit(0); }' ChangeLog ) - -# Ensure that the version found in 'Changelog' is the same in the python -# cloud-init version directory -py_version=$(python -c 'from cloudinit import version; import sys; \ -sys.stdout.write(version.version_string())') - -# Canonicalize the changelog version -ch_version=$(python -c "from distutils import version; import sys; \ -sys.stdout.write(str(version.StrictVersion('$version')));") - -if [ "$py_version" != "$ch_version" ]; then - echo "Cloud-init python version $py_version" \ - " != changelog version $ch_version" - echo "Please ensure they are the same!" - exit 1 -fi +version=$(tools/read-version) mkdir "${TEMP_D}/cloud-init" otar="$TEMP_D/cloud-init_$version~bzr${revno}.orig.tar.gz" -- cgit v1.2.3 From b40acd43cd8a7849887147c293d41f0ee5e1145c Mon Sep 17 00:00:00 2001 From: Joshua Harlow Date: Mon, 25 Jun 2012 21:13:37 -0700 Subject: Use move and not util copy --- packages/bddeb | 109 ++++++++++++++++++++++++++++++++++----------------------- packages/brpm | 4 +-- 2 files changed, 67 insertions(+), 46 deletions(-) (limited to 'packages/bddeb') diff --git a/packages/bddeb b/packages/bddeb index 2a089295..465bd986 100755 --- a/packages/bddeb +++ b/packages/bddeb @@ -1,45 +1,66 @@ -#!/bin/sh - -# Ensure we can find the setup.py file which -# should be at the root of the cloud-init tree -PKG_DIR=`pwd` -ROOT="$PKG_DIR/../" -if [ ! -e "$ROOT/setup.py" ]; then - echo "No setup.py found at $ROOT" - exit 1 -fi -echo "Using root directory $ROOT for building your debian package" - -# Ensure tempdir is cleaned and ready to go -TEMP_D=$(mktemp -d "${TMPDIR:-/tmp}/${0##*/}.XXXXXXX") -echo "With $TEMP_D as a temporary workspace" -rm -Rf "${TEMP_D}"; mkdir "${TEMP_D}" -set -e - -# Ensure tempdir removed if breaks... -trap "rm -Rf '${TEMP_D}'" EXIT SIGINT SIGTERM - -# Go to the root and start making a package! -cd $ROOT -files=$(bzr ls --versioned) -revno=$(bzr revno) -version=$(tools/read-version) - -mkdir "${TEMP_D}/cloud-init" -otar="$TEMP_D/cloud-init_$version~bzr${revno}.orig.tar.gz" -tar -czf - ${files} > "$otar" -tar -C "${TEMP_D}/cloud-init" -xzf - < "$otar" - -if [ ! -d "${TEMP_D}/cloud-init/debian" ]; then - rsync -a $PKG_DIR/debian.trunk/ "${TEMP_D}/cloud-init/debian" -fi - -sed -i -e "s,VERSION,$version," -e "s,REVNO,bzr$revno," \ - "$TEMP_D/cloud-init/debian/changelog" - -cd "${TEMP_D}/cloud-init" -debuild "$@" -debname="cloud-init_${version}~bzr${revno}-1_all.deb" -mv "../$debname" "$PKG_DIR" -echo "Wrote $debname to $PKG_DIR" +#!/usr/bin/python +import contextlib +import glob +import os +import shutil +import subprocess +import sys +import tempfile + + +@contextlib.contextmanager +def tmpdir(): + t = tempfile.mkdtemp() + try: + yield t + finally: + shutil.rmtree(t) + + +def join(*paths): + p = os.path.join(*paths) + return os.path.abspath(p) + + +def tiny_p(cmd): + # Darn python 2.6 doesn't have check_output (argggg) + info("Running %s" % (cmd)) + sp = subprocess.Popen(cmd, stdout=subprocess.PIPE, + stderr=subprocess.PIPE, stdin=None) + (out, err) = sp.communicate() + if sp.returncode not in [0]: + raise RuntimeError("Failed running %s [rc=%s] (%s, %s)" + % (cmd, sp.returncode, out, err)) + return (out, err) + + +def info(msg): + print("INFO: %s" % (msg)) + + +def warn(msg): + print("WARNING: %s" % (msg)) + + + +def main(): + + with tmpdir() as td: + info("Using %s as a temporary workspace" % (td)) + (stdout, _stderr) = tiny_p(['bzr', 'revno']) + revno = stdout.strip() + + + + cmd = [sys.executable, join(os.pardir, 'tools', 'read-version')] + (stdout, _stderr) = tiny_p(cmd) + version = stdout.strip() + + + + return 0 + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/packages/brpm b/packages/brpm index 241f08fd..febbfb5e 100755 --- a/packages/brpm +++ b/packages/brpm @@ -145,7 +145,7 @@ def main(): # Archive the code (revno, version, archive_fn) = archive_code() real_archive_fn = os.path.join(arc_dir, os.path.basename(archive_fn)) - shutil.copy(archive_fn, real_archive_fn) + shutil.move(archive_fn, real_archive_fn) info("Archived code to %s" % (real_archive_fn)) # Form the spec file to be used @@ -175,7 +175,7 @@ def main(): for fn in globs: n = os.path.basename(fn) tgt_fn = os.path.join(os.getcwd(), n) - util.copy(fn, tgt_fn) + shutil.move(fn, tgt_fn) info("Copied %s to %s" % (n, tgt_fn)) return 0 -- cgit v1.2.3 From 0b692aa1f4cd99332e47fca7a8cc27843ad1bbe5 Mon Sep 17 00:00:00 2001 From: Joshua Harlow Date: Mon, 25 Jun 2012 21:33:25 -0700 Subject: Coverting this to use the python utils --- packages/bddeb | 46 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 11 deletions(-) (limited to 'packages/bddeb') diff --git a/packages/bddeb b/packages/bddeb index 465bd986..f2158d5b 100755 --- a/packages/bddeb +++ b/packages/bddeb @@ -42,22 +42,46 @@ def info(msg): def warn(msg): print("WARNING: %s" % (msg)) - + +def archive_code(): + (stdout, _stderr) = tiny_p([sys.executable, + join(os.getcwd(), 'tar-me')]) + lines = stdout.splitlines() + revno = lines[0] + version = lines[1] + bname = lines[2] + arc_fn = lines[3] + return (revno, version, bname, arc_fn) + def main(): with tmpdir() as td: - info("Using %s as a temporary workspace" % (td)) - (stdout, _stderr) = tiny_p(['bzr', 'revno']) - revno = stdout.strip() - - - - cmd = [sys.executable, join(os.pardir, 'tools', 'read-version')] - (stdout, _stderr) = tiny_p(cmd) - version = stdout.strip() - + (revno, version, bname, archive_fn) = archive_code() + real_archive_fn = os.path.join(td, os.path.basename(archive_fn)) + shutil.move(archive_fn, real_archive_fn) + info("Archived code to %s" % (real_archive_fn)) + + cmd = ['tar', '-xvzf', real_archive_fn, '-C', td] + stdout, stderr = tiny_p(cmd) + + edir = join(td, bname) + shutil.move(edir, join(td, 'cloud-init')) + shutil.copytree('debian.trunk', join(td, 'cloud-init', 'debian')) + + cmd = ['sed', '-i', '-e',"s,VERSION,%s," %(version), + '-e', "s,REVNO,bzr%s," % (revno), + join(td, 'cloud-init', 'debian', 'changelog')] + tiny_p(cmd) + ocwd = os.getcwd() + os.chdir(join(td, 'cloud-init')) + cmd = ['debuild'] + tiny_p(cmd) + + debname = "cloud-init_%s~bzr%s-1_all.deb" % (version, revno) + shutil.move(debname, join(owcwd, debname)) + info("Wrote out debian package %s" % (join(owcwd, debname))) return 0 -- cgit v1.2.3 From cb49d6d4a1b5699b5e0afca1ac15d7225a8728a4 Mon Sep 17 00:00:00 2001 From: Joshua Harlow Date: Mon, 25 Jun 2012 21:51:36 -0700 Subject: Get the new builddeb working and fix the rules file --- packages/bddeb | 15 +++++++++++++-- packages/debian.trunk/rules | 1 - 2 files changed, 13 insertions(+), 3 deletions(-) (limited to 'packages/bddeb') diff --git a/packages/bddeb b/packages/bddeb index f2158d5b..1a9f13f3 100755 --- a/packages/bddeb +++ b/packages/bddeb @@ -15,7 +15,8 @@ def tmpdir(): try: yield t finally: - shutil.rmtree(t) + pass + #shutil.rmtree(t) def join(*paths): @@ -56,6 +57,10 @@ def archive_code(): def main(): + # cmd = ['apt-get', 'install', 'python-nose', + #'pyflakes', 'python-mocker', 'cdbs', 'debhelper'] + # tiny_p(cmd) + with tmpdir() as td: (revno, version, bname, archive_fn) = archive_code() real_archive_fn = os.path.join(td, os.path.basename(archive_fn)) @@ -68,12 +73,18 @@ def main(): edir = join(td, bname) shutil.move(edir, join(td, 'cloud-init')) shutil.copytree('debian.trunk', join(td, 'cloud-init', 'debian')) - + cmd = ['sed', '-i', '-e',"s,VERSION,%s," %(version), '-e', "s,REVNO,bzr%s," % (revno), join(td, 'cloud-init', 'debian', 'changelog')] tiny_p(cmd) + # Seems to want an original tar ball + o_tar = "cloud-init_%s~bzr%s.orig.tar.gz" % (version, revno) + cmd = ['tar', '-czf', join(td, o_tar), '-C', join(td, 'cloud-init')] + cmd.extend(os.listdir(join(td, 'cloud-init'))) + tiny_p(cmd) + ocwd = os.getcwd() os.chdir(join(td, 'cloud-init')) cmd = ['debuild'] diff --git a/packages/debian.trunk/rules b/packages/debian.trunk/rules index 0f79136c..a907b594 100755 --- a/packages/debian.trunk/rules +++ b/packages/debian.trunk/rules @@ -10,7 +10,6 @@ include /usr/share/cdbs/1/class/python-distutils.mk DEB_DH_INSTALL_SOURCEDIR := debian/tmp cloud-init-fixups: - for x in $(DEB_DESTDIR)/usr/bin/*.py; do mv "$$x" "$${x%.py}"; done install -d $(DEB_DESTDIR)/etc/rsyslog.d cp tools/21-cloudinit.conf $(DEB_DESTDIR)/etc/rsyslog.d/21-cloudinit.conf -- cgit v1.2.3 From 2e05cec5cc9b5b334f7e46b629d424b09b9925b2 Mon Sep 17 00:00:00 2001 From: Joshua Harlow Date: Mon, 25 Jun 2012 23:57:01 -0700 Subject: Get these working again after the subdirectory and output format changes. --- packages/bddeb | 99 +++++++++++++++++++++++++++++++++++++++++++--------------- packages/brpm | 32 +++++++++---------- 2 files changed, 89 insertions(+), 42 deletions(-) (limited to 'packages/bddeb') diff --git a/packages/bddeb b/packages/bddeb index 1a9f13f3..c39965da 100755 --- a/packages/bddeb +++ b/packages/bddeb @@ -8,6 +8,17 @@ import subprocess import sys import tempfile +import tempita + +PKG_MP = { + 'tempita': 'python-tempita', + 'boto': 'python-boto', + 'configobj': 'python-configobj', + 'oauth': 'python-oauth', + 'yaml': 'python-yaml', + 'prettytable': 'python-prettytable', + 'argparse': 'python-argparse', +} @contextlib.contextmanager def tmpdir(): @@ -24,11 +35,16 @@ def join(*paths): return os.path.abspath(p) -def tiny_p(cmd): +def tiny_p(cmd, capture=True): # Darn python 2.6 doesn't have check_output (argggg) info("Running %s" % (cmd)) - sp = subprocess.Popen(cmd, stdout=subprocess.PIPE, - stderr=subprocess.PIPE, stdin=None) + stdout = subprocess.PIPE + stderr = subprocess.PIPE + if not capture: + stdout = None + stderr = None + sp = subprocess.Popen(cmd, stdout=stdout, + stderr=stderr, stdin=None) (out, err) = sp.communicate() if sp.returncode not in [0]: raise RuntimeError("Failed running %s [rc=%s] (%s, %s)" @@ -36,6 +52,53 @@ def tiny_p(cmd): return (out, err) +def tmpl_file(name, params): + with open(join('debian', name), 'r') as fh: + contents = fh.read() + tpl = tempita.Template(contents) + return tpl.substitute(**params) + + +def write_debian(version, revno, root): + db_dir = join(root, 'debian') + os.makedirs(db_dir) + + # Fill in the change log template + with open(join(db_dir, 'changelog'), 'w') as fh: + params = { + 'version': version, + 'revision': revno, + } + contents = tmpl_file('changelog', params) + fh.write(contents) + + # Write out the control file template + cmd = [sys.executable, join(os.pardir, 'tools', 'read-dependencies')] + (stdout, _stderr) = tiny_p(cmd) + pkgs = stdout.splitlines() + requires = [] + + # Map to known packages + for e in pkgs: + e = e.lower().strip() + tgt_pkg = None + for n in PKG_MP.keys(): + if e.find(n) != -1: + tgt_pkg = PKG_MP.get(n) + if not tgt_pkg: + raise RuntimeError(("Do not know how to translate %s to " + " a known package") % (e)) + else: + requires.append(tgt_pkg) + contents = tmpl_file('control', {'requires': requires}) + with open(join(db_dir, 'control'), 'w') as fh: + fh.write(contents) + + # Just copy the following directly + for fn in ['dirs', 'copyright', 'compat', 'pycompat', 'rules']: + shutil.copy(join('debian', fn), + join(db_dir, fn)) + def info(msg): print("INFO: %s" % (msg)) @@ -46,49 +109,33 @@ def warn(msg): def archive_code(): (stdout, _stderr) = tiny_p([sys.executable, - join(os.getcwd(), 'tar-me')]) - lines = stdout.splitlines() - revno = lines[0] - version = lines[1] - bname = lines[2] - arc_fn = lines[3] - return (revno, version, bname, arc_fn) + join(os.getcwd(), 'make-tarball')]) + return stdout.split(None) def main(): - # cmd = ['apt-get', 'install', 'python-nose', - #'pyflakes', 'python-mocker', 'cdbs', 'debhelper'] - # tiny_p(cmd) - with tmpdir() as td: (revno, version, bname, archive_fn) = archive_code() real_archive_fn = os.path.join(td, os.path.basename(archive_fn)) shutil.move(archive_fn, real_archive_fn) - info("Archived code to %s" % (real_archive_fn)) - cmd = ['tar', '-xvzf', real_archive_fn, '-C', td] stdout, stderr = tiny_p(cmd) edir = join(td, bname) shutil.move(edir, join(td, 'cloud-init')) - shutil.copytree('debian.trunk', join(td, 'cloud-init', 'debian')) - - cmd = ['sed', '-i', '-e',"s,VERSION,%s," %(version), - '-e', "s,REVNO,bzr%s," % (revno), - join(td, 'cloud-init', 'debian', 'changelog')] - tiny_p(cmd) - + write_debian(version, revno, join(td, 'cloud-init')) + # Seems to want an original tar ball - o_tar = "cloud-init_%s~bzr%s.orig.tar.gz" % (version, revno) - cmd = ['tar', '-czf', join(td, o_tar), '-C', join(td, 'cloud-init')] + o_tar = "cloud-init_%s~%s.orig.tar.gz" % (version, revno) + cmd = ['tar', '-czvf', join(td, o_tar), '-C', join(td, 'cloud-init')] cmd.extend(os.listdir(join(td, 'cloud-init'))) tiny_p(cmd) ocwd = os.getcwd() os.chdir(join(td, 'cloud-init')) cmd = ['debuild'] - tiny_p(cmd) + tiny_p(cmd, capture=False) debname = "cloud-init_%s~bzr%s-1_all.deb" % (version, revno) shutil.move(debname, join(owcwd, debname)) diff --git a/packages/brpm b/packages/brpm index c3be5997..bbe637e8 100755 --- a/packages/brpm +++ b/packages/brpm @@ -37,11 +37,16 @@ def join(*paths): return os.path.abspath(p) -def tiny_p(cmd): +def tiny_p(cmd, capture=True): # Darn python 2.6 doesn't have check_output (argggg) info("Running %s" % (cmd)) - sp = subprocess.Popen(cmd, stdout=subprocess.PIPE, - stderr=subprocess.PIPE, stdin=None) + stdout = subprocess.PIPE + stderr = subprocess.PIPE + if not capture: + stdout = None + stderr = None + sp = subprocess.Popen(cmd, stdout=stdout, + stderr=stderr, stdin=None) (out, err) = sp.communicate() if sp.returncode not in [0]: raise RuntimeError("Failed running %s [rc=%s] (%s, %s)" @@ -123,12 +128,8 @@ def generate_spec_contents(tmpl_fn, revno, version): def archive_code(): (stdout, _stderr) = tiny_p([sys.executable, - join(os.getcwd(), 'tar-me')]) - lines = stdout.splitlines() - revno = lines[0] - version = lines[1] - bname = lines[2] - arc_fn = lines[3] + join(os.getcwd(), 'make-tarball')]) + (revno, version, bname, arc_fn) = stdout.split(None) return (revno, version, arc_fn) @@ -136,7 +137,7 @@ def main(): # Clean out the root dir and make sure the dirs we want are in place root_dir = os.path.expanduser("~/rpmbuild") - info("Cleaning %s" % (root_dir)) + info("Cleaning %r" % (root_dir)) if os.path.isdir(root_dir): shutil.rmtree(root_dir) arc_dir = os.path.join(root_dir, 'SOURCES') @@ -147,22 +148,21 @@ def main(): (revno, version, archive_fn) = archive_code() real_archive_fn = os.path.join(arc_dir, os.path.basename(archive_fn)) shutil.move(archive_fn, real_archive_fn) - info("Archived code to %s" % (real_archive_fn)) + info("Archived code to %r" % (real_archive_fn)) # Form the spec file to be used - tmpl_fn = os.path.join(os.getcwd(), 'brpm.tmpl') - info("Generated spec file from template %s" % (tmpl_fn)) + tmpl_fn = os.path.join(os.getcwd(), 'redhat', 'cloud-init.spec') + info("Generated spec file from template %r" % (tmpl_fn)) (base_name, arc_name, contents) = generate_spec_contents(tmpl_fn, revno, version) spec_fn = os.path.join(root_dir, 'cloud-init.spec') with open(spec_fn, 'w') as fh: fh.write(contents) - info("Wrote spec file to %s" % (spec_fn)) + info("Wrote spec file to %r" % (spec_fn)) # Now build it! cmd = ['rpmbuild', '-ba', spec_fn] - info("Running rpmbuild %s" % (cmd)) - tiny_p(cmd) + tiny_p(cmd, capture=False) info("Rpmbuild completed!") # Copy the items built to our local dir -- cgit v1.2.3 From 2b1916db723148dcc291f3ac991bb0340943587e Mon Sep 17 00:00:00 2001 From: Joshua Harlow Date: Tue, 26 Jun 2012 12:17:11 -0700 Subject: Shrink these down by using the cloudinit utils. --- packages/bddeb | 177 +++++++++++++++++++++----------------------------- packages/brpm | 155 ++++++++++++++++++------------------------- packages/make-tarball | 108 ++++++++++++------------------ 3 files changed, 183 insertions(+), 257 deletions(-) (limited to 'packages/bddeb') diff --git a/packages/bddeb b/packages/bddeb index c39965da..5f250738 100755 --- a/packages/bddeb +++ b/packages/bddeb @@ -1,15 +1,20 @@ #!/usr/bin/python -import contextlib -import glob import os import shutil -import subprocess import sys -import tempfile -import tempita +# Use the util functions from cloudinit +possible_topdir = os.path.normpath(os.path.join(os.path.abspath( + sys.argv[0]), os.pardir, os.pardir)) +if os.path.exists(os.path.join(possible_topdir, "cloudinit", "__init__.py")): + sys.path.insert(0, possible_topdir) +from cloudinit import templater +from cloudinit import util + +# Package names that will showup in requires to what we can actually +# use in our debian 'control' file PKG_MP = { 'tempita': 'python-tempita', 'boto': 'python-boto', @@ -20,126 +25,94 @@ PKG_MP = { 'argparse': 'python-argparse', } -@contextlib.contextmanager -def tmpdir(): - t = tempfile.mkdtemp() - try: - yield t - finally: - pass - #shutil.rmtree(t) - - -def join(*paths): - p = os.path.join(*paths) - return os.path.abspath(p) - - -def tiny_p(cmd, capture=True): - # Darn python 2.6 doesn't have check_output (argggg) - info("Running %s" % (cmd)) - stdout = subprocess.PIPE - stderr = subprocess.PIPE - if not capture: - stdout = None - stderr = None - sp = subprocess.Popen(cmd, stdout=stdout, - stderr=stderr, stdin=None) - (out, err) = sp.communicate() - if sp.returncode not in [0]: - raise RuntimeError("Failed running %s [rc=%s] (%s, %s)" - % (cmd, sp.returncode, out, err)) - return (out, err) - - -def tmpl_file(name, params): - with open(join('debian', name), 'r') as fh: - contents = fh.read() - tpl = tempita.Template(contents) - return tpl.substitute(**params) - -def write_debian(version, revno, root): - db_dir = join(root, 'debian') - os.makedirs(db_dir) +def write_debian_folder(root, version, revno): + deb_dir = util.abs_join(root, 'debian') + os.makedirs(deb_dir) # Fill in the change log template - with open(join(db_dir, 'changelog'), 'w') as fh: - params = { - 'version': version, - 'revision': revno, - } - contents = tmpl_file('changelog', params) - fh.write(contents) + templater.render_to_file(util.abs_join('debian', 'changelog'), + util.abs_join(deb_dir, 'changelog'), + params={ + 'version': version, + 'revision': revno, + }) # Write out the control file template - cmd = [sys.executable, join(os.pardir, 'tools', 'read-dependencies')] - (stdout, _stderr) = tiny_p(cmd) - pkgs = stdout.splitlines() - requires = [] + cmd = [sys.executable, + util.abs_join(os.pardir, 'tools', 'read-dependencies')] + (stdout, _stderr) = util.subp(cmd) # Map to known packages - for e in pkgs: - e = e.lower().strip() + pkgs = [p.lower().strip() for p in stdout.splitlines()] + requires = [] + for p in pkgs: tgt_pkg = None - for n in PKG_MP.keys(): - if e.find(n) != -1: - tgt_pkg = PKG_MP.get(n) + for name in PKG_MP.keys(): + if p.find(name) != -1: + tgt_pkg = PKG_MP.get(name) + break if not tgt_pkg: raise RuntimeError(("Do not know how to translate %s to " - " a known package") % (e)) + " a known package") % (p)) else: requires.append(tgt_pkg) - contents = tmpl_file('control', {'requires': requires}) - with open(join(db_dir, 'control'), 'w') as fh: - fh.write(contents) + + templater.render_to_file(util.abs_join('debian', 'control'), + util.abs_join(deb_dir, 'control'), + params={'requires': requires}) # Just copy the following directly - for fn in ['dirs', 'copyright', 'compat', 'pycompat', 'rules']: - shutil.copy(join('debian', fn), - join(db_dir, fn)) - -def info(msg): - print("INFO: %s" % (msg)) + for base_fn in ['dirs', 'copyright', 'compat', 'pycompat', 'rules']: + shutil.copy(util.abs_join('debian', base_fn), + util.abs_join(deb_dir, base_fn)) -def warn(msg): - print("WARNING: %s" % (msg)) +def main(): + with util.tempdir() as tdir: -def archive_code(): - (stdout, _stderr) = tiny_p([sys.executable, - join(os.getcwd(), 'make-tarball')]) - return stdout.split(None) + cmd = [sys.executable, + util.abs_join(os.pardir, 'tools', 'read-version')] + (sysout, _stderr) = util.subp(cmd) + version = sysout.strip() + cmd = ['bzr', 'revno'] + (sysout, _stderr) = util.subp(cmd) + revno = sysout.strip() + + cmd = [sys.executable, + util.abs_join(os.getcwd(), 'make-tarball')] + (sysout, _stderr) = util.subp(cmd) + arch_fn = sysout.strip() -def main(): + tmp_arch_fn = util.abs_join(tdir, os.path.basename(arch_fn)) + shutil.move(arch_fn, tmp_arch_fn) - with tmpdir() as td: - (revno, version, bname, archive_fn) = archive_code() - real_archive_fn = os.path.join(td, os.path.basename(archive_fn)) - shutil.move(archive_fn, real_archive_fn) - cmd = ['tar', '-xvzf', real_archive_fn, '-C', td] - stdout, stderr = tiny_p(cmd) - - edir = join(td, bname) - shutil.move(edir, join(td, 'cloud-init')) - write_debian(version, revno, join(td, 'cloud-init')) - - # Seems to want an original tar ball - o_tar = "cloud-init_%s~%s.orig.tar.gz" % (version, revno) - cmd = ['tar', '-czvf', join(td, o_tar), '-C', join(td, 'cloud-init')] - cmd.extend(os.listdir(join(td, 'cloud-init'))) - tiny_p(cmd) + cmd = ['tar', '-xvzf', tmp_arch_fn, '-C', tdir] + util.subp(cmd) + + base_name = os.path.basename(arch_fn)[:-len(".tar.gz")] + shutil.move(util.abs_join(tdir, base_name), + util.abs_join(tdir, 'cloud-init')) + + write_debian_folder(util.abs_join(tdir, 'cloud-init'), + version, revno) + + tar_fn = "cloud-init_%s~%s.orig.tar.gz" % (version, revno) + cmd = ['tar', '-czvf', + util.abs_join(tdir, tar_fn), + '-C', util.abs_join(tdir, 'cloud-init')] + cmd.extend(os.listdir(util.abs_join(tdir, 'cloud-init'))) + util.subp(cmd) ocwd = os.getcwd() - os.chdir(join(td, 'cloud-init')) - cmd = ['debuild'] - tiny_p(cmd, capture=False) - - debname = "cloud-init_%s~bzr%s-1_all.deb" % (version, revno) - shutil.move(debname, join(owcwd, debname)) - info("Wrote out debian package %s" % (join(owcwd, debname))) + with util.chdir(util.abs_join(tdir, 'cloud-init')): + util.subp(['debuild'], capture=False) + debname = "cloud-init_%s~bzr%s-1_all.deb" % (version, revno) + shutil.move(debname, util.abs_join(ocwd, debname)) + + print("Wrote out debian package %s" % (util.abs_join(ocwd, debname))) return 0 diff --git a/packages/brpm b/packages/brpm index db60bf81..f3ff2f58 100755 --- a/packages/brpm +++ b/packages/brpm @@ -11,10 +11,18 @@ import re import argparse -import tempita +# Use the util functions from cloudinit +possible_topdir = os.path.normpath(os.path.join(os.path.abspath( + sys.argv[0]), os.pardir, os.pardir)) +if os.path.exists(os.path.join(possible_topdir, "cloudinit", "__init__.py")): + sys.path.insert(0, possible_topdir) + +from cloudinit import templater +from cloudinit import util from datetime import datetime + # Mapping of expected packages to there full name... PKG_MP = { 'boto': 'python-boto', @@ -27,39 +35,10 @@ PKG_MP = { } -@contextlib.contextmanager -def tmpdir(): - t = tempfile.mkdtemp() - try: - yield t - finally: - shutil.rmtree(t) - - -def join(*paths): - p = os.path.join(*paths) - return os.path.abspath(p) - - -def tiny_p(cmd, capture=True): - # Darn python 2.6 doesn't have check_output (argggg) - info("Running %s" % (cmd)) - stdout = subprocess.PIPE - stderr = subprocess.PIPE - if not capture: - stdout = None - stderr = None - sp = subprocess.Popen(cmd, stdout=stdout, - stderr=stderr, stdin=None) - (out, err) = sp.communicate() - if sp.returncode not in [0]: - raise RuntimeError("Failed running %s [rc=%s] (%s, %s)" - % (cmd, sp.returncode, out, err)) - return (out, err) - def get_log_header(version): + # Try to find the version in the tags output cmd = ['bzr', 'tags'] - (stdout, _stderr) = tiny_p(cmd) + (stdout, _stderr) = util.subp(cmd) a_rev = None for t in stdout.splitlines(): ver, rev = t.split(None) @@ -69,11 +48,14 @@ def get_log_header(version): if not a_rev: return format_change_line(datetime.now(), '??', version) + + # Extract who made that tag as the header cmd = ['bzr', 'log', '-r%s' % (a_rev), '--timezone=utc'] - (stdout, _stderr) = tiny_p(cmd) + (stdout, _stderr) = util.subp(cmd) kvs = { 'comment': version, } + for line in stdout.splitlines(): if line.startswith('committer:'): kvs['who'] = line[len('committer:'):].strip() @@ -84,74 +66,73 @@ def get_log_header(version): ts = ts.replace("+0000", '').strip() ds = datetime.strptime(ts, '%a %Y-%m-%d %H:%M:%S') kvs['ds'] = ds + return format_change_line(**kvs) + def format_change_line(ds, who, comment=None): - d = format_rpm_date(ds) + d = ds.strftime("%a %b %d %Y") d += " - %s" % (who) if comment: d += " - %s" % (comment) return "* %s" % (d) -def format_rpm_date(ds): - return ds.strftime("%a %b %d %Y") - - -def info(msg): - print("INFO: %s" % (msg)) - - -def warn(msg): - print("WARNING: %s" % (msg)) +def generate_spec_contents(args, tmpl_fn): - -def generate_spec_contents(args, tmpl_fn, revno, version): + # Figure out the version and revno + cmd = [sys.executable, + util.abs_join(os.pardir, 'tools', 'read-version')] + (stdout, _stderr) = util.subp(cmd) + version = stdout.strip() + + cmd = ['bzr', 'revno'] + (stdout, _stderr) = util.subp(cmd) + revno = stdout.strip() # Tmpl params subs = {} subs['version'] = version subs['revno'] = revno subs['release'] = revno - subs['archive_name'] = '%{name}-%{version}-' + subs['revno'] + '.tar.gz' + subs['archive_name'] = '%{name}-%{version}-' + revno + '.tar.gz' subs['bd_requires'] = ['python-devel', 'python-setuptools'] - requires = [] - cmd = [sys.executable, join(os.pardir, 'tools', 'read-dependencies')] - (stdout, _stderr) = tiny_p(cmd) - pkgs = stdout.splitlines() - + cmd = [sys.executable, + util.abs_join(os.pardir, 'tools', 'read-dependencies')] + (stdout, _stderr) = util.subp(cmd) + # Map to known packages - for e in pkgs: - e = e.lower().strip() + pkgs = [p.lower().strip() for p in stdout.splitlines()] + + # Map to known packages + requires = [] + for p in pkgs: tgt_pkg = None - for n in PKG_MP.keys(): - if e.find(n) != -1: - tgt_pkg = PKG_MP.get(n) + for name in PKG_MP.keys(): + if p.find(name) != -1: + tgt_pkg = PKG_MP.get(name) + break if not tgt_pkg: raise RuntimeError(("Do not know how to translate %s to " - " a known package") % (e)) + " a known package") % (p)) else: requires.append(tgt_pkg) - - base_name = 'cloud-init-%s-%s' % (version, subs['revno']) subs['requires'] = requires # Format a nice changelog (as best as we can) - changelog = '' - with open(join(os.pardir, 'ChangeLog')) as fh: - changelog = fh.read() - ch_lines = [] + changelog = util.load_file(util.abs_join(os.pardir, 'ChangeLog')) + changelog_lines = [] for line in changelog.splitlines(): if not line.strip(): continue if re.match(r"^\s*[\d][.][\d][.][\d]:\s*", line): line = line.strip(":") header = get_log_header(line) - ch_lines.append(header) + changelog_lines.append(header) else: - ch_lines.append(line) - subs['changelog'] = "\n".join(ch_lines) + changelog_lines.append(line) + subs['changelog'] = "\n".join(changelog_lines) # See: http://www.zarb.org/~jasonc/macros.php # Pickup any special files @@ -174,6 +155,7 @@ def generate_spec_contents(args, tmpl_fn, revno, version): '%{_bindir}/*', '/usr/lib/cloud-init/*', ] + # Since setup.py installs them # all, we need to selectively # knock off the wrong ones and @@ -192,10 +174,7 @@ def generate_spec_contents(args, tmpl_fn, revno, version): subs['post_remove'] = post_remove subs['files'] = other_files - with open(tmpl_fn, 'r') as fh: - tmpl = tempita.Template(fh.read()) - contents = tmpl.substitute(**subs) - return contents + return templater.render_from_file(tmpl_fn, params=subs) def archive_code(): @@ -216,31 +195,28 @@ def main(): # Clean out the root dir and make sure the dirs we want are in place root_dir = os.path.expanduser("~/rpmbuild") - info("Cleaning %r" % (root_dir)) if os.path.isdir(root_dir): shutil.rmtree(root_dir) - arc_dir = os.path.join(root_dir, 'SOURCES') - for d in [root_dir, arc_dir]: - os.makedirs(d) - + arc_dir = util.abs_join(root_dir, 'SOURCES') + util.ensure_dirs([root_dir, arc_dir]) + # Archive the code - (revno, version, archive_fn) = archive_code() + cmd = [sys.executable, + util.abs_join(os.getcwd(), 'make-tarball')] + (stdout, _stderr) = util.subp(cmd) + archive_fn = stdout.strip() real_archive_fn = os.path.join(arc_dir, os.path.basename(archive_fn)) shutil.move(archive_fn, real_archive_fn) - info("Archived code to %r" % (real_archive_fn)) # Form the spec file to be used - tmpl_fn = os.path.join(os.getcwd(), 'redhat', 'cloud-init.spec') - info("Generating spec file from template %r" % (tmpl_fn)) - contents = generate_spec_contents(args, tmpl_fn, revno, version) + tmpl_fn = util.abs_join(os.getcwd(), 'redhat', 'cloud-init.spec') + contents = generate_spec_contents(args, tmpl_fn) spec_fn = os.path.join(root_dir, 'cloud-init.spec') - with open(spec_fn, 'w') as fh: - fh.write(contents) - info("Wrote spec file to %r" % (spec_fn)) + util.write_file(spec_fn, contents) # Now build it! cmd = ['rpmbuild', '-ba', spec_fn] - tiny_p(cmd, capture=False) + util.subp(cmd, capture=False) info("Rpmbuild completed!") # Copy the items built to our local dir @@ -251,11 +227,10 @@ def main(): (os.path.join(root_dir, 'RPMS')))) globs.extend(glob.glob("%s/*.rpm" % (os.path.join(root_dir, 'SRPMS')))) - for fn in globs: - n = os.path.basename(fn) - tgt_fn = os.path.join(os.getcwd(), n) - shutil.move(fn, tgt_fn) - info("Copied %s to %s" % (n, tgt_fn)) + for rpm_fn in globs: + tgt_fn = util.abs_join(os.getcwd(), os.path.basename(rpm_fn)) + shutil.move(rpm_fn, tgt_fn) + print(tgt_fn) return 0 diff --git a/packages/make-tarball b/packages/make-tarball index 98f669a9..479e11af 100755 --- a/packages/make-tarball +++ b/packages/make-tarball @@ -8,78 +8,56 @@ import sys import tempfile -def join(*paths): - p = os.path.join(*paths) - return os.path.abspath(p) +# Use the util functions from cloudinit +possible_topdir = os.path.normpath(os.path.join(os.path.abspath( + sys.argv[0]), os.pardir, os.pardir)) +if os.path.exists(os.path.join(possible_topdir, "cloudinit", "__init__.py")): + sys.path.insert(0, possible_topdir) +from cloudinit import util -def tiny_p(cmd): - # Darn python 2.6 doesn't have check_output (argggg) - sp = subprocess.Popen(cmd, stdout=subprocess.PIPE, - stderr=subprocess.PIPE, stdin=None) - (out, err) = sp.communicate() - if sp.returncode not in [0]: - raise RuntimeError("Failed running %s [rc=%s] (%s, %s)" - % (cmd, sp.returncode, out, err)) - return (out, err) +def main(args): -@contextlib.contextmanager -def tmpdir(): - t = tempfile.mkdtemp() - try: - yield t - finally: - shutil.rmtree(t) - + base_fn = None + if args: + base_fn = args[0] + with util.tempdir() as tdir: -def main(args): + if not base_fn: + (stdout, _stderr) = util.subp(['bzr', 'revno']) + revno = stdout.strip() - tag = None - if args: - tag = args[0] - - with tmpdir() as td: - (stdout, _stderr) = tiny_p(['bzr', 'revno']) - revno = stdout.strip() - - cmd = [sys.executable, join(os.pardir, 'tools', 'read-version')] - (stdout, _stderr) = tiny_p(cmd) - version = stdout.strip() - - owcd = os.getcwd() - os.chdir(os.path.abspath(os.pardir)) - if not os.path.exists('setup.py'): - raise RuntimeError("No setup.py found in %s" % (os.getcwd())) - - cmd = ['bzr', 'ls', '--versioned'] - (stdout, _stderr) = tiny_p(cmd) - fns = [] - for fn in stdout.splitlines(): - fn = fn.strip() - if not fn or fn.startswith("."): - continue - fns.append(fn) - bfn = 'cloud-init-%s-%s' % (version, revno) - os.makedirs(join(td, bfn)) - - for fn in fns: - if os.path.isfile(fn): - shutil.copy(fn, join(td, bfn, fn)) - else: - shutil.copytree(fn, join(td, bfn, fn)) - - fn = '%s.tar.gz' % (bfn) - o_fn = join(td, fn) - cmd = ['tar', '-czf', o_fn, '-C', join(td), bfn] - tiny_p(cmd) - - os.chdir(owcd) - shutil.move(o_fn, fn) - - out = [revno, version, bfn, os.path.abspath(fn)] - print('\t'.join(out)) + cmd = [sys.executable, + util.abs_join(os.pardir, 'tools', 'read-version')] + (stdout, _stderr) = util.subp(cmd) + version = stdout.strip() + base_fn = 'cloud-init-%s-%s' % (version, revno) + + util.ensure_dir(util.abs_join(tdir, base_fn)) + arch_fn = '%s.tar.gz' % (base_fn) + + with util.chdir(os.pardir): + (stdout, _stderr) = util.subp(['bzr', 'ls', '--versioned']) + fns = [fn for fn in stdout.splitlines() + if fn and not fn.startswith('.')] + # TODO - only copy the right files + # ie do a recursive versioned... + for fn in fns: + if os.path.isfile(fn): + shutil.copy(fn, util.abs_join(tdir, base_fn, fn)) + else: + shutil.copytree(fn, util.abs_join(tdir, base_fn, fn)) + + cmd = ['tar', '-czf', + util.abs_join(tdir, arch_fn), + '-C', tdir, base_fn] + util.subp(cmd) + + shutil.move(util.abs_join(tdir, arch_fn), + util.abs_join(os.getcwd(), arch_fn)) + print(os.path.abspath(arch_fn)) return 0 -- cgit v1.2.3 From c66ad5d6dbc0b7133b57092a52da09bb71157361 Mon Sep 17 00:00:00 2001 From: Joshua Harlow Date: Tue, 26 Jun 2012 15:20:07 -0700 Subject: 1. Add 'verbose' options to both. 2. Fixup the debian building after util changes --- packages/bddeb | 39 +++++++++++++++++++++++++++++++-------- packages/brpm | 10 +++++++++- 2 files changed, 40 insertions(+), 9 deletions(-) (limited to 'packages/bddeb') diff --git a/packages/bddeb b/packages/bddeb index 5f250738..9015585b 100755 --- a/packages/bddeb +++ b/packages/bddeb @@ -13,6 +13,8 @@ if os.path.exists(os.path.join(possible_topdir, "cloudinit", "__init__.py")): from cloudinit import templater from cloudinit import util +import argparse + # Package names that will showup in requires to what we can actually # use in our debian 'control' file PKG_MP = { @@ -70,6 +72,23 @@ def write_debian_folder(root, version, revno): def main(): + parser = argparse.ArgumentParser() + parser.add_argument("-n", "--no-sign", dest="sign", + help=("attempt to sign " + "the package (default: %(default)s)"), + default=True, + action='store_false') + parser.add_argument("-v", "--verbose", dest="verbose", + help=("run verbosely" + " (default: %(default)s)"), + default=False, + action='store_true') + args = parser.parse_args() + + capture = True + if args.verbose: + capture = False + with util.tempdir() as tdir: cmd = [sys.executable, @@ -95,24 +114,28 @@ def main(): base_name = os.path.basename(arch_fn)[:-len(".tar.gz")] shutil.move(util.abs_join(tdir, base_name), util.abs_join(tdir, 'cloud-init')) - + write_debian_folder(util.abs_join(tdir, 'cloud-init'), version, revno) - + tar_fn = "cloud-init_%s~%s.orig.tar.gz" % (version, revno) cmd = ['tar', '-czvf', util.abs_join(tdir, tar_fn), '-C', util.abs_join(tdir, 'cloud-init')] cmd.extend(os.listdir(util.abs_join(tdir, 'cloud-init'))) util.subp(cmd) + shutil.copy(util.abs_join(tdir, tar_fn), tar_fn) + print("Wrote out archive %r" % (util.abs_join(tar_fn))) - ocwd = os.getcwd() with util.chdir(util.abs_join(tdir, 'cloud-init')): - util.subp(['debuild'], capture=False) - debname = "cloud-init_%s~bzr%s-1_all.deb" % (version, revno) - shutil.move(debname, util.abs_join(ocwd, debname)) - - print("Wrote out debian package %s" % (util.abs_join(ocwd, debname))) + cmd = ['debuild'] + if not args.sign: + cmd.extend(['-us', '-uc']) + util.subp(cmd, capture=capture) + + debname = "cloud-init_%s~%s-1_all.deb" % (version, revno) + shutil.move(util.abs_join(tdir, debname), debname) + print("Wrote out debian package %r" % (util.abs_join(debname))) return 0 diff --git a/packages/brpm b/packages/brpm index 6870e172..b7246d8d 100755 --- a/packages/brpm +++ b/packages/brpm @@ -191,7 +191,15 @@ def main(): help="select boot type (default: %(default)s)", metavar="TYPE", default='initd', choices=['upstart', 'initd', 'systemd']) + parser.add_argument("-v", "--verbose", dest="verbose", + help=("run verbosely" + " (default: %(default)s)"), + default=False, + action='store_true') args = parser.parse_args() + capture = True + if args.verbose: + capture = False # Clean out the root dir and make sure the dirs we want are in place root_dir = os.path.expanduser("~/rpmbuild") @@ -216,7 +224,7 @@ def main(): # Now build it! cmd = ['rpmbuild', '-ba', spec_fn] - util.subp(cmd, capture=False) + util.subp(cmd, capture=capture) # Copy the items built to our local dir globs = [] -- cgit v1.2.3 From 505aae53f2c2a9ca363691e710c89da82137955b Mon Sep 17 00:00:00 2001 From: Joshua Harlow Date: Fri, 29 Jun 2012 12:00:01 -0700 Subject: Add in the linking of the _all.deb with a symlink 'cloud-init_all.deb' --- packages/bddeb | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) (limited to 'packages/bddeb') diff --git a/packages/bddeb b/packages/bddeb index 9015585b..b10f5a8e 100755 --- a/packages/bddeb +++ b/packages/bddeb @@ -133,9 +133,17 @@ def main(): cmd.extend(['-us', '-uc']) util.subp(cmd, capture=capture) - debname = "cloud-init_%s~%s-1_all.deb" % (version, revno) - shutil.move(util.abs_join(tdir, debname), debname) - print("Wrote out debian package %r" % (util.abs_join(debname))) + globs = [] + globs.extend(glob.glob("%s/*.deb" % + (os.path.join(tdir)))) + for fn in globs: + base_fn = os.path.basename(fn) + shutil.move(fn, base_fn) + print("Wrote out debian package %r" % (base_fn)) + if fn.endswith('_all.deb'): + # Add in the local link + util.del_file('cloud-init_all.deb') + util.symlink(base_fn, 'cloud-init_all.deb') return 0 -- cgit v1.2.3 From 9bb44707c1ae45574a83ea1409d53b762db912c9 Mon Sep 17 00:00:00 2001 From: Scott Moser Date: Fri, 29 Jun 2012 16:37:05 -0400 Subject: packages/bddeb: fix broken bddeb needed to import glob, and use os.symlink, not util.symlink. Also, here made the 'tar' verbose. if '-v' option given. --- packages/bddeb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'packages/bddeb') diff --git a/packages/bddeb b/packages/bddeb index b10f5a8e..eeb64434 100755 --- a/packages/bddeb +++ b/packages/bddeb @@ -3,6 +3,7 @@ import os import shutil import sys +import glob # Use the util functions from cloudinit possible_topdir = os.path.normpath(os.path.join(os.path.abspath( @@ -123,7 +124,7 @@ def main(): util.abs_join(tdir, tar_fn), '-C', util.abs_join(tdir, 'cloud-init')] cmd.extend(os.listdir(util.abs_join(tdir, 'cloud-init'))) - util.subp(cmd) + util.subp(cmd, capture=capture) shutil.copy(util.abs_join(tdir, tar_fn), tar_fn) print("Wrote out archive %r" % (util.abs_join(tar_fn))) @@ -143,7 +144,7 @@ def main(): if fn.endswith('_all.deb'): # Add in the local link util.del_file('cloud-init_all.deb') - util.symlink(base_fn, 'cloud-init_all.deb') + os.symlink(base_fn, 'cloud-init_all.deb') return 0 -- cgit v1.2.3 From 51a8e6ee88e9ee83450215208e2aaad4ad2a2843 Mon Sep 17 00:00:00 2001 From: Joshua Harlow Date: Wed, 4 Jul 2012 13:52:34 -0700 Subject: 1. Make the debian rules file a template (and pass in the daemon-type) 2. Adjust the bddeb to pass this in (as well as other output statement being added) 3. Adjust make-tarball to only archive the bzr versioned files (using --recursive) --- packages/bddeb | 37 ++++++++++++++++++------ packages/debian/rules | 3 ++ packages/make-tarball | 78 +++++++++++++++++++++++++++++++++------------------ 3 files changed, 81 insertions(+), 37 deletions(-) (limited to 'packages/bddeb') diff --git a/packages/bddeb b/packages/bddeb index eeb64434..b5a70dd8 100755 --- a/packages/bddeb +++ b/packages/bddeb @@ -29,7 +29,7 @@ PKG_MP = { } -def write_debian_folder(root, version, revno): +def write_debian_folder(root, version, revno, daemon_type): deb_dir = util.abs_join(root, 'debian') os.makedirs(deb_dir) @@ -65,8 +65,12 @@ def write_debian_folder(root, version, revno): util.abs_join(deb_dir, 'control'), params={'requires': requires}) + templater.render_to_file(util.abs_join('debian', 'rules'), + util.abs_join(deb_dir, 'rules'), + params={'daemon_type': daemon_type}) + # Just copy the following directly - for base_fn in ['dirs', 'copyright', 'compat', 'pycompat', 'rules']: + for base_fn in ['dirs', 'copyright', 'compat', 'pycompat']: shutil.copy(util.abs_join('debian', base_fn), util.abs_join(deb_dir, base_fn)) @@ -84,6 +88,10 @@ def main(): " (default: %(default)s)"), default=False, action='store_true') + parser.add_argument("-b", "--boot", dest="boot", + help="select boot type (default: %(default)s)", + metavar="TYPE", default='upstart', + choices=('upstart', 'upstart-local')) args = parser.parse_args() capture = True @@ -101,25 +109,33 @@ def main(): (sysout, _stderr) = util.subp(cmd) revno = sysout.strip() + # This is really only a temporary archive + # since we will extract it then add in the debian + # folder, then re-archive it for debian happiness + print("Creating a temporary tarball using the 'make-tarball' helper") cmd = [sys.executable, util.abs_join(os.getcwd(), 'make-tarball')] (sysout, _stderr) = util.subp(cmd) arch_fn = sysout.strip() - tmp_arch_fn = util.abs_join(tdir, os.path.basename(arch_fn)) shutil.move(arch_fn, tmp_arch_fn) + print("Extracting temporary tarball %r" % (tmp_arch_fn)) cmd = ['tar', '-xvzf', tmp_arch_fn, '-C', tdir] - util.subp(cmd) - + util.subp(cmd, capture=capture) base_name = os.path.basename(arch_fn)[:-len(".tar.gz")] shutil.move(util.abs_join(tdir, base_name), util.abs_join(tdir, 'cloud-init')) + print("Creating a debian/ folder in %r" % + (util.abs_join(tdir, 'cloud-init'))) write_debian_folder(util.abs_join(tdir, 'cloud-init'), - version, revno) + version, revno, args.boot) + # The naming here seems to follow some debian standard + # so it will whine if it is changed... tar_fn = "cloud-init_%s~%s.orig.tar.gz" % (version, revno) + print("Archiving that new folder into %r" % (tar_fn)) cmd = ['tar', '-czvf', util.abs_join(tdir, tar_fn), '-C', util.abs_join(tdir, 'cloud-init')] @@ -127,7 +143,8 @@ def main(): util.subp(cmd, capture=capture) shutil.copy(util.abs_join(tdir, tar_fn), tar_fn) print("Wrote out archive %r" % (util.abs_join(tar_fn))) - + + print("Running 'debuild' in %r" % (util.abs_join(tdir, 'cloud-init'))) with util.chdir(util.abs_join(tdir, 'cloud-init')): cmd = ['debuild'] if not args.sign: @@ -137,14 +154,16 @@ def main(): globs = [] globs.extend(glob.glob("%s/*.deb" % (os.path.join(tdir)))) + link_fn = os.path.join(os.getcwd(), 'cloud-init_all.deb') for fn in globs: base_fn = os.path.basename(fn) shutil.move(fn, base_fn) print("Wrote out debian package %r" % (base_fn)) if fn.endswith('_all.deb'): # Add in the local link - util.del_file('cloud-init_all.deb') - os.symlink(base_fn, 'cloud-init_all.deb') + util.del_file(link_fn) + os.symlink(base_fn, link_fn) + print("Linked %r to %r" % (base_fn, link_fn)) return 0 diff --git a/packages/debian/rules b/packages/debian/rules index 1739f4cf..6814974f 100755 --- a/packages/debian/rules +++ b/packages/debian/rules @@ -7,8 +7,11 @@ binary-install/cloud-init::cloud-init-fixups include /usr/share/cdbs/1/rules/debhelper.mk include /usr/share/cdbs/1/class/python-distutils.mk +DEB_PYTHON_INSTALL_ARGS_ALL += --daemon-type={{daemon_type}} + DEB_DH_INSTALL_SOURCEDIR := debian/tmp cloud-init-fixups: install -d $(DEB_DESTDIR)/etc/rsyslog.d cp tools/21-cloudinit.conf $(DEB_DESTDIR)/etc/rsyslog.d/21-cloudinit.conf + diff --git a/packages/make-tarball b/packages/make-tarball index 479e11af..43a6fc33 100755 --- a/packages/make-tarball +++ b/packages/make-tarball @@ -7,6 +7,8 @@ import subprocess import sys import tempfile +import optparse + # Use the util functions from cloudinit possible_topdir = os.path.normpath(os.path.join(os.path.abspath( @@ -17,51 +19,71 @@ if os.path.exists(os.path.join(possible_topdir, "cloudinit", "__init__.py")): from cloudinit import util -def main(args): +def find_versioned_files(): + (stdout, _stderr) = util.subp(['bzr', 'ls', '--versioned', '--recursive']) + fns = [fn for fn in stdout.splitlines() + if fn and not fn.startswith('.')] + fns.sort() + return fns - base_fn = None - if args: - base_fn = args[0] - with util.tempdir() as tdir: +def copy(fn, where_to, verbose): + if verbose: + print("Copying %r --> %r" % (fn, where_to)) + if os.path.isfile(fn): + shutil.copy(fn, where_to) + elif os.path.isdir(fn) and not os.path.isdir(where_to): + os.makedirs(where_to) + else: + raise RuntimeError("Do not know how to copy %s" % (fn)) + + +def main(): - if not base_fn: - (stdout, _stderr) = util.subp(['bzr', 'revno']) - revno = stdout.strip() - - cmd = [sys.executable, - util.abs_join(os.pardir, 'tools', 'read-version')] - (stdout, _stderr) = util.subp(cmd) - version = stdout.strip() - base_fn = 'cloud-init-%s-%s' % (version, revno) + parser = optparse.OptionParser() + parser.add_option("-f", "--file", dest="filename", + help="write archive to FILE", metavar="FILE") + parser.add_option("-v", "--verbose", + action="store_true", dest="verbose", default=False, + help="show verbose messaging") + (options, args) = parser.parse_args() + + base_fn = options.filename + if not base_fn: + (stdout, _stderr) = util.subp(['bzr', 'revno']) + revno = stdout.strip() + cmd = [sys.executable, + util.abs_join(os.pardir, 'tools', 'read-version')] + (stdout, _stderr) = util.subp(cmd) + version = stdout.strip() + base_fn = 'cloud-init-%s-%s' % (version, revno) + + with util.tempdir() as tdir: util.ensure_dir(util.abs_join(tdir, base_fn)) arch_fn = '%s.tar.gz' % (base_fn) with util.chdir(os.pardir): - (stdout, _stderr) = util.subp(['bzr', 'ls', '--versioned']) - fns = [fn for fn in stdout.splitlines() - if fn and not fn.startswith('.')] - # TODO - only copy the right files - # ie do a recursive versioned... + fns = find_versioned_files() for fn in fns: - if os.path.isfile(fn): - shutil.copy(fn, util.abs_join(tdir, base_fn, fn)) - else: - shutil.copytree(fn, util.abs_join(tdir, base_fn, fn)) + copy(fn, util.abs_join(tdir, base_fn, fn), + verbose=options.verbose) - cmd = ['tar', '-czf', - util.abs_join(tdir, arch_fn), - '-C', tdir, base_fn] - util.subp(cmd) + arch_full_fn = util.abs_join(tdir, arch_fn) + cmd = ['tar', '-czvf', arch_full_fn, '-C', tdir, base_fn] + if options.verbose: + print("Creating an archive from directory %r to %r" % + (util.abs_join(tdir, base_fn), arch_full_fn)) + util.subp(cmd, capture=(not options.verbose)) shutil.move(util.abs_join(tdir, arch_fn), util.abs_join(os.getcwd(), arch_fn)) + print(os.path.abspath(arch_fn)) return 0 if __name__ == '__main__': - sys.exit(main(sys.argv[1:])) + sys.exit(main()) -- cgit v1.2.3 From 95711130af22f1d597aa0ab6b5a39d0af16f8a28 Mon Sep 17 00:00:00 2001 From: Scott Moser Date: Fri, 6 Jul 2012 17:03:11 -0400 Subject: setup.py: rename "daemon type" to "init system" This brings with it other changes, and also makes an install install all of the requisite init files. (ie, cloud-init needs the -local and the non-local) --- initd/cloud-config | 124 ---------------------------------------- initd/cloud-final | 124 ---------------------------------------- initd/cloud-init | 124 ---------------------------------------- initd/cloud-init-local | 124 ---------------------------------------- packages/bddeb | 4 +- packages/brpm | 2 +- packages/debian/rules | 2 +- packages/redhat/cloud-init.spec | 2 +- setup.py | 52 ++++++----------- sysvinit/cloud-config | 124 ++++++++++++++++++++++++++++++++++++++++ sysvinit/cloud-final | 124 ++++++++++++++++++++++++++++++++++++++++ sysvinit/cloud-init | 124 ++++++++++++++++++++++++++++++++++++++++ sysvinit/cloud-init-local | 124 ++++++++++++++++++++++++++++++++++++++++ 13 files changed, 520 insertions(+), 534 deletions(-) delete mode 100755 initd/cloud-config delete mode 100755 initd/cloud-final delete mode 100755 initd/cloud-init delete mode 100755 initd/cloud-init-local create mode 100755 sysvinit/cloud-config create mode 100755 sysvinit/cloud-final create mode 100755 sysvinit/cloud-init create mode 100755 sysvinit/cloud-init-local (limited to 'packages/bddeb') diff --git a/initd/cloud-config b/initd/cloud-config deleted file mode 100755 index dd0bca8b..00000000 --- a/initd/cloud-config +++ /dev/null @@ -1,124 +0,0 @@ -#!/bin/sh - -# -# Copyright (C) 2012 Yahoo! Inc. -# -# Author: Joshua Harlow -# -# 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 . -# - -# See: http://wiki.debian.org/LSBInitScripts -# See: http://tiny.cc/czvbgw -# See: http://www.novell.com/coolsolutions/feature/15380.html -# Also based on dhcpd in RHEL (for comparison) - -### BEGIN INIT INFO -# Provides: cloud-config -# Required-Start: cloud-init -# Should-Start: $time -# Required-Stop: -# Should-Stop: -# Default-Start: 3 5 -# Default-Stop: -# Short-Description: The config cloud-init job -# Description: Start cloud-init and runs the config phase -# and any associated config modules as desired. -### END INIT INFO - -. /etc/init.d/functions - -# Return values acc. to LSB for all commands but status: -# 0 - success -# 1 - generic or unspecified error -# 2 - invalid or excess argument(s) -# 3 - unimplemented feature (e.g. "reload") -# 4 - user had insufficient privileges -# 5 - program is not installed -# 6 - program is not configured -# 7 - program is not running -# 8--199 - reserved (8--99 LSB, 100--149 distrib, 150--199 appl) -# -# Note that starting an already running service, stopping -# or restarting a not-running service as well as the restart -# with force-reload (in case signaling is not supported) are -# considered a success. - -RETVAL=0 - -prog="cloud-init" -cloud_init="/usr/bin/cloud-init" -conf="/etc/cloud/cloud.cfg" - -# If there exists a sysconfig variable override file use it... -[ -f /etc/sysconfig/cloud-init ] && . /etc/sysconfig/cloud-init - -start() { - [ -x $cloud_init ] || return 5 - [ -f $conf ] || return 6 - - echo -n $"Starting $prog: " - $cloud_init $CLOUDINITARGS modules --mode config - RETVAL=$? - return $RETVAL -} - -stop() { - echo -n $"Shutting down $prog: " - # No-op - RETVAL=7 - return $RETVAL -} - -. /etc/init.d/functions - -case "$1" in - start) - start - RETVAL=$? - ;; - stop) - stop - RETVAL=$? - ;; - restart|try-restart|condrestart) - ## Stop the service and regardless of whether it was - ## running or not, start it again. - # - ## Note: try-restart is now part of LSB (as of 1.9). - ## RH has a similar command named condrestart. - start - RETVAL=$? - ;; - reload|force-reload) - # It does not support reload - RETVAL=3 - ;; - status) - echo -n $"Checking for service $prog:" - # Return value is slightly different for the status command: - # 0 - service up and running - # 1 - service dead, but /var/run/ pid file exists - # 2 - service dead, but /var/lock/ lock file exists - # 3 - service not running (unused) - # 4 - service status unknown :-( - # 5--199 reserved (5--99 LSB, 100--149 distro, 150--199 appl.) - RETVAL=3 - ;; - *) - echo "Usage: $0 {start|stop|status|try-restart|condrestart|restart|force-reload|reload}" - RETVAL=3 - ;; -esac - -exit $RETVAL diff --git a/initd/cloud-final b/initd/cloud-final deleted file mode 100755 index 2e462c17..00000000 --- a/initd/cloud-final +++ /dev/null @@ -1,124 +0,0 @@ -#!/bin/sh - -# -# Copyright (C) 2012 Yahoo! Inc. -# -# Author: Joshua Harlow -# -# 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 . -# - -# See: http://wiki.debian.org/LSBInitScripts -# See: http://tiny.cc/czvbgw -# See: http://www.novell.com/coolsolutions/feature/15380.html -# Also based on dhcpd in RHEL (for comparison) - -### BEGIN INIT INFO -# Provides: cloud-final -# Required-Start: $all cloud-init cloud-config -# Should-Start: $time -# Required-Stop: -# Should-Stop: -# Default-Start: 3 5 -# Default-Stop: -# Short-Description: The final cloud-init job -# Description: Start cloud-init and runs the final phase -# and any associated final modules as desired. -### END INIT INFO - -. /etc/init.d/functions - -# Return values acc. to LSB for all commands but status: -# 0 - success -# 1 - generic or unspecified error -# 2 - invalid or excess argument(s) -# 3 - unimplemented feature (e.g. "reload") -# 4 - user had insufficient privileges -# 5 - program is not installed -# 6 - program is not configured -# 7 - program is not running -# 8--199 - reserved (8--99 LSB, 100--149 distrib, 150--199 appl) -# -# Note that starting an already running service, stopping -# or restarting a not-running service as well as the restart -# with force-reload (in case signaling is not supported) are -# considered a success. - -RETVAL=0 - -prog="cloud-init" -cloud_init="/usr/bin/cloud-init" -conf="/etc/cloud/cloud.cfg" - -# If there exists a sysconfig variable override file use it... -[ -f /etc/sysconfig/cloud-init ] && . /etc/sysconfig/cloud-init - -start() { - [ -x $cloud_init ] || return 5 - [ -f $conf ] || return 6 - - echo -n $"Starting $prog: " - $cloud_init $CLOUDINITARGS modules --mode final - RETVAL=$? - return $RETVAL -} - -stop() { - echo -n $"Shutting down $prog: " - # No-op - RETVAL=7 - return $RETVAL -} - -. /etc/init.d/functions - -case "$1" in - start) - start - RETVAL=$? - ;; - stop) - stop - RETVAL=$? - ;; - restart|try-restart|condrestart) - ## Stop the service and regardless of whether it was - ## running or not, start it again. - # - ## Note: try-restart is now part of LSB (as of 1.9). - ## RH has a similar command named condrestart. - start - RETVAL=$? - ;; - reload|force-reload) - # It does not support reload - RETVAL=3 - ;; - status) - echo -n $"Checking for service $prog:" - # Return value is slightly different for the status command: - # 0 - service up and running - # 1 - service dead, but /var/run/ pid file exists - # 2 - service dead, but /var/lock/ lock file exists - # 3 - service not running (unused) - # 4 - service status unknown :-( - # 5--199 reserved (5--99 LSB, 100--149 distro, 150--199 appl.) - RETVAL=3 - ;; - *) - echo "Usage: $0 {start|stop|status|try-restart|condrestart|restart|force-reload|reload}" - RETVAL=3 - ;; -esac - -exit $RETVAL diff --git a/initd/cloud-init b/initd/cloud-init deleted file mode 100755 index 7726c452..00000000 --- a/initd/cloud-init +++ /dev/null @@ -1,124 +0,0 @@ -#!/bin/sh - -# -# Copyright (C) 2012 Yahoo! Inc. -# -# Author: Joshua Harlow -# -# 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 . -# - -# See: http://wiki.debian.org/LSBInitScripts -# See: http://tiny.cc/czvbgw -# See: http://www.novell.com/coolsolutions/feature/15380.html -# Also based on dhcpd in RHEL (for comparison) - -### BEGIN INIT INFO -# Provides: cloud-init -# Required-Start: $local_fs $network $named $remote_fs -# Should-Start: $time -# Required-Stop: -# Should-Stop: -# Default-Start: 3 5 -# Default-Stop: -# Short-Description: The initial cloud-init job (net and fs contingent) -# Description: Start cloud-init and runs the initialization phase -# and any associated initial modules as desired. -### END INIT INFO - -. /etc/init.d/functions - -# Return values acc. to LSB for all commands but status: -# 0 - success -# 1 - generic or unspecified error -# 2 - invalid or excess argument(s) -# 3 - unimplemented feature (e.g. "reload") -# 4 - user had insufficient privileges -# 5 - program is not installed -# 6 - program is not configured -# 7 - program is not running -# 8--199 - reserved (8--99 LSB, 100--149 distrib, 150--199 appl) -# -# Note that starting an already running service, stopping -# or restarting a not-running service as well as the restart -# with force-reload (in case signaling is not supported) are -# considered a success. - -RETVAL=0 - -prog="cloud-init" -cloud_init="/usr/bin/cloud-init" -conf="/etc/cloud/cloud.cfg" - -# If there exists a sysconfig variable override file use it... -[ -f /etc/sysconfig/cloud-init ] && . /etc/sysconfig/cloud-init - -start() { - [ -x $cloud_init ] || return 5 - [ -f $conf ] || return 6 - - echo -n $"Starting $prog: " - $cloud_init $CLOUDINITARGS init - RETVAL=$? - return $RETVAL -} - -stop() { - echo -n $"Shutting down $prog: " - # No-op - RETVAL=7 - return $RETVAL -} - -. /etc/init.d/functions - -case "$1" in - start) - start - RETVAL=$? - ;; - stop) - stop - RETVAL=$? - ;; - restart|try-restart|condrestart) - ## Stop the service and regardless of whether it was - ## running or not, start it again. - # - ## Note: try-restart is now part of LSB (as of 1.9). - ## RH has a similar command named condrestart. - start - RETVAL=$? - ;; - reload|force-reload) - # It does not support reload - RETVAL=3 - ;; - status) - echo -n $"Checking for service $prog:" - # Return value is slightly different for the status command: - # 0 - service up and running - # 1 - service dead, but /var/run/ pid file exists - # 2 - service dead, but /var/lock/ lock file exists - # 3 - service not running (unused) - # 4 - service status unknown :-( - # 5--199 reserved (5--99 LSB, 100--149 distro, 150--199 appl.) - RETVAL=3 - ;; - *) - echo "Usage: $0 {start|stop|status|try-restart|condrestart|restart|force-reload|reload}" - RETVAL=3 - ;; -esac - -exit $RETVAL diff --git a/initd/cloud-init-local b/initd/cloud-init-local deleted file mode 100755 index bf5d409a..00000000 --- a/initd/cloud-init-local +++ /dev/null @@ -1,124 +0,0 @@ -#!/bin/sh - -# -# Copyright (C) 2012 Yahoo! Inc. -# -# Author: Joshua Harlow -# -# 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 . -# - -# See: http://wiki.debian.org/LSBInitScripts -# See: http://tiny.cc/czvbgw -# See: http://www.novell.com/coolsolutions/feature/15380.html -# Also based on dhcpd in RHEL (for comparison) - -### BEGIN INIT INFO -# Provides: cloud-init -# Required-Start: $local_fs $remote_fs -# Should-Start: $time -# Required-Stop: -# Should-Stop: -# Default-Start: 3 5 -# Default-Stop: -# Short-Description: The initial cloud-init job (local fs contingent) -# Description: Start cloud-init and runs the initialization phases -# and any associated initial modules as desired. -### END INIT INFO - -. /etc/init.d/functions - -# Return values acc. to LSB for all commands but status: -# 0 - success -# 1 - generic or unspecified error -# 2 - invalid or excess argument(s) -# 3 - unimplemented feature (e.g. "reload") -# 4 - user had insufficient privileges -# 5 - program is not installed -# 6 - program is not configured -# 7 - program is not running -# 8--199 - reserved (8--99 LSB, 100--149 distrib, 150--199 appl) -# -# Note that starting an already running service, stopping -# or restarting a not-running service as well as the restart -# with force-reload (in case signaling is not supported) are -# considered a success. - -RETVAL=0 - -prog="cloud-init" -cloud_init="/usr/bin/cloud-init" -conf="/etc/cloud/cloud.cfg" - -# If there exists a sysconfig variable override file use it... -[ -f /etc/sysconfig/cloud-init ] && . /etc/sysconfig/cloud-init - -start() { - [ -x $cloud_init ] || return 5 - [ -f $conf ] || return 6 - - echo -n $"Starting $prog: " - $cloud_init $CLOUDINITARGS init --local - RETVAL=$? - return $RETVAL -} - -stop() { - echo -n $"Shutting down $prog: " - # No-op - RETVAL=7 - return $RETVAL -} - -. /etc/init.d/functions - -case "$1" in - start) - start - RETVAL=$? - ;; - stop) - stop - RETVAL=$? - ;; - restart|try-restart|condrestart) - ## Stop the service and regardless of whether it was - ## running or not, start it again. - # - ## Note: try-restart is now part of LSB (as of 1.9). - ## RH has a similar command named condrestart. - start - RETVAL=$? - ;; - reload|force-reload) - # It does not support reload - RETVAL=3 - ;; - status) - echo -n $"Checking for service $prog:" - # Return value is slightly different for the status command: - # 0 - service up and running - # 1 - service dead, but /var/run/ pid file exists - # 2 - service dead, but /var/lock/ lock file exists - # 3 - service not running (unused) - # 4 - service status unknown :-( - # 5--199 reserved (5--99 LSB, 100--149 distro, 150--199 appl.) - RETVAL=3 - ;; - *) - echo "Usage: $0 {start|stop|status|try-restart|condrestart|restart|force-reload|reload}" - RETVAL=3 - ;; -esac - -exit $RETVAL diff --git a/packages/bddeb b/packages/bddeb index b5a70dd8..10ad08b3 100755 --- a/packages/bddeb +++ b/packages/bddeb @@ -29,7 +29,7 @@ PKG_MP = { } -def write_debian_folder(root, version, revno, daemon_type): +def write_debian_folder(root, version, revno, init_sys): deb_dir = util.abs_join(root, 'debian') os.makedirs(deb_dir) @@ -67,7 +67,7 @@ def write_debian_folder(root, version, revno, daemon_type): templater.render_to_file(util.abs_join('debian', 'rules'), util.abs_join(deb_dir, 'rules'), - params={'daemon_type': daemon_type}) + params={'init_sys': init_sys}) # Just copy the following directly for base_fn in ['dirs', 'copyright', 'compat', 'pycompat']: diff --git a/packages/brpm b/packages/brpm index 1212b0e4..1d05bd2a 100755 --- a/packages/brpm +++ b/packages/brpm @@ -150,7 +150,7 @@ def generate_spec_contents(args, tmpl_fn): else: subs['systemd'] = False - subs['daemon_type'] = args.boot + subs['init_sys'] = args.boot return templater.render_from_file(tmpl_fn, params=subs) diff --git a/packages/debian/rules b/packages/debian/rules index 6814974f..87cd6538 100755 --- a/packages/debian/rules +++ b/packages/debian/rules @@ -7,7 +7,7 @@ binary-install/cloud-init::cloud-init-fixups include /usr/share/cdbs/1/rules/debhelper.mk include /usr/share/cdbs/1/class/python-distutils.mk -DEB_PYTHON_INSTALL_ARGS_ALL += --daemon-type={{daemon_type}} +DEB_PYTHON_INSTALL_ARGS_ALL += --init-system={{init_sys}} DEB_DH_INSTALL_SOURCEDIR := debian/tmp diff --git a/packages/redhat/cloud-init.spec b/packages/redhat/cloud-init.spec index df13bcb7..d0f83a4b 100644 --- a/packages/redhat/cloud-init.spec +++ b/packages/redhat/cloud-init.spec @@ -63,7 +63,7 @@ ssh keys and to let the user run various scripts. rm -rf $RPM_BUILD_ROOT %{__python} setup.py install -O1 \ --skip-build --root $RPM_BUILD_ROOT \ - --daemon-type={{daemon_type}} + --init-system={{init_sys}} # Note that /etc/rsyslog.d didn't exist by default until F15. # el6 request: https://bugzilla.redhat.com/show_bug.cgi?id=740420 diff --git a/setup.py b/setup.py index 50e95e9d..458d1a9e 100755 --- a/setup.py +++ b/setup.py @@ -38,31 +38,17 @@ def is_f(p): return os.path.isfile(p) -DAEMON_FILES = { - 'initd': filter((lambda x: is_f(x) - and x.find('local') == -1), glob('initd/*')), - 'initd-local': filter((lambda x: is_f(x) - and not x.endswith('cloud-init')), glob('initd/*')), +INITSYS_FILES = { + 'sysvinit': filter((lambda x: is_f(x)), glob('sysvinit/*')), 'systemd': filter((lambda x: is_f(x)), glob('systemd/*')), - 'upstart': filter((lambda x: is_f(x) - and x.find('local') == -1 - and x.find('nonet') == -1), glob('upstart/*')), - 'upstart-nonet': filter((lambda x: is_f(x) - and x.find('local') == -1 - and not x.endswith('cloud-init.conf')), glob('upstart/*')), - 'upstart-local': filter((lambda x: is_f(x) - and x.find('nonet') == -1 - and not x.endswith('cloud-init.conf')), glob('upstart/*')), + 'upstart': filter((lambda x: is_f(x)), glob('upstart/*')), } -DAEMON_ROOTS = { - 'initd': '/etc/rc.d/init.d', - 'initd-local': '/etc/rc.d/init.d', +INITSYS_ROOTS = { + 'sysvinit': '/etc/rc.d/init.d', 'systemd': '/etc/systemd/system/', 'upstart': '/etc/init/', - 'upstart-nonet': '/etc/init/', - 'upstart-local': '/etc/init/', } -DAEMON_TYPES = sorted(list(DAEMON_ROOTS.keys())) +INITSYS_TYPES = sorted(list(INITSYS_ROOTS.keys())) def tiny_p(cmd, capture=True): @@ -94,29 +80,29 @@ def read_requires(): # TODO: Is there a better way to do this?? -class DaemonInstallData(install): +class InitsysInstallData(install): user_options = install.user_options + [ - # This will magically show up in member variable 'daemon_type' - ('daemon-type=', None, - ('daemon type to configure (%s) [default: None]') % - (", ".join(DAEMON_TYPES)) + # This will magically show up in member variable 'init_sys' + ('init-system=', None, + ('init system to configure (%s) [default: None]') % + (", ".join(INITSYS_TYPES)) ), ] def initialize_options(self): install.initialize_options(self) - self.daemon_type = None + self.initsys = None def finalize_options(self): install.finalize_options(self) - if self.daemon_type and self.daemon_type not in DAEMON_TYPES: + if self.initsys and self.initsys not in INITSYS_TYPES: raise DistutilsArgError( ("You must specify one of (%s) when" - " specifying a daemon type!") % (", ".join(DAEMON_TYPES)) + " specifying a init system!") % (", ".join(INITSYS_TYPES)) ) - elif self.daemon_type: - self.distribution.data_files.append((DAEMON_ROOTS[self.daemon_type], - DAEMON_FILES[self.daemon_type])) + elif self.initsys: + self.distribution.data_files.append((INITSYS_ROOTS[self.initsys], + INITSYS_FILES[self.initsys])) # Force that command to reinitalize (with new file list) self.distribution.reinitialize_command('install_data', True) @@ -145,7 +131,7 @@ setuptools.setup(name='cloud-init', install_requires=read_requires(), cmdclass = { # Use a subclass for install that handles - # adding on the right daemon configuration files - 'install': DaemonInstallData, + # adding on the right init system configuration files + 'install': InitsysInstallData, }, ) diff --git a/sysvinit/cloud-config b/sysvinit/cloud-config new file mode 100755 index 00000000..dd0bca8b --- /dev/null +++ b/sysvinit/cloud-config @@ -0,0 +1,124 @@ +#!/bin/sh + +# +# Copyright (C) 2012 Yahoo! Inc. +# +# Author: Joshua Harlow +# +# 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 . +# + +# See: http://wiki.debian.org/LSBInitScripts +# See: http://tiny.cc/czvbgw +# See: http://www.novell.com/coolsolutions/feature/15380.html +# Also based on dhcpd in RHEL (for comparison) + +### BEGIN INIT INFO +# Provides: cloud-config +# Required-Start: cloud-init +# Should-Start: $time +# Required-Stop: +# Should-Stop: +# Default-Start: 3 5 +# Default-Stop: +# Short-Description: The config cloud-init job +# Description: Start cloud-init and runs the config phase +# and any associated config modules as desired. +### END INIT INFO + +. /etc/init.d/functions + +# Return values acc. to LSB for all commands but status: +# 0 - success +# 1 - generic or unspecified error +# 2 - invalid or excess argument(s) +# 3 - unimplemented feature (e.g. "reload") +# 4 - user had insufficient privileges +# 5 - program is not installed +# 6 - program is not configured +# 7 - program is not running +# 8--199 - reserved (8--99 LSB, 100--149 distrib, 150--199 appl) +# +# Note that starting an already running service, stopping +# or restarting a not-running service as well as the restart +# with force-reload (in case signaling is not supported) are +# considered a success. + +RETVAL=0 + +prog="cloud-init" +cloud_init="/usr/bin/cloud-init" +conf="/etc/cloud/cloud.cfg" + +# If there exists a sysconfig variable override file use it... +[ -f /etc/sysconfig/cloud-init ] && . /etc/sysconfig/cloud-init + +start() { + [ -x $cloud_init ] || return 5 + [ -f $conf ] || return 6 + + echo -n $"Starting $prog: " + $cloud_init $CLOUDINITARGS modules --mode config + RETVAL=$? + return $RETVAL +} + +stop() { + echo -n $"Shutting down $prog: " + # No-op + RETVAL=7 + return $RETVAL +} + +. /etc/init.d/functions + +case "$1" in + start) + start + RETVAL=$? + ;; + stop) + stop + RETVAL=$? + ;; + restart|try-restart|condrestart) + ## Stop the service and regardless of whether it was + ## running or not, start it again. + # + ## Note: try-restart is now part of LSB (as of 1.9). + ## RH has a similar command named condrestart. + start + RETVAL=$? + ;; + reload|force-reload) + # It does not support reload + RETVAL=3 + ;; + status) + echo -n $"Checking for service $prog:" + # Return value is slightly different for the status command: + # 0 - service up and running + # 1 - service dead, but /var/run/ pid file exists + # 2 - service dead, but /var/lock/ lock file exists + # 3 - service not running (unused) + # 4 - service status unknown :-( + # 5--199 reserved (5--99 LSB, 100--149 distro, 150--199 appl.) + RETVAL=3 + ;; + *) + echo "Usage: $0 {start|stop|status|try-restart|condrestart|restart|force-reload|reload}" + RETVAL=3 + ;; +esac + +exit $RETVAL diff --git a/sysvinit/cloud-final b/sysvinit/cloud-final new file mode 100755 index 00000000..2e462c17 --- /dev/null +++ b/sysvinit/cloud-final @@ -0,0 +1,124 @@ +#!/bin/sh + +# +# Copyright (C) 2012 Yahoo! Inc. +# +# Author: Joshua Harlow +# +# 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 . +# + +# See: http://wiki.debian.org/LSBInitScripts +# See: http://tiny.cc/czvbgw +# See: http://www.novell.com/coolsolutions/feature/15380.html +# Also based on dhcpd in RHEL (for comparison) + +### BEGIN INIT INFO +# Provides: cloud-final +# Required-Start: $all cloud-init cloud-config +# Should-Start: $time +# Required-Stop: +# Should-Stop: +# Default-Start: 3 5 +# Default-Stop: +# Short-Description: The final cloud-init job +# Description: Start cloud-init and runs the final phase +# and any associated final modules as desired. +### END INIT INFO + +. /etc/init.d/functions + +# Return values acc. to LSB for all commands but status: +# 0 - success +# 1 - generic or unspecified error +# 2 - invalid or excess argument(s) +# 3 - unimplemented feature (e.g. "reload") +# 4 - user had insufficient privileges +# 5 - program is not installed +# 6 - program is not configured +# 7 - program is not running +# 8--199 - reserved (8--99 LSB, 100--149 distrib, 150--199 appl) +# +# Note that starting an already running service, stopping +# or restarting a not-running service as well as the restart +# with force-reload (in case signaling is not supported) are +# considered a success. + +RETVAL=0 + +prog="cloud-init" +cloud_init="/usr/bin/cloud-init" +conf="/etc/cloud/cloud.cfg" + +# If there exists a sysconfig variable override file use it... +[ -f /etc/sysconfig/cloud-init ] && . /etc/sysconfig/cloud-init + +start() { + [ -x $cloud_init ] || return 5 + [ -f $conf ] || return 6 + + echo -n $"Starting $prog: " + $cloud_init $CLOUDINITARGS modules --mode final + RETVAL=$? + return $RETVAL +} + +stop() { + echo -n $"Shutting down $prog: " + # No-op + RETVAL=7 + return $RETVAL +} + +. /etc/init.d/functions + +case "$1" in + start) + start + RETVAL=$? + ;; + stop) + stop + RETVAL=$? + ;; + restart|try-restart|condrestart) + ## Stop the service and regardless of whether it was + ## running or not, start it again. + # + ## Note: try-restart is now part of LSB (as of 1.9). + ## RH has a similar command named condrestart. + start + RETVAL=$? + ;; + reload|force-reload) + # It does not support reload + RETVAL=3 + ;; + status) + echo -n $"Checking for service $prog:" + # Return value is slightly different for the status command: + # 0 - service up and running + # 1 - service dead, but /var/run/ pid file exists + # 2 - service dead, but /var/lock/ lock file exists + # 3 - service not running (unused) + # 4 - service status unknown :-( + # 5--199 reserved (5--99 LSB, 100--149 distro, 150--199 appl.) + RETVAL=3 + ;; + *) + echo "Usage: $0 {start|stop|status|try-restart|condrestart|restart|force-reload|reload}" + RETVAL=3 + ;; +esac + +exit $RETVAL diff --git a/sysvinit/cloud-init b/sysvinit/cloud-init new file mode 100755 index 00000000..7726c452 --- /dev/null +++ b/sysvinit/cloud-init @@ -0,0 +1,124 @@ +#!/bin/sh + +# +# Copyright (C) 2012 Yahoo! Inc. +# +# Author: Joshua Harlow +# +# 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 . +# + +# See: http://wiki.debian.org/LSBInitScripts +# See: http://tiny.cc/czvbgw +# See: http://www.novell.com/coolsolutions/feature/15380.html +# Also based on dhcpd in RHEL (for comparison) + +### BEGIN INIT INFO +# Provides: cloud-init +# Required-Start: $local_fs $network $named $remote_fs +# Should-Start: $time +# Required-Stop: +# Should-Stop: +# Default-Start: 3 5 +# Default-Stop: +# Short-Description: The initial cloud-init job (net and fs contingent) +# Description: Start cloud-init and runs the initialization phase +# and any associated initial modules as desired. +### END INIT INFO + +. /etc/init.d/functions + +# Return values acc. to LSB for all commands but status: +# 0 - success +# 1 - generic or unspecified error +# 2 - invalid or excess argument(s) +# 3 - unimplemented feature (e.g. "reload") +# 4 - user had insufficient privileges +# 5 - program is not installed +# 6 - program is not configured +# 7 - program is not running +# 8--199 - reserved (8--99 LSB, 100--149 distrib, 150--199 appl) +# +# Note that starting an already running service, stopping +# or restarting a not-running service as well as the restart +# with force-reload (in case signaling is not supported) are +# considered a success. + +RETVAL=0 + +prog="cloud-init" +cloud_init="/usr/bin/cloud-init" +conf="/etc/cloud/cloud.cfg" + +# If there exists a sysconfig variable override file use it... +[ -f /etc/sysconfig/cloud-init ] && . /etc/sysconfig/cloud-init + +start() { + [ -x $cloud_init ] || return 5 + [ -f $conf ] || return 6 + + echo -n $"Starting $prog: " + $cloud_init $CLOUDINITARGS init + RETVAL=$? + return $RETVAL +} + +stop() { + echo -n $"Shutting down $prog: " + # No-op + RETVAL=7 + return $RETVAL +} + +. /etc/init.d/functions + +case "$1" in + start) + start + RETVAL=$? + ;; + stop) + stop + RETVAL=$? + ;; + restart|try-restart|condrestart) + ## Stop the service and regardless of whether it was + ## running or not, start it again. + # + ## Note: try-restart is now part of LSB (as of 1.9). + ## RH has a similar command named condrestart. + start + RETVAL=$? + ;; + reload|force-reload) + # It does not support reload + RETVAL=3 + ;; + status) + echo -n $"Checking for service $prog:" + # Return value is slightly different for the status command: + # 0 - service up and running + # 1 - service dead, but /var/run/ pid file exists + # 2 - service dead, but /var/lock/ lock file exists + # 3 - service not running (unused) + # 4 - service status unknown :-( + # 5--199 reserved (5--99 LSB, 100--149 distro, 150--199 appl.) + RETVAL=3 + ;; + *) + echo "Usage: $0 {start|stop|status|try-restart|condrestart|restart|force-reload|reload}" + RETVAL=3 + ;; +esac + +exit $RETVAL diff --git a/sysvinit/cloud-init-local b/sysvinit/cloud-init-local new file mode 100755 index 00000000..bf5d409a --- /dev/null +++ b/sysvinit/cloud-init-local @@ -0,0 +1,124 @@ +#!/bin/sh + +# +# Copyright (C) 2012 Yahoo! Inc. +# +# Author: Joshua Harlow +# +# 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 . +# + +# See: http://wiki.debian.org/LSBInitScripts +# See: http://tiny.cc/czvbgw +# See: http://www.novell.com/coolsolutions/feature/15380.html +# Also based on dhcpd in RHEL (for comparison) + +### BEGIN INIT INFO +# Provides: cloud-init +# Required-Start: $local_fs $remote_fs +# Should-Start: $time +# Required-Stop: +# Should-Stop: +# Default-Start: 3 5 +# Default-Stop: +# Short-Description: The initial cloud-init job (local fs contingent) +# Description: Start cloud-init and runs the initialization phases +# and any associated initial modules as desired. +### END INIT INFO + +. /etc/init.d/functions + +# Return values acc. to LSB for all commands but status: +# 0 - success +# 1 - generic or unspecified error +# 2 - invalid or excess argument(s) +# 3 - unimplemented feature (e.g. "reload") +# 4 - user had insufficient privileges +# 5 - program is not installed +# 6 - program is not configured +# 7 - program is not running +# 8--199 - reserved (8--99 LSB, 100--149 distrib, 150--199 appl) +# +# Note that starting an already running service, stopping +# or restarting a not-running service as well as the restart +# with force-reload (in case signaling is not supported) are +# considered a success. + +RETVAL=0 + +prog="cloud-init" +cloud_init="/usr/bin/cloud-init" +conf="/etc/cloud/cloud.cfg" + +# If there exists a sysconfig variable override file use it... +[ -f /etc/sysconfig/cloud-init ] && . /etc/sysconfig/cloud-init + +start() { + [ -x $cloud_init ] || return 5 + [ -f $conf ] || return 6 + + echo -n $"Starting $prog: " + $cloud_init $CLOUDINITARGS init --local + RETVAL=$? + return $RETVAL +} + +stop() { + echo -n $"Shutting down $prog: " + # No-op + RETVAL=7 + return $RETVAL +} + +. /etc/init.d/functions + +case "$1" in + start) + start + RETVAL=$? + ;; + stop) + stop + RETVAL=$? + ;; + restart|try-restart|condrestart) + ## Stop the service and regardless of whether it was + ## running or not, start it again. + # + ## Note: try-restart is now part of LSB (as of 1.9). + ## RH has a similar command named condrestart. + start + RETVAL=$? + ;; + reload|force-reload) + # It does not support reload + RETVAL=3 + ;; + status) + echo -n $"Checking for service $prog:" + # Return value is slightly different for the status command: + # 0 - service up and running + # 1 - service dead, but /var/run/ pid file exists + # 2 - service dead, but /var/lock/ lock file exists + # 3 - service not running (unused) + # 4 - service status unknown :-( + # 5--199 reserved (5--99 LSB, 100--149 distro, 150--199 appl.) + RETVAL=3 + ;; + *) + echo "Usage: $0 {start|stop|status|try-restart|condrestart|restart|force-reload|reload}" + RETVAL=3 + ;; +esac + +exit $RETVAL -- cgit v1.2.3