mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
94 lines
3.2 KiB
Python
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)
|