Package: release.debian.org Severity: normal Tags: jessie User: release.debian....@packages.debian.org Usertags: pu
Dear Stable release team, I'd like to upload an update of Swift through s-p-u, in order to fix a number of issues listed below: - User creation was done in a non-OpenStack package standard way, namely missing the --disabled-login option. - On removal, the package was calling userdel, which I consider dangerous (potential reuse of the UUID). - On purge, /var/cache/swift wasn't removed. - The swift-container-sync init script wasn't installed. More importantly, there's 2 CVEs which needs to be fixed: - CVE-2015-1856 & OSSA 2015-006: Unauthorized delete of versioned Swift object. - CVE-2015-5223: Information leak via Swift tempurls. The above CVEs were considered not critical enough by the security team to deserve a DSA, though they still deserve fixing. I have attached a debdiff with all of the above problems corrected. The pre-built package is also available here: http://sid.gplhost.com/jessie-proposed-updates/swift/ Please allow me to upload swift/2.2.0-1+deb8u1 to jessie-proposed-updates. Cheers, Thomas Goirand (zigo)
diff -Nru swift-2.2.0/debian/changelog swift-2.2.0/debian/changelog --- swift-2.2.0/debian/changelog 2014-10-16 12:48:43.000000000 +0000 +++ swift-2.2.0/debian/changelog 2015-09-15 19:29:22.000000000 +0000 @@ -1,3 +1,20 @@ +swift (2.2.0-1+deb8u1) jessie-proposed-updates; urgency=medium + + [ Thomas Goirand ] + * Fixed swift user creation (standardized on pkgos way). + * CVE-2015-1856 & OSSA 2015-006: Unauthorized delete of versioned Swift + object. Applied upstream patch: Prevent unauthorized delete in versioned + container (Closes: #783163). + + [ Ondřej Nový ] + * Fixed service name of object-expirer. + * Added container-sync init script. + * CVE-2015-5223: Information leak via Swift tempurls. + Applied upstream patch: Disallow unsafe tempurl operations to point + to unauthorized data (Closes: #797032). + + -- Thomas Goirand <z...@debian.org> Tue, 15 Sep 2015 21:28:14 +0200 + swift (2.2.0-1) unstable; urgency=medium * New upstream release. diff -Nru swift-2.2.0/debian/patches/CVE-2015-1856_Prevent-unauthorized-delete-in-versioned-container.patch swift-2.2.0/debian/patches/CVE-2015-1856_Prevent-unauthorized-delete-in-versioned-container.patch --- swift-2.2.0/debian/patches/CVE-2015-1856_Prevent-unauthorized-delete-in-versioned-container.patch 1970-01-01 00:00:00.000000000 +0000 +++ swift-2.2.0/debian/patches/CVE-2015-1856_Prevent-unauthorized-delete-in-versioned-container.patch 2015-09-15 19:29:22.000000000 +0000 @@ -0,0 +1,242 @@ +Description: CVE-2015-1856: Prevent unauthorized delete in versioned container + An authenticated user can delete the most recent version of any versioned + object who's name is known if the user has listing access to the + x-versions-location container. Only Swift setups with allow_version setting + are affected. + . + This patch closes this bug, tracked as CVE-2015-1856. +Author: Alistair Coles <alistair.co...@hp.com> +Date: Fri, 3 Apr 2015 16:05:36 +0000 (+0100) +X-Git-Url: https://review.openstack.org/gitweb?p=openstack%2Fswift.git;a=commitdiff_plain;h=85afe9316570855c87ea731d0627f6f8f2b73264 +Co-Authored-By: Clay Gerrard <clay.gerr...@gmail.com> +Co-Authored-By: Christian Schwede <i...@cschwede.de> +Co-Authored-By: Alistair Coles <alistair.co...@hp.com> +Bug-Ubuntu: https://bugs.launchpad.net/swift/+bug/1430645 +Change-Id: I74448c12bc4d4cd07d4300f452cf3dd6f66ca70a +Bug-Debian: https://bugs.debian.org/783163 + +diff --git a/swift/proxy/controllers/obj.py b/swift/proxy/controllers/obj.py +index abd4cc2..36c1058 100644 +--- a/swift/proxy/controllers/obj.py ++++ b/swift/proxy/controllers/obj.py +@@ -783,6 +783,10 @@ class ObjectController(Controller): + req.acl = container_info['write_acl'] + req.environ['swift_sync_key'] = container_info['sync_key'] + object_versions = container_info['versions'] ++ if 'swift.authorize' in req.environ: ++ aresp = req.environ['swift.authorize'](req) ++ if aresp: ++ return aresp + if object_versions: + # this is a version manifest and needs to be handled differently + object_versions = unquote(object_versions) +@@ -853,11 +857,11 @@ class ObjectController(Controller): + # remove 'X-If-Delete-At', since it is not for the older copy + if 'X-If-Delete-At' in req.headers: + del req.headers['X-If-Delete-At'] ++ if 'swift.authorize' in req.environ: ++ aresp = req.environ['swift.authorize'](req) ++ if aresp: ++ return aresp + break +- if 'swift.authorize' in req.environ: +- aresp = req.environ['swift.authorize'](req) +- if aresp: +- return aresp + if not containers: + return HTTPNotFound(request=req) + partition, nodes = obj_ring.get_nodes( +diff --git a/test/functional/tests.py b/test/functional/tests.py +index d6b0b70..e57f22b 100644 +--- a/test/functional/tests.py ++++ b/test/functional/tests.py +@@ -2397,6 +2397,14 @@ class TestObjectVersioningEnv(object): + cls.account = Account(cls.conn, tf.config.get('account', + tf.config['username'])) + ++ # Second connection for ACL tests ++ config2 = deepcopy(tf.config) ++ config2['account'] = tf.config['account2'] ++ config2['username'] = tf.config['username2'] ++ config2['password'] = tf.config['password2'] ++ cls.conn2 = Connection(config2) ++ cls.conn2.authenticate() ++ + # avoid getting a prefix that stops halfway through an encoded + # character + prefix = Utils.create_name().decode("utf-8")[:10].encode("utf-8") +@@ -2450,6 +2458,14 @@ class TestCrossPolicyObjectVersioningEnv(object): + cls.account = Account(cls.conn, tf.config.get('account', + tf.config['username'])) + ++ # Second connection for ACL tests ++ config2 = deepcopy(tf.config) ++ config2['account'] = tf.config['account2'] ++ config2['username'] = tf.config['username2'] ++ config2['password'] = tf.config['password2'] ++ cls.conn2 = Connection(config2) ++ cls.conn2.authenticate() ++ + # avoid getting a prefix that stops halfway through an encoded + # character + prefix = Utils.create_name().decode("utf-8")[:10].encode("utf-8") +@@ -2484,6 +2500,15 @@ class TestObjectVersioning(Base): + "Expected versioning_enabled to be True/False, got %r" % + (self.env.versioning_enabled,)) + ++ def tearDown(self): ++ super(TestObjectVersioning, self).tearDown() ++ try: ++ # delete versions first! ++ self.env.versions_container.delete_files() ++ self.env.container.delete_files() ++ except ResponseError: ++ pass ++ + def test_overwriting(self): + container = self.env.container + versions_container = self.env.versions_container +@@ -2515,6 +2540,33 @@ class TestObjectVersioning(Base): + versioned_obj.delete() + self.assertRaises(ResponseError, versioned_obj.read) + ++ def test_versioning_check_acl(self): ++ container = self.env.container ++ versions_container = self.env.versions_container ++ versions_container.create(hdrs={'X-Container-Read': '.r:*,.rlistings'}) ++ ++ obj_name = Utils.create_name() ++ versioned_obj = container.file(obj_name) ++ versioned_obj.write("aaaaa") ++ self.assertEqual("aaaaa", versioned_obj.read()) ++ ++ versioned_obj.write("bbbbb") ++ self.assertEqual("bbbbb", versioned_obj.read()) ++ ++ # Use token from second account and try to delete the object ++ org_token = self.env.account.conn.storage_token ++ self.env.account.conn.storage_token = self.env.conn2.storage_token ++ try: ++ self.assertRaises(ResponseError, versioned_obj.delete) ++ finally: ++ self.env.account.conn.storage_token = org_token ++ ++ # Verify with token from first account ++ self.assertEqual("bbbbb", versioned_obj.read()) ++ ++ versioned_obj.delete() ++ self.assertEqual("aaaaa", versioned_obj.read()) ++ + + class TestObjectVersioningUTF8(Base2, TestObjectVersioning): + set_up = False +diff --git a/test/unit/proxy/test_server.py b/test/unit/proxy/test_server.py +index b3b18a7..85ca553 100644 +--- a/test/unit/proxy/test_server.py ++++ b/test/unit/proxy/test_server.py +@@ -56,7 +56,7 @@ from swift.proxy.controllers.base import get_container_memcache_key, \ + get_account_memcache_key, cors_validation + import swift.proxy.controllers + from swift.common.swob import Request, Response, HTTPUnauthorized, \ +- HTTPException ++ HTTPException, HTTPForbidden + from swift.common import storage_policy + from swift.common.storage_policy import StoragePolicy, \ + StoragePolicyCollection, POLICIES +@@ -1566,6 +1566,7 @@ class TestObjectController(unittest.TestCase): + ]) + def test_DELETE_on_expired_versioned_object(self): + methods = set() ++ authorize_call_count = [0] + + def test_connect(ipaddr, port, device, partition, method, path, + headers=None, query_string=None): +@@ -1591,6 +1592,10 @@ class TestObjectController(unittest.TestCase): + for obj in object_list: + yield obj + ++ def fake_authorize(req): ++ authorize_call_count[0] += 1 ++ return None # allow the request ++ + with save_globals(): + controller = proxy_server.ObjectController(self.app, + 'a', 'c', 'o') +@@ -1602,7 +1607,8 @@ class TestObjectController(unittest.TestCase): + 204, 204, 204, # delete for the pre-previous + give_connect=test_connect) + req = Request.blank('/v1/a/c/o', +- environ={'REQUEST_METHOD': 'DELETE'}) ++ environ={'REQUEST_METHOD': 'DELETE', ++ 'swift.authorize': fake_authorize}) + + self.app.memcache.store = {} + self.app.update_request(req) +@@ -1612,6 +1618,67 @@ class TestObjectController(unittest.TestCase): + ('PUT', '/a/c/o'), + ('DELETE', '/a/foo/2')] + self.assertEquals(set(exp_methods), (methods)) ++ self.assertEquals(authorize_call_count[0], 2) ++ ++ @patch_policies([ ++ StoragePolicy(0, 'zero', False, object_ring=FakeRing()), ++ StoragePolicy(1, 'one', True, object_ring=FakeRing()) ++ ]) ++ def test_denied_DELETE_of_versioned_object(self): ++ """ ++ Verify that a request with read access to a versions container ++ is unable to cause any write operations on the versioned container. ++ """ ++ methods = set() ++ authorize_call_count = [0] ++ ++ def test_connect(ipaddr, port, device, partition, method, path, ++ headers=None, query_string=None): ++ methods.add((method, path)) ++ ++ def fake_container_info(account, container, req): ++ return {'status': 200, 'sync_key': None, ++ 'meta': {}, 'cors': {'allow_origin': None, ++ 'expose_headers': None, ++ 'max_age': None}, ++ 'sysmeta': {}, 'read_acl': None, 'object_count': None, ++ 'write_acl': None, 'versions': 'foo', ++ 'partition': 1, 'bytes': None, 'storage_policy': '1', ++ 'nodes': [{'zone': 0, 'ip': '10.0.0.0', 'region': 0, ++ 'id': 0, 'device': 'sda', 'port': 1000}, ++ {'zone': 1, 'ip': '10.0.0.1', 'region': 1, ++ 'id': 1, 'device': 'sdb', 'port': 1001}, ++ {'zone': 2, 'ip': '10.0.0.2', 'region': 0, ++ 'id': 2, 'device': 'sdc', 'port': 1002}]} ++ ++ def fake_list_iter(container, prefix, env): ++ object_list = [{'name': '1'}, {'name': '2'}, {'name': '3'}] ++ for obj in object_list: ++ yield obj ++ ++ def fake_authorize(req): ++ # deny write access ++ authorize_call_count[0] += 1 ++ return HTTPForbidden(req) # allow the request ++ ++ with save_globals(): ++ controller = proxy_server.ObjectController(self.app, ++ 'a', 'c', 'o') ++ controller.container_info = fake_container_info ++ # patching _listing_iter simulates request being authorized ++ # to list versions container ++ controller._listing_iter = fake_list_iter ++ set_http_connect(give_connect=test_connect) ++ req = Request.blank('/v1/a/c/o', ++ environ={'REQUEST_METHOD': 'DELETE', ++ 'swift.authorize': fake_authorize}) ++ ++ self.app.memcache.store = {} ++ self.app.update_request(req) ++ resp = controller.DELETE(req) ++ self.assertEqual(403, resp.status_int) ++ self.assertFalse(methods, methods) ++ self.assertEquals(authorize_call_count[0], 1) + + def test_PUT_auto_content_type(self): + with save_globals(): diff -Nru swift-2.2.0/debian/patches/CVE-2015-5223_Disallow-unsafe-tempurl-operations-to-point-to-unauthorized-data.patch swift-2.2.0/debian/patches/CVE-2015-5223_Disallow-unsafe-tempurl-operations-to-point-to-unauthorized-data.patch --- swift-2.2.0/debian/patches/CVE-2015-5223_Disallow-unsafe-tempurl-operations-to-point-to-unauthorized-data.patch 1970-01-01 00:00:00.000000000 +0000 +++ swift-2.2.0/debian/patches/CVE-2015-5223_Disallow-unsafe-tempurl-operations-to-point-to-unauthorized-data.patch 2015-09-15 19:29:22.000000000 +0000 @@ -0,0 +1,182 @@ +From 0694e1911d10a18075ff99462c96781372422b2c Mon Sep 17 00:00:00 2001 +From: Clay Gerrard <clay.gerr...@gmail.com> +Date: Thu, 23 Jul 2015 22:36:21 -0700 +Origin: upstream, https://review.openstack.org/#/c/217253/ +Subject: [PATCH] Disallow unsafe tempurl operations to point to unauthorized + data + +Do not allow PUT tempurls to create pointers to other data. Specifically +disallow the creation of DLO object manifests by returning an error if a +non-safe tempurl request includes an X-Object-Manifest header regardless of +the value of the header. + +This prevents discoverability attacks which can use any PUT tempurl to probe +for private data by creating a DLO object manifest and then using the PUT +tempurl to head the object which would 404 if the prefix does not match any +object data or form a valid DLO HEAD response if it does. + +This also prevents a tricky and potentially unexpected consequence of PUT +tempurls which would make it unsafe to allow a user to download objects +created by tempurl (even if they just created them) because the result of +reading the object created via tempurl may not be the data which was uploaded. + +[CVE-2015-5223] + +Co-Authored-By: Kota Tsuyuzaki <tsuyuzaki.k...@lab.ntt.co.jp> + +Closes-Bug: 1453948 + +Change-Id: I91161dfb0f089c3990aca1b4255b520299ef73c8 +--- + swift/common/middleware/tempurl.py | 31 ++++++++++++++++++++++++- + test/functional/tests.py | 36 +++++++++++++++++++++++++++++ + test/unit/common/middleware/test_tempurl.py | 19 +++++++++++++++ + 3 files changed, 85 insertions(+), 1 deletion(-) + +diff --git a/swift/common/middleware/tempurl.py b/swift/common/middleware/tempurl.py +index c2381b3..1f94e8d 100644 +--- a/swift/common/middleware/tempurl.py ++++ b/swift/common/middleware/tempurl.py +@@ -119,11 +119,13 @@ from urllib import urlencode + from urlparse import parse_qs + + from swift.proxy.controllers.base import get_account_info +-from swift.common.swob import HeaderKeyDict, HTTPUnauthorized ++from swift.common.swob import HeaderKeyDict, HTTPUnauthorized, HTTPBadRequest + from swift.common.utils import split_path, get_valid_utf8_str, \ + register_swift_info, get_hmac, streq_const_time, quote + + ++DISALLOWED_INCOMING_HEADERS = 'x-object-manifest' ++ + #: Default headers to remove from incoming requests. Simply a whitespace + #: delimited list of header names and names can optionally end with '*' to + #: indicate a prefix match. DEFAULT_INCOMING_ALLOW_HEADERS is a list of +@@ -227,6 +229,10 @@ class TempURL(object): + #: The methods allowed with Temp URLs. + self.methods = methods + ++ self.disallowed_headers = set( ++ 'HTTP_' + h.upper().replace('-', '_') ++ for h in DISALLOWED_INCOMING_HEADERS.split()) ++ + headers = DEFAULT_INCOMING_REMOVE_HEADERS + if 'incoming_remove_headers' in conf: + headers = conf['incoming_remove_headers'] +@@ -320,6 +326,13 @@ class TempURL(object): + for hmac in hmac_vals) + if not is_valid_hmac: + return self._invalid(env, start_response) ++ # disallowed headers prevent accidently allowing upload of a pointer ++ # to data that the PUT tempurl would not otherwise allow access for. ++ # It should be safe to provide a GET tempurl for data that an ++ # untrusted client just uploaded with a PUT tempurl. ++ resp = self._clean_disallowed_headers(env, start_response) ++ if resp: ++ return resp + self._clean_incoming_headers(env) + env['swift.authorize'] = lambda req: None + env['swift.authorize_override'] = True +@@ -456,6 +469,22 @@ class TempURL(object): + body = '401 Unauthorized: Temp URL invalid\n' + return HTTPUnauthorized(body=body)(env, start_response) + ++ def _clean_disallowed_headers(self, env, start_response): ++ """ ++ Validate the absense of disallowed headers for "unsafe" operations. ++ ++ :returns: None for safe operations or swob.HTTPBadResponse if the ++ request includes disallowed headers. ++ """ ++ if env['REQUEST_METHOD'] in ('GET', 'HEAD', 'OPTIONS'): ++ return ++ for h in env: ++ if h in self.disallowed_headers: ++ return HTTPBadRequest( ++ body='The header %r is not allowed in this tempurl' % ++ h[len('HTTP_'):].title().replace('_', '-'))( ++ env, start_response) ++ + def _clean_incoming_headers(self, env): + """ + Removes any headers from the WSGI environment as per the +diff --git a/test/functional/tests.py b/test/functional/tests.py +index e57f22b..654949f 100644 +--- a/test/functional/tests.py ++++ b/test/functional/tests.py +@@ -2687,6 +2687,42 @@ class TestTempurl(Base): + self.assert_(new_obj.info(parms=put_parms, + cfg={'no_auth_token': True})) + ++ def test_PUT_manifest_access(self): ++ new_obj = self.env.container.file(Utils.create_name()) ++ ++ # give out a signature which allows a PUT to new_obj ++ expires = int(time.time()) + 86400 ++ sig = self.tempurl_sig( ++ 'PUT', expires, self.env.conn.make_path(new_obj.path), ++ self.env.tempurl_key) ++ put_parms = {'temp_url_sig': sig, ++ 'temp_url_expires': str(expires)} ++ ++ # try to create manifest pointing to some random container ++ try: ++ new_obj.write('', { ++ 'x-object-manifest': '%s/foo' % 'some_random_container' ++ }, parms=put_parms, cfg={'no_auth_token': True}) ++ except ResponseError as e: ++ self.assertEqual(e.status, 400) ++ else: ++ self.fail('request did not error') ++ ++ # create some other container ++ other_container = self.env.account.container(Utils.create_name()) ++ if not other_container.create(): ++ raise ResponseError(self.conn.response) ++ ++ # try to create manifest pointing to new container ++ try: ++ new_obj.write('', { ++ 'x-object-manifest': '%s/foo' % other_container ++ }, parms=put_parms, cfg={'no_auth_token': True}) ++ except ResponseError as e: ++ self.assertEqual(e.status, 400) ++ else: ++ self.fail('request did not error') ++ + def test_HEAD(self): + expires = int(time.time()) + 86400 + sig = self.tempurl_sig( +diff --git a/test/unit/common/middleware/test_tempurl.py b/test/unit/common/middleware/test_tempurl.py +index 0581077..ffb3b98 100644 +--- a/test/unit/common/middleware/test_tempurl.py ++++ b/test/unit/common/middleware/test_tempurl.py +@@ -623,6 +623,25 @@ class TestTempURL(unittest.TestCase): + self.assertTrue('Temp URL invalid' in resp.body) + self.assertTrue('Www-Authenticate' in resp.headers) + ++ def test_disallowed_header_object_manifest(self): ++ self.tempurl = tempurl.filter_factory({})(self.auth) ++ method = 'PUT' ++ expires = int(time() + 86400) ++ path = '/v1/a/c/o' ++ key = 'abc' ++ hmac_body = '%s\n%s\n%s' % (method, expires, path) ++ sig = hmac.new(key, hmac_body, sha1).hexdigest() ++ req = self._make_request( ++ path, method='PUT', keys=[key], ++ headers={'x-object-manifest': 'private/secret'}, ++ environ={'QUERY_STRING': 'temp_url_sig=%s&temp_url_expires=%s' % ( ++ sig, expires)}) ++ resp = req.get_response(self.tempurl) ++ self.assertEquals(resp.status_int, 400) ++ self.assertTrue('header' in resp.body) ++ self.assertTrue('not allowed' in resp.body) ++ self.assertTrue('X-Object-Manifest' in resp.body) ++ + def test_removed_incoming_header(self): + self.tempurl = tempurl.filter_factory({ + 'incoming_remove_headers': 'x-remove-this'})(self.auth) +-- +2.3.2 (Apple Git-55) + diff -Nru swift-2.2.0/debian/patches/series swift-2.2.0/debian/patches/series --- swift-2.2.0/debian/patches/series 1970-01-01 00:00:00.000000000 +0000 +++ swift-2.2.0/debian/patches/series 2015-09-15 19:29:22.000000000 +0000 @@ -0,0 +1,2 @@ +CVE-2015-1856_Prevent-unauthorized-delete-in-versioned-container.patch +CVE-2015-5223_Disallow-unsafe-tempurl-operations-to-point-to-unauthorized-data.patch diff -Nru swift-2.2.0/debian/python-swift.postinst swift-2.2.0/debian/python-swift.postinst --- swift-2.2.0/debian/python-swift.postinst 2014-10-16 12:48:43.000000000 +0000 +++ swift-2.2.0/debian/python-swift.postinst 2015-09-15 19:29:22.000000000 +0000 @@ -2,14 +2,34 @@ set -e -#DEBHELPER# +pkgos_adduser () { + local VAR_UG_PKG_NAME + VAR_UG_PKG_NAME=${1} + + # Create user and groups if they don't exist + if ! getent group ${VAR_UG_PKG_NAME} > /dev/null 2>&1 ; then + addgroup --quiet --system ${VAR_UG_PKG_NAME} + fi + if ! getent passwd ${VAR_UG_PKG_NAME} > /dev/null 2>&1 ; then + adduser --system \ + --home /var/lib/${VAR_UG_PKG_NAME} \ + --no-create-home \ + --quiet \ + --disabled-password \ + --shell /bin/bash \ + --group ${VAR_UG_PKG_NAME} + fi + usermod -G adm ${VAR_UG_PKG_NAME} +} -if ! getent passwd swift > /dev/null ; then - adduser --system --quiet --disabled-login --disabled-password --no-create-home --group --shell /bin/false swift -fi -usermod -G adm swift +if [ "$1" = "configure" ] || [ "$1" = "reconfigure" ] ; then + pkgos_adduser swift -chown swift:swift /var/cache/swift + mkdir -p /var/cache/swift + chown swift:swift /var/cache/swift +fi + +#DEBHELPER# exit 0 diff -Nru swift-2.2.0/debian/python-swift.postrm swift-2.2.0/debian/python-swift.postrm --- swift-2.2.0/debian/python-swift.postrm 2014-10-16 12:48:43.000000000 +0000 +++ swift-2.2.0/debian/python-swift.postrm 2015-09-15 19:29:22.000000000 +0000 @@ -2,18 +2,9 @@ set -e -case "$1" in - purge) - # Remove swift user if possible - userdel swift || true - ;; - remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) - ;; - *) - echo "postrm called with unknown argument \`$1'" >&2 - exit 1 - ;; -esac +if [ "${1}" = "purge" ] ; then + rm -rf /var/cache/swift +fi #DEBHELPER# diff -Nru swift-2.2.0/debian/rules swift-2.2.0/debian/rules --- swift-2.2.0/debian/rules 2014-10-16 12:48:43.000000000 +0000 +++ swift-2.2.0/debian/rules 2015-09-15 19:29:22.000000000 +0000 @@ -56,6 +56,7 @@ dh_installinit --no-start -pswift-container --name=swift-container-replicator dh_installinit --no-start -pswift-container --name=swift-container-auditor dh_installinit --no-start -pswift-container --name=swift-container-updater + dh_installinit --no-start -pswift-container --name=swift-container-sync dh_installinit --no-start -pswift-account --name=swift-account-replicator dh_installinit --no-start -pswift-account --name=swift-account-auditor dh_installinit --no-start -pswift-account --name=swift-account-reaper diff -Nru swift-2.2.0/debian/swift-container.swift-container-sync.init swift-2.2.0/debian/swift-container.swift-container-sync.init --- swift-2.2.0/debian/swift-container.swift-container-sync.init 1970-01-01 00:00:00.000000000 +0000 +++ swift-2.2.0/debian/swift-container.swift-container-sync.init 2015-09-15 19:29:22.000000000 +0000 @@ -0,0 +1,57 @@ +#! /bin/sh +### BEGIN INIT INFO +# Provides: swift-container-sync +# Required-Start: $remote_fs +# Required-Stop: $remote_fs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Swift container sync server +# Description: Container sync server for Swift. +### END INIT INFO + +set -e + +SERVICE_NAME="container-sync" +PRINT_NAME="container sync" + +. /lib/lsb/init-functions + +if ! [ -x /usr/bin/swift-init ] ; then + exit 0 +fi + +case "$1" in +start) + log_daemon_msg "Starting Swift ${PRINT_NAME}" "swift-init ${SERVICE_NAME}" + /usr/bin/swift-init ${SERVICE_NAME} start + log_end_msg $? + exit $? +;; +stop) + log_daemon_msg "Stopping Swift ${PRINT_NAME}" "swift-init ${SERVICE_NAME}" + /usr/bin/swift-init ${SERVICE_NAME} stop + log_end_msg $? + exit $? +;; +restart) + log_daemon_msg "Restarting Swift ${PRINT_NAME}" "swift-init ${SERVICE_NAME}" + /usr/bin/swift-init ${SERVICE_NAME} restart + log_end_msg $? + exit $? +;; +reload|force-reload) + log_daemon_msg "Gracefully restarting Swift ${PRINT_NAME}" "swift-init ${SERVICE_NAME}" + /usr/bin/swift-init ${SERVICE_NAME} reload + log_end_msg $? + exit $? +;; +status) + exec /usr/bin/swift-init ${SERVICE_NAME} status +;; +*) + echo "Usage: $0 {start|stop|restart|reload}" + exit 1 +;; +esac + +exit 0 diff -Nru swift-2.2.0/debian/swift-container.swift-container-sync.upstart.in swift-2.2.0/debian/swift-container.swift-container-sync.upstart.in --- swift-2.2.0/debian/swift-container.swift-container-sync.upstart.in 1970-01-01 00:00:00.000000000 +0000 +++ swift-2.2.0/debian/swift-container.swift-container-sync.upstart.in 2015-09-15 19:29:22.000000000 +0000 @@ -0,0 +1,20 @@ +# swift-container-auditor - SWIFT Container Sync +# +# The swift container sync. + +description "SWIFT Container Sync" +author "Marc Cluet <marc.cl...@ubuntu.com>" + +start on runlevel [2345] +stop on runlevel [016] + +pre-start script + if [ -f "/etc/swift/container-server.conf" ]; then + exec /usr/bin/swift-init container-sync start + else + exit 1 + fi +end script + +post-stop exec /usr/bin/swift-init container-sync stop + diff -Nru swift-2.2.0/debian/swift-object-expirer.init swift-2.2.0/debian/swift-object-expirer.init --- swift-2.2.0/debian/swift-object-expirer.init 2014-10-16 12:48:43.000000000 +0000 +++ swift-2.2.0/debian/swift-object-expirer.init 2015-09-15 19:29:22.000000000 +0000 @@ -9,7 +9,7 @@ # Description: Object expirer daemon for swift. ### END INIT INFO -SERVICE_NAME="object-server-expirer" +SERVICE_NAME="object-expirer" PRINT_NAME="object expirer daemon" . /lib/lsb/init-functions