From 234cf79b0ce8c147bfff580b51d138058e94956c Mon Sep 17 00:00:00 2001 From: gholt <gholt@rackspace.com> Date: Sat, 14 Aug 2010 09:46:32 -0700 Subject: [PATCH] Cyberduck Support and How To --- bin/swift-auth-create-account | 4 +- bin/swift-auth-recreate-accounts | 3 +- doc/source/howto_cyberduck.rst | 141 ++++++++++++++++++++++++++ doc/source/howto_cyberduck_config.png | Bin 0 -> 40503 bytes doc/source/index.rst | 7 ++ etc/proxy-server.conf-sample | 1 + swift/common/auth.py | 4 +- swift/common/bufferedhttp.py | 29 ++++-- 8 files changed, 177 insertions(+), 12 deletions(-) create mode 100644 doc/source/howto_cyberduck.rst create mode 100644 doc/source/howto_cyberduck_config.png diff --git a/bin/swift-auth-create-account b/bin/swift-auth-create-account index ccaf93cf5f..cdc085d754 100755 --- a/bin/swift-auth-create-account +++ b/bin/swift-auth-create-account @@ -36,8 +36,10 @@ if __name__ == '__main__': conf = dict(c.items('auth-server')) host = conf.get('bind_ip', '127.0.0.1') port = int(conf.get('bind_port', 11000)) + ssl = conf.get('cert_file') is not None path = '/account/%s/%s' % (new_account, new_user) - conn = http_connect(host, port, 'PUT', path, {'x-auth-key':new_password}) + conn = http_connect(host, port, 'PUT', path, {'x-auth-key':new_password}, + ssl=ssl) resp = conn.getresponse() if resp.status == 204: print resp.getheader('x-storage-url') diff --git a/bin/swift-auth-recreate-accounts b/bin/swift-auth-recreate-accounts index 51212b4f4f..3bdd1e43ee 100755 --- a/bin/swift-auth-recreate-accounts +++ b/bin/swift-auth-recreate-accounts @@ -31,8 +31,9 @@ if __name__ == '__main__': conf = dict(c.items('auth-server')) host = conf.get('bind_ip', '127.0.0.1') port = int(conf.get('bind_port', 11000)) + ssl = conf.get('cert_file') is not None path = '/recreate_accounts' - conn = http_connect(host, port, 'POST', path) + conn = http_connect(host, port, 'POST', path, ssl=ssl) resp = conn.getresponse() if resp.status == 200: print resp.read() diff --git a/doc/source/howto_cyberduck.rst b/doc/source/howto_cyberduck.rst new file mode 100644 index 0000000000..135272d9b4 --- /dev/null +++ b/doc/source/howto_cyberduck.rst @@ -0,0 +1,141 @@ +=============================== +Talking to Swift with Cyberduck +=============================== + +.. note:: + Put together by Caleb Tennis, thanks Celeb! + + +#. Install Swift, or have credentials for an existing Swift installation. If + you plan to install Swift on your own server, follow the general guidelines + in the section following this one. + +#. Verify you can connect using the standard Swift Tool `st` from your + "public" URL (yes I know this resolves privately inside EC2):: + + ubuntu@domU-12-31-39-03-CD-06:/home/swift/swift/bin$ st -A https://ec2-184-72-156-130.compute-1.amazonaws.com:11000/v1.0 -U a3:b3 -K c3 stat + Account: 06228ccf-6d0a-4395-889e-e971e8de8781 + Containers: 0 + Objects: 0 + Bytes: 0 + + .. note:: + + The Swift Tool `st` can be copied from Swift sources to most any + machine with Python installed. You can grab it from + http://bazaar.launchpad.net/%7Ehudson-openstack/swift/trunk/annotate/head%3A/bin/st + if you don't have the Swift code handy. + +#. Download and extract the Cyberduck sources (3.5.1 as of this writing). They + should be available at http://trac.cyberduck.ch/ + +#. Edit the Cyberduck source. Look for lib/cloudfiles.properties, and edit + this file. Change auth_url to your public auth URL (note the https):: + + auth_url=https://ec2-184-72-156-130.compute-1.amazonaws.com:11000/v1.0 + +#. Edit source/ch/cyberduck/core/Protocol.java. Look for the line saying + "storage.clouddrive.com". Just above that, change:: + + public boolean isHostnameConfigurable() { + return true; + } + +#. In the root directory, run "make" to rebuild Cyberduck. When done, type: + `open build/Release/Cyberduck.app/` to start the program. + +#. Go to "Open Connection", select Rackspace Cloud Files, and connect. + + .. image:: howto_cyberduck_config.png + +#. If you get SSL errors, make sure your auth and proxy server are both setup + for SSL. If you get certificate errors (specifically, 'unable to find valid + certification path to requested target'), you are using a self signed + certificate, you need to perform a few more steps: + + .. note:: + + For some folks, just telling the OS to trust the cert works fine, for + others use the following steps. + +#. As outlined here: http://blogs.sun.com/andreas/entry/no_more_unable_to_find, + download http://blogs.sun.com/andreas/resource/InstallCert.java, run "javac + InstallCert.java" to compile it, then run "java InstallCert + https://your-auth-server-url:8080". This script will pull down that + certificate and put it into a Java cert store, in your local directory. The + file is jssecacerts. + +#. You need to move that file to $JAVA_HOME/jre/lib/security, so your java run + time picks it up. + +#. Restart Cyberduck, and it should now allow you to use that certificate + without an error. + + +--------------------------------------- +Installing Swift For Use With Cyberduck +--------------------------------------- + +#. Both the proxy and auth servers will ultimately need to be running with + SSL. You will need a key and certificate to do this, self signed is ok (but + a little more work getting Cyberduck to accept it). Put these in + /etc/swift/cert.crt and /etc/swift/cert.key. + + .. note:: + + Creating a self-signed cert can usually be done with:: + + cd /etc/swift + openssl req -new -x509 -nodes -out cert.crt -keyout cert.key + +#. Example proxy-server config:: + + [proxy-server] + bind_port = 8080 + user = swift + cert_file = /etc/swift/cert.crt + key_file = /etc/swift/cert.key + + [auth-server] + ssl = true + +#. Example auth-server config:: + + [auth-server] + default_cluster_url = https://ec2-184-72-156-130.compute-1.amazonaws.com:8080/v1 + user = swift + cert_file = /etc/swift/cert.crt + key_file = /etc/swift/cert.key + +#. Use swift-auth-create-account to create a new account:: + + ubuntu@domU-12-31-39-03-CD-06:/home/swift/swift/bin$ swift-auth-create-account a3 b3 c3 + https://ec2-184-72-156-130.compute-1.amazonaws.com:8080/v1/06228ccf-6d0a-4395-889e-e971e8de8781 + + .. note:: + It's important that the URL that is given back to you be accessible + publicly. This URL is tied to this account, and will be served + back to Cyberduck after authorization. If this URL gives back + something like: http://127.0.0.1/v1/... this won't work, because + Cyberduck will attempt to connect to 127.0.0.1. + + This URL is specified in the auth-server config's + default_cluster_url. However, once you have created an + account/user, this URL is fixed and won't change even if you change + that configuration item. You will have to use sqlite to manually + edit the auth.db in order to change it (limitation of using the + development auth server, but perhaps someone will patch in this + ability someday). + +#. Verify you can connect using the standard Swift Tool `st`:: + + ubuntu@domU-12-31-39-03-CD-06:/home/swift/swift/bin$ st -A https://127.0.0.1:11000/v1.0 -U a3:b3 -K c3 stat + Account: 06228ccf-6d0a-4395-889e-e971e8de8781 + Containers: 0 + Objects: 0 + Bytes: 0 + +.. note:: + + Please let me know if you find any changes that need to be made: ctennis on + IRC diff --git a/doc/source/howto_cyberduck_config.png b/doc/source/howto_cyberduck_config.png new file mode 100644 index 0000000000000000000000000000000000000000..1612bbe0e6aedc62ae284f4d2f1aa6ceeea66afc GIT binary patch literal 40503 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 literal 0 HcmV?d00001 diff --git a/doc/source/index.rst b/doc/source/index.rst index 60d26dbe32..3461a9083c 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -41,6 +41,13 @@ Deployment: deployment_guide admin_guide +End User Guides: + +.. toctree:: + :maxdepth: 1 + + howto_cyberduck + Source: .. toctree:: diff --git a/etc/proxy-server.conf-sample b/etc/proxy-server.conf-sample index 33d612c724..f548852722 100644 --- a/etc/proxy-server.conf-sample +++ b/etc/proxy-server.conf-sample @@ -35,4 +35,5 @@ # class = swift.common.auth.DevAuthMiddleware # ip = 127.0.0.1 # port = 11000 +# ssl = false # node_timeout = 10 diff --git a/swift/common/auth.py b/swift/common/auth.py index 6830b60ba7..5e4e7d1716 100644 --- a/swift/common/auth.py +++ b/swift/common/auth.py @@ -35,6 +35,8 @@ class DevAuthMiddleware(object): self.conf = conf self.auth_host = conf.get('ip', '127.0.0.1') self.auth_port = int(conf.get('port', 11000)) + self.ssl = \ + conf.get('ssl', 'false').lower() in ('true', 'on', '1', 'yes') self.timeout = int(conf.get('node_timeout', 10)) def __call__(self, env, start_response): @@ -78,7 +80,7 @@ class DevAuthMiddleware(object): try: with Timeout(self.timeout): conn = http_connect(self.auth_host, self.auth_port, 'GET', - '/token/%s/%s' % (account, token)) + '/token/%s/%s' % (account, token), ssl=self.ssl) resp = conn.getresponse() resp.read() conn.close() diff --git a/swift/common/bufferedhttp.py b/swift/common/bufferedhttp.py index 94d1ba1073..6b308e5b01 100644 --- a/swift/common/bufferedhttp.py +++ b/swift/common/bufferedhttp.py @@ -30,8 +30,8 @@ from urllib import quote import logging import time -from eventlet.green.httplib import HTTPConnection, HTTPResponse, _UNKNOWN, \ - CONTINUE, HTTPMessage +from eventlet.green.httplib import CONTINUE, HTTPConnection, HTTPMessage, \ + HTTPResponse, HTTPSConnection, _UNKNOWN class BufferedHTTPResponse(HTTPResponse): @@ -106,10 +106,11 @@ class BufferedHTTPConnection(HTTPConnection): def http_connect(ipaddr, port, device, partition, method, path, - headers=None, query_string=None): + headers=None, query_string=None, ssl=False): """ - Helper function to create a HTTPConnection object that is buffered - for backend Swift services. + Helper function to create an HTTPConnection object. If ssl is set True, + HTTPSConnection will be used. However, if ssl=False, BufferedHTTPConnection + will be used, which is buffered for backend Swift services. :param ipaddr: IPv4 address to connect to :param port: port to connect to @@ -119,9 +120,13 @@ def http_connect(ipaddr, port, device, partition, method, path, :param path: request path :param headers: dictionary of headers :param query_string: request query string + :param ssl: set True if SSL should be used (default: False) :returns: HTTPConnection object """ - conn = BufferedHTTPConnection('%s:%s' % (ipaddr, port)) + if ssl: + conn = HTTPSConnection('%s:%s' % (ipaddr, port)) + else: + conn = BufferedHTTPConnection('%s:%s' % (ipaddr, port)) path = quote('/' + device + '/' + str(partition) + path) if query_string: path += '?' + query_string @@ -135,9 +140,11 @@ def http_connect(ipaddr, port, device, partition, method, path, def http_connect_raw(ipaddr, port, method, path, headers=None, - query_string=None): + query_string=None, ssl=False): """ - Helper function to create a HTTPConnection object that is buffered. + Helper function to create an HTTPConnection object. If ssl is set True, + HTTPSConnection will be used. However, if ssl=False, BufferedHTTPConnection + will be used, which is buffered for backend Swift services. :param ipaddr: IPv4 address to connect to :param port: port to connect to @@ -145,9 +152,13 @@ def http_connect_raw(ipaddr, port, method, path, headers=None, :param path: request path :param headers: dictionary of headers :param query_string: request query string + :param ssl: set True if SSL should be used (default: False) :returns: HTTPConnection object """ - conn = BufferedHTTPConnection('%s:%s' % (ipaddr, port)) + if ssl: + conn = HTTPSConnection('%s:%s' % (ipaddr, port)) + else: + conn = BufferedHTTPConnection('%s:%s' % (ipaddr, port)) if query_string: path += '?' + query_string conn.path = path