18551677 Request to integrate Swift into userland
authorDanek Duvall <danek.duvall@oracle.com>
Tue, 13 May 2014 15:55:28 -0600
changeset 1896 f83e6dde6c3b
parent 1895 1f133713df64
child 1897 9c849cc3d7d5
18551677 Request to integrate Swift into userland
components/openstack/common/openstack.p5m
components/openstack/keystone/patches/06-sample-data-sh.patch
components/openstack/swift/Makefile
components/openstack/swift/files/proxy-server.conf
components/openstack/swift/files/rsyncd.conf
components/openstack/swift/files/swift-account-auditor.xml
components/openstack/swift/files/swift-account-reaper.xml
components/openstack/swift/files/swift-account-replicator.xml
components/openstack/swift/files/swift-account-server.xml
components/openstack/swift/files/swift-container-auditor.xml
components/openstack/swift/files/swift-container-replicator.xml
components/openstack/swift/files/swift-container-server.xml
components/openstack/swift/files/swift-container-sync.xml
components/openstack/swift/files/swift-container-updater.xml
components/openstack/swift/files/swift-object-auditor.xml
components/openstack/swift/files/swift-object-expirer.xml
components/openstack/swift/files/swift-object-replicator.xml
components/openstack/swift/files/swift-object-server.xml
components/openstack/swift/files/swift-object-updater.xml
components/openstack/swift/files/swift-proxy-server.xml
components/openstack/swift/files/swift-replicator-rsync
components/openstack/swift/files/swift-replicator-rsync.xml
components/openstack/swift/files/swift-smf-method
components/openstack/swift/files/swift.auth_attr
components/openstack/swift/files/swift.exec_attr
components/openstack/swift/files/swift.prof_attr
components/openstack/swift/patches/01-CVE-2013-4155.patch
components/openstack/swift/patches/02-CVE-2014-0006.patch
components/openstack/swift/patches/03-CVE-2013-2161.patch
components/openstack/swift/patches/manager.patch
components/openstack/swift/patches/manpages.patch
components/openstack/swift/patches/orphans.patch
components/openstack/swift/patches/recon.patch
components/openstack/swift/patches/test.patch
components/openstack/swift/resolve.deps
components/openstack/swift/swift.p5m
--- a/components/openstack/common/openstack.p5m	Wed May 14 12:19:10 2014 -0700
+++ b/components/openstack/common/openstack.p5m	Tue May 13 15:55:28 2014 -0600
@@ -45,6 +45,7 @@
 depend type=group fmri=cloud/openstack/keystone
 depend type=group fmri=cloud/openstack/neutron
 depend type=group fmri=cloud/openstack/nova
+depend type=group fmri=cloud/openstack/swift
 depend type=group fmri=library/python/cinderclient
 depend type=group fmri=library/python/glanceclient
 depend type=group fmri=library/python/keystoneclient
--- a/components/openstack/keystone/patches/06-sample-data-sh.patch	Wed May 14 12:19:10 2014 -0700
+++ b/components/openstack/keystone/patches/06-sample-data-sh.patch	Tue May 13 15:55:28 2014 -0600
@@ -175,9 +175,9 @@
 -        --publicurl   "http://$CONTROLLER_PUBLIC_ADDRESS:8888/v1/AUTH_\$(tenant_id)s" \
 -        --adminurl    "http://$CONTROLLER_ADMIN_ADDRESS:8888/v1" \
 -        --internalurl "http://$CONTROLLER_INTERNAL_ADDRESS:8888/v1/AUTH_\$(tenant_id)s"
-+        --publicurl   "http://$SWIFT_PUBLIC_ADDRESS:8888/v1/AUTH_\$(tenant_id)s" \
-+        --adminurl    "http://$SWIFT_ADMIN_ADDRESS:8888/v1" \
-+        --internalurl "http://$SWIFT_INTERNAL_ADDRESS:8888/v1/AUTH_\$(tenant_id)s"
++        --publicurl   "http://$SWIFT_PUBLIC_ADDRESS:8080/v1/AUTH_\$(tenant_id)s" \
++        --adminurl    "http://$SWIFT_ADMIN_ADDRESS:8080/v1" \
++        --internalurl "http://$SWIFT_INTERNAL_ADDRESS:8080/v1/AUTH_\$(tenant_id)s"
 +fi
 +
 +#
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/swift/Makefile	Tue May 13 15:55:28 2014 -0600
@@ -0,0 +1,64 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+
+#
+# Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+#
+include ../../../make-rules/shared-macros.mk
+
+COMPONENT_NAME=		swift
+COMPONENT_CODENAME=	grizzly
+COMPONENT_VERSION=	1.8.0
+COMPONENT_SRC=		$(COMPONENT_NAME)-$(COMPONENT_VERSION)
+COMPONENT_ARCHIVE=	$(COMPONENT_SRC).tar.gz
+COMPONENT_ARCHIVE_HASH=	\
+    sha256:613185473e0c6f11c77bdc6b65efee195303268117afd9024fee82ebde6ed8a3
+COMPONENT_ARCHIVE_URL=	http://launchpad.net/$(COMPONENT_NAME)/$(COMPONENT_CODENAME)/$(COMPONENT_VERSION)/+download/$(COMPONENT_ARCHIVE)
+COMPONENT_PROJECT_URL=	http://www.openstack.org/
+COMPONENT_BUG_DB=	service/swift
+
+include $(WS_TOP)/make-rules/prep.mk
+include $(WS_TOP)/make-rules/setup.py.mk
+include $(WS_TOP)/make-rules/ips.mk
+
+ASLR_MODE = $(ASLR_NOT_APPLICABLE)
+
+# Since this is an app, and doesn't provide any public library interfaces, we
+# only need to deliver one version.  The manifest is parameterized, though.
+PYTHON_VERSIONS=	2.6
+
+PKG_MACROS +=		PYVER=$(PYTHON_VERSIONS)
+
+COMPONENT_TEST_DIR =	$(SOURCE_DIR)
+COMPONENT_TEST_CMD =	nosetests
+COMPONENT_TEST_ARGS =	--with-xunit --xunit-file=$(BUILD_DIR)/nosetests-$(MACH).xml
+COMPONENT_TEST_ARGS +=	test/unit
+
+# common targets
+build:		$(BUILD_NO_ARCH)
+
+install:	$(INSTALL_NO_ARCH)
+
+test:		$(TEST_NO_ARCH)
+
+BUILD_PKG_DEPENDENCIES =	$(BUILD_TOOLS)
+
+include $(WS_TOP)/make-rules/depend.mk
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/swift/files/proxy-server.conf	Tue May 13 15:55:28 2014 -0600
@@ -0,0 +1,370 @@
+[DEFAULT]
+# bind_ip = 0.0.0.0
+# bind_port = 80
+# bind_timeout = 30
+# backlog = 4096
+# swift_dir = /etc/swift
+# workers = 1
+# user = swift
+# Set the following two lines to enable SSL. This is for testing only.
+# cert_file = /etc/swift/proxy.crt
+# key_file = /etc/swift/proxy.key
+# expiring_objects_container_divisor = 86400
+# You can specify default log routing here if you want:
+# log_name = swift
+# log_facility = LOG_LOCAL0
+# log_level = INFO
+# log_headers = False
+# log_address = /dev/log
+# comma separated list of functions to call to setup custom log handlers.
+# functions get passed: conf, name, log_to_console, log_route, fmt, logger,
+# adapted_logger
+# log_custom_handlers =
+# If set, log_udp_host will override log_address
+# log_udp_host =
+# log_udp_port = 514
+# You can enable StatsD logging here:
+# log_statsd_host = localhost
+# log_statsd_port = 8125
+# log_statsd_default_sample_rate = 1.0
+# log_statsd_sample_rate_factor = 1.0
+# log_statsd_metric_prefix =
+# Use a comma separated list of full url (http://foo.bar:1234,https://foo.bar)
+# cors_allow_origin =
+# eventlet_debug = false
+
+[pipeline:main]
+pipeline = catch_errors healthcheck proxy-logging cache slo ratelimit tempauth authtoken keystoneauth container-quotas account-quotas proxy-logging proxy-server
+
+[app:proxy-server]
+use = egg:swift#proxy
+# You can override the default log routing for this app here:
+# set log_name = proxy-server
+# set log_facility = LOG_LOCAL0
+# set log_level = INFO
+# set log_address = /dev/log
+# log_handoffs = True
+# recheck_account_existence = 60
+# recheck_container_existence = 60
+# object_chunk_size = 8192
+# client_chunk_size = 8192
+# node_timeout = 10
+# client_timeout = 60
+# conn_timeout = 0.5
+# How long without an error before a node's error count is reset. This will
+# also be how long before a node is reenabled after suppression is triggered.
+# error_suppression_interval = 60
+# How many errors can accumulate before a node is temporarily ignored.
+# error_suppression_limit = 10
+# If set to 'true' any authorized user may create and delete accounts; if
+# 'false' no one, even authorized, can.
+# allow_account_management = false
+# Set object_post_as_copy = false to turn on fast posts where only the metadata
+# changes are stored anew and the original data file is kept in place. This
+# makes for quicker posts; but since the container metadata isn't updated in
+# this mode, features like container sync won't be able to sync posts.
+# object_post_as_copy = true
+# If set to 'true' authorized accounts that do not yet exist within the Swift
+# cluster will be automatically created.
+account_autocreate = true
+# If set to a positive value, trying to create a container when the account
+# already has at least this maximum containers will result in a 403 Forbidden.
+# Note: This is a soft limit, meaning a user might exceed the cap for
+# recheck_account_existence before the 403s kick in.
+# max_containers_per_account = 0
+# This is a comma separated list of account hashes that ignore the
+# max_containers_per_account cap.
+# max_containers_whitelist =
+# Comma separated list of Host headers to which the proxy will deny requests.
+# deny_host_headers =
+# Prefix used when automatically creating accounts.
+# auto_create_account_prefix = .
+# Depth of the proxy put queue.
+# put_queue_depth = 10
+# Start rate-limiting object segment serving after the Nth segment of a
+# segmented object.
+# rate_limit_after_segment = 10
+# Once segment rate-limiting kicks in for an object, limit segments served
+# to N per second.
+# rate_limit_segments_per_sec = 1
+# Storage nodes can be chosen at random (shuffle) or by using timing
+# measurements. Using timing measurements may allow for lower overall latency.
+# The valid values for sorting_method are "shuffle" and "timing"
+# sorting_method = shuffle
+# If the timing sorting_method is used, the timings will only be valid for
+# the number of seconds configured by timing_expiry.
+# timing_expiry = 300
+# If set to false will treat objects with X-Static-Large-Object header set
+# as a regular object on GETs, i.e. will return that object's contents. Should
+# be set to false if slo is not used in pipeline.
+# allow_static_large_object = true
+
+[filter:tempauth]
+use = egg:swift#tempauth
+# You can override the default log routing for this filter here:
+# set log_name = tempauth
+# set log_facility = LOG_LOCAL0
+# set log_level = INFO
+# set log_headers = False
+# set log_address = /dev/log
+# The reseller prefix will verify a token begins with this prefix before even
+# attempting to validate it. Also, with authorization, only Swift storage
+# accounts with this prefix will be authorized by this middleware. Useful if
+# multiple auth systems are in use for one Swift cluster.
+# reseller_prefix = AUTH
+# The auth prefix will cause requests beginning with this prefix to be routed
+# to the auth subsystem, for granting tokens, etc.
+# auth_prefix = /auth/
+# token_life = 86400
+# This allows middleware higher in the WSGI pipeline to override auth
+# processing, useful for middleware such as tempurl and formpost. If you know
+# you're not going to use such middleware and you want a bit of extra security,
+# you can set this to false.
+# allow_overrides = true
+# This specifies what scheme to return with storage urls:
+# http, https, or default (chooses based on what the server is running as)
+# This can be useful with an SSL load balancer in front of a non-SSL server.
+# storage_url_scheme = default
+# Lastly, you need to list all the accounts/users you want here. The format is:
+#   user_<account>_<user> = <key> [group] [group] [...] [storage_url]
+# or if you want underscores in <account> or <user>, you can base64 encode them
+# (with no equal signs) and use this format:
+#   user64_<account_b64>_<user_b64> = <key> [group] [group] [...] [storage_url]
+# There are special groups of:
+#   .reseller_admin = can do anything to any account for this auth
+#   .admin = can do anything within the account
+# If neither of these groups are specified, the user can only access containers
+# that have been explicitly allowed for them by a .admin or .reseller_admin.
+# The trailing optional storage_url allows you to specify an alternate url to
+# hand back to the user upon authentication. If not specified, this defaults to
+# $HOST/v1/<reseller_prefix>_<account> where $HOST will do its best to resolve
+# to what the requester would need to use to reach this host.
+# Here are example entries, required for running the tests:
+user_admin_admin = admin .admin .reseller_admin
+user_test_tester = testing .admin
+user_test2_tester2 = testing2 .admin
+user_test_tester3 = testing3
+
+# To enable Keystone authentication you need to have the auth token
+# middleware first to be configured. Here is an example below, please
+# refer to the keystone's documentation for details about the
+# different settings.
+#
+# You'll need to have as well the keystoneauth middleware enabled
+# and have it in your main pipeline so instead of having tempauth in
+# there you can change it to: authtoken keystone
+#
+[filter:authtoken]
+paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory
+auth_host = 127.0.0.1
+auth_port = 35357
+auth_protocol = http
+auth_uri = http://127.0.0.1:5000/
+admin_tenant_name = %SERVICE_TENANT_NAME%
+admin_user = %SERVICE_USER%
+admin_password = %SERVICE_PASSWORD%
+delay_auth_decision = 1
+cache = swift.cache
+include_service_catalog = False
+signing_dir = /var/lib/swift/keystone-signing
+
+[filter:keystoneauth]
+use = egg:swift#keystoneauth
+# Operator roles is the role which user would be allowed to manage a
+# tenant and be able to create container or give ACL to others.
+# operator_roles = admin, swiftoperator
+
+[filter:healthcheck]
+use = egg:swift#healthcheck
+# An optional filesystem path, which if present, will cause the healthcheck
+# URL to return "503 Service Unavailable" with a body of "DISABLED BY FILE".
+# This facility may be used to temporarily remove a Swift node from a load
+# balancer pool during maintenance or upgrade (remove the file to allow the
+# node back into the load balancer pool).
+# disable_path =
+
+[filter:cache]
+use = egg:swift#memcache
+# You can override the default log routing for this filter here:
+# set log_name = cache
+# set log_facility = LOG_LOCAL0
+# set log_level = INFO
+# set log_headers = False
+# set log_address = /dev/log
+# If not set here, the value for memcache_servers will be read from
+# memcache.conf (see memcache.conf-sample) or lacking that file, it will
+# default to the value below. You can specify multiple servers separated with
+# commas, as in: 10.1.2.3:11211,10.1.2.4:11211
+# memcache_servers = 127.0.0.1:11211
+#
+# Sets how memcache values are serialized and deserialized:
+# 0 = older, insecure pickle serialization
+# 1 = json serialization but pickles can still be read (still insecure)
+# 2 = json serialization only (secure and the default)
+# If not set here, the value for memcache_serialization_support will be read
+# from /etc/swift/memcache.conf (see memcache.conf-sample).
+# To avoid an instant full cache flush, existing installations should
+# upgrade with 0, then set to 1 and reload, then after some time (24 hours)
+# set to 2 and reload.
+# In the future, the ability to use pickle serialization will be removed.
+# memcache_serialization_support = 2
+
+[filter:ratelimit]
+use = egg:swift#ratelimit
+# You can override the default log routing for this filter here:
+# set log_name = ratelimit
+# set log_facility = LOG_LOCAL0
+# set log_level = INFO
+# set log_headers = False
+# set log_address = /dev/log
+# clock_accuracy should represent how accurate the proxy servers' system clocks
+# are with each other. 1000 means that all the proxies' clock are accurate to
+# each other within 1 millisecond.  No ratelimit should be higher than the
+# clock accuracy.
+# clock_accuracy = 1000
+# max_sleep_time_seconds = 60
+# log_sleep_time_seconds of 0 means disabled
+# log_sleep_time_seconds = 0
+# allows for slow rates (e.g. running up to 5 sec's behind) to catch up.
+# rate_buffer_seconds = 5
+# account_ratelimit of 0 means disabled
+# account_ratelimit = 0
+
+# these are comma separated lists of account names
+# account_whitelist = a,b
+# account_blacklist = c,d
+
+# with container_limit_x = r
+# for containers of size x limit requests per second to r.  The container
+# rate will be linearly interpolated from the values given. With the values
+# below, a container of size 5 will get a rate of 75.
+# container_ratelimit_0 = 100
+# container_ratelimit_10 = 50
+# container_ratelimit_50 = 20
+
+[filter:domain_remap]
+use = egg:swift#domain_remap
+# You can override the default log routing for this filter here:
+# set log_name = domain_remap
+# set log_facility = LOG_LOCAL0
+# set log_level = INFO
+# set log_headers = False
+# set log_address = /dev/log
+# storage_domain = example.com
+# path_root = v1
+# reseller_prefixes = AUTH
+
+[filter:catch_errors]
+use = egg:swift#catch_errors
+# You can override the default log routing for this filter here:
+# set log_name = catch_errors
+# set log_facility = LOG_LOCAL0
+# set log_level = INFO
+# set log_headers = False
+# set log_address = /dev/log
+
+[filter:cname_lookup]
+# Note: this middleware requires python-dnspython
+use = egg:swift#cname_lookup
+# You can override the default log routing for this filter here:
+# set log_name = cname_lookup
+# set log_facility = LOG_LOCAL0
+# set log_level = INFO
+# set log_headers = False
+# set log_address = /dev/log
+# storage_domain = example.com
+# lookup_depth = 1
+
+# Note: Put staticweb just after your auth filter(s) in the pipeline
+[filter:staticweb]
+use = egg:swift#staticweb
+# Seconds to cache container x-container-meta-web-* header values.
+# cache_timeout = 300
+
+# Note: Put tempurl just before your auth filter(s) in the pipeline
+[filter:tempurl]
+use = egg:swift#tempurl
+#
+# The 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. incoming_allow_headers is a list of exceptions to these
+# removals.
+# incoming_remove_headers = x-timestamp
+#
+# The headers allowed as exceptions to incoming_remove_headers. Simply a
+# whitespace delimited list of header names and names can optionally end with
+# '*' to indicate a prefix match.
+# incoming_allow_headers =
+#
+# The headers to remove from outgoing responses. Simply a whitespace delimited
+# list of header names and names can optionally end with '*' to indicate a
+# prefix match. outgoing_allow_headers is a list of exceptions to these
+# removals.
+# outgoing_remove_headers = x-object-meta-*
+#
+# The headers allowed as exceptions to outgoing_remove_headers. Simply a
+# whitespace delimited list of header names and names can optionally end with
+# '*' to indicate a prefix match.
+# outgoing_allow_headers = x-object-meta-public-*
+
+# Note: Put formpost just before your auth filter(s) in the pipeline
+[filter:formpost]
+use = egg:swift#formpost
+
+# Note: Just needs to be placed before the proxy-server in the pipeline.
+[filter:name_check]
+use = egg:swift#name_check
+# forbidden_chars = '"`<>
+# maximum_length = 255
+# forbidden_regexp = /\./|/\.\./|/\.$|/\.\.$
+
+[filter:list-endpoints]
+use = egg:swift#list_endpoints
+# list_endpoints_path = /endpoints/
+
+[filter:proxy-logging]
+use = egg:swift#proxy_logging
+# If not set, logging directives from [DEFAULT] without "access_" will be used
+# access_log_name = swift
+# access_log_facility = LOG_LOCAL0
+# access_log_level = INFO
+# access_log_address = /dev/log
+# If set, access_log_udp_host will override access_log_address
+# access_log_udp_host =
+# access_log_udp_port = 514
+# You can use log_statsd_* from [DEFAULT] or override them here:
+# access_log_statsd_host = localhost
+# access_log_statsd_port = 8125
+# access_log_statsd_default_sample_rate = 1.0
+# access_log_statsd_sample_rate_factor = 1.0
+# access_log_statsd_metric_prefix =
+# access_log_headers = False
+# What HTTP methods are allowed for StatsD logging (comma-sep); request methods
+# not in this list will have "BAD_METHOD" for the <verb> portion of the metric.
+# log_statsd_valid_http_methods = GET,HEAD,POST,PUT,DELETE,COPY,OPTIONS
+# Note: The double proxy-logging in the pipeline is not a mistake. The
+# left-most proxy-logging is there to log requests that were handled in
+# middleware and never made it through to the right-most middleware (and
+# proxy server). Double logging is prevented for normal requests. See
+# proxy-logging docs.
+
+# Note: Put before both ratelimit and auth in the pipeline.
+[filter:bulk]
+use = egg:swift#bulk
+# max_containers_per_extraction = 10000
+# max_failed_files = 1000
+# max_deletes_per_request = 1000
+
+# Note: Put after auth in the pipeline.
+[filter:container-quotas]
+use = egg:swift#container_quotas
+
+# Note: Put before both ratelimit and auth in the pipeline.
+[filter:slo]
+use = egg:swift#slo
+# max_manifest_segments = 1000
+# max_manifest_size = 2097152
+# min_segment_size = 1048576
+
+[filter:account-quotas]
+use = egg:swift#account_quotas
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/swift/files/rsyncd.conf	Tue May 13 15:55:28 2014 -0600
@@ -0,0 +1,20 @@
+log file = /var/log/swift/rsyncd.log
+pid file = /var/run/swift/rsyncd.pid
+
+[account]
+max connections = 2
+path = /srv/node
+read only = false
+lock file = /var/run/swift/account-rsync.lock
+
+[container]
+max connections = 4
+path = /srv/node
+read only = false
+lock file = /var/run/swift/container-rsync.lock
+
+[object]
+max connections = 8
+path = /srv/node
+read only = false
+lock file = /var/run/swift/object-rsync.lock
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/swift/files/swift-account-auditor.xml	Tue May 13 15:55:28 2014 -0600
@@ -0,0 +1,71 @@
+<?xml version="1.0" ?>
+<!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
+<!--
+ Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License"); you may
+ not use this file except in compliance with the License. You may obtain
+ a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ License for the specific language governing permissions and limitations
+ under the License.
+
+ NOTE:  This service manifest is not editable; its contents will
+ be overwritten by package or patch operations, including
+ operating system upgrade.  Make customizations in a different
+ file.
+-->
+<service_bundle type="manifest" name="swift-account-auditor">
+
+  <service version="1" type="service"
+    name="application/openstack/swift/swift-account-auditor">
+
+    <dependency name='multiuser' grouping='require_all' restart_on='error'
+      type='service'>
+      <service_fmri value='svc:/milestone/multi-user:default' />
+    </dependency>
+
+    <exec_method timeout_seconds="60" type="method" name="start"
+      exec="/lib/svc/method/swift-account-auditor %m">
+      <method_context>
+        <method_credential user='swift' group='swift'
+          privileges='basic,{zone}:/system/volatile/swift' />
+      </method_context>
+    </exec_method>
+    <exec_method timeout_seconds="60" type="method" name="stop"
+      exec=":kill"/>
+
+    <instance name='default' enabled='false'>
+      <!-- to start/stop/refresh the service -->
+      <property_group name='general' type='framework'>
+        <propval name='action_authorization' type='astring'
+                 value='solaris.smf.manage.swift' />
+        <propval name='value_authorization' type='astring'
+                 value='solaris.smf.value.swift' />
+      </property_group>
+    </instance>
+
+    <template>
+      <common_name>
+        <loctext xml:lang="C">
+          OpenStack Swift Account Auditor Service
+        </loctext>
+      </common_name>
+      <description>
+        <loctext xml:lang="C">
+          The Swift account auditor checks accounts, quarantining corrupt
+          data and requesting clean data from another replica.
+        </loctext>
+      </description>
+      <documentation>
+        <manpage title="swift-account-auditor" section="1" />
+        <manpage title="account-server.conf" section="4" />
+      </documentation>
+    </template>
+  </service>
+</service_bundle>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/swift/files/swift-account-reaper.xml	Tue May 13 15:55:28 2014 -0600
@@ -0,0 +1,70 @@
+<?xml version="1.0" ?>
+<!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
+<!--
+ Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License"); you may
+ not use this file except in compliance with the License. You may obtain
+ a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ License for the specific language governing permissions and limitations
+ under the License.
+
+ NOTE:  This service manifest is not editable; its contents will
+ be overwritten by package or patch operations, including
+ operating system upgrade.  Make customizations in a different
+ file.
+-->
+<service_bundle type="manifest" name="swift-account-reaper">
+
+  <service version="1" type="service"
+    name="application/openstack/swift/swift-account-reaper">
+
+    <dependency name='multiuser' grouping='require_all' restart_on='error'
+      type='service'>
+      <service_fmri value='svc:/milestone/multi-user:default' />
+    </dependency>
+
+    <exec_method timeout_seconds="60" type="method" name="start"
+      exec="/lib/svc/method/swift-account-reaper %m">
+      <method_context>
+        <method_credential user='swift' group='swift'
+          privileges='basic,{zone}:/system/volatile/swift' />
+      </method_context>
+    </exec_method>
+    <exec_method timeout_seconds="60" type="method" name="stop"
+      exec=":kill"/>
+
+    <instance name='default' enabled='false'>
+      <!-- to start/stop/refresh the service -->
+      <property_group name='general' type='framework'>
+        <propval name='action_authorization' type='astring'
+                 value='solaris.smf.manage.swift' />
+        <propval name='value_authorization' type='astring'
+                 value='solaris.smf.value.swift' />
+      </property_group>
+    </instance>
+
+    <template>
+      <common_name>
+        <loctext xml:lang="C">
+          OpenStack Swift Account Reaper Service
+        </loctext>
+      </common_name>
+      <description>
+        <loctext xml:lang="C">
+          The Swift account reaper removes data from deleted accounts.
+        </loctext>
+      </description>
+      <documentation>
+        <manpage title="swift-account-reaper" section="1" />
+        <manpage title="account-server.conf" section="4" />
+      </documentation>
+    </template>
+  </service>
+</service_bundle>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/swift/files/swift-account-replicator.xml	Tue May 13 15:55:28 2014 -0600
@@ -0,0 +1,71 @@
+<?xml version="1.0" ?>
+<!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
+<!--
+ Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License"); you may
+ not use this file except in compliance with the License. You may obtain
+ a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ License for the specific language governing permissions and limitations
+ under the License.
+
+ NOTE:  This service manifest is not editable; its contents will
+ be overwritten by package or patch operations, including
+ operating system upgrade.  Make customizations in a different
+ file.
+-->
+<service_bundle type="manifest" name="swift-account-replicator">
+
+  <service version="1" type="service"
+    name="application/openstack/swift/swift-account-replicator">
+
+    <dependency name='multiuser' grouping='require_all' restart_on='error'
+      type='service'>
+      <service_fmri value='svc:/milestone/multi-user:default' />
+    </dependency>
+
+    <exec_method timeout_seconds="60" type="method" name="start"
+      exec="/lib/svc/method/swift-account-replicator %m">
+      <method_context>
+        <method_credential user='swift' group='swift'
+          privileges='basic,{zone}:/system/volatile/swift' />
+      </method_context>
+    </exec_method>
+    <exec_method timeout_seconds="60" type="method" name="stop"
+      exec=":kill"/>
+
+    <instance name='default' enabled='false'>
+      <!-- to start/stop/refresh the service -->
+      <property_group name='general' type='framework'>
+        <propval name='action_authorization' type='astring'
+                 value='solaris.smf.manage.swift' />
+        <propval name='value_authorization' type='astring'
+                 value='solaris.smf.value.swift' />
+      </property_group>
+    </instance>
+
+    <template>
+      <common_name>
+        <loctext xml:lang="C">
+          OpenStack Swift Account Replicator Service
+        </loctext>
+      </common_name>
+      <description>
+        <loctext xml:lang="C">
+          The Swift account replicator ensures account consistency across
+          replicas.
+        </loctext>
+      </description>
+      <documentation>
+        <manpage title="swift-account-replicator" section="1" />
+        <manpage title="account-server.conf" section="4" />
+      </documentation>
+    </template>
+  </service>
+</service_bundle>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/swift/files/swift-account-server.xml	Tue May 13 15:55:28 2014 -0600
@@ -0,0 +1,76 @@
+<?xml version="1.0" ?>
+<!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
+<!--
+ Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License"); you may
+ not use this file except in compliance with the License. You may obtain
+ a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ License for the specific language governing permissions and limitations
+ under the License.
+
+ NOTE:  This service manifest is not editable; its contents will
+ be overwritten by package or patch operations, including
+ operating system upgrade.  Make customizations in a different
+ file.
+-->
+<service_bundle type="manifest" name="swift-account-server">
+
+  <service version="1" type="service"
+    name="application/openstack/swift/swift-account-server">
+
+    <dependency name='memcached' grouping='require_all' restart_on='error'
+      type='service'>
+      <service_fmri value='svc:/application/database/memcached:default' />
+    </dependency>
+
+    <dependency name='multiuser' grouping='require_all' restart_on='error'
+      type='service'>
+      <service_fmri value='svc:/milestone/multi-user:default' />
+    </dependency>
+
+    <exec_method timeout_seconds="60" type="method" name="start"
+      exec="/lib/svc/method/swift-account-server %m">
+      <method_context>
+        <method_credential user='swift' group='swift'
+          privileges='basic,{zone}:/system/volatile/swift' />
+      </method_context>
+    </exec_method>
+    <exec_method timeout_seconds="60" type="method" name="stop"
+      exec=":kill"/>
+
+    <instance name='default' enabled='false'>
+      <!-- to start/stop/refresh the service -->
+      <property_group name='general' type='framework'>
+        <propval name='action_authorization' type='astring'
+                 value='solaris.smf.manage.swift' />
+        <propval name='value_authorization' type='astring'
+                 value='solaris.smf.value.swift' />
+      </property_group>
+    </instance>
+
+    <template>
+      <common_name>
+        <loctext xml:lang="C">
+          OpenStack Swift Account Service
+        </loctext>
+      </common_name>
+      <description>
+        <loctext xml:lang="C">
+          Swift account servers manage accounts defined with the object storage
+          service.
+        </loctext>
+      </description>
+      <documentation>
+        <manpage title="swift-account-server" section="1" />
+        <manpage title="account-server.conf" section="4" />
+      </documentation>
+    </template>
+  </service>
+</service_bundle>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/swift/files/swift-container-auditor.xml	Tue May 13 15:55:28 2014 -0600
@@ -0,0 +1,71 @@
+<?xml version="1.0" ?>
+<!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
+<!--
+ Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License"); you may
+ not use this file except in compliance with the License. You may obtain
+ a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ License for the specific language governing permissions and limitations
+ under the License.
+
+ NOTE:  This service manifest is not editable; its contents will
+ be overwritten by package or patch operations, including
+ operating system upgrade.  Make customizations in a different
+ file.
+-->
+<service_bundle type="manifest" name="swift-container-auditor">
+
+  <service version="1" type="service"
+    name="application/openstack/swift/swift-container-auditor">
+
+    <dependency name='multiuser' grouping='require_all' restart_on='error'
+      type='service'>
+      <service_fmri value='svc:/milestone/multi-user:default' />
+    </dependency>
+
+    <exec_method timeout_seconds="60" type="method" name="start"
+      exec="/lib/svc/method/swift-container-auditor %m">
+      <method_context>
+        <method_credential user='swift' group='swift'
+          privileges='basic,{zone}:/system/volatile/swift' />
+      </method_context>
+    </exec_method>
+    <exec_method timeout_seconds="60" type="method" name="stop"
+      exec=":kill"/>
+
+    <instance name='default' enabled='false'>
+      <!-- to start/stop/refresh the service -->
+      <property_group name='general' type='framework'>
+        <propval name='action_authorization' type='astring'
+                 value='solaris.smf.manage.swift' />
+        <propval name='value_authorization' type='astring'
+                 value='solaris.smf.value.swift' />
+      </property_group>
+    </instance>
+
+    <template>
+      <common_name>
+        <loctext xml:lang="C">
+          OpenStack Swift Container Auditor Service
+        </loctext>
+      </common_name>
+      <description>
+        <loctext xml:lang="C">
+          The Swift container auditor checks containers, quarantining corrupt
+          data and requesting clean data from another replica.
+        </loctext>
+      </description>
+      <documentation>
+        <manpage title="swift-container-auditor" section="1" />
+        <manpage title="container-server.conf" section="4" />
+      </documentation>
+    </template>
+  </service>
+</service_bundle>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/swift/files/swift-container-replicator.xml	Tue May 13 15:55:28 2014 -0600
@@ -0,0 +1,71 @@
+<?xml version="1.0" ?>
+<!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
+<!--
+ Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License"); you may
+ not use this file except in compliance with the License. You may obtain
+ a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ License for the specific language governing permissions and limitations
+ under the License.
+
+ NOTE:  This service manifest is not editable; its contents will
+ be overwritten by package or patch operations, including
+ operating system upgrade.  Make customizations in a different
+ file.
+-->
+<service_bundle type="manifest" name="swift-container-replicator">
+
+  <service version="1" type="service"
+    name="application/openstack/swift/swift-container-replicator">
+
+    <dependency name='multiuser' grouping='require_all' restart_on='error'
+      type='service'>
+      <service_fmri value='svc:/milestone/multi-user:default' />
+    </dependency>
+
+    <exec_method timeout_seconds="60" type="method" name="start"
+      exec="/lib/svc/method/swift-container-replicator %m">
+      <method_context>
+        <method_credential user='swift' group='swift'
+          privileges='basic,{zone}:/system/volatile/swift' />
+      </method_context>
+    </exec_method>
+    <exec_method timeout_seconds="60" type="method" name="stop"
+      exec=":kill"/>
+
+    <instance name='default' enabled='false'>
+      <!-- to start/stop/refresh the service -->
+      <property_group name='general' type='framework'>
+        <propval name='action_authorization' type='astring'
+                 value='solaris.smf.manage.swift' />
+        <propval name='value_authorization' type='astring'
+                 value='solaris.smf.value.swift' />
+      </property_group>
+    </instance>
+
+    <template>
+      <common_name>
+        <loctext xml:lang="C">
+          OpenStack Swift Container Replicator Service
+        </loctext>
+      </common_name>
+      <description>
+        <loctext xml:lang="C">
+          The Swift container replicator ensures container consistency across
+          replicas.
+        </loctext>
+      </description>
+      <documentation>
+        <manpage title="swift-container-replicator" section="1" />
+        <manpage title="container-server.conf" section="4" />
+      </documentation>
+    </template>
+  </service>
+</service_bundle>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/swift/files/swift-container-server.xml	Tue May 13 15:55:28 2014 -0600
@@ -0,0 +1,76 @@
+<?xml version="1.0" ?>
+<!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
+<!--
+ Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License"); you may
+ not use this file except in compliance with the License. You may obtain
+ a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ License for the specific language governing permissions and limitations
+ under the License.
+
+ NOTE:  This service manifest is not editable; its contents will
+ be overwritten by package or patch operations, including
+ operating system upgrade.  Make customizations in a different
+ file.
+-->
+<service_bundle type="manifest" name="swift-container-server">
+
+  <service version="1" type="service"
+    name="application/openstack/swift/swift-container-server">
+
+    <dependency name='memcached' grouping='require_all' restart_on='error'
+      type='service'>
+      <service_fmri value='svc:/application/database/memcached:default' />
+    </dependency>
+
+    <dependency name='multiuser' grouping='require_all' restart_on='error'
+      type='service'>
+      <service_fmri value='svc:/milestone/multi-user:default' />
+    </dependency>
+
+    <exec_method timeout_seconds="60" type="method" name="start"
+      exec="/lib/svc/method/swift-container-server %m">
+      <method_context>
+        <method_credential user='swift' group='swift'
+          privileges='basic,{zone}:/system/volatile/swift' />
+      </method_context>
+    </exec_method>
+    <exec_method timeout_seconds="60" type="method" name="stop"
+      exec=":kill"/>
+
+    <instance name='default' enabled='false'>
+      <!-- to start/stop/refresh the service -->
+      <property_group name='general' type='framework'>
+        <propval name='action_authorization' type='astring'
+                 value='solaris.smf.manage.swift' />
+        <propval name='value_authorization' type='astring'
+                 value='solaris.smf.value.swift' />
+      </property_group>
+    </instance>
+
+    <template>
+      <common_name>
+        <loctext xml:lang="C">
+          OpenStack Swift Container Service
+        </loctext>
+      </common_name>
+      <description>
+        <loctext xml:lang="C">
+          The Swift container server manages a mapping of containers (i.e.,
+          folders) within the object store service.
+        </loctext>
+      </description>
+      <documentation>
+        <manpage title="swift-container-server" section="1" />
+        <manpage title="container-server.conf" section="4" />
+      </documentation>
+    </template>
+  </service>
+</service_bundle>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/swift/files/swift-container-sync.xml	Tue May 13 15:55:28 2014 -0600
@@ -0,0 +1,71 @@
+<?xml version="1.0" ?>
+<!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
+<!--
+ Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License"); you may
+ not use this file except in compliance with the License. You may obtain
+ a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ License for the specific language governing permissions and limitations
+ under the License.
+
+ NOTE:  This service manifest is not editable; its contents will
+ be overwritten by package or patch operations, including
+ operating system upgrade.  Make customizations in a different
+ file.
+-->
+<service_bundle type="manifest" name="swift-container-sync">
+
+  <service version="1" type="service"
+    name="application/openstack/swift/swift-container-sync">
+
+    <dependency name='multiuser' grouping='require_all' restart_on='error'
+      type='service'>
+      <service_fmri value='svc:/milestone/multi-user:default' />
+    </dependency>
+
+    <exec_method timeout_seconds="60" type="method" name="start"
+      exec="/lib/svc/method/swift-container-sync %m">
+      <method_context>
+        <method_credential user='swift' group='swift'
+          privileges='basic,{zone}:/system/volatile/swift' />
+      </method_context>
+    </exec_method>
+    <exec_method timeout_seconds="60" type="method" name="stop"
+      exec=":kill"/>
+
+    <instance name='default' enabled='false'>
+      <!-- to start/stop/refresh the service -->
+      <property_group name='general' type='framework'>
+        <propval name='action_authorization' type='astring'
+                 value='solaris.smf.manage.swift' />
+        <propval name='value_authorization' type='astring'
+                 value='solaris.smf.value.swift' />
+      </property_group>
+    </instance>
+
+    <template>
+      <common_name>
+        <loctext xml:lang="C">
+          OpenStack Swift Container Synchronization Service
+        </loctext>
+      </common_name>
+      <description>
+        <loctext xml:lang="C">
+          The Swift synchronization server mirrors containers between Swift
+          clusters.
+        </loctext>
+      </description>
+      <documentation>
+        <manpage title="swift-container-sync" section="1" />
+        <manpage title="container-server.conf" section="4" />
+      </documentation>
+    </template>
+  </service>
+</service_bundle>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/swift/files/swift-container-updater.xml	Tue May 13 15:55:28 2014 -0600
@@ -0,0 +1,71 @@
+<?xml version="1.0" ?>
+<!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
+<!--
+ Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License"); you may
+ not use this file except in compliance with the License. You may obtain
+ a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ License for the specific language governing permissions and limitations
+ under the License.
+
+ NOTE:  This service manifest is not editable; its contents will
+ be overwritten by package or patch operations, including
+ operating system upgrade.  Make customizations in a different
+ file.
+-->
+<service_bundle type="manifest" name="swift-container-updater">
+
+  <service version="1" type="service"
+    name="application/openstack/swift/swift-container-updater">
+
+    <dependency name='multiuser' grouping='require_all' restart_on='error'
+      type='service'>
+      <service_fmri value='svc:/milestone/multi-user:default' />
+    </dependency>
+
+    <exec_method timeout_seconds="60" type="method" name="start"
+      exec="/lib/svc/method/swift-container-updater %m">
+      <method_context>
+        <method_credential user='swift' group='swift'
+          privileges='basic,{zone}:/system/volatile/swift' />
+      </method_context>
+    </exec_method>
+    <exec_method timeout_seconds="60" type="method" name="stop"
+      exec=":kill"/>
+
+    <instance name='default' enabled='false'>
+      <!-- to start/stop/refresh the service -->
+      <property_group name='general' type='framework'>
+        <propval name='action_authorization' type='astring'
+                 value='solaris.smf.manage.swift' />
+        <propval name='value_authorization' type='astring'
+                 value='solaris.smf.value.swift' />
+      </property_group>
+    </instance>
+
+    <template>
+      <common_name>
+        <loctext xml:lang="C">
+          OpenStack Swift Container Updater Service
+        </loctext>
+      </common_name>
+      <description>
+        <loctext xml:lang="C">
+          The Swift container updater is responsible for updating container
+          information in the account database.
+        </loctext>
+      </description>
+      <documentation>
+        <manpage title="swift-container-updater" section="1" />
+        <manpage title="container-server.conf" section="4" />
+      </documentation>
+    </template>
+  </service>
+</service_bundle>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/swift/files/swift-object-auditor.xml	Tue May 13 15:55:28 2014 -0600
@@ -0,0 +1,71 @@
+<?xml version="1.0" ?>
+<!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
+<!--
+ Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License"); you may
+ not use this file except in compliance with the License. You may obtain
+ a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ License for the specific language governing permissions and limitations
+ under the License.
+
+ NOTE:  This service manifest is not editable; its contents will
+ be overwritten by package or patch operations, including
+ operating system upgrade.  Make customizations in a different
+ file.
+-->
+<service_bundle type="manifest" name="swift-object-auditor">
+
+  <service version="1" type="service"
+    name="application/openstack/swift/swift-object-auditor">
+
+    <dependency name='multiuser' grouping='require_all' restart_on='error'
+      type='service'>
+      <service_fmri value='svc:/milestone/multi-user:default' />
+    </dependency>
+
+    <exec_method timeout_seconds="60" type="method" name="start"
+      exec="/lib/svc/method/swift-object-auditor %m">
+      <method_context>
+        <method_credential user='swift' group='swift'
+          privileges='basic,{zone}:/system/volatile/swift' />
+      </method_context>
+    </exec_method>
+    <exec_method timeout_seconds="60" type="method" name="stop"
+      exec=":kill"/>
+
+    <instance name='default' enabled='false'>
+      <!-- to start/stop/refresh the service -->
+      <property_group name='general' type='framework'>
+        <propval name='action_authorization' type='astring'
+                 value='solaris.smf.manage.swift' />
+        <propval name='value_authorization' type='astring'
+                 value='solaris.smf.value.swift' />
+      </property_group>
+    </instance>
+
+    <template>
+      <common_name>
+        <loctext xml:lang="C">
+          OpenStack Swift Object Auditor Service
+        </loctext>
+      </common_name>
+      <description>
+        <loctext xml:lang="C">
+          The Swift object auditor checks objects, quarantining corrupt
+          data and requesting clean data from another replica.
+        </loctext>
+      </description>
+      <documentation>
+        <manpage title="swift-object-auditor" section="1" />
+        <manpage title="object-server.conf" section="4" />
+      </documentation>
+    </template>
+  </service>
+</service_bundle>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/swift/files/swift-object-expirer.xml	Tue May 13 15:55:28 2014 -0600
@@ -0,0 +1,70 @@
+<?xml version="1.0" ?>
+<!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
+<!--
+ Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License"); you may
+ not use this file except in compliance with the License. You may obtain
+ a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ License for the specific language governing permissions and limitations
+ under the License.
+
+ NOTE:  This service manifest is not editable; its contents will
+ be overwritten by package or patch operations, including
+ operating system upgrade.  Make customizations in a different
+ file.
+-->
+<service_bundle type="manifest" name="swift-object-expirer">
+
+  <service version="1" type="service"
+    name="application/openstack/swift/swift-object-expirer">
+
+    <dependency name='multiuser' grouping='require_all' restart_on='error'
+      type='service'>
+      <service_fmri value='svc:/milestone/multi-user:default' />
+    </dependency>
+
+    <exec_method timeout_seconds="60" type="method" name="start"
+      exec="/lib/svc/method/swift-object-expirer %m">
+      <method_context>
+        <method_credential user='swift' group='swift'
+          privileges='basic,{zone}:/system/volatile/swift' />
+      </method_context>
+    </exec_method>
+    <exec_method timeout_seconds="60" type="method" name="stop"
+      exec=":kill"/>
+
+    <instance name='default' enabled='false'>
+      <!-- to start/stop/refresh the service -->
+      <property_group name='general' type='framework'>
+        <propval name='action_authorization' type='astring'
+                 value='solaris.smf.manage.swift' />
+        <propval name='value_authorization' type='astring'
+                 value='solaris.smf.value.swift' />
+      </property_group>
+    </instance>
+
+    <template>
+      <common_name>
+        <loctext xml:lang="C">
+          OpenStack Swift Object Expirer Service
+        </loctext>
+      </common_name>
+      <description>
+        <loctext xml:lang="C">
+          The Swift object expirer executes scheduled deletion of objects.
+        </loctext>
+      </description>
+      <documentation>
+        <manpage title="swift-object-expirer" section="1" />
+        <manpage title="object-expirer.conf" section="4" />
+      </documentation>
+    </template>
+  </service>
+</service_bundle>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/swift/files/swift-object-replicator.xml	Tue May 13 15:55:28 2014 -0600
@@ -0,0 +1,71 @@
+<?xml version="1.0" ?>
+<!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
+<!--
+ Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License"); you may
+ not use this file except in compliance with the License. You may obtain
+ a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ License for the specific language governing permissions and limitations
+ under the License.
+
+ NOTE:  This service manifest is not editable; its contents will
+ be overwritten by package or patch operations, including
+ operating system upgrade.  Make customizations in a different
+ file.
+-->
+<service_bundle type="manifest" name="swift-object-replicator">
+
+  <service version="1" type="service"
+    name="application/openstack/swift/swift-object-replicator">
+
+    <dependency name='multiuser' grouping='require_all' restart_on='error'
+      type='service'>
+      <service_fmri value='svc:/milestone/multi-user:default' />
+    </dependency>
+
+    <exec_method timeout_seconds="60" type="method" name="start"
+      exec="/lib/svc/method/swift-object-replicator %m">
+      <method_context>
+        <method_credential user='swift' group='swift'
+          privileges='basic,{zone}:/system/volatile/swift' />
+      </method_context>
+    </exec_method>
+    <exec_method timeout_seconds="60" type="method" name="stop"
+      exec=":kill"/>
+
+    <instance name='default' enabled='false'>
+      <!-- to start/stop/refresh the service -->
+      <property_group name='general' type='framework'>
+        <propval name='action_authorization' type='astring'
+                 value='solaris.smf.manage.swift' />
+        <propval name='value_authorization' type='astring'
+                 value='solaris.smf.value.swift' />
+      </property_group>
+    </instance>
+
+    <template>
+      <common_name>
+        <loctext xml:lang="C">
+          OpenStack Swift Object Replicator Service
+        </loctext>
+      </common_name>
+      <description>
+        <loctext xml:lang="C">
+          The Swift object replicator ensures account consistency across
+          replicas.
+        </loctext>
+      </description>
+      <documentation>
+        <manpage title="swift-object-replicator" section="1" />
+        <manpage title="object-server.conf" section="4" />
+      </documentation>
+    </template>
+  </service>
+</service_bundle>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/swift/files/swift-object-server.xml	Tue May 13 15:55:28 2014 -0600
@@ -0,0 +1,76 @@
+<?xml version="1.0" ?>
+<!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
+<!--
+ Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License"); you may
+ not use this file except in compliance with the License. You may obtain
+ a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ License for the specific language governing permissions and limitations
+ under the License.
+
+ NOTE:  This service manifest is not editable; its contents will
+ be overwritten by package or patch operations, including
+ operating system upgrade.  Make customizations in a different
+ file.
+-->
+<service_bundle type="manifest" name="swift-object-server">
+
+  <service version="1" type="service"
+    name="application/openstack/swift/swift-object-server">
+
+    <dependency name='memcached' grouping='require_all' restart_on='error'
+      type='service'>
+      <service_fmri value='svc:/application/database/memcached:default' />
+    </dependency>
+
+    <dependency name='multiuser' grouping='require_all' restart_on='error'
+      type='service'>
+      <service_fmri value='svc:/milestone/multi-user:default' />
+    </dependency>
+
+    <exec_method timeout_seconds="60" type="method" name="start"
+      exec="/lib/svc/method/swift-object-server %m">
+      <method_context>
+        <method_credential user='swift' group='swift'
+          privileges='basic,{zone}:/system/volatile/swift' />
+      </method_context>
+    </exec_method>
+    <exec_method timeout_seconds="60" type="method" name="stop"
+      exec=":kill"/>
+
+    <instance name='default' enabled='false'>
+      <!-- to start/stop/refresh the service -->
+      <property_group name='general' type='framework'>
+        <propval name='action_authorization' type='astring'
+                 value='solaris.smf.manage.swift' />
+        <propval name='value_authorization' type='astring'
+                 value='solaris.smf.value.swift' />
+      </property_group>
+    </instance>
+
+    <template>
+      <common_name>
+        <loctext xml:lang="C">
+          OpenStack Swift Object Service
+        </loctext>
+      </common_name>
+      <description>
+        <loctext xml:lang="C">
+          Swift object servers manage actual objects (i.e., files) on the
+          storage nodes.
+        </loctext>
+      </description>
+      <documentation>
+        <manpage title="swift-object-server" section="1" />
+        <manpage title="object-server.conf" section="4" />
+      </documentation>
+    </template>
+  </service>
+</service_bundle>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/swift/files/swift-object-updater.xml	Tue May 13 15:55:28 2014 -0600
@@ -0,0 +1,71 @@
+<?xml version="1.0" ?>
+<!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
+<!--
+ Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License"); you may
+ not use this file except in compliance with the License. You may obtain
+ a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ License for the specific language governing permissions and limitations
+ under the License.
+
+ NOTE:  This service manifest is not editable; its contents will
+ be overwritten by package or patch operations, including
+ operating system upgrade.  Make customizations in a different
+ file.
+-->
+<service_bundle type="manifest" name="swift-object-updater">
+
+  <service version="1" type="service"
+    name="application/openstack/swift/swift-object-updater">
+
+    <dependency name='multiuser' grouping='require_all' restart_on='error'
+      type='service'>
+      <service_fmri value='svc:/milestone/multi-user:default' />
+    </dependency>
+
+    <exec_method timeout_seconds="60" type="method" name="start"
+      exec="/lib/svc/method/swift-object-updater %m">
+      <method_context>
+        <method_credential user='swift' group='swift'
+          privileges='basic,{zone}:/system/volatile/swift' />
+      </method_context>
+    </exec_method>
+    <exec_method timeout_seconds="60" type="method" name="stop"
+      exec=":kill"/>
+
+    <instance name='default' enabled='false'>
+      <!-- to start/stop/refresh the service -->
+      <property_group name='general' type='framework'>
+        <propval name='action_authorization' type='astring'
+                 value='solaris.smf.manage.swift' />
+        <propval name='value_authorization' type='astring'
+                 value='solaris.smf.value.swift' />
+      </property_group>
+    </instance>
+
+    <template>
+      <common_name>
+        <loctext xml:lang="C">
+          OpenStack Swift Object Updater Service
+        </loctext>
+      </common_name>
+      <description>
+        <loctext xml:lang="C">
+          The Swift object updater is responsible for updating object
+          information in container listings.
+        </loctext>
+      </description>
+      <documentation>
+        <manpage title="swift-object-updater" section="1" />
+        <manpage title="object-server.conf" section="4" />
+      </documentation>
+    </template>
+  </service>
+</service_bundle>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/swift/files/swift-proxy-server.xml	Tue May 13 15:55:28 2014 -0600
@@ -0,0 +1,76 @@
+<?xml version="1.0" ?>
+<!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
+<!--
+ Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License"); you may
+ not use this file except in compliance with the License. You may obtain
+ a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ License for the specific language governing permissions and limitations
+ under the License.
+
+ NOTE:  This service manifest is not editable; its contents will
+ be overwritten by package or patch operations, including
+ operating system upgrade.  Make customizations in a different
+ file.
+-->
+<service_bundle type="manifest" name="swift-proxy-server">
+
+  <service version="1" type="service"
+    name="application/openstack/swift/swift-proxy-server">
+
+    <dependency name='memcached' grouping='require_all' restart_on='error'
+      type='service'>
+      <service_fmri value='svc:/application/database/memcached:default' />
+    </dependency>
+
+    <dependency name='multiuser' grouping='require_all' restart_on='error'
+      type='service'>
+      <service_fmri value='svc:/milestone/multi-user:default' />
+    </dependency>
+
+    <exec_method timeout_seconds="60" type="method" name="start"
+      exec="/lib/svc/method/swift-proxy-server %m">
+      <method_context>
+        <method_credential user='swift' group='swift'
+          privileges='basic,{zone}:/system/volatile/swift' />
+      </method_context>
+    </exec_method>
+    <exec_method timeout_seconds="60" type="method" name="stop"
+      exec=":kill"/>
+
+    <instance name='default' enabled='false'>
+      <!-- to start/stop/refresh the service -->
+      <property_group name='general' type='framework'>
+        <propval name='action_authorization' type='astring'
+                 value='solaris.smf.manage.swift' />
+        <propval name='value_authorization' type='astring'
+                 value='solaris.smf.value.swift' />
+      </property_group>
+    </instance>
+
+    <template>
+      <common_name>
+        <loctext xml:lang="C">
+          OpenStack Swift Proxy Service
+        </loctext>
+      </common_name>
+      <description>
+        <loctext xml:lang="C">
+          Swift proxy servers accept incoming requests via the OpenStack Object
+          API or just raw HTTP.
+        </loctext>
+      </description>
+      <documentation>
+        <manpage title="swift-proxy-server" section="1" />
+        <manpage title="proxy-server.conf" section="4" />
+      </documentation>
+    </template>
+  </service>
+</service_bundle>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/swift/files/swift-replicator-rsync	Tue May 13 15:55:28 2014 -0600
@@ -0,0 +1,58 @@
+#!/usr/bin/python2.6
+
+# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+import errno
+import os
+import subprocess
+import sys
+
+import smf_include
+
+
+def start():
+    cfgfile = "/etc/swift/rsyncd.conf"
+    if not os.path.isfile(cfgfile):
+        smf_include.smf_method_exit(smf_include.SMF_EXIT_ERR_CONFIG,
+          "missing_config", "Missing configuration file")
+
+    # This is the default delivered in /etc/swift/rsyncd.conf
+    try:
+        os.mkdir("/var/run/swift")
+    except OSError as e:
+        if e.errno != errno.EEXIST:
+            raise
+
+    cmdline = ["/usr/bin/rsync", "--daemon", "--config", cfgfile]
+    try:
+        proc = subprocess.Popen(cmdline)
+    except OSError as err:
+        print >> sys.stderr, "Error executing rsync: %s" % err
+        smf_include.smf_method_exit(smf_include.SMF_EXIT_ERR_FATAL,
+          "exec_error", "Error executing rsync: %s" % err)
+
+    ret = proc.wait()
+    if ret != 0:
+        print >> sys.stderr, "rsync daemon failed to start (see message above)"
+        print >> sys.stderr, "commandline:", " ".join(cmdline)
+        print >> sys.stderr, "exit code:", ret
+        smf_include.smf_method_exit(smf_include.SMF_EXIT_ERR_FATAL,
+          "exec_fail", "rsync daemon failed to start (see service log)")
+
+    return smf_include.SMF_EXIT_OK
+
+if __name__ == "__main__":
+    os.putenv("LC_ALL", "C")
+    smf_include.smf_main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/swift/files/swift-replicator-rsync.xml	Tue May 13 15:55:28 2014 -0600
@@ -0,0 +1,71 @@
+<?xml version="1.0" ?>
+<!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
+<!--
+ Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License"); you may
+ not use this file except in compliance with the License. You may obtain
+ a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ License for the specific language governing permissions and limitations
+ under the License.
+
+ NOTE:  This service manifest is not editable; its contents will
+ be overwritten by package or patch operations, including
+ operating system upgrade.  Make customizations in a different
+ file.
+-->
+<service_bundle type="manifest" name="swift-replicator-rsync">
+
+  <service version="1" type="service"
+    name="application/openstack/swift/swift-replicator-rsync">
+
+    <dependency name='multiuser' grouping='require_all' restart_on='error'
+      type='service'>
+      <service_fmri value='svc:/milestone/multi-user:default' />
+    </dependency>
+
+    <exec_method timeout_seconds="60" type="method" name="start"
+      exec="/lib/svc/method/swift-replicator-rsync %m">
+      <method_context>
+        <method_credential user='swift' group='swift'
+          privileges='basic,{zone}:/system/volatile/swift,{net_privaddr}:873/tcp,proc_chroot' />
+      </method_context>
+    </exec_method>
+    <exec_method timeout_seconds="60" type="method" name="stop"
+      exec=":kill"/>
+
+    <instance name='default' enabled='false'>
+      <!-- to start/stop/refresh the service -->
+      <property_group name='general' type='framework'>
+        <propval name='action_authorization' type='astring'
+                 value='solaris.smf.manage.swift' />
+        <propval name='value_authorization' type='astring'
+                 value='solaris.smf.value.swift' />
+      </property_group>
+    </instance>
+
+    <template>
+      <common_name>
+        <loctext xml:lang="C">
+          OpenStack Swift Replication Service
+        </loctext>
+      </common_name>
+      <description>
+        <loctext xml:lang="C">
+          The Swift replication service acts as the backend for the Swift
+          account, container, and object replicator services.
+        </loctext>
+      </description>
+      <documentation>
+        <manpage title="rsync" section="1" />
+        <manpage title="rsyncd.conf" section="5" />
+      </documentation>
+    </template>
+  </service>
+</service_bundle>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/swift/files/swift-smf-method	Tue May 13 15:55:28 2014 -0600
@@ -0,0 +1,76 @@
+#!/usr/bin/python2.6
+
+# Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+import errno
+import os
+import sys
+
+import smf_include
+
+rings = {
+    "account-reaper": ["account", "container", "object"],
+    "account-replicator": ["account"],
+    "container-replicator": ["container"],
+    "container-sync": ["container", "object"],
+    "container-updater": ["account"],
+    "object-expirer": ["object"],
+    "object-replicator": ["object"],
+    "object-updater": ["container"],
+    "proxy-server": ["account", "container", "object"]
+}
+
+def start():
+    # All the Swift services do essentially the same thing, so there's no need
+    # to have different method executables.  Just look at the FMRI and run the
+    # appropriate executable from /usr/lib/swift.
+    fmri = os.environ["SMF_FMRI"]
+    exefile = os.path.basename(fmri.split(":")[1])
+    exepath = os.path.join("/usr/lib/swift", exefile)
+
+    # Try to find a config file that matches the executable name (minus the
+    # leading "swift-".  If that fails, try using the -server config file.
+    cfgfile = "/etc/swift/%s.conf" % exepath.split("-", 1)[1]
+    if not os.path.isfile(cfgfile):
+        cfgfile = "/etc/swift/%s-server.conf" % exepath.split("-")[1]
+    if not os.path.isfile(cfgfile):
+        print >> sys.stderr, "Missing configuration file"
+        smf_include.smf_method_exit(smf_include.SMF_EXIT_ERR_CONFIG,
+          "missing_config", "Missing configuration file")
+
+    missing_rings = []
+    for ring in rings.get(exepath.split("-", 1)[1], ()):
+        ringfile = "/etc/swift/%s.ring.gz" % ring
+        if not os.path.isfile(ringfile):
+            missing_rings.append(ringfile)
+    if missing_rings:
+        print >> sys.stderr, "Missing ring(s): " + ", ".join(missing_rings)
+        smf_include.smf_method_exit(smf_include.SMF_EXIT_ERR_CONFIG,
+          "missing_ring",
+          "Missing ring(s): " + ", ".join(missing_rings))
+
+    # This is the default recon_cache_path (from the config files) as well as
+    # the default run_dir (from the code).
+    try:
+        os.mkdir("/var/run/swift")
+    except OSError as e:
+        if e.errno != errno.EEXIST:
+            raise
+
+    smf_include.smf_subprocess("%s %s" % (exepath, cfgfile))
+
+if __name__ == "__main__":
+    os.putenv("LC_ALL", "C")
+    smf_include.smf_main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/swift/files/swift.auth_attr	Tue May 13 15:55:28 2014 -0600
@@ -0,0 +1,2 @@
+solaris.smf.manage.swift:RO::Manage OpenStack Swift Service States::
+solaris.smf.value.swift:RO::Change Values of OpenStack Swift Properties::
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/swift/files/swift.exec_attr	Tue May 13 15:55:28 2014 -0600
@@ -0,0 +1,32 @@
+OpenStack Object Storage Management:solaris:cmd:RO::\
+/usr/bin/swift-account-audit:uid=swift;gid=swift
+
+OpenStack Object Storage Management:solaris:cmd:RO::\
+/usr/bin/swift-bench-client:uid=swift;gid=swift
+
+OpenStack Object Storage Management:solaris:cmd:RO::\
+/usr/bin/swift-bench:uid=swift;gid=swift
+
+OpenStack Object Storage Management:solaris:cmd:RO::\
+/usr/bin/swift-dispersion-populate:uid=swift;gid=swift
+
+OpenStack Object Storage Management:solaris:cmd:RO::\
+/usr/bin/swift-dispersion-report:uid=swift;gid=swift
+
+OpenStack Object Storage Management:solaris:cmd:RO::\
+/usr/bin/swift-form-signature:uid=swift;gid=swift
+
+OpenStack Object Storage Management:solaris:cmd:RO::\
+/usr/bin/swift-get-nodes:uid=swift;gid=swift
+
+OpenStack Object Storage Management:solaris:cmd:RO::\
+/usr/bin/swift-object-info:uid=swift;gid=swift
+
+OpenStack Object Storage Management:solaris:cmd:RO::\
+/usr/bin/swift-recon:uid=swift;gid=swift
+
+OpenStack Object Storage Management:solaris:cmd:RO::\
+/usr/bin/swift-ring-builder:uid=swift;gid=swift
+
+OpenStack Object Storage Management:solaris:cmd:RO::\
+/usr/bin/swift-temp-url:uid=swift;gid=swift
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/swift/files/swift.prof_attr	Tue May 13 15:55:28 2014 -0600
@@ -0,0 +1,18 @@
+OpenStack Object Storage Management:RO::\
+Manage OpenStack Swift:\
+auths=solaris.admin.edit/etc/swift/account-server.conf,
+solaris.admin.edit/etc/swift/container-server.conf,
+solaris.admin.edit/etc/swift/dispersion.conf,
+solaris.admin.edit/etc/swift/memcache.conf,
+solaris.admin.edit/etc/swift/mime.types,
+solaris.admin.edit/etc/swift/object-expirer.conf,
+solaris.admin.edit/etc/swift/object-server.conf,
+solaris.admin.edit/etc/swift/proxy-server.conf,
+solaris.admin.edit/etc/swift/rsyncd.conf,
+solaris.admin.edit/etc/swift/swift-bench.conf,
+solaris.admin.edit/etc/swift/swift.conf,
+solaris.smf.manage.swift,\
+solaris.smf.value.swift
+
+OpenStack Management:RO:::profiles=OpenStack Object Storage Management
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/swift/patches/01-CVE-2013-4155.patch	Tue May 13 15:55:28 2014 -0600
@@ -0,0 +1,416 @@
+commit 1f4ec235cdfd8c868f2d6458532f9dc32c00b8ca
+Author: Peter Portante <[email protected]>
+Date:   Fri Jul 26 15:03:34 2013 -0400
+
+    Fix handling of DELETE obj reqs with old timestamp
+    
+    The DELETE object REST API was creating tombstone files with old
+    timestamps, potentially filling up the disk, as well as sending
+    container updates.
+    
+    Here we now make DELETEs with a request timestamp return a 409 (HTTP
+    Conflict) if a data file exists with a newer timestamp, only creating
+    tombstones if they have a newer timestamp.
+    
+    The key fix is to actually read the timestamp metadata from an
+    existing tombstone file (thanks to Pete Zaitcev for catching this),
+    and then only create tombstone files with newer timestamps.
+    
+    We also prevent PUT and POST operations using old timestamps as well.
+    
+    Change-Id: I631957029d17c6578bca5779367df5144ba01fc9
+    Signed-off-by: Peter Portante <[email protected]>
+
+--- a/swift/obj/server.py
++++ b/swift/obj/server.py
[email protected]@ -46,7 +46,7 @@ from swift.common.swob import HTTPAccepted, HTTPBadRequest, HTTPCreated, \
+     HTTPInternalServerError, HTTPNoContent, HTTPNotFound, HTTPNotModified, \
+     HTTPPreconditionFailed, HTTPRequestTimeout, HTTPUnprocessableEntity, \
+     HTTPClientDisconnect, HTTPMethodNotAllowed, Request, Response, UTC, \
+-    HTTPInsufficientStorage, multi_range_iterator
++    HTTPInsufficientStorage, multi_range_iterator, HTTPConflict
+ 
+ 
+ DATADIR = 'objects'
[email protected]@ -121,7 +121,6 @@ class DiskFile(object):
+         self.tmppath = None
+         self.logger = logger
+         self.metadata = {}
+-        self.meta_file = None
+         self.data_file = None
+         self.fp = None
+         self.iter_etag = None
[email protected]@ -133,15 +132,18 @@ class DiskFile(object):
+         if not os.path.exists(self.datadir):
+             return
+         files = sorted(os.listdir(self.datadir), reverse=True)
+-        for file in files:
+-            if file.endswith('.ts'):
+-                self.data_file = self.meta_file = None
+-                self.metadata = {'deleted': True}
+-                return
+-            if file.endswith('.meta') and not self.meta_file:
+-                self.meta_file = os.path.join(self.datadir, file)
+-            if file.endswith('.data') and not self.data_file:
+-                self.data_file = os.path.join(self.datadir, file)
++        meta_file = None
++        for afile in files:
++            if afile.endswith('.ts'):
++                self.data_file = None
++                with open(os.path.join(self.datadir, afile)) as mfp:
++                    self.metadata = read_metadata(mfp)
++                self.metadata['deleted'] = True
++                break
++            if afile.endswith('.meta') and not meta_file:
++                meta_file = os.path.join(self.datadir, afile)
++            if afile.endswith('.data') and not self.data_file:
++                self.data_file = os.path.join(self.datadir, afile)
+                 break
+         if not self.data_file:
+             return
[email protected]@ -149,8 +151,8 @@ class DiskFile(object):
+         self.metadata = read_metadata(self.fp)
+         if not keep_data_fp:
+             self.close(verify_file=False)
+-        if self.meta_file:
+-            with open(self.meta_file) as mfp:
++        if meta_file:
++            with open(meta_file) as mfp:
+                 for key in self.metadata.keys():
+                     if key.lower() not in DISALLOWED_HEADERS:
+                         del self.metadata[key]
[email protected]@ -594,6 +596,9 @@ class ObjectController(object):
+         except (DiskFileError, DiskFileNotExist):
+             file.quarantine()
+             return HTTPNotFound(request=request)
++        orig_timestamp = file.metadata.get('X-Timestamp', '0')
++        if orig_timestamp >= request.headers['x-timestamp']:
++            return HTTPConflict(request=request)
+         metadata = {'X-Timestamp': request.headers['x-timestamp']}
+         metadata.update(val for val in request.headers.iteritems()
+                         if val[0].lower().startswith('x-object-meta-'))
[email protected]@ -639,6 +644,8 @@ class ObjectController(object):
+         file = DiskFile(self.devices, device, partition, account, container,
+                         obj, self.logger, disk_chunk_size=self.disk_chunk_size)
+         orig_timestamp = file.metadata.get('X-Timestamp')
++        if orig_timestamp and orig_timestamp >= request.headers['x-timestamp']:
++            return HTTPConflict(request=request)
+         upload_expiration = time.time() + self.max_upload_time
+         etag = md5()
+         upload_size = 0
[email protected]@ -863,23 +870,26 @@ class ObjectController(object):
+             return HTTPPreconditionFailed(
+                 request=request,
+                 body='X-If-Delete-At and X-Delete-At do not match')
+-        orig_timestamp = file.metadata.get('X-Timestamp')
+-        if file.is_deleted() or file.is_expired():
+-            response_class = HTTPNotFound
+-        metadata = {
+-            'X-Timestamp': request.headers['X-Timestamp'], 'deleted': True,
+-        }
+         old_delete_at = int(file.metadata.get('X-Delete-At') or 0)
+         if old_delete_at:
+             self.delete_at_update('DELETE', old_delete_at, account,
+                                   container, obj, request.headers, device)
+-        file.put_metadata(metadata, tombstone=True)
+-        file.unlinkold(metadata['X-Timestamp'])
+-        if not orig_timestamp or \
+-                orig_timestamp < request.headers['x-timestamp']:
++        orig_timestamp = file.metadata.get('X-Timestamp', 0)
++        req_timestamp = request.headers['X-Timestamp']
++        if file.is_deleted() or file.is_expired():
++            response_class = HTTPNotFound
++        else:
++            if orig_timestamp < req_timestamp:
++                response_class = HTTPNoContent
++            else:
++                response_class = HTTPConflict
++        if orig_timestamp < req_timestamp:
++            file.put_metadata({'X-Timestamp': req_timestamp},
++                              tombstone=True)
++            file.unlinkold(req_timestamp)
+             self.container_update(
+                 'DELETE', account, container, obj, request.headers,
+-                {'x-timestamp': metadata['X-Timestamp'],
++                {'x-timestamp': req_timestamp,
+                  'x-trans-id': request.headers.get('x-trans-id', '-')},
+                 device)
+         resp = response_class(request=request)
+
+
+diff --git a/test/unit/obj/test_server.py b/test/unit/obj/test_server.py
+
+index 8ee266b..b354b97 100755 (executable)
+
+
+--- a/test/unit/obj/test_server.py
++++ b/test/unit/obj/test_server.py
[email protected]@ -509,6 +509,41 @@ class TestObjectController(unittest.TestCase):
+                      "X-Object-Meta-3" in resp.headers)
+         self.assertEquals(resp.headers['Content-Type'], 'application/x-test')
+ 
++    def test_POST_old_timestamp(self):
++        ts = time()
++        timestamp = normalize_timestamp(ts)
++        req = Request.blank('/sda1/p/a/c/o', environ={'REQUEST_METHOD': 'PUT'},
++                            headers={'X-Timestamp': timestamp,
++                                     'Content-Type': 'application/x-test',
++                                     'X-Object-Meta-1': 'One',
++                                     'X-Object-Meta-Two': 'Two'})
++        req.body = 'VERIFY'
++        resp = self.object_controller.PUT(req)
++        self.assertEquals(resp.status_int, 201)
++
++        # Same timestamp should result in 409
++        req = Request.blank('/sda1/p/a/c/o',
++                            environ={'REQUEST_METHOD': 'POST'},
++                            headers={'X-Timestamp': timestamp,
++                                     'X-Object-Meta-3': 'Three',
++                                     'X-Object-Meta-4': 'Four',
++                                     'Content-Encoding': 'gzip',
++                                     'Content-Type': 'application/x-test'})
++        resp = self.object_controller.POST(req)
++        self.assertEquals(resp.status_int, 409)
++
++        # Earlier timestamp should result in 409
++        timestamp = normalize_timestamp(ts - 1)
++        req = Request.blank('/sda1/p/a/c/o',
++                            environ={'REQUEST_METHOD': 'POST'},
++                            headers={'X-Timestamp': timestamp,
++                                     'X-Object-Meta-5': 'Five',
++                                     'X-Object-Meta-6': 'Six',
++                                     'Content-Encoding': 'gzip',
++                                     'Content-Type': 'application/x-test'})
++        resp = self.object_controller.POST(req)
++        self.assertEquals(resp.status_int, 409)
++
+     def test_POST_not_exist(self):
+         timestamp = normalize_timestamp(time())
+         req = Request.blank('/sda1/p/a/c/fail',
[email protected]@ -555,11 +590,15 @@ class TestObjectController(unittest.TestCase):
+ 
+         old_http_connect = object_server.http_connect
+         try:
+-            timestamp = normalize_timestamp(time())
++            ts = time()
++            timestamp = normalize_timestamp(ts)
+             req = Request.blank('/sda1/p/a/c/o', environ={'REQUEST_METHOD':
+                 'POST'}, headers={'X-Timestamp': timestamp, 'Content-Type':
+                 'text/plain', 'Content-Length': '0'})
+             resp = self.object_controller.PUT(req)
++            self.assertEquals(resp.status_int, 201)
++
++            timestamp = normalize_timestamp(ts + 1)
+             req = Request.blank('/sda1/p/a/c/o',
+                     environ={'REQUEST_METHOD': 'POST'},
+                     headers={'X-Timestamp': timestamp,
[email protected]@ -571,6 +610,8 @@ class TestObjectController(unittest.TestCase):
+             object_server.http_connect = mock_http_connect(202)
+             resp = self.object_controller.POST(req)
+             self.assertEquals(resp.status_int, 202)
++
++            timestamp = normalize_timestamp(ts + 2)
+             req = Request.blank('/sda1/p/a/c/o',
+                     environ={'REQUEST_METHOD': 'POST'},
+                     headers={'X-Timestamp': timestamp,
[email protected]@ -582,6 +623,8 @@ class TestObjectController(unittest.TestCase):
+             object_server.http_connect = mock_http_connect(202, with_exc=True)
+             resp = self.object_controller.POST(req)
+             self.assertEquals(resp.status_int, 202)
++
++            timestamp = normalize_timestamp(ts + 3)
+             req = Request.blank('/sda1/p/a/c/o',
+                     environ={'REQUEST_METHOD': 'POST'},
+                     headers={'X-Timestamp': timestamp,
[email protected]@ -718,6 +761,32 @@ class TestObjectController(unittest.TestCase):
+                            'name': '/a/c/o',
+                            'Content-Encoding': 'gzip'})
+ 
++    def test_PUT_old_timestamp(self):
++        ts = time()
++        req = Request.blank('/sda1/p/a/c/o', environ={'REQUEST_METHOD': 'PUT'},
++                headers={'X-Timestamp': normalize_timestamp(ts),
++                         'Content-Length': '6',
++                         'Content-Type': 'application/octet-stream'})
++        req.body = 'VERIFY'
++        resp = self.object_controller.PUT(req)
++        self.assertEquals(resp.status_int, 201)
++
++        req = Request.blank('/sda1/p/a/c/o', environ={'REQUEST_METHOD': 'PUT'},
++                            headers={'X-Timestamp': normalize_timestamp(ts),
++                                     'Content-Type': 'text/plain',
++                                     'Content-Encoding': 'gzip'})
++        req.body = 'VERIFY TWO'
++        resp = self.object_controller.PUT(req)
++        self.assertEquals(resp.status_int, 409)
++
++        req = Request.blank('/sda1/p/a/c/o', environ={'REQUEST_METHOD': 'PUT'},
++                            headers={'X-Timestamp': normalize_timestamp(ts - 1),
++                                     'Content-Type': 'text/plain',
++                                     'Content-Encoding': 'gzip'})
++        req.body = 'VERIFY THREE'
++        resp = self.object_controller.PUT(req)
++        self.assertEquals(resp.status_int, 409)
++
+     def test_PUT_no_etag(self):
+         req = Request.blank('/sda1/p/a/c/o', environ={'REQUEST_METHOD': 'PUT'},
+                            headers={'X-Timestamp': normalize_timestamp(time()),
[email protected]@ -1306,12 +1375,32 @@ class TestObjectController(unittest.TestCase):
+         self.assertEquals(resp.status_int, 400)
+         # self.assertRaises(KeyError, self.object_controller.DELETE, req)
+ 
++        # The following should have created a tombstone file
+         timestamp = normalize_timestamp(time())
+         req = Request.blank('/sda1/p/a/c/o',
+                             environ={'REQUEST_METHOD': 'DELETE'},
+                             headers={'X-Timestamp': timestamp})
+         resp = self.object_controller.DELETE(req)
+         self.assertEquals(resp.status_int, 404)
++        objfile = os.path.join(self.testdir, 'sda1',
++            storage_directory(object_server.DATADIR, 'p',
++                              hash_path('a', 'c', 'o')),
++            timestamp + '.ts')
++        self.assert_(os.path.isfile(objfile))
++
++        # The following should *not* have created a tombstone file.
++        timestamp = normalize_timestamp(float(timestamp) - 1)
++        req = Request.blank('/sda1/p/a/c/o',
++                            environ={'REQUEST_METHOD': 'DELETE'},
++                            headers={'X-Timestamp': timestamp})
++        resp = self.object_controller.DELETE(req)
++        self.assertEquals(resp.status_int, 404)
++        objfile = os.path.join(self.testdir, 'sda1',
++            storage_directory(object_server.DATADIR, 'p',
++                              hash_path('a', 'c', 'o')),
++            timestamp + '.ts')
++        self.assertFalse(os.path.exists(objfile))
++        self.assertEquals(len(os.listdir(os.path.dirname(objfile))), 1)
+ 
+         sleep(.00001)
+         timestamp = normalize_timestamp(time())
[email protected]@ -1325,17 +1414,19 @@ class TestObjectController(unittest.TestCase):
+         resp = self.object_controller.PUT(req)
+         self.assertEquals(resp.status_int, 201)
+ 
++        # The following should *not* have created a tombstone file.
+         timestamp = normalize_timestamp(float(timestamp) - 1)
+         req = Request.blank('/sda1/p/a/c/o',
+                             environ={'REQUEST_METHOD': 'DELETE'},
+                             headers={'X-Timestamp': timestamp})
+         resp = self.object_controller.DELETE(req)
+-        self.assertEquals(resp.status_int, 204)
++        self.assertEquals(resp.status_int, 409)
+         objfile = os.path.join(self.testdir, 'sda1',
+             storage_directory(object_server.DATADIR, 'p',
+                               hash_path('a', 'c', 'o')),
+             timestamp + '.ts')
+-        self.assert_(os.path.isfile(objfile))
++        self.assertFalse(os.path.exists(objfile))
++        self.assertEquals(len(os.listdir(os.path.dirname(objfile))), 1)
+ 
+         sleep(.00001)
+         timestamp = normalize_timestamp(time())
[email protected]@ -1350,6 +1441,103 @@ class TestObjectController(unittest.TestCase):
+             timestamp + '.ts')
+         self.assert_(os.path.isfile(objfile))
+ 
++    def test_DELETE_container_updates(self):
++        # Test swift.object_server.ObjectController.DELETE and container
++        # updates, making sure container update is called in the correct
++        # state.
++        timestamp = normalize_timestamp(time())
++        req = Request.blank('/sda1/p/a/c/o', environ={'REQUEST_METHOD': 'PUT'},
++                            headers={
++                                'X-Timestamp': timestamp,
++                                'Content-Type': 'application/octet-stream',
++                                'Content-Length': '4',
++                                })
++        req.body = 'test'
++        resp = self.object_controller.PUT(req)
++        self.assertEquals(resp.status_int, 201)
++
++        calls_made = [0]
++
++        def our_container_update(*args, **kwargs):
++            calls_made[0] += 1
++
++        orig_cu = self.object_controller.container_update
++        self.object_controller.container_update = our_container_update
++        try:
++            # The following request should return 409 (HTTP Conflict). A
++            # tombstone file should not have been created with this timestamp.
++            timestamp = normalize_timestamp(float(timestamp) - 1)
++            req = Request.blank('/sda1/p/a/c/o',
++                                environ={'REQUEST_METHOD': 'DELETE'},
++                                headers={'X-Timestamp': timestamp})
++            resp = self.object_controller.DELETE(req)
++            self.assertEquals(resp.status_int, 409)
++            objfile = os.path.join(self.testdir, 'sda1',
++                storage_directory(object_server.DATADIR, 'p',
++                                  hash_path('a', 'c', 'o')),
++                timestamp + '.ts')
++            self.assertFalse(os.path.isfile(objfile))
++            self.assertEquals(len(os.listdir(os.path.dirname(objfile))), 1)
++            self.assertEquals(0, calls_made[0])
++
++            # The following request should return 204, and the object should
++            # be truly deleted (container update is performed) because this
++            # timestamp is newer. A tombstone file should have been created
++            # with this timestamp.
++            sleep(.00001)
++            timestamp = normalize_timestamp(time())
++            req = Request.blank('/sda1/p/a/c/o',
++                                environ={'REQUEST_METHOD': 'DELETE'},
++                                headers={'X-Timestamp': timestamp})
++            resp = self.object_controller.DELETE(req)
++            self.assertEquals(resp.status_int, 204)
++            objfile = os.path.join(self.testdir, 'sda1',
++                storage_directory(object_server.DATADIR, 'p',
++                                  hash_path('a', 'c', 'o')),
++                timestamp + '.ts')
++            self.assert_(os.path.isfile(objfile))
++            self.assertEquals(1, calls_made[0])
++            self.assertEquals(len(os.listdir(os.path.dirname(objfile))), 1)
++
++            # The following request should return a 404, as the object should
++            # already have been deleted, but it should have also performed a
++            # container update because the timestamp is newer, and a tombstone
++            # file should also exist with this timestamp.
++            sleep(.00001)
++            timestamp = normalize_timestamp(time())
++            req = Request.blank('/sda1/p/a/c/o',
++                                environ={'REQUEST_METHOD': 'DELETE'},
++                                headers={'X-Timestamp': timestamp})
++            resp = self.object_controller.DELETE(req)
++            self.assertEquals(resp.status_int, 404)
++            objfile = os.path.join(self.testdir, 'sda1',
++                storage_directory(object_server.DATADIR, 'p',
++                                  hash_path('a', 'c', 'o')),
++                timestamp + '.ts')
++            self.assert_(os.path.isfile(objfile))
++            self.assertEquals(2, calls_made[0])
++            self.assertEquals(len(os.listdir(os.path.dirname(objfile))), 1)
++
++            # The following request should return a 404, as the object should
++            # already have been deleted, and it should not have performed a
++            # container update because the timestamp is older, or created a
++            # tombstone file with this timestamp.
++            timestamp = normalize_timestamp(float(timestamp) - 1)
++            req = Request.blank('/sda1/p/a/c/o',
++                                environ={'REQUEST_METHOD': 'DELETE'},
++                                headers={'X-Timestamp': timestamp})
++            resp = self.object_controller.DELETE(req)
++            self.assertEquals(resp.status_int, 404)
++            objfile = os.path.join(self.testdir, 'sda1',
++                storage_directory(object_server.DATADIR, 'p',
++                                  hash_path('a', 'c', 'o')),
++                timestamp + '.ts')
++            self.assertFalse(os.path.isfile(objfile))
++            self.assertEquals(2, calls_made[0])
++            self.assertEquals(len(os.listdir(os.path.dirname(objfile))), 1)
++        finally:
++            self.object_controller.container_update = orig_cu
++
+     def test_call(self):
+         """ Test swift.object_server.ObjectController.__call__ """
+         inbuf = StringIO()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/swift/patches/02-CVE-2014-0006.patch	Tue May 13 15:55:28 2014 -0600
@@ -0,0 +1,43 @@
+From c0eed792a22865b280f99cbb79076fa7ad19fcbb Mon Sep 17 00:00:00 2001
+From: Samuel Merritt <[email protected]>
+Date: Thu, 16 Jan 2014 12:45:52 +0000
+Subject: Use constant time comparison in tempURL
+
+Use constant time comparison when evaluating tempURL to avoid timing
+attacks (CVE-2014-0006). This is the grizzly backport of the master
+patch.
+
+Fixes bug 1265665
+
+Change-Id: I11e4ad83cc4077e52adf54a0bd0f9749294b2a48
+---
+diff --git a/swift/common/middleware/tempurl.py b/swift/common/middleware/tempurl.py
+index 5a05de7..8a2517e 100644
+--- a/swift/common/middleware/tempurl.py
++++ b/swift/common/middleware/tempurl.py
[email protected]@ -98,6 +98,7 @@ from urlparse import parse_qs
+ 
+ from swift.common.wsgi import make_pre_authed_env
+ from swift.common.http import HTTP_UNAUTHORIZED
++from swift.common.utils import streq_const_time
+ 
+ 
+ #: Default headers to remove from incoming requests. Simply a whitespace
[email protected]@ -248,14 +249,14 @@ class TempURL(object):
+         if env['REQUEST_METHOD'] == 'HEAD':
+             hmac_val = self._get_hmac(env, temp_url_expires, key,
+                                       request_method='GET')
+-            if temp_url_sig != hmac_val:
++            if not streq_const_time(temp_url_sig, hmac_val):
+                 hmac_val = self._get_hmac(env, temp_url_expires, key,
+                                           request_method='PUT')
+-                if temp_url_sig != hmac_val:
++                if not streq_const_time(temp_url_sig, hmac_val):
+                     return self._invalid(env, start_response)
+         else:
+             hmac_val = self._get_hmac(env, temp_url_expires, key)
+-            if temp_url_sig != hmac_val:
++            if not streq_const_time(temp_url_sig, hmac_val):
+                 return self._invalid(env, start_response)
+         self._clean_incoming_headers(env)
+         env['swift.authorize'] = lambda req: None
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/swift/patches/03-CVE-2013-2161.patch	Tue May 13 15:55:28 2014 -0600
@@ -0,0 +1,25 @@
+commit 6659382c4fa348e1ebbce2424968dd7267ea1db1
+Author: Alex Gaynor <[email protected]>
+Date:   Mon May 27 02:07:39 2013 +0000
+
+    Check user input in XML responses.
+    
+    Fixes bug 1183884.
+    
+    * swift/account/server.py: Escape account name in XML listings.
+    
+    Change-Id: I7ba54631ed1349516132c00a53fae74f0b84ac37
+
+diff --git a/swift/account/server.py b/swift/account/server.py
+index 81c4d90..baca5a5 100644
+--- a/swift/account/server.py
++++ b/swift/account/server.py
[email protected]@ -241,7 +241,7 @@ class AccountController(object):
+             account_list = json.dumps(data)
+         elif out_content_type.endswith('/xml'):
+             output_list = ['<?xml version="1.0" encoding="UTF-8"?>',
+-                           '<account name="%s">' % account]
++                           '<account name="%s">' % saxutils.escape(account)]
+             for (name, object_count, bytes_used, is_subdir) in account_list:
+                 name = saxutils.escape(name)
+                 if is_subdir:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/swift/patches/manager.patch	Tue May 13 15:55:28 2014 -0600
@@ -0,0 +1,32 @@
+We want to put the swift server executables in /usr/lib/swift, which means
+that we need to be able to call them from there.  We do so by using the
+"executable" keyword argument to subprocess.Popen() (and allow for it to be
+mocked out during testing).
+
+This patch is not suitable for pushing upstream.
+
+diff --git a/swift/common/manager.py b/swift/common/manager.py
+--- a/swift/common/manager.py
++++ b/swift/common/manager.py
[email protected]@ -532,7 +532,8 @@ class Server():
+                 re_out = subprocess.PIPE
+             else:
+                 re_out = open(os.devnull, 'w+b')
+-        proc = subprocess.Popen(args, stdout=re_out, stderr=re_err)
++        proc = subprocess.Popen(args, stdout=re_out, stderr=re_err,
++            executable='/usr/lib/swift/' + self.cmd)
+         pid_file = self.get_pid_file_name(conf_file)
+         write_file(pid_file, proc.pid)
+         self.procs.append(proc)
+diff --git a/test/unit/common/test_manager.py b/test/unit/common/test_manager.py
+--- a/test/unit/common/test_manager.py
++++ b/test/unit/common/test_manager.py
[email protected]@ -816,7 +816,7 @@ class TestServer(unittest.TestCase):
+         class MockProc():
+ 
+             def __init__(self, pid, args, stdout=MockProcess.NOTHING,
+-                         stderr=MockProcess.NOTHING):
++                         stderr=MockProcess.NOTHING, executable=None):
+                 self.pid = pid
+                 self.args = args
+                 self.stdout = stdout
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/swift/patches/manpages.patch	Tue May 13 15:55:28 2014 -0600
@@ -0,0 +1,1302 @@
+Section renumbering and more consistent use of .BR.  Add language
+describing use of SMF.  Fix a few small errors.  Some of this is obviously
+Solaris-specific, but the rest could be submitted upstream.
+
+diff --git a/doc/manpages/account-server.conf.5 b/doc/manpages/account-server.conf.5
+--- a/doc/manpages/account-server.conf.5
++++ b/doc/manpages/account-server.conf.5
[email protected]@ -15,12 +15,12 @@
+ .\" See the License for the specific language governing permissions and
+ .\" limitations under the License.
+ .\"
+-.TH account-server.conf 5 "8/26/2011" "Linux" "OpenStack Swift"
++.TH account-server.conf 4 "8/26/2011" "OpenStack" "OpenStack Swift"
+ 
+ .SH NAME
+ .LP
+ .B account-server.conf
+-\- configuration file for the openstack-swift account server
++\- configuration file for the OpenStack Swift account server
+ 
+ 
+ 
[email protected]@ -245,13 +245,13 @@ Connection timeout to external services.
+ .SH DOCUMENTATION
+ .LP
+ More in depth documentation about the swift-account-server and
+-also Openstack-Swift as a whole can be found at
++also OpenStack Swift as a whole can be found at
+ .BI http://swift.openstack.org/admin_guide.html
+ and
+ .BI http://swift.openstack.org
+ 
+ 
+ .SH "SEE ALSO"
+-.BR swift-account-server(1),
++.BR swift-account-server (1)
+ 
+ 
+diff --git a/doc/manpages/container-server.conf.5 b/doc/manpages/container-server.conf.5
+--- a/doc/manpages/container-server.conf.5
++++ b/doc/manpages/container-server.conf.5
[email protected]@ -15,12 +15,12 @@
+ .\" See the License for the specific language governing permissions and
+ .\" limitations under the License.
+ .\"
+-.TH container-server.conf 5 "8/26/2011" "Linux" "OpenStack Swift"
++.TH container-server.conf 4 "8/26/2011" "OpenStack" "OpenStack Swift"
+ 
+ .SH NAME
+ .LP
+ .B container-server.conf
+-\- configuration file for the openstack-swift container server
++\- configuration file for the OpenStack Swift container server
+ 
+ 
+ 
[email protected]@ -270,13 +270,13 @@ Maximum amount of time to spend syncing 
+ .SH DOCUMENTATION
+ .LP
+ More in depth documentation about the swift-container-server and
+-also Openstack-Swift as a whole can be found at
++also OpenStack Swift as a whole can be found at
+ .BI http://swift.openstack.org/admin_guide.html
+ and
+ .BI http://swift.openstack.org
+ 
+ 
+ .SH "SEE ALSO"
+-.BR swift-container-server(1),
++.BR swift-container-server (1)
+ 
+ 
+diff --git a/doc/manpages/dispersion.conf.5 b/doc/manpages/dispersion.conf.5
+--- a/doc/manpages/dispersion.conf.5
++++ b/doc/manpages/dispersion.conf.5
[email protected]@ -15,12 +15,12 @@
+ .\" See the License for the specific language governing permissions and
+ .\" limitations under the License.
+ .\"  
+-.TH dispersion.conf 5 "8/26/2011" "Linux" "OpenStack Swift"
++.TH dispersion.conf 4 "8/26/2011" "OpenStack" "OpenStack Swift"
+ 
+ .SH NAME 
+ .LP
+ .B dispersion.conf
+-\- configuration file for the openstack-swift dispersion tools 
++\- configuration file for the OpenStack Swift dispersion tools 
+ 
+ .SH SYNOPSIS
+ .LP
[email protected]@ -43,7 +43,7 @@ Authentication system account/user name
+ .IP "\fBauth_key\fR"
+ Authentication system account/user password 
+ .IP "\fBswift_dir\fR"
+-Location of openstack-swift configuration and ring files
++Location of OpenStack Swift configuration and ring files
+ .IP "\fBdispersion_coverage\fR"
+ Percentage of partition coverage to use. The default is 1.
+ .IP "\fBretries\fR"
[email protected]@ -80,13 +80,13 @@ Whether to run the object report. The de
+ .SH DOCUMENTATION
+ .LP
+ More in depth documentation about the swift-dispersion utilities and
+-also Openstack-Swift as a whole can be found at 
++also OpenStack Swift as a whole can be found at 
+ .BI http://swift.openstack.org/admin_guide.html#cluster-health
+ and 
+ .BI http://swift.openstack.org
+ 
+ 
+ .SH "SEE ALSO"
+-.BR swift-dispersion-report(1),
+-.BR swift-dispersion-populate(1)
++.BR swift-dispersion-report (1),
++.BR swift-dispersion-populate (1)
+ 
+diff --git a/doc/manpages/object-expirer.conf.5 b/doc/manpages/object-expirer.conf.5
+--- a/doc/manpages/object-expirer.conf.5
++++ b/doc/manpages/object-expirer.conf.5
[email protected]@ -15,12 +15,12 @@
+ .\" See the License for the specific language governing permissions and
+ .\" limitations under the License.
+ .\"  
+-.TH object-expirer.conf 5 "03/15/2012" "Linux" "OpenStack Swift"
++.TH object-expirer.conf 4 "03/15/2012" "OpenStack" "OpenStack Swift"
+ 
+ .SH NAME 
+ .LP
+ .B object-expirer.conf
+-\- configuration file for the openstack-swift object exprier daemon  
++\- configuration file for the OpenStack Swift object exprier daemon  
+ 
+ 
+ 
[email protected]@ -133,12 +133,12 @@ The default is \fBegg:swift#catch_errors
+ .SH DOCUMENTATION
+ .LP
+ More in depth documentation about the swift-object-expirer and
+-also Openstack-Swift as a whole can be found at 
++also OpenStack Swift as a whole can be found at 
+ .BI http://swift.openstack.org/admin_guide.html 
+ and 
+ .BI http://swift.openstack.org
+ 
+ 
+ .SH "SEE ALSO"
+-.BR swift-proxy-server.conf(5),
++.BR proxy-server.conf (4)
+ 
+diff --git a/doc/manpages/object-server.conf.5 b/doc/manpages/object-server.conf.5
+--- a/doc/manpages/object-server.conf.5
++++ b/doc/manpages/object-server.conf.5
[email protected]@ -15,12 +15,12 @@
+ .\" See the License for the specific language governing permissions and
+ .\" limitations under the License.
+ .\"
+-.TH object-server.conf 5 "8/26/2011" "Linux" "OpenStack Swift"
++.TH object-server.conf 4 "8/26/2011" "OpenStack" "OpenStack Swift"
+ 
+ .SH NAME
+ .LP
+ .B object-server.conf
+-\- configuration file for the openstack-swift object server
++\- configuration file for the OpenStack Swift object server
+ 
+ 
+ 
[email protected]@ -262,13 +262,13 @@ The default is 50.
+ .SH DOCUMENTATION
+ .LP
+ More in depth documentation about the swift-object-server and
+-also Openstack-Swift as a whole can be found at
++also OpenStack Swift as a whole can be found at
+ .BI http://swift.openstack.org/admin_guide.html
+ and
+ .BI http://swift.openstack.org
+ 
+ 
+ .SH "SEE ALSO"
+-.BR swift-object-server(1),
++.BR swift-object-server (1)
+ 
+ 
+diff --git a/doc/manpages/proxy-server.conf.5 b/doc/manpages/proxy-server.conf.5
+--- a/doc/manpages/proxy-server.conf.5
++++ b/doc/manpages/proxy-server.conf.5
[email protected]@ -15,12 +15,12 @@
+ .\" See the License for the specific language governing permissions and
+ .\" limitations under the License.
+ .\"
+-.TH proxy-server.conf 5 "8/26/2011" "Linux" "OpenStack Swift"
++.TH proxy-server.conf 4 "8/26/2011" "OpenStack" "OpenStack Swift"
+ 
+ .SH NAME
+ .LP
+ .B proxy-server.conf
+-\- configuration file for the openstack-swift proxy server
++\- configuration file for the OpenStack Swift proxy server
+ 
+ 
+ 
[email protected]@ -539,10 +539,10 @@ per second.  The default is 1.
+ .SH DOCUMENTATION
+ .LP
+ More in depth documentation about the swift-proxy-server and
+-also Openstack-Swift as a whole can be found at
++also OpenStack Swift as a whole can be found at
+ .BI http://swift.openstack.org/admin_guide.html
+ and
+ .BI http://swift.openstack.org
+ 
+ .SH "SEE ALSO"
+-.BR swift-proxy-server(1)
++.BR swift-proxy-server (1)
+diff --git a/doc/manpages/swift-account-auditor.1 b/doc/manpages/swift-account-auditor.1
+--- a/doc/manpages/swift-account-auditor.1
++++ b/doc/manpages/swift-account-auditor.1
[email protected]@ -15,16 +15,16 @@
+ .\" See the License for the specific language governing permissions and
+ .\" limitations under the License.
+ .\"  
+-.TH swift-account-auditor 1 "8/26/2011" "Linux" "OpenStack Swift"
++.TH swift-account-auditor 1 "8/26/2011" "OpenStack" "OpenStack Swift"
+ 
+ .SH NAME 
+ .LP
+ .B swift-account-auditor 
+-\- Openstack-swift account auditor
++\- OpenStack Swift account auditor
+ 
+ .SH SYNOPSIS
+ .LP
+-.B swift-account-auditor 
++.B /usr/lib/swift/swift-account-auditor
+ [CONFIG] [-h|--help] [-v|--verbose] [-o|--once]
+ 
+ .SH DESCRIPTION 
[email protected]@ -50,13 +50,25 @@ The options are as follows:
+ .RE
+ .PD
+ .RE
++
++.LP
++The account auditor should be enabled and disabled using the Solaris
++Service Management Facility, \fBsmf\fR(5).  The service FMRI for the
++account auditor is:
++.sp
++.in +2
++.nf
++svc:/application/openstack/swift/swift-account-auditor
++.fi
++.in -2
+     
+ .SH DOCUMENTATION
+ .LP
+ More in depth documentation in regards to 
+ .BI swift-account-auditor 
+-and also about Openstack-Swift as a whole can be found at 
++and also about OpenStack Swift as a whole can be found at 
+ .BI http://swift.openstack.org/index.html
+ 
+ .SH "SEE ALSO"
+-.BR account-server.conf(5)
++.BR account-server.conf (4),
++.BR smf (5)
+diff --git a/doc/manpages/swift-account-reaper.1 b/doc/manpages/swift-account-reaper.1
+--- a/doc/manpages/swift-account-reaper.1
++++ b/doc/manpages/swift-account-reaper.1
[email protected]@ -15,16 +15,16 @@
+ .\" See the License for the specific language governing permissions and
+ .\" limitations under the License.
+ .\"  
+-.TH swift-account-reaper 1 "8/26/2011" "Linux" "OpenStack Swift"
++.TH swift-account-reaper 1 "8/26/2011" "OpenStack" "OpenStack Swift"
+ 
+ .SH NAME 
+ .LP
+ .B swift-account-reaper
+-\- Openstack-swift account reaper
++\- OpenStack Swift account reaper
+ 
+ .SH SYNOPSIS
+ .LP
+-.B swift-account-reaper 
++.B /usr/lib/swift/swift-account-reaper
+ [CONFIG] [-h|--help] [-v|--verbose] [-o|--once]
+ 
+ .SH DESCRIPTION 
[email protected]@ -56,14 +56,25 @@ The options are as follows:
+ .PD
+ .RE
+ 
+-    
++.LP
++The account reaper should be enabled and disabled using the Solaris Service
++Management Facility, \fBsmf\fR(5).  The service FMRI for the account reaper
++is:
++.sp
++.in +2
++.nf
++svc:/application/openstack/swift/swift-account-reaper
++.fi
++.in -2
++
+ .SH DOCUMENTATION
+ .LP
+ More in depth documentation in regards to 
+-.BI swift-object-auditor 
+-and also about Openstack-Swift as a whole can be found at 
++.BI swift-account-reaper 
++and also about OpenStack Swift as a whole can be found at 
+ .BI http://swift.openstack.org/index.html
+ 
+ 
+ .SH "SEE ALSO"
+-.BR account-server.conf(5)
++.BR account-server.conf (4),
++.BR smf (5)
+diff --git a/doc/manpages/swift-account-replicator.1 b/doc/manpages/swift-account-replicator.1
+--- a/doc/manpages/swift-account-replicator.1
++++ b/doc/manpages/swift-account-replicator.1
[email protected]@ -15,16 +15,16 @@
+ .\" See the License for the specific language governing permissions and
+ .\" limitations under the License.
+ .\"  
+-.TH swift-account-replicator 1 "8/26/2011" "Linux" "OpenStack Swift"
++.TH swift-account-replicator 1 "8/26/2011" "OpenStack" "OpenStack Swift"
+ 
+ .SH NAME 
+ .LP
+ .B swift-account-replicator 
+-\- Openstack-swift account replicator
++\- OpenStack Swift account replicator
+ 
+ .SH SYNOPSIS
+ .LP
+-.B swift-account-replicator 
++.B /usr/lib/swift/swift-account-replicator
+ [CONFIG] [-h|--help] [-v|--verbose] [-o|--once]
+ 
+ .SH DESCRIPTION 
[email protected]@ -58,14 +58,25 @@ The options are as follows:
+ .PD 
+ .RE
+     
+-   
++.LP
++The account replicator should be enabled and disabled using the Solaris
++Service Management Facility, \fBsmf\fR(5).  The service FMRI for the
++account replicator is:
++.sp
++.in +2
++.nf
++svc:/application/openstack/swift/swift-account-replicator
++.fi
++.in -2
++    
+ .SH DOCUMENTATION
+ .LP
+ More in depth documentation in regards to 
+ .BI swift-account-replicator
+-and also about Openstack-Swift as a whole can be found at 
++and also about OpenStack Swift as a whole can be found at 
+ .BI http://swift.openstack.org/index.html
+ 
+ 
+ .SH "SEE ALSO"
+-.BR account-server.conf(5)
++.BR account-server.conf (4),
++.BR smf (5)
+diff --git a/doc/manpages/swift-account-server.1 b/doc/manpages/swift-account-server.1
+--- a/doc/manpages/swift-account-server.1
++++ b/doc/manpages/swift-account-server.1
[email protected]@ -15,16 +15,16 @@
+ .\" See the License for the specific language governing permissions and
+ .\" limitations under the License.
+ .\"  
+-.TH swift-account-server 1 "8/26/2011" "Linux" "OpenStack Swift"
++.TH swift-account-server 1 "8/26/2011" "OpenStack" "OpenStack Swift"
+ 
+ .SH NAME 
+ .LP
+ .B swift-account-server
+-\- Openstack-swift account server
++\- OpenStack Swift account server
+ 
+ .SH SYNOPSIS
+ .LP
+-.B swift-account-server
++.B /usr/lib/swift/swift-account-server
+ [CONFIG] [-h|--help] [-v|--verbose]
+ 
+ .SH DESCRIPTION 
[email protected]@ -33,15 +33,26 @@ The Account Server's primary job is to h
+ are stored as sqlite database files, and replicated across the cluster similar to how
+ objects are. 
+ 
++.LP
++The account server should be enabled and disabled using the Solaris Service
++Management Facility, \fBsmf\fR(5).  The service FMRI for the account server
++is:
++.sp
++.in +2
++.nf
++svc:/application/openstack/swift/swift-account-server
++.fi
++.in -2
++
+ .SH DOCUMENTATION
+ .LP
+ More in depth documentation in regards to 
+ .BI swift-account-server
+-and also about Openstack-Swift as a whole can be found at 
++and also about Openstack Swift as a whole can be found at 
+ .BI http://swift.openstack.org/index.html
+ and 
+ .BI http://docs.openstack.org
+ 
+-
+ .SH "SEE ALSO"
+-.BR account-server.conf(5)
++.BR account-server.conf (4),
++.BR smf (5)
+diff --git a/doc/manpages/swift-container-auditor.1 b/doc/manpages/swift-container-auditor.1
+--- a/doc/manpages/swift-container-auditor.1
++++ b/doc/manpages/swift-container-auditor.1
[email protected]@ -15,16 +15,16 @@
+ .\" See the License for the specific language governing permissions and
+ .\" limitations under the License.
+ .\"  
+-.TH swift-container-auditor 1 "8/26/2011" "Linux" "OpenStack Swift"
++.TH swift-container-auditor 1 "8/26/2011" "OpenStack" "OpenStack Swift"
+ 
+ .SH NAME 
+ .LP
+ .B swift-container-auditor 
+-\- Openstack-swift container auditor
++\- OpenStack Swift container auditor
+ 
+ .SH SYNOPSIS
+ .LP
+-.B swift-container-auditor 
++.B /usr/lib/swift/swift-container-auditor
+ [CONFIG] [-h|--help] [-v|--verbose] [-o|--once]
+ 
+ .SH DESCRIPTION 
[email protected]@ -50,15 +50,26 @@ The options are as follows:
+ .RE
+ .PD
+ .RE
+-     	
+-    
++
++.LP
++The container auditor should be enabled and disabled using the Solaris
++Service Management Facility, \fBsmf\fR(5).  The service FMRI for the
++container auditor is:
++.sp
++.in +2
++.nf
++svc:/application/openstack/swift/swift-container-auditor
++.fi
++.in -2
++
+ .SH DOCUMENTATION
+ .LP
+ More in depth documentation in regards to 
+ .BI swift-container-auditor 
+-and also about Openstack-Swift as a whole can be found at 
++and also about OpenStack Swift as a whole can be found at 
+ .BI http://swift.openstack.org/index.html
+ 
+ 
+ .SH "SEE ALSO"
+-.BR container-server.conf(5)
++.BR container-server.conf (4),
++.BR smf (5)
+diff --git a/doc/manpages/swift-container-replicator.1 b/doc/manpages/swift-container-replicator.1
+--- a/doc/manpages/swift-container-replicator.1
++++ b/doc/manpages/swift-container-replicator.1
[email protected]@ -15,16 +15,16 @@
+ .\" See the License for the specific language governing permissions and
+ .\" limitations under the License.
+ .\"  
+-.TH swift-container-replicator 1 "8/26/2011" "Linux" "OpenStack Swift"
++.TH swift-container-replicator 1 "8/26/2011" "OpenStack" "OpenStack Swift"
+ 
+ .SH NAME 
+ .LP
+ .B swift-container-replicator 
+-\- Openstack-swift container replicator
++\- OpenStack Swift container replicator
+ 
+ .SH SYNOPSIS
+ .LP
+-.B swift-container-replicator 
++.B /usr/lib/swift/swift-container-replicator
+ [CONFIG] [-h|--help] [-v|--verbose] [-o|--once]
+ 
+ .SH DESCRIPTION 
[email protected]@ -57,15 +57,26 @@ The options are as follows:
+ .RE
+ .PD
+ .RE
++
++.LP
++The container replicator should be enabled and disabled using the Solaris
++Service Management Facility, \fBsmf\fR(5).  The service FMRI for the
++container replicator is:
++.sp
++.in +2
++.nf
++svc:/application/openstack/swift/swift-container-replicator
++.fi
++.in -2
+     
+-   
+ .SH DOCUMENTATION
+ .LP
+ More in depth documentation in regards to 
+ .BI swift-container-replicator
+-and also about Openstack-Swift as a whole can be found at 
++and also about OpenStack Swift as a whole can be found at 
+ .BI http://swift.openstack.org/index.html
+ 
+ 
+ .SH "SEE ALSO"
+-.BR container-server.conf(5)
++.BR container-server.conf (4),
++.BR smf (5)
+diff --git a/doc/manpages/swift-container-server.1 b/doc/manpages/swift-container-server.1
+--- a/doc/manpages/swift-container-server.1
++++ b/doc/manpages/swift-container-server.1
[email protected]@ -15,16 +15,16 @@
+ .\" See the License for the specific language governing permissions and
+ .\" limitations under the License.
+ .\"  
+-.TH swift-container-server 1 "8/26/2011" "Linux" "OpenStack Swift"
++.TH swift-container-server 1 "8/26/2011" "OpenStack" "OpenStack Swift"
+ 
+ .SH NAME 
+ .LP
+ .B swift-container-server
+-\- Openstack-swift container server
++\- OpenStack Swift container server
+ 
+ .SH SYNOPSIS
+ .LP
+-.B swift-container-server
++.B /usr/lib/swift/swift-container-server
+ [CONFIG] [-h|--help] [-v|--verbose]
+ 
+ .SH DESCRIPTION 
[email protected]@ -35,11 +35,22 @@ are stored as sqlite database files, and
+ objects are. Statistics are also tracked that include the total number of objects, and 
+ total storage usage for that container.
+ 
++.LP
++The container server should be enabled and disabled using the Solaris
++Service Management Facility, \fBsmf\fR(5).  The service FMRI for the
++container server is:
++.sp
++.in +2
++.nf
++svc:/application/openstack/swift/swift-container-server
++.fi
++.in -2
++    
+ .SH DOCUMENTATION
+ .LP
+ More in depth documentation in regards to 
+ .BI swift-container-server
+-and also about Openstack-Swift as a whole can be found at 
++and also about OpenStack Swift as a whole can be found at 
+ .BI http://swift.openstack.org/index.html
+ and 
+ .BI http://docs.openstack.org
[email protected]@ -47,4 +58,5 @@ and
+ .LP 
+ 
+ .SH "SEE ALSO"
+-.BR container-server.conf(5)
++.BR container-server.conf (4),
++.BR smf (5)
+diff --git a/doc/manpages/swift-container-sync.1 b/doc/manpages/swift-container-sync.1
+--- a/doc/manpages/swift-container-sync.1
++++ b/doc/manpages/swift-container-sync.1
[email protected]@ -15,12 +15,12 @@
+ .\" See the License for the specific language governing permissions and
+ .\" limitations under the License.
+ .\"  
+-.TH swift-container-sync 1 "8/26/2011" "Linux" "OpenStack Swift"
++.TH swift-container-sync 1 "8/26/2011" "OpenStack" "OpenStack Swift"
+ 
+ .SH NAME 
+ .LP
+ .B swift-container-sync
+-\- Openstack-swift container sync
++\- OpenStack Swift container sync
+ 
+ .SH SYNOPSIS
+ .LP
[email protected]@ -44,7 +44,7 @@ newer rows since the last sync will trig
+ .LP
+ More in depth documentation in regards to 
+ .BI swift-container-sync
+-and also about Openstack-Swift as a whole can be found at 
++and also about OpenStack Swift as a whole can be found at 
+ .BI http://swift.openstack.org/overview_container_sync.html
+ and 
+ .BI http://docs.openstack.org
[email protected]@ -52,4 +52,4 @@ and
+ .LP 
+ 
+ .SH "SEE ALSO"
+-.BR container-server.conf(5)
++.BR container-server.conf (4)
+diff --git a/doc/manpages/swift-container-updater.1 b/doc/manpages/swift-container-updater.1
+--- a/doc/manpages/swift-container-updater.1
++++ b/doc/manpages/swift-container-updater.1
[email protected]@ -15,16 +15,16 @@
+ .\" See the License for the specific language governing permissions and
+ .\" limitations under the License.
+ .\"  
+-.TH swift-container-updater 1 "8/26/2011" "Linux" "OpenStack Swift"
++.TH swift-container-updater 1 "8/26/2011" "OpenStack" "OpenStack Swift"
+ 
+ .SH NAME 
+ .LP
+ .B swift-container-updater
+-\- Openstack-swift container updater
++\- OpenStack Swift container updater
+ 
+ .SH SYNOPSIS
+ .LP
+-.B swift-container-updater 
++.B /usr/lib/swift/swift-container-updater
+ [CONFIG] [-h|--help] [-v|--verbose] [-o|--once]
+ 
+ .SH DESCRIPTION 
[email protected]@ -59,14 +59,26 @@ The options are as follows:
+ .RE
+ .PD
+ .RE
+-       
++
++.LP
++The container updater should be enabled and disabled using the Solaris
++Service Management Facility, \fBsmf\fR(5).  The service FMRI for the
++container updater is:
++.sp
++.in +2
++.nf
++svc:/application/openstack/swift/swift-container-updater
++.fi
++.in -2
++
+ .SH DOCUMENTATION
+ .LP
+ More in depth documentation in regards to 
+ .BI swift-container-updater
+-and also about Openstack-Swift as a whole can be found at 
++and also about OpenStack Swift as a whole can be found at 
+ .BI http://swift.openstack.org/index.html
+ 
+ 
+ .SH "SEE ALSO"
+-.BR container-server.conf(5)
++.BR container-server.conf (4),
++.BR smf (5)
+diff --git a/doc/manpages/swift-dispersion-populate.1 b/doc/manpages/swift-dispersion-populate.1
+--- a/doc/manpages/swift-dispersion-populate.1
++++ b/doc/manpages/swift-dispersion-populate.1
[email protected]@ -15,12 +15,12 @@
+ .\" See the License for the specific language governing permissions and
+ .\" limitations under the License.
+ .\"  
+-.TH swift-dispersion-populate 1 "8/26/2011" "Linux" "OpenStack Swift"
++.TH swift-dispersion-populate 1 "8/26/2011" "OpenStack" "OpenStack Swift"
+ 
+ .SH NAME 
+ .LP
+ .B swift-dispersion-populate
+-\- Openstack-swift dispersion populate 
++\- OpenStack Swift dispersion populate 
+ 
+ .SH SYNOPSIS
+ .LP
[email protected]@ -88,12 +88,12 @@ Example \fI/etc/swift/dispersion.conf\fR
+ .SH DOCUMENTATION
+ .LP
+ More in depth documentation about the swift-dispersion utilities and
+-also Openstack-Swift as a whole can be found at 
++also OpenStack Swift as a whole can be found at 
+ .BI http://swift.openstack.org/admin_guide.html#cluster-health
+ and 
+ .BI http://swift.openstack.org
+ 
+ 
+ .SH "SEE ALSO"
+-.BR swift-dispersion-report(1),
+-.BR dispersion.conf (5)
++.BR swift-dispersion-report (1),
++.BR dispersion.conf (4)
+diff --git a/doc/manpages/swift-dispersion-report.1 b/doc/manpages/swift-dispersion-report.1
+--- a/doc/manpages/swift-dispersion-report.1
++++ b/doc/manpages/swift-dispersion-report.1
[email protected]@ -15,12 +15,12 @@
+ .\" See the License for the specific language governing permissions and
+ .\" limitations under the License.
+ .\"  
+-.TH swift-dispersion-report 1 "8/26/2011" "Linux" "OpenStack Swift"
++.TH swift-dispersion-report 1 "8/26/2011" "OpenStack" "OpenStack Swift"
+ 
+ .SH NAME 
+ .LP
+ .B swift-dispersion-report
+-\- Openstack-swift dispersion report 
++\- OpenStack Swift dispersion report 
+ 
+ .SH SYNOPSIS
+ .LP
[email protected]@ -124,12 +124,12 @@ Example \fI/etc/swift/dispersion.conf\fR
+ .SH DOCUMENTATION
+ .LP
+ More in depth documentation about the swift-dispersion utilities and
+-also Openstack-Swift as a whole can be found at 
++also OpenStack Swift as a whole can be found at 
+ .BI http://swift.openstack.org/admin_guide.html#cluster-health
+ and 
+ .BI http://swift.openstack.org
+ 
+ 
+ .SH "SEE ALSO"
+-.BR swift-dispersion-populate(1),
+-.BR dispersion.conf (5)
++.BR swift-dispersion-populate (1),
++.BR dispersion.conf (4)
+diff --git a/doc/manpages/swift-get-nodes.1 b/doc/manpages/swift-get-nodes.1
+--- a/doc/manpages/swift-get-nodes.1
++++ b/doc/manpages/swift-get-nodes.1
[email protected]@ -15,12 +15,12 @@
+ .\" See the License for the specific language governing permissions and
+ .\" limitations under the License.
+ .\"  
+-.TH swift-get-nodes 1 "8/26/2011" "Linux" "OpenStack Swift"
++.TH swift-get-nodes 1 "8/26/2011" "OpenStack" "OpenStack Swift"
+ 
+ .SH NAME 
+ .LP
+ .B swift-get-nodes
+-\- Openstack-swift get-nodes tool
++\- OpenStack Swift get-nodes tool
+ 
+ .SH SYNOPSIS
+ .LP
[email protected]@ -72,11 +72,11 @@ where the container resides by using the
+ 
+ .SH DOCUMENTATION
+ .LP
+-More documentation about Openstack-Swift can be found at 
++More documentation about OpenStack Swift can be found at 
+ .BI http://swift.openstack.org/index.html
+ 
+ 
+ 
+ .SH "SEE ALSO"
+-.BR swift-object-info(1),
+-.BR swift-ring-builder(1)
++.BR swift-object-info (1),
++.BR swift-ring-builder (1)
+diff --git a/doc/manpages/swift-init.1 b/doc/manpages/swift-init.1
+--- a/doc/manpages/swift-init.1
++++ b/doc/manpages/swift-init.1
[email protected]@ -15,22 +15,54 @@
+ .\" See the License for the specific language governing permissions and
+ .\" limitations under the License.
+ .\"  
+-.TH swift-init 1 "8/26/2011" "Linux" "OpenStack Swift"
++.TH swift-init 1 "8/26/2011" "OpenStack" "OpenStack Swift"
+ 
+ .SH NAME 
+ .LP
+ .B swift-init
+-\- Openstack-swift swift-init tool
++\- Openstack Swift swift-init tool
+ 
+ .SH SYNOPSIS
+ .LP
+-.B swift-init
+- <server> [<server> ...] <command> [options]
++.B /usr/lib/swift/swift-init
++<server> [<server> ...] <command> [options]
+  
+ .SH DESCRIPTION 
+ .PP
++The suite of servers implementing OpenStack Swift should be managed using
++the Solaris Service Management Facility, \fBsmf\fR(5).  There are sixteen
++services:
++.sp
++.in +2
++.nf
++svc:/application/openstack/swift/swift-account-auditor
++svc:/application/openstack/swift/swift-account-reaper
++svc:/application/openstack/swift/swift-account-replicator
++svc:/application/openstack/swift/swift-account-server
++svc:/application/openstack/swift/swift-container-auditor
++svc:/application/openstack/swift/swift-container-replicator
++svc:/application/openstack/swift/swift-container-server
++svc:/application/openstack/swift/swift-container-sync
++svc:/application/openstack/swift/swift-container-updater
++svc:/application/openstack/swift/swift-object-auditor
++svc:/application/openstack/swift/swift-object-expirer
++svc:/application/openstack/swift/swift-object-replicator
++svc:/application/openstack/swift/swift-object-server
++svc:/application/openstack/swift/swift-object-updater
++svc:/application/openstack/swift/swift-proxy-server
++svc:/application/openstack/swift/swift-replicator-rsync
++.fi
++.in -2
++.LP
++Each service is described more completely in its corresponding manual page.
++Note that there are no dependencies between the services, although most of
++them should be started in groups, even if the entire suite isn't necessary.
++.LP
++Although the \fBswift-init\fR tool can be used to manage the services,
++doing so is not supported on Solaris.
++.LP
+ The swift-init tool can be used to initialize all swift daemons available as part of
+-openstack-swift. Instead of calling individual init scripts for each 
++OpenStack Swift. Instead of calling individual init scripts for each 
+ swift daemon, one can just use swift-init. With swift-init you can initialize 
+ just one swift service, such as the "proxy", or a combination of them. The tool also 
+ allows one to use the keywords such as "all", "main" and "rest" for the <server> argument.
[email protected]@ -116,8 +148,26 @@ allows one to use the keywords such as "
+ 
+ .SH DOCUMENTATION
+ .LP
+-More documentation about Openstack-Swift can be found at 
++More documentation about OpenStack Swift can be found at 
+ .BI http://swift.openstack.org/index.html
+ 
+ 
+ 
++.SH SEE ALSO
++.BR swift-account-auditor (1),
++.BR swift-account-reaper (1),
++.BR swift-account-replicator (1),
++.BR swift-account-server (1),
++.BR swift-container-auditor (1),
++.BR swift-container-replicator (1),
++.BR swift-container-server (1),
++.BR swift-container-sync (1),
++.BR swift-container-updater
++.BR swift-object-auditor (1),
++.BR swift-object-expirer (1),
++.BR swift-object-replicator (1),
++.BR swift-object-server (1),
++.BR swift-object-updater (1),
++.BR swift-proxy-server (1),
++.BR swift-replicator-rsync (1),
++.BR smf (5)
+diff --git a/doc/manpages/swift-object-auditor.1 b/doc/manpages/swift-object-auditor.1
+--- a/doc/manpages/swift-object-auditor.1
++++ b/doc/manpages/swift-object-auditor.1
[email protected]@ -15,16 +15,16 @@
+ .\" See the License for the specific language governing permissions and
+ .\" limitations under the License.
+ .\"  
+-.TH swift-object-auditor 1 "8/26/2011" "Linux" "OpenStack Swift"
++.TH swift-object-auditor 1 "8/26/2011" "OpenStack" "OpenStack Swift"
+ 
+ .SH NAME 
+ .LP
+ .B swift-object-auditor 
+-\- Openstack-swift object auditor
++\- OpenStack Swift object auditor
+ 
+ .SH SYNOPSIS
+ .LP
+-.B swift-object-auditor 
++.B /usr/lib/swift/swift-object-auditor
+ [CONFIG] [-h|--help] [-v|--verbose] [-o|--once] [-z|--zero_byte_fps]
+ 
+ .SH DESCRIPTION 
[email protected]@ -56,15 +56,26 @@ The options are as follows:
+ .RE
+ .PD
+ .RE
+-    
+-    
++
++.LP
++The object auditor should be enabled and disabled using the Solaris Service
++Management Facility, \fBsmf\fR(5).  The service FMRI for the object auditor
++is:
++.sp
++.in +2
++.nf
++svc:/application/openstack/swift/swift-object-auditor
++.fi
++.in -2
++
+ .SH DOCUMENTATION
+ .LP
+ More in depth documentation in regards to 
+ .BI swift-object-auditor 
+-and also about Openstack-Swift as a whole can be found at 
++and also about OpenStack Swift as a whole can be found at 
+ .BI http://swift.openstack.org/index.html
+ 
+ 
+ .SH "SEE ALSO"
+-.BR object-server.conf(5)
++.BR object-server.conf (4),
++.BR smf (5)
+diff --git a/doc/manpages/swift-object-expirer.1 b/doc/manpages/swift-object-expirer.1
+--- a/doc/manpages/swift-object-expirer.1
++++ b/doc/manpages/swift-object-expirer.1
[email protected]@ -15,16 +15,16 @@
+ .\" See the License for the specific language governing permissions and
+ .\" limitations under the License.
+ .\"  
+-.TH swift-object-expirer 1 "3/15/2012" "Linux" "OpenStack Swift"
++.TH swift-object-expirer 1 "3/15/2012" "OpenStack" "OpenStack Swift"
+ 
+ .SH NAME 
+ .LP
+ .B swift-object-expirer
+-\- Openstack-swift object expirer
++\- OpenStack Swift object expirer
+ 
+ .SH SYNOPSIS
+ .LP
+-.B swift-object-expirer 
++.B /usr/lib/swift/swift-object-expirer
+ [CONFIG] [-h|--help] [-v|--verbose] [-o|--once]
+ 
+ .SH DESCRIPTION 
[email protected]@ -57,18 +57,28 @@ The options are as follows:
+ .RE
+ .PD
+ .RE
+-    
+-   
++
++.LP
++The object expirer should be enabled and disabled using the Solaris Service
++Management Facility, \fBsmf\fR(5).  The service FMRI for the object expirer
++is:
++.sp
++.in +2
++.nf
++svc:/application/openstack/swift/swift-object-expirer
++.fi
++.in -2
++
+ .SH DOCUMENTATION
+ .LP
+ More in depth documentation in regards to 
+ .BI swift-object-expirer
+ can be foud at 
+ .BI http://swift.openstack.org/overview_expiring_objects.html
+-and also about Openstack-Swift as a whole can be found at 
++and also about OpenStack Swift as a whole can be found at 
+ .BI http://swift.openstack.org/index.html
+ 
+ 
+ .SH "SEE ALSO"
+-.BR object-expirer.conf(5)
+-
++.BR object-expirer.conf (4),
++.BR smf (5)
+diff --git a/doc/manpages/swift-object-info.1 b/doc/manpages/swift-object-info.1
+--- a/doc/manpages/swift-object-info.1
++++ b/doc/manpages/swift-object-info.1
[email protected]@ -15,12 +15,12 @@
+ .\" See the License for the specific language governing permissions and
+ .\" limitations under the License.
+ .\"  
+-.TH swift-object-info 1 "8/26/2011" "Linux" "OpenStack Swift"
++.TH swift-object-info 1 "8/26/2011" "OpenStack" "OpenStack Swift"
+ 
+ .SH NAME 
+ .LP
+ .B swift-object-info
+-\- Openstack-swift object-info tool
++\- OpenStack Swift object-info tool
+ 
+ .SH SYNOPSIS
+ .LP
[email protected]@ -48,8 +48,8 @@ It will then return several information 
+     
+ .SH DOCUMENTATION
+ .LP
+-More documentation about Openstack-Swift can be found at 
++More documentation about OpenStack Swift can be found at 
+ .BI http://swift.openstack.org/index.html
+ 
+ .SH "SEE ALSO"
+-.BR swift-get-nodes(1),
++.BR swift-get-nodes (1)
+diff --git a/doc/manpages/swift-object-replicator.1 b/doc/manpages/swift-object-replicator.1
+--- a/doc/manpages/swift-object-replicator.1
++++ b/doc/manpages/swift-object-replicator.1
[email protected]@ -15,16 +15,16 @@
+ .\" See the License for the specific language governing permissions and
+ .\" limitations under the License.
+ .\"  
+-.TH swift-object-replicator 1 "8/26/2011" "Linux" "OpenStack Swift"
++.TH swift-object-replicator 1 "8/26/2011" "OpenStack" "OpenStack Swift"
+ 
+ .SH NAME 
+ .LP
+ .B swift-object-replicator 
+-\- Openstack-swift object replicator
++\- OpenStack Swift object replicator
+ 
+ .SH SYNOPSIS
+ .LP
+-.B swift-object-replicator 
++.B /usr/lib/swift/swift-object-replicator 
+ [CONFIG] [-h|--help] [-v|--verbose] [-o|--once]
+ 
+ .SH DESCRIPTION 
[email protected]@ -57,15 +57,26 @@ The options are as follows:
+ .RE
+ .PD
+ .RE
+-    
+-   
++
++.LP
++The object replicator should be enabled and disabled using the Solaris
++Service Management Facility, \fBsmf\fR(5).  The service FMRI for the object
++replicator is:
++.sp
++.in +2
++.nf
++svc:/application/openstack/swift/swift-object-replicator
++.fi
++.in -2
++
+ .SH DOCUMENTATION
+ .LP
+ More in depth documentation in regards to 
+ .BI swift-object-replicator
+-and also about Openstack-Swift as a whole can be found at 
++and also about OpenStack Swift as a whole can be found at 
+ .BI http://swift.openstack.org/index.html
+ 
+ 
+ .SH "SEE ALSO"
+-.BR object-server.conf(5)
++.BR object-server.conf (4),
++.BR smf (5)
+diff --git a/doc/manpages/swift-object-server.1 b/doc/manpages/swift-object-server.1
+--- a/doc/manpages/swift-object-server.1
++++ b/doc/manpages/swift-object-server.1
[email protected]@ -15,16 +15,16 @@
+ .\" See the License for the specific language governing permissions and
+ .\" limitations under the License.
+ .\"  
+-.TH swift-object-server 1 "8/26/2011" "Linux" "OpenStack Swift"
++.TH swift-object-server 1 "8/26/2011" "OpenStack" "OpenStack Swift"
+ 
+ .SH NAME 
+ .LP
+ .B swift-object-server
+-\- Openstack-swift object server.
++\- OpenStack Swift object server.
+ 
+ .SH SYNOPSIS
+ .LP
+-.B swift-object-server
++.B /usr/lib/swift/swift-object-server
+ [CONFIG] [-h|--help] [-v|--verbose]
+ 
+ .SH DESCRIPTION 
[email protected]@ -40,15 +40,27 @@ served. A deletion is also treated as a 
+ ".ts", which stands for tombstone). This ensures that deleted files are replicated 
+ correctly and older versions don't magically reappear due to failure scenarios.
+ 
++.LP
++The object server should be enabled and disabled using the Solaris Service
++Management Facility, \fBsmf\fR(5).  The service FMRI for the object server
++is:
++.sp
++.in +2
++.nf
++svc:/application/openstack/swift/swift-object-server
++.fi
++.in -2
++
+ .SH DOCUMENTATION
+ .LP
+ More in depth documentation in regards to 
+ .BI swift-object-server
+-and also about Openstack-Swift as a whole can be found at 
++and also about OpenStack Swift as a whole can be found at 
+ .BI http://swift.openstack.org/index.html
+ and 
+ .BI http://docs.openstack.org
+ 
+ 
+ .SH "SEE ALSO"
+-.BR object-server.conf(5)
++.BR object-server.conf (4),
++.BR smf (5)
+diff --git a/doc/manpages/swift-object-updater.1 b/doc/manpages/swift-object-updater.1
+--- a/doc/manpages/swift-object-updater.1
++++ b/doc/manpages/swift-object-updater.1
[email protected]@ -15,16 +15,16 @@
+ .\" See the License for the specific language governing permissions and
+ .\" limitations under the License.
+ .\"  
+-.TH swift-object-updater 1 "8/26/2011" "Linux" "OpenStack Swift"
++.TH swift-object-updater 1 "8/26/2011" "OpenStack" "OpenStack Swift"
+ 
+ .SH NAME 
+ .LP
+ .B swift-object-updater
+-\- Openstack-swift object updater
++\- OpenStack Swift object updater
+ 
+ .SH SYNOPSIS
+ .LP
+-.B swift-object-updater
++.B /usr/lib/swift/swift-object-updater
+ [CONFIG] [-h|--help] [-v|--verbose] [-o|--once]
+ 
+ .SH DESCRIPTION 
[email protected]@ -64,15 +64,26 @@ The options are as follows:
+ .RE
+ .PD 
+ .RE
+-    
+-    
++
++.LP
++The object updater should be enabled and disabled using the Solaris Service
++Management Facility, \fBsmf\fR(5).  The service FMRI for the object updater
++is:
++.sp
++.in +2
++.nf
++svc:/application/openstack/swift/swift-object-updater
++.fi
++.in -2
++
+ .SH DOCUMENTATION
+ .LP
+ More in depth documentation in regards to 
+ .BI swift-object-updater
+-and also about Openstack-Swift as a whole can be found at 
++and also about OpenStack Swift as a whole can be found at 
+ .BI http://swift.openstack.org/index.html
+ 
+ 
+ .SH "SEE ALSO"
+-.BR object-server.conf(5)
++.BR object-server.conf (4),
++.BR smf (5)
+diff --git a/doc/manpages/swift-orphans.1 b/doc/manpages/swift-orphans.1
+--- a/doc/manpages/swift-orphans.1
++++ b/doc/manpages/swift-orphans.1
[email protected]@ -15,12 +15,12 @@
+ .\" See the License for the specific language governing permissions and
+ .\" limitations under the License.
+ .\"  
+-.TH swift-orphans 1 "3/15/2012" "Linux" "OpenStack Swift"
++.TH swift-orphans 1 "3/15/2012" "OpenStack" "OpenStack Swift"
+ 
+ .SH NAME 
+ .LP
+ .B swift-orphans
+-\- Openstack-swift orphans tool
++\- OpenStack Swift orphans tool
+ 
+ .SH SYNOPSIS
+ .LP
[email protected]@ -65,6 +65,6 @@ The options are as follows:
+     
+ .SH DOCUMENTATION
+ .LP
+-More documentation about Openstack-Swift can be found at 
++More documentation about OpenStack Swift can be found at 
+ .BI http://swift.openstack.org/index.html
+ 
+diff --git a/doc/manpages/swift-proxy-server.1 b/doc/manpages/swift-proxy-server.1
+--- a/doc/manpages/swift-proxy-server.1
++++ b/doc/manpages/swift-proxy-server.1
[email protected]@ -15,16 +15,16 @@
+ .\" See the License for the specific language governing permissions and
+ .\" limitations under the License.
+ .\"  
+-.TH swift-proxy-server 1 "8/26/2011" "Linux" "OpenStack Swift"
++.TH swift-proxy-server 1 "8/26/2011" "OpenStack" "OpenStack Swift"
+ 
+ .SH NAME 
+ .LP
+ .B swift-proxy-server 
+-\- Openstack-swift proxy server.
++\- OpenStack Swift proxy server.
+ 
+ .SH SYNOPSIS
+ .LP
+-.B swift-proxy-server
++.B /usr/lib/swift/swift-proxy-server
+ [CONFIG] [-h|--help] [-v|--verbose]
+ 
+ .SH DESCRIPTION 
[email protected]@ -38,13 +38,25 @@ and route there instead. When objects ar
+ streamed directly through the proxy server to or from the user the proxy server does 
+ not spool them.
+ 
++.LP
++The proxy server should be enabled and disabled using the Solaris Service
++Management Facility, \fBsmf\fR(5).  The service FMRI for the proxy server
++is:
++.sp
++.in +2
++.nf
++svc:/application/openstack/swift/swift-proxy-server
++.fi
++.in -2
++
+ .SH DOCUMENTATION
+ .LP
+ More in depth documentation in regards to 
+ .BI swift-proxy-server
+-and also about Openstack-Swift as a whole can be found at 
++and also about OpenStack Swift as a whole can be found at 
+ .BI http://swift.openstack.org/index.html
+ 
+ 
+ .SH "SEE ALSO"
+-.BR proxy-server.conf(5)
++.BR proxy-server.conf (4),
++.BR smf (5)
+diff --git a/doc/manpages/swift-recon.1 b/doc/manpages/swift-recon.1
+--- a/doc/manpages/swift-recon.1
++++ b/doc/manpages/swift-recon.1
[email protected]@ -15,12 +15,12 @@
+ .\" See the License for the specific language governing permissions and
+ .\" limitations under the License.
+ .\"  
+-.TH swift-recon 1 "8/26/2011" "Linux" "OpenStack Swift"
++.TH swift-recon 1 "8/26/2011" "OpenStack" "OpenStack Swift"
+ 
+ .SH NAME 
+ .LP
+ .B swift-recon
+-\- Openstack-swift recon middleware cli tool
++\- OpenStack Swift recon middleware cli tool
+ 
+ .SH SYNOPSIS
+ .LP
[email protected]@ -104,7 +104,7 @@ cronjob to run the swift-recon-cron scri
+ 
+ .SH DOCUMENTATION
+ .LP
+-More documentation about Openstack-Swift can be found at 
++More documentation about OpenStack Swift can be found at 
+ .BI http://swift.openstack.org/index.html 
+ Also more specific documentation about swift-recon can be found at 
+ .BI http://swift.openstack.org/admin_guide.html#cluster-telemetry-and-monitoring
[email protected]@ -112,6 +112,6 @@ Also more specific documentation about s
+ 
+ 
+ .SH "SEE ALSO"
+-.BR object-server.conf(5),
++.BR object-server.conf (4)
+ 
+ 
+diff --git a/doc/manpages/swift-ring-builder.1 b/doc/manpages/swift-ring-builder.1
+--- a/doc/manpages/swift-ring-builder.1
++++ b/doc/manpages/swift-ring-builder.1
[email protected]@ -15,12 +15,12 @@
+ .\" See the License for the specific language governing permissions and
+ .\" limitations under the License.
+ .\"  
+-.TH swift-ring-builder 1 "8/26/2011" "Linux" "OpenStack Swift"
++.TH swift-ring-builder 1 "8/26/2011" "OpenStack" "OpenStack Swift"
+ 
+ .SH NAME 
+ .LP
+ .B swift-ring-builder
+-\- Openstack-swift ring builder
++\- OpenStack Swift ring builder
+ 
+ .SH SYNOPSIS
+ .LP
[email protected]@ -208,7 +208,7 @@ calls when no rebalance is needed but yo
+ 
+ .SH DOCUMENTATION
+ .LP
+-More in depth documentation about the swift ring and also Openstack-Swift as a 
++More in depth documentation about the swift ring and also OpenStack Swift as a 
+ whole can be found at 
+ .BI http://swift.openstack.org/overview_ring.html, 
+ .BI http://swift.openstack.org/admin_guide.html#managing-the-rings 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/swift/patches/orphans.patch	Tue May 13 15:55:28 2014 -0600
@@ -0,0 +1,29 @@
+Convert the calls to ps in swift-orphans to calls that will work on
+Solaris.
+
+diff --git a/bin/swift-orphans b/bin/swift-orphans
+--- a/bin/swift-orphans
++++ b/bin/swift-orphans
[email protected]@ -42,12 +42,12 @@ Example (sends SIGTERM to all orphaned S
+             if name.endswith('.pid'):
+                 pids.append(open(os.path.join(root, name)).read().strip())
+                 pids.extend(subprocess.Popen(
+-                    ['ps', '--ppid', pids[-1], '-o', 'pid', '--no-headers'],
++                    ['pgrep', '-P', pids[-1]],
+                     stdout=subprocess.PIPE).communicate()[0].split())
+ 
+     listing = []
+     for line in subprocess.Popen(
+-            ['ps', '-eo', 'etime,pid,args', '--no-headers'],
++            ['ps', '-eo', 'etime=', '-o' 'pid=', '-o' 'args='],
+             stdout=subprocess.PIPE).communicate()[0].split('\n'):
+         if not line:
+             continue
[email protected]@ -58,6 +58,7 @@ Example (sends SIGTERM to all orphaned S
+             sys.exit('Could not process ps line %r' % line)
+         if pid in pids:
+             continue
++        # XXX Do we get enough of the arguments to get "once"?
+         if (not args.startswith('/usr/bin/python /usr/bin/swift-') and
+             not args.startswith('/usr/bin/python /usr/local/bin/swift-')) or \
+                 'swift-orphans' in args or \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/swift/patches/recon.patch	Tue May 13 15:55:28 2014 -0600
@@ -0,0 +1,399 @@
+Move recon's locks to /var/run/swift and caches to /var/lib/swift/recon-cache.
+Change some of the ways we gather information, since those are normally
+Linux-specific.  Make the tests acknowledge these changes.
+
+diff --git a/bin/swift-recon-cron b/bin/swift-recon-cron
+--- a/bin/swift-recon-cron
++++ b/bin/swift-recon-cron
[email protected]@ -34,8 +34,8 @@ def main():
+         sys.exit(1)
+     conf = dict(c.items('filter:recon'))
+     device_dir = conf.get('devices', '/srv/node')
+-    recon_cache_path = conf.get('recon_cache_path', '/var/cache/swift')
+-    recon_lock_path = conf.get('recon_lock_path', '/var/lock')
++    recon_cache_path = conf.get('recon_cache_path', '/var/lib/swift/recon-cache')
++    recon_lock_path = conf.get('recon_lock_path', '/var/run/swift')
+     cache_file = os.path.join(recon_cache_path, "object.recon")
+     lock_dir = os.path.join(recon_lock_path, "swift-recon-object-cron")
+     conf['log_name'] = conf.get('log_name', 'recon-cron')
+diff --git a/etc/account-server.conf-sample b/etc/account-server.conf-sample
+--- a/etc/account-server.conf-sample
++++ b/etc/account-server.conf-sample
[email protected]@ -56,7 +56,7 @@ use = egg:swift#healthcheck
+ 
+ [filter:recon]
+ use = egg:swift#recon
+-# recon_cache_path = /var/cache/swift
++# recon_cache_path = /var/lib/swift/recon-cache
+ 
+ [account-replicator]
+ # You can override the default log routing for this app here (don't use set!):
[email protected]@ -80,7 +80,7 @@ use = egg:swift#recon
+ # reclaim_age = 604800
+ # Time in seconds to wait between replication passes
+ # run_pause = 30
+-# recon_cache_path = /var/cache/swift
++# recon_cache_path = /var/lib/swift/recon-cache
+ 
+ [account-auditor]
+ # You can override the default log routing for this app here (don't use set!):
[email protected]@ -93,7 +93,7 @@ use = egg:swift#recon
+ # log_facility = LOG_LOCAL0
+ # log_level = INFO
+ # accounts_per_second = 200
+-# recon_cache_path = /var/cache/swift
++# recon_cache_path = /var/lib/swift/recon-cache
+ 
+ [account-reaper]
+ # You can override the default log routing for this app here (don't use set!):
+diff --git a/etc/container-server.conf-sample b/etc/container-server.conf-sample
+--- a/etc/container-server.conf-sample
++++ b/etc/container-server.conf-sample
[email protected]@ -62,7 +62,7 @@ use = egg:swift#healthcheck
+ 
+ [filter:recon]
+ use = egg:swift#recon
+-#recon_cache_path = /var/cache/swift
++#recon_cache_path = /var/lib/swift/recon-cache
+ 
+ [container-replicator]
+ # You can override the default log routing for this app here (don't use set!):
[email protected]@ -81,7 +81,7 @@ use = egg:swift#recon
+ # reclaim_age = 604800
+ # Time in seconds to wait between replication passes
+ # run_pause = 30
+-# recon_cache_path = /var/cache/swift
++# recon_cache_path = /var/lib/swift/recon-cache
+ 
+ [container-updater]
+ # You can override the default log routing for this app here (don't use set!):
[email protected]@ -97,7 +97,7 @@ use = egg:swift#recon
+ # slowdown = 0.01
+ # Seconds to suppress updating an account that has generated an error
+ # account_suppression_time = 60
+-# recon_cache_path = /var/cache/swift
++# recon_cache_path = /var/lib/swift/recon-cache
+ 
+ [container-auditor]
+ # You can override the default log routing for this app here (don't use set!):
[email protected]@ -108,7 +108,7 @@ use = egg:swift#recon
+ # Will audit each container at most once per interval
+ # interval = 1800
+ # containers_per_second = 200
+-# recon_cache_path = /var/cache/swift
++# recon_cache_path = /var/lib/swift/recon-cache
+ 
+ [container-sync]
+ # You can override the default log routing for this app here (don't use set!):
+diff --git a/etc/object-server.conf-sample b/etc/object-server.conf-sample
+--- a/etc/object-server.conf-sample
++++ b/etc/object-server.conf-sample
[email protected]@ -71,8 +71,8 @@ use = egg:swift#healthcheck
+ 
+ [filter:recon]
+ use = egg:swift#recon
+-#recon_cache_path = /var/cache/swift
+-#recon_lock_path = /var/lock
++#recon_cache_path = /var/lib/swift/recon-cache
++#recon_lock_path = /var/run/swift
+ 
+ [object-replicator]
+ # You can override the default log routing for this app here (don't use set!):
[email protected]@ -96,7 +96,7 @@ use = egg:swift#recon
+ # The replicator also performs reclamation
+ # reclaim_age = 604800
+ # ring_check_interval = 15
+-# recon_cache_path = /var/cache/swift
++# recon_cache_path = /var/lib/swift/recon-cache
+ 
+ [object-updater]
+ # You can override the default log routing for this app here (don't use set!):
[email protected]@ -110,7 +110,7 @@ use = egg:swift#recon
+ # conn_timeout = 0.5
+ # slowdown will sleep that amount between objects
+ # slowdown = 0.01
+-# recon_cache_path = /var/cache/swift
++# recon_cache_path = /var/lib/swift/recon-cache
+ 
+ [object-auditor]
+ # You can override the default log routing for this app here (don't use set!):
[email protected]@ -122,4 +122,4 @@ use = egg:swift#recon
+ # bytes_per_second = 10000000
+ # log_time = 3600
+ # zero_byte_files_per_second = 50
+-# recon_cache_path = /var/cache/swift
++# recon_cache_path = /var/lib/swift/recon-cache
+diff --git a/swift/account/auditor.py b/swift/account/auditor.py
+--- a/swift/account/auditor.py
++++ b/swift/account/auditor.py
[email protected]@ -44,7 +44,7 @@ class AccountAuditor(Daemon):
+         swift.common.db.DB_PREALLOCATION = \
+             config_true_value(conf.get('db_preallocation', 'f'))
+         self.recon_cache_path = conf.get('recon_cache_path',
+-                                         '/var/cache/swift')
++                                         '/var/lib/swift/recon-cache')
+         self.rcache = os.path.join(self.recon_cache_path, "account.recon")
+ 
+     def _one_audit_pass(self, reported):
+diff --git a/swift/common/db_replicator.py b/swift/common/db_replicator.py
+--- a/swift/common/db_replicator.py
++++ b/swift/common/db_replicator.py
[email protected]@ -166,7 +166,7 @@ class Replicator(Daemon):
+             config_true_value(conf.get('db_preallocation', 'f'))
+         self._zero_stats()
+         self.recon_cache_path = conf.get('recon_cache_path',
+-                                         '/var/cache/swift')
++                                         '/var/lib/swift/recon-cache')
+         self.recon_replicator = '%s.recon' % self.server_type
+         self.rcache = os.path.join(self.recon_cache_path,
+                                    self.recon_replicator)
+diff --git a/swift/common/middleware/recon.py b/swift/common/middleware/recon.py
+--- a/swift/common/middleware/recon.py
++++ b/swift/common/middleware/recon.py
[email protected]@ -15,6 +15,7 @@
+ 
+ import errno
+ import os
++import sys
+ 
+ from swift.common.swob import Request, Response
+ from swift.common.utils import get_logger, config_true_value, json
[email protected]@ -43,7 +44,7 @@ class ReconMiddleware(object):
+         swift_dir = conf.get('swift_dir', '/etc/swift')
+         self.logger = get_logger(conf, log_route='recon')
+         self.recon_cache_path = conf.get('recon_cache_path',
+-                                         '/var/cache/swift')
++                                         '/var/lib/swift/recon-cache')
+         self.object_recon_cache = os.path.join(self.recon_cache_path,
+                                                'object.recon')
+         self.container_recon_cache = os.path.join(self.recon_cache_path,
[email protected]@ -80,28 +81,43 @@ class ReconMiddleware(object):
+     def get_mounted(self, openr=open):
+         """get ALL mounted fs from /proc/mounts"""
+         mounts = []
+-        with openr('/proc/mounts', 'r') as procmounts:
++        if sys.platform == 'sunos5':
++            mountsfile = '/etc/mnttab'
++        else:
++            mountsfile = '/proc/mounts'
++        with openr(mountsfile, 'r') as procmounts:
+             for line in procmounts:
+                 mount = {}
+-                mount['device'], mount['path'], opt1, opt2, opt3, \
+-                    opt4 = line.rstrip().split()
++                mount['device'], mount['path'] = line.rstrip().split()[:2]
+                 mounts.append(mount)
+         return mounts
+ 
+     def get_load(self, openr=open):
+         """get info from /proc/loadavg"""
+         loadavg = {}
+-        with openr('/proc/loadavg', 'r') as f:
+-            onemin, fivemin, ftmin, tasks, procs = f.read().rstrip().split()
++        if sys.platform == 'sunos5':
++            onemin, fivemin, ftmin = os.getloadavg()
++        else:
++            with openr('/proc/loadavg', 'r') as f:
++                onemin, fivemin, ftmin, tasks, procs = f.read().rstrip().split()
+         loadavg['1m'] = float(onemin)
+         loadavg['5m'] = float(fivemin)
+         loadavg['15m'] = float(ftmin)
+-        loadavg['tasks'] = tasks
+-        loadavg['processes'] = int(procs)
++        if sys.platform == 'sunos5':
++            # The next two fields don't seem to be used.
++            # executing threads / total threads
++            loadavg['tasks'] = "0/0"
++            # pid of newest process
++            loadavg['processes'] = 0
++        else:
++            loadavg['tasks'] = tasks
++            loadavg['processes'] = int(procs)
+         return loadavg
+ 
+     def get_mem(self, openr=open):
+         """get info from /proc/meminfo"""
++        if sys.platform == 'sunos5':
++            return {}
+         meminfo = {}
+         with openr('/proc/meminfo', 'r') as memlines:
+             for i in memlines:
+diff --git a/swift/container/auditor.py b/swift/container/auditor.py
+--- a/swift/container/auditor.py
++++ b/swift/container/auditor.py
[email protected]@ -44,7 +44,7 @@ class ContainerAuditor(Daemon):
+         swift.common.db.DB_PREALLOCATION = \
+             config_true_value(conf.get('db_preallocation', 'f'))
+         self.recon_cache_path = conf.get('recon_cache_path',
+-                                         '/var/cache/swift')
++                                         '/var/lib/swift/recon-cache')
+         self.rcache = os.path.join(self.recon_cache_path, "container.recon")
+ 
+     def _one_audit_pass(self, reported):
+diff --git a/swift/container/updater.py b/swift/container/updater.py
+--- a/swift/container/updater.py
++++ b/swift/container/updater.py
[email protected]@ -59,7 +59,7 @@ class ContainerUpdater(Daemon):
+         swift.common.db.DB_PREALLOCATION = \
+             config_true_value(conf.get('db_preallocation', 'f'))
+         self.recon_cache_path = conf.get('recon_cache_path',
+-                                         '/var/cache/swift')
++                                         '/var/lib/swift/recon-cache')
+         self.rcache = os.path.join(self.recon_cache_path, "container.recon")
+ 
+     def get_account_ring(self):
+diff --git a/swift/obj/auditor.py b/swift/obj/auditor.py
+--- a/swift/obj/auditor.py
++++ b/swift/obj/auditor.py
[email protected]@ -54,7 +54,7 @@ class AuditorWorker(object):
+         self.quarantines = 0
+         self.errors = 0
+         self.recon_cache_path = conf.get('recon_cache_path',
+-                                         '/var/cache/swift')
++                                         '/var/lib/swift/recon-cache')
+         self.rcache = os.path.join(self.recon_cache_path, "object.recon")
+ 
+     def audit_all_objects(self, mode='once'):
+diff --git a/swift/obj/expirer.py b/swift/obj/expirer.py
+--- a/swift/obj/expirer.py
++++ b/swift/obj/expirer.py
[email protected]@ -50,7 +50,7 @@ class ObjectExpirer(Daemon):
+         self.report_first_time = self.report_last_time = time()
+         self.report_objects = 0
+         self.recon_cache_path = conf.get('recon_cache_path',
+-                                         '/var/cache/swift')
++                                         '/var/lib/swift/recon-cache')
+         self.rcache = join(self.recon_cache_path, 'object.recon')
+ 
+     def report(self, final=False):
+diff --git a/swift/obj/replicator.py b/swift/obj/replicator.py
+--- a/swift/obj/replicator.py
++++ b/swift/obj/replicator.py
[email protected]@ -265,7 +265,7 @@ class ObjectReplicator(Daemon):
+         self.http_timeout = int(conf.get('http_timeout', 60))
+         self.lockup_timeout = int(conf.get('lockup_timeout', 1800))
+         self.recon_cache_path = conf.get('recon_cache_path',
+-                                         '/var/cache/swift')
++                                         '/var/lib/swift/recon-cache')
+         self.rcache = os.path.join(self.recon_cache_path, "object.recon")
+ 
+     def _rsync(self, args):
+diff --git a/swift/obj/updater.py b/swift/obj/updater.py
+--- a/swift/obj/updater.py
++++ b/swift/obj/updater.py
[email protected]@ -51,7 +51,7 @@ class ObjectUpdater(Daemon):
+         self.successes = 0
+         self.failures = 0
+         self.recon_cache_path = conf.get('recon_cache_path',
+-                                         '/var/cache/swift')
++                                         '/var/lib/swift/recon-cache')
+         self.rcache = os.path.join(self.recon_cache_path, 'object.recon')
+ 
+     def get_container_ring(self):
+diff --git a/test/unit/common/middleware/test_recon.py b/test/unit/common/middleware/test_recon.py
+--- a/test/unit/common/middleware/test_recon.py
++++ b/test/unit/common/middleware/test_recon.py
[email protected]@ -18,6 +18,8 @@ from unittest import TestCase
+ from contextlib import contextmanager
+ from posix import stat_result, statvfs_result
+ import os
++import sys
++from nose import SkipTest
+ 
+ import swift.common.constraints
+ from swift.common.swob import Request
[email protected]@ -272,10 +274,12 @@ class TestReconSuccess(TestCase):
+                         {'device': 'none', 'path': '/proc/fs/vmblock/mountPoint'}]
+         oart = OpenAndReadTester(mounts_content)
+         rv = self.app.get_mounted(openr=oart.open)
+-        self.assertEquals(oart.open_calls, [(('/proc/mounts', 'r'), {})])
++        self.assertEquals(oart.open_calls, [(('/etc/mnttab', 'r'), {})])
+         self.assertEquals(rv, mounted_resp)
+ 
+     def test_get_load(self):
++        if sys.platform == 'sunos5':
++            raise SkipTest
+         oart = OpenAndReadTester(['0.03 0.03 0.00 1/220 16306'])
+         rv = self.app.get_load(openr=oart.open)
+         self.assertEquals(oart.read_calls, [((), {})])
[email protected]@ -285,6 +289,8 @@ class TestReconSuccess(TestCase):
+                                '1m': 0.029999999999999999})
+ 
+     def test_get_mem(self):
++        if sys.platform == 'sunos5':
++            raise SkipTest
+         meminfo_content = ['MemTotal:         505840 kB',
+                            'MemFree:           26588 kB',
+                            'Buffers:           44948 kB',
[email protected]@ -395,7 +401,7 @@ class TestReconSuccess(TestCase):
+         self.assertEquals(self.fakecache.fakeout_calls,
+                             [((['replication_time', 'replication_stats',
+                                 'replication_last'],
+-                                '/var/cache/swift/account.recon'), {})])
++                                '/var/lib/swift/recon-cache/account.recon'), {})])
+         self.assertEquals(rv, {"replication_stats": {
+                                     "attempted": 1, "diff": 0,
+                                     "diff_capped": 0, "empty": 0,
[email protected]@ -424,7 +430,7 @@ class TestReconSuccess(TestCase):
+         self.assertEquals(self.fakecache.fakeout_calls,
+                             [((['replication_time', 'replication_stats',
+                                 'replication_last'],
+-                                '/var/cache/swift/container.recon'), {})])
++                                '/var/lib/swift/recon-cache/container.recon'), {})])
+         self.assertEquals(rv, {"replication_time": 200.0,
+                                "replication_stats": {
+                                     "attempted": 179, "diff": 0,
[email protected]@ -445,7 +451,7 @@ class TestReconSuccess(TestCase):
+         self.assertEquals(self.fakecache.fakeout_calls,
+                             [((['object_replication_time',
+                                 'object_replication_last'],
+-                                '/var/cache/swift/object.recon'), {})])
++                                '/var/lib/swift/recon-cache/object.recon'), {})])
+         self.assertEquals(rv, {'object_replication_time': 200.0,
+                                'object_replication_last': 1357962809.15})
+ 
[email protected]@ -456,7 +462,7 @@ class TestReconSuccess(TestCase):
+         rv = self.app.get_updater_info('container')
+         self.assertEquals(self.fakecache.fakeout_calls,
+                             [((['container_updater_sweep'],
+-                            '/var/cache/swift/container.recon'), {})])
++                            '/var/lib/swift/recon-cache/container.recon'), {})])
+         self.assertEquals(rv, {"container_updater_sweep": 18.476239919662476})
+ 
+     def test_get_updater_info_object(self):
[email protected]@ -466,7 +472,7 @@ class TestReconSuccess(TestCase):
+         rv = self.app.get_updater_info('object')
+         self.assertEquals(self.fakecache.fakeout_calls,
+                             [((['object_updater_sweep'],
+-                            '/var/cache/swift/object.recon'), {})])
++                            '/var/lib/swift/recon-cache/object.recon'), {})])
+         self.assertEquals(rv, {"object_updater_sweep": 0.79848217964172363})
+ 
+     def test_get_auditor_info_account(self):
[email protected]@ -482,7 +488,7 @@ class TestReconSuccess(TestCase):
+                                 'account_auditor_pass_completed',
+                                 'account_audits_since',
+                                 'account_audits_failed'],
+-                                '/var/cache/swift/account.recon'), {})])
++                                '/var/lib/swift/recon-cache/account.recon'), {})])
+         self.assertEquals(rv, {"account_auditor_pass_completed": 0.24,
+                                "account_audits_failed": 0,
+                                "account_audits_passed": 6,
[email protected]@ -501,7 +507,7 @@ class TestReconSuccess(TestCase):
+                                 'container_auditor_pass_completed',
+                                 'container_audits_since',
+                                 'container_audits_failed'],
+-                                '/var/cache/swift/container.recon'), {})])
++                                '/var/lib/swift/recon-cache/container.recon'), {})])
+         self.assertEquals(rv, {"container_auditor_pass_completed": 0.24,
+                                "container_audits_failed": 0,
+                                "container_audits_passed": 6,
[email protected]@ -528,7 +534,7 @@ class TestReconSuccess(TestCase):
+         self.assertEquals(self.fakecache.fakeout_calls,
+                             [((['object_auditor_stats_ALL',
+                                 'object_auditor_stats_ZBF'],
+-                            '/var/cache/swift/object.recon'), {})])
++                            '/var/lib/swift/recon-cache/object.recon'), {})])
+         self.assertEquals(rv, {"object_auditor_stats_ALL": {
+                                     "audit_time": 115.14418768882751,
+                                     "bytes_processed": 234660,
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/swift/patches/test.patch	Tue May 13 15:55:28 2014 -0600
@@ -0,0 +1,150 @@
+Various testing fixes:
+
+  - Tests involving large (5GB+) bodies are mocked, but on 32-bit python,
+    len() is limited to returning a ssize_t, which can represent 2GB.
+
+  - Solaris doesn't yet support syslog logging to /dev/log.
+
+  - Solaris doesn't have TCP_KEEPIDLE.
+
+  - Three tests make connections to 127.0.0.[234], which take minutes to
+    timeout (and one test fails).  Mock the connections to make the return
+    success immediately.
+
+The last has already been fixed upstream, as of 1.9.1.  The middle two are
+Solaris-only, and not suitable for upstream.  The first, while potentially
+useful elsewhere, is really only an issue on Solaris because Linux runs
+almost exclusively 64-bit, which makes this a non-issue.
+
+diff --git a/test/unit/__init__.py b/test/unit/__init__.py
+--- a/test/unit/__init__.py
++++ b/test/unit/__init__.py
[email protected]@ -315,7 +315,7 @@ def fake_http_connect(*code_iter, **kwar
+                 else:
+                     etag = '"68b329da9893e34099c7d8ad5cb9c940"'
+ 
+-            headers = {'content-length': len(self.body),
++            headers = {'content-length': self.body.__len__(),
+                        'content-type': 'x-application/test',
+                        'x-timestamp': self.timestamp,
+                        'last-modified': self.timestamp,
+diff --git a/test/unit/proxy/test_server.py b/test/unit/proxy/test_server.py
+--- a/test/unit/proxy/test_server.py
++++ b/test/unit/proxy/test_server.py
[email protected]@ -2310,6 +2310,9 @@ class TestObjectController(unittest.Test
+ 
+             class LargeResponseBody(object):
+ 
++                def __nonzero__(self):
++                    return True
++
+                 def __len__(self):
+                     return MAX_FILE_SIZE + 1
+ 
[email protected]@ -2439,6 +2442,9 @@ class TestObjectController(unittest.Test
+ 
+             class LargeResponseBody(object):
+ 
++                def __nonzero__(self):
++                    return True
++
+                 def __len__(self):
+                     return MAX_FILE_SIZE + 1
+ 
+diff --git a/test/unit/common/test_utils.py b/test/unit/common/test_utils.py
+--- a/test/unit/common/test_utils.py
++++ b/test/unit/common/test_utils.py
[email protected]@ -425,9 +425,15 @@ class TestUtils(unittest.TestCase):
+             logger = utils.get_logger({
+                 'log_facility': 'LOG_LOCAL3',
+             }, 'server', log_route='server')
++            if sys.platform == 'sunos5':
++                extra = [
++                  ((), {'facility': orig_sysloghandler.LOG_LOCAL3})
++                ]
++            else:
++                extra = []
+             self.assertEquals([
+                 ((), {'address': '/dev/log',
+-                      'facility': orig_sysloghandler.LOG_LOCAL3})],
++                      'facility': orig_sysloghandler.LOG_LOCAL3})] + extra,
+                 syslog_handler_args)
+ 
+             syslog_handler_args = []
+diff --git a/test/unit/common/test_wsgi.py b/test/unit/common/test_wsgi.py
+--- a/test/unit/common/test_wsgi.py
++++ b/test/unit/common/test_wsgi.py
[email protected]@ -116,11 +116,12 @@ class TestWSGI(unittest.TestCase):
+                 socket.SOL_SOCKET: {
+                     socket.SO_REUSEADDR: 1,
+                     socket.SO_KEEPALIVE: 1,
+-                },
+-                socket.IPPROTO_TCP: {
++                }
++            }
++            if hasattr(socket, 'TCP_KEEPIDLE'):
++                expected_socket_opts[socket.IPPROTO_TCP] = {
+                     socket.TCP_KEEPIDLE: 600,
+-                },
+-            }
++                }
+             self.assertEquals(sock.opts, expected_socket_opts)
+             # test ssl
+             sock = wsgi.get_socket(ssl_conf)
+diff --git a/test/unit/obj/test_replicator.py b/test/unit/obj/test_replicator.py
+--- a/test/unit/obj/test_replicator.py
++++ b/test/unit/obj/test_replicator.py
[email protected]@ -17,6 +17,7 @@ from __future__ import with_statement
+ 
+ import unittest
+ import os
++from mock import patch as mockpatch
+ from gzip import GzipFile
+ from shutil import rmtree
+ import cPickle as pickle
[email protected]@ -482,14 +483,16 @@ class TestObjectReplicator(unittest.Test
+             self.replicator.logger.log_dict['warning'])
+ 
+     def test_delete_partition(self):
+-        df = DiskFile(self.devices, 'sda', '0', 'a', 'c', 'o', FakeLogger())
+-        mkdirs(df.datadir)
+-        ohash = hash_path('a', 'c', 'o')
+-        data_dir = ohash[-3:]
+-        part_path = os.path.join(self.objects, '1')
+-        self.assertTrue(os.access(part_path, os.F_OK))
+-        self.replicator.replicate()
+-        self.assertFalse(os.access(part_path, os.F_OK))
++        with mockpatch('swift.obj.replicator.http_connect',
++                        mock_http_connect(200)):
++            df = DiskFile(self.devices, 'sda', '0', 'a', 'c', 'o', FakeLogger())
++            mkdirs(df.datadir)
++            ohash = hash_path('a', 'c', 'o')
++            data_dir = ohash[-3:]
++            part_path = os.path.join(self.objects, '1')
++            self.assertTrue(os.access(part_path, os.F_OK))
++            self.replicator.replicate()
++            self.assertFalse(os.access(part_path, os.F_OK))
+ 
+     def test_delete_partition_override_params(self):
+         df = DiskFile(self.devices, 'sda', '0', 'a', 'c', 'o', FakeLogger())
[email protected]@ -613,12 +616,16 @@ class TestObjectReplicator(unittest.Test
+             tpool.execute = was_execute
+ 
+     def test_run(self):
+-        with _mock_process([(0, '')] * 100):
+-            self.replicator.replicate()
++        with mockpatch('swift.obj.replicator.http_connect',
++                        mock_http_connect(200)):
++            with _mock_process([(0, '')] * 100):
++                self.replicator.replicate()
+ 
+     def test_run_withlog(self):
+-        with _mock_process([(0, "stuff in log")] * 100):
+-            self.replicator.replicate()
++        with mockpatch('swift.obj.replicator.http_connect',
++                        mock_http_connect(200)):
++            with _mock_process([(0, "stuff in log")] * 100):
++                self.replicator.replicate()
+ 
+ if __name__ == '__main__':
+     unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/swift/resolve.deps	Tue May 13 15:55:28 2014 -0600
@@ -0,0 +1,8 @@
+library/python-2/eventlet-26
+library/python-2/simplejson-26
+library/python/eventlet-26
+library/python/simplejson-26
+library/python/swiftclient-26
+runtime/python-26
+service/memcached
+system/core-os
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/swift/swift.p5m	Tue May 13 15:55:28 2014 -0600
@@ -0,0 +1,258 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+
+#
+# Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+#
+
+<transform file path=usr.*/man/.+ -> default mangler.man.stability uncommitted>
+
+set name=pkg.fmri \
+    value=pkg:/cloud/openstack/[email protected]$(IPS_COMPONENT_VERSION),$(BUILD_VERSION)
+set name=pkg.summary value="OpenStack Swift"
+set name=pkg.description \
+    value="The OpenStack Object Store project, known as Swift, offers cloud storage software so that you can store and retrieve data in virtual containers"
+set name=pkg.human-version value="Grizzly 2013.1.4"
+set name=com.oracle.info.description \
+    value="Swift, the OpenStack object storage service"
+set name=com.oracle.info.tpno value=14503
+set name=info.classification \
+    value="org.opensolaris.category.2008:System/Administration and Configuration" \
+    value="org.opensolaris.category.2008:System/Enterprise Management" \
+    value=org.opensolaris.category.2008:System/Virtualization \
+    value="org.opensolaris.category.2008:Web Services/Application and Web Servers"
+set name=info.source-url value=$(COMPONENT_ARCHIVE_URL)
+set name=info.upstream value="OpenStack <[email protected]>"
+set name=info.upstream-url value=$(COMPONENT_PROJECT_URL)
+set name=org.opensolaris.arc-caseid value=PSARC/2013/350 value=PSARC/2014/050
+set name=org.opensolaris.consolidation value=$(CONSOLIDATION)
+#
+<transform file path=.*/(.*_attr)\.d -> set action.hash files/swift.%<1>>
+<transform file path=.*/(.*_attr)\.d -> default group sys>
+file path=etc/security/auth_attr.d/cloud:openstack:swift
+file path=etc/security/exec_attr.d/cloud:openstack:swift
+file path=etc/security/prof_attr.d/cloud:openstack:swift
+<transform file path=etc/swift/(.*) -> set action.hash etc/%<1>-sample>
+<transform file path=etc/swift/rsyncd.conf -> set action.hash files/rsyncd.conf>
+<transform dir file path=etc/swift/? -> default owner swift>
+<transform dir file path=etc/swift/? -> default group swift>
+<transform file path=etc/swift/ -> default mode 0644>
+<transform file path=etc/swift/ -> default overlay allow>
+<transform file path=etc/swift/ -> default preserve true>
+dir  path=etc/swift mode=0700
+file path=etc/swift/account-server.conf
+file path=etc/swift/container-server.conf
+file path=etc/swift/dispersion.conf
+file path=etc/swift/memcache.conf
+file path=etc/swift/mime.types
+file path=etc/swift/object-expirer.conf
+file path=etc/swift/object-server.conf
+file path=etc/swift/proxy-server.conf
+file path=etc/swift/rsyncd.conf
+file path=etc/swift/swift-bench.conf
+file path=etc/swift/swift.conf
+<transform file path=lib/svc/.*/([^/]*) -> set action.hash files/%<1>>
+<transform file path=lib/svc/method/swift-proxy-server -> set action.hash files/swift-smf-method>
+file path=lib/svc/manifest/application/openstack/swift-account-auditor.xml
+file path=lib/svc/manifest/application/openstack/swift-account-reaper.xml
+file path=lib/svc/manifest/application/openstack/swift-account-replicator.xml
+file path=lib/svc/manifest/application/openstack/swift-account-server.xml
+file path=lib/svc/manifest/application/openstack/swift-container-auditor.xml
+file path=lib/svc/manifest/application/openstack/swift-container-replicator.xml
+file path=lib/svc/manifest/application/openstack/swift-container-server.xml
+file path=lib/svc/manifest/application/openstack/swift-container-sync.xml
+file path=lib/svc/manifest/application/openstack/swift-container-updater.xml
+file path=lib/svc/manifest/application/openstack/swift-object-auditor.xml
+file path=lib/svc/manifest/application/openstack/swift-object-expirer.xml
+file path=lib/svc/manifest/application/openstack/swift-object-replicator.xml
+file path=lib/svc/manifest/application/openstack/swift-object-server.xml
+file path=lib/svc/manifest/application/openstack/swift-object-updater.xml
+file path=lib/svc/manifest/application/openstack/swift-proxy-server.xml
+file path=lib/svc/manifest/application/openstack/swift-replicator-rsync.xml
+<transform hardlink path=lib/svc/method -> default target swift-proxy-server>
+hardlink path=lib/svc/method/swift-account-auditor
+hardlink path=lib/svc/method/swift-account-reaper
+hardlink path=lib/svc/method/swift-account-replicator
+hardlink path=lib/svc/method/swift-account-server
+hardlink path=lib/svc/method/swift-container-auditor
+hardlink path=lib/svc/method/swift-container-replicator
+hardlink path=lib/svc/method/swift-container-server
+hardlink path=lib/svc/method/swift-container-sync
+hardlink path=lib/svc/method/swift-container-updater
+hardlink path=lib/svc/method/swift-object-auditor
+hardlink path=lib/svc/method/swift-object-expirer
+hardlink path=lib/svc/method/swift-object-replicator
+hardlink path=lib/svc/method/swift-object-server
+hardlink path=lib/svc/method/swift-object-updater
+file path=lib/svc/method/swift-proxy-server
+file path=lib/svc/method/swift-replicator-rsync
+file path=usr/bin/swift-account-audit
+file path=usr/bin/swift-bench
+file path=usr/bin/swift-bench-client
+file path=usr/bin/swift-dispersion-populate
+file path=usr/bin/swift-dispersion-report
+file path=usr/bin/swift-form-signature
+file path=usr/bin/swift-get-nodes
+file path=usr/bin/swift-object-info
+file path=usr/bin/swift-recon
+file path=usr/bin/swift-ring-builder
+file path=usr/bin/swift-temp-url
+file path=usr/lib/python$(PYVER)/vendor-packages/swift-$(COMPONENT_VERSION)-py$(PYVER).egg-info/PKG-INFO
+file path=usr/lib/python$(PYVER)/vendor-packages/swift-$(COMPONENT_VERSION)-py$(PYVER).egg-info/SOURCES.txt
+file path=usr/lib/python$(PYVER)/vendor-packages/swift-$(COMPONENT_VERSION)-py$(PYVER).egg-info/dependency_links.txt
+file path=usr/lib/python$(PYVER)/vendor-packages/swift-$(COMPONENT_VERSION)-py$(PYVER).egg-info/entry_points.txt
+file path=usr/lib/python$(PYVER)/vendor-packages/swift-$(COMPONENT_VERSION)-py$(PYVER).egg-info/requires.txt
+file path=usr/lib/python$(PYVER)/vendor-packages/swift-$(COMPONENT_VERSION)-py$(PYVER).egg-info/top_level.txt
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/account/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/account/auditor.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/account/reaper.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/account/replicator.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/account/server.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/bench.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/bufferedhttp.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/constraints.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/daemon.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/db.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/db_replicator.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/direct_client.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/exceptions.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/http.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/internal_client.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/manager.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/memcached.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/middleware/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/middleware/account_quotas.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/middleware/acl.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/middleware/bulk.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/middleware/catch_errors.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/middleware/cname_lookup.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/middleware/container_quotas.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/middleware/domain_remap.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/middleware/formpost.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/middleware/healthcheck.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/middleware/keystoneauth.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/middleware/list_endpoints.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/middleware/memcache.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/middleware/name_check.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/middleware/proxy_logging.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/middleware/ratelimit.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/middleware/recon.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/middleware/slo.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/middleware/staticweb.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/middleware/tempauth.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/middleware/tempurl.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/ring/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/ring/builder.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/ring/ring.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/ring/utils.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/swob.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/utils.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/common/wsgi.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/container/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/container/auditor.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/container/replicator.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/container/server.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/container/sync.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/container/updater.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/obj/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/obj/auditor.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/obj/expirer.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/obj/replicator.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/obj/server.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/obj/updater.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/proxy/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/proxy/controllers/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/proxy/controllers/account.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/proxy/controllers/base.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/proxy/controllers/container.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/proxy/controllers/obj.py
+file path=usr/lib/python$(PYVER)/vendor-packages/swift/proxy/server.py
+<transform file path=usr/lib/swift/(.*) -> set action.hash usr/bin/%<1>>
+<transform file path=usr/lib/swift/(.*) -> default mode 0555>
+file path=usr/lib/swift/swift-account-auditor
+file path=usr/lib/swift/swift-account-reaper
+file path=usr/lib/swift/swift-account-replicator
+file path=usr/lib/swift/swift-account-server
+file path=usr/lib/swift/swift-container-auditor
+file path=usr/lib/swift/swift-container-replicator
+file path=usr/lib/swift/swift-container-server
+file path=usr/lib/swift/swift-container-sync
+file path=usr/lib/swift/swift-container-updater
+file path=usr/lib/swift/swift-init
+file path=usr/lib/swift/swift-object-auditor
+file path=usr/lib/swift/swift-object-expirer
+file path=usr/lib/swift/swift-object-replicator
+file path=usr/lib/swift/swift-object-server
+file path=usr/lib/swift/swift-object-updater
+file path=usr/lib/swift/swift-proxy-server
+file path=usr/lib/swift/swift-recon-cron
+<transform file path=usr/share/man/man1/(.+) -> set action.hash doc/manpages/%<1>>
+<transform file path=usr/share/man/man4/(.+)\.4 -> set action.hash doc/manpages/%<1>.5>
+file path=usr/share/man/man1/swift-account-auditor.1
+file path=usr/share/man/man1/swift-account-reaper.1
+file path=usr/share/man/man1/swift-account-replicator.1
+file path=usr/share/man/man1/swift-account-server.1
+file path=usr/share/man/man1/swift-container-auditor.1
+file path=usr/share/man/man1/swift-container-replicator.1
+file path=usr/share/man/man1/swift-container-server.1
+file path=usr/share/man/man1/swift-container-sync.1
+file path=usr/share/man/man1/swift-container-updater.1
+file path=usr/share/man/man1/swift-dispersion-populate.1
+file path=usr/share/man/man1/swift-dispersion-report.1
+file path=usr/share/man/man1/swift-get-nodes.1
+file path=usr/share/man/man1/swift-init.1
+file path=usr/share/man/man1/swift-object-auditor.1
+file path=usr/share/man/man1/swift-object-expirer.1
+file path=usr/share/man/man1/swift-object-info.1
+file path=usr/share/man/man1/swift-object-replicator.1
+file path=usr/share/man/man1/swift-object-server.1
+file path=usr/share/man/man1/swift-object-updater.1
+file path=usr/share/man/man1/swift-proxy-server.1
+file path=usr/share/man/man1/swift-recon.1
+file path=usr/share/man/man1/swift-ring-builder.1
+file path=usr/share/man/man4/account-server.conf.4
+file path=usr/share/man/man4/container-server.conf.4
+file path=usr/share/man/man4/dispersion.conf.4
+file path=usr/share/man/man4/object-expirer.conf.4
+file path=usr/share/man/man4/object-server.conf.4
+file path=usr/share/man/man4/proxy-server.conf.4
+dir  path=var/lib/swift owner=swift group=swift mode=0700
+dir  path=var/lib/swift/recon-cache owner=swift group=swift
+dir  path=var/log/swift owner=swift group=swift
+#
+group groupname=swift gid=86
+user username=swift ftpuser=false gcos-field="Openstack Swift" group=swift \
+    home-dir=/var/lib/swift uid=86
+#
+license LICENSE license="Apache v2.0"
+
+# force a dependency on netifaces; pkgdepend work is needed to flush this
+# out.
+depend type=require fmri=library/python/netifaces-26
+
+# force a dependency on paste.deploy; pkgdepend work is needed to flush this
+# out.
+depend type=require fmri=library/python/paste.deploy-26
+
+# force a dependency on xattr; pkgdepend work is needed to flush this out.
+depend type=require fmri=library/python/xattr-26