Created
May 26, 2012 18:31
-
-
Save momijiame/2794870 to your computer and use it in GitHub Desktop.
The CloudStack Web Services Query HTTP API Client Script
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
import os | |
import base64 | |
import urllib | |
import hashlib | |
import hmac | |
import httplib | |
import urlparse | |
import argparse | |
import json | |
import xml.dom.minidom | |
class CloudStackApiSignatureBuilder(object): | |
def __init__(self, apikey, secretkey): | |
self.apikey = apikey | |
self.secretkey = secretkey | |
def build(self, query_dict): | |
query_dict['apikey'] = self.apikey | |
query_list = sorted(['%s=%s' % (k, urllib.quote(v, safe='')) | |
for k, v in query_dict.items()]) | |
command_str = reduce(lambda s, e: '%s&%s' % (s, e), | |
query_list, '').lower()[1:] | |
digest = hmac.new(self.secretkey, command_str, hashlib.sha1).digest() | |
return urllib.quote(base64.encodestring(digest)[:-1], safe='') | |
class CloudStackApiClient(object): | |
def __init__(self, entrypoint, apikey, secretkey): | |
self.entrypoint = entrypoint | |
self.apikey = apikey | |
self.secretkey = secretkey | |
def request(self, query_dict, method='GET'): | |
if self.apikey != None and self.secretkey != None: | |
signature_builder = CloudStackApiSignatureBuilder(self.apikey, | |
self.secretkey) | |
sigunature = signature_builder.build(query_dict) | |
query_dict['signature'] = sigunature | |
query_dict['apikey'] = self.apikey | |
query_string = reduce(lambda s, (k, v): '%s&%s=%s' % (s, k, v), | |
query_dict.iteritems(), '')[1:] | |
url_parser = urlparse.urlparse(self.entrypoint) | |
connections = {'https': httplib.HTTPSConnection, | |
'http': httplib.HTTPConnection} | |
http_connection = connections[url_parser.scheme](url_parser.netloc) | |
http_connection.request(method, '%s?%s' % (url_parser.path, | |
query_string)) | |
return http_connection.getresponse() | |
def main(args): | |
client = CloudStackApiClient(args.entrypoint, args.apikey, args.secretkey) | |
params = {} | |
for s in args.parameters: | |
params[s.split('=')[0]] = s.split('=')[1] | |
if args.json: | |
params['response'] = 'json' | |
response = client.request(params) | |
print '%s %s' % (response.status, response.reason) | |
print response.msg | |
if 'response' in params and params['response'] == 'json': | |
print json.dumps(json.loads(response.read(), 'UTF-8'), indent=4) | |
else: | |
print xml.dom.minidom.parseString(response.read()).toprettyxml() | |
if __name__ == '__main__': | |
description = 'The CloudStack Web Services Query HTTP API Client' | |
option_e_help = 'API entry point' | |
option_a_help = 'API key which can be taken from management WebUI' | |
option_s_help = 'SECRET key which can be taken from management WebUI' | |
option_j_help = 'JSON format' | |
parameters_help = 'key=value pairs (e.g. command=listHosts ...)' | |
option_e_default = os.environ.get('CLOUDSTACK_API_ENTRYPOINT') | |
option_a_default = os.environ.get('CLOUDSTACK_API_APIKEY') | |
option_s_default = os.environ.get('CLOUDSTACK_API_SECRETKEY') | |
arg_parser = argparse.ArgumentParser(description=description) | |
arg_parser.add_argument('-e', '--entrypoint', help=option_e_help, | |
required=False, default=option_e_default) | |
arg_parser.add_argument('-a', '--apikey', help=option_a_help, | |
required=False, default=option_a_default) | |
arg_parser.add_argument('-s', '--secretkey', help=option_s_help, | |
required=False, default=option_s_default) | |
arg_parser.add_argument('-j', '--json', help=option_j_help, | |
required=False, action='store_true') | |
arg_parser.add_argument('parameters', help=parameters_help, nargs='+') | |
main(arg_parser.parse_args()) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment