Skip to content

Instantly share code, notes, and snippets.

@smarx smarx/
Created Jun 10, 2011

What would you like to do?
Node.js, CoffeeScript, and the Windows Azure Service Management API
certificate generated via:
openssl req -x509 -nodes -days 365 -subj "/CN=test" -newkey rsa:1024 -keyout priv.pem -out pub.pem
openssl x509 -outform der -in pub.pem -out pub.cer
(pub.cer is what's uploaded to Windows Azure via the portal)
crypto = require 'crypto'
https = require 'https'
fs = require 'fs'
xml2js = require 'xml2js'
cli = require 'cli'
util = require 'util'
base64DecodeAll = (x) ->
return unless x instanceof Object
for name, value of x
if name == 'Label'
x[name] = (new Buffer value, 'base64').toString()
base64DecodeAll x[name]
class ServiceManagementApi
constructor: (@subscriptionId, @key, @cert) ->
getOperatingSystemFamilies: (callback) -> 'operatingsystemfamilies', 'GET', callback
call: (path, method, body, callback) ->
if not callback?
if not body?
callback = method
method = 'GET'
body = undefined
callback = body
body = undefined
options = {
host: '',
port: 443,
key: @key,
cert: @cert,
method: method,
headers: { 'x-ms-version': '2010-10-28' },
path: "/#{@subscriptionId}/#{path}"
req = https.request options, (res) ->
body = ''
res.on 'data', (chunk) -> body += chunk
res.on 'end', (result) ->
parser = new xml2js.Parser
parser.on 'end', (result) ->
base64DecodeAll result
for name, value of result
callback value unless name == '@'
parser.parseString body
req.write body if body?
options = cli.parse {
subscriptionId: ['s', 'Subscription ID (found in the Windows Azure portal)', 'string'],
privateKey: ['p', 'Private key (.pem file)', 'file', 'priv.pem'],
certificate: ['c', 'Public certificate (.pem file)', 'file', 'pub.pem']
new ServiceManagementApi options.subscriptionId,
fs.readFileSync(options.privateKey, 'ascii'),
fs.readFileSync(options.certificate, 'ascii')
.getOperatingSystemFamilies (result) ->
console.log util.inspect result, false, 10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.