| #!/usr/bin/python |
| # |
| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you 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 base64 |
| import hmac |
| import os |
| import sys |
| import urllib2 |
| import urllib |
| import httplib |
| from datetime import datetime |
| from optparse import OptionParser |
| from urlparse import urlparse |
| |
| try: |
| from hashlib import sha1 as sha |
| except ImportError: |
| import sha |
| |
| def get_signature(key, url, query): |
| netloc, path = urlparse(url)[1:3] |
| return urllib.quote_plus(base64.b64encode( |
| hmac.new(key, '\n'.join(['GET', netloc, path, query]), sha).digest())) |
| |
| def get_url(url, api_key, secret_key, action, query): |
| amzn_string = 'AWSAccessKeyId=' + api_key + '&Action=' + action + '&SignatureMethod=HmacSHA1' |
| amzn_string += '&SignatureVersion=2&Timestamp='+ datetime.now().isoformat()[:19] +'Z&Version=2010-11-15' |
| query = amzn_string + '&' + query |
| url = url + '?' + query + '&Signature=' + get_signature(secret_key, url, query) |
| try: |
| urllib2.urlopen(url) |
| if action == 'SetCertificate': |
| print 'User registration is successful!' |
| return True |
| except urllib2.HTTPError, e: |
| print 'User registration failed with http error code:' , e.code |
| return False |
| except urllib2.URLError, e: |
| print 'User registration failed with error: ' , e.reason |
| return False |
| |
| |
| def register(url, api_key, secret_key, cert): |
| # Register API keys |
| query = 'accesskey=' + api_key + '&secretkey=' + secret_key |
| result = get_url(url, api_key, secret_key, 'SetUserKeys', query) |
| |
| if result == True: |
| # Tie Certifcate to API keys |
| query = 'cert=' + urllib.quote_plus(cert) |
| get_url(url, api_key, secret_key, 'SetCertificate', query) |
| |
| |
| def get_opts(): |
| parser = OptionParser() |
| parser.add_option('-a', '--apikey') |
| parser.add_option('-s', '--secretkey') |
| parser.add_option('-c', '--cert', help='Name of a file containing an X.509 certificate') |
| parser.add_option('-u', '--url', help='CloudStack AWSAPI URL, eg. http://cloudstack.host:8080/awsapi') |
| (options, args) = parser.parse_args() |
| if None in [options.apikey, options.secretkey, options.cert, options.url]: |
| print 'Error: Missing argument\n' |
| parser.print_help() |
| sys.exit(1) |
| return options |
| |
| def validate_opts(options): |
| if not os.path.isfile(options.cert): |
| print 'Error reading file: ' + options.cert |
| sys.exit(1) |
| f = open(options.cert) |
| options.cert = f.read() |
| return options |
| |
| if __name__ == '__main__': |
| opts = validate_opts(get_opts()) |
| register(opts.url, opts.apikey, opts.secretkey, opts.cert) |