Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Wiki Markup
#!/ usr/bin/env

...

 python# By: Kelcey Damage,

...

import hashlib, hmac, string. base64, urllib

# Reference GET/POST sample request
## 1. http://10.10.0.1:8080/client/api
# 2. ?apiKey=API_KEY
# 3. &command=API_COMMAND
# 4. &response=JSON/XML
# 5. &zoneid=ZONE_ID
# 6. &signature=SIGNATURE

# Reference required signature elements
## 1. request# 2. apiKey# 3. private_key

api_url = 'http://10.10.0.1:8080/client/api'

secret = Secret Key

apiKey = API Key

request =  {'command': 'restartNetwork', 'id': '214', 'response': 'json'}

class SignedAPICall(Object):
    def _init_(self, api_url, apikey,, secret):
        self.api_url = api_url
        self.apikey = apiKey
        self.secret = secret

...

 2012 & Kraig Amador, 2012

api_url = 'your_stuff_here'apiKey = 'your_stuff_here'secret = 'your_stuff_here'

import hashlib, hmac, string, base64, urllibimport json, urllib

class SignedAPICall(object):    def __init__(self, api_url, apiKey, secret):        self.api_url = api_url        self.apiKey = apiKey        self.secret = secret

    def request(self, args):

...

        args['apiKey'

...

] = self.

...

apiKey        self.params = 

...

[

...

]        self._sort_request(args)

...

        self._create_signature()        self._build_post_request()

...



    def _sort_request(self, args):

...

        keys = sorted(args.keys())

...

        for key in keys:

...

            self.params.append(key + '=' + urllib.quote_plus(args

...

[key

...

]))

...



    def _create_signature(self):

...

        self.query = '&'.join(self.params)

...

        digest = hmac.new(

...

            self.secret,

...

            msg=self.query.lower(),

...

            digestmod=hashlib.sha1).digest()

...

        self.signature = base64.b64encode(digest)

...



    def _build_post_request(self):

...

        self.query += '&signature=' + urllib.quote_plus(self.signature)

...

        self.value = self.api_url + '?' + self.query

...

api = SignedAPICall(api_url, apiKey,, secret)

api.request(request)

print api.value

# Example Usage:

# api.value is a debug that holds the complete valid URL request.

...



class CloudStack(SignedAPICall):    def __getattr__(self, name):        def handlerFunction(*args, **kwargs):            if kwargs:                return self._make_request(name, kwargs)            return self._make_request(name, args[0])        return handlerFunction

    def _http_get(self, url):        response = urllib.urlopen(url)        return response.read()

    def _make_request(self, command, args):        args['response'] = 'json'        args['command'] = command        self.request(args)        data = self._http_get(self.value)        # The response is of the format {commandresponse: actual-data}        key = command.lower() + "response"        return json.loads(data)[key]

api = CloudStack(api_url, apiKey, secret)

request = {'listall': 'true'}result = api.listVirtualMachines(request)print "count", result['count']print "api url", api.value