cloudstack/awsapi-setup/setup/cloudstack-aws-api-register

94 lines
3.2 KiB
Python

#!/cygdrive/c/python26/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)