3 # Copyright (c) 2003 Intel Corporation
6 # Copyright (c) 2004-2006 The Trustees of Princeton University
11 import xml.parsers.expat
16 from Exceptions import *
19 def create_auth_structure( vars, call_params ):
21 create and return an authentication structure for a Boot API
22 call. Vars contains the boot manager runtime variables, and
23 call_params is a tuple of the parameters that will be passed to the
24 API call. Return None if unable to (typically due to missing
25 keys in vars, such as node_id or node_key)
29 auth['AuthMethod']= 'hmac'
32 network= vars['NETWORK_SETTINGS']
34 auth['node_id']= vars['NODE_ID']
35 auth['node_ip']= network['ip']
36 node_key= vars['NODE_KEY']
40 params= serialize_params(call_params)
42 msg= "[" + "".join(params) + "]"
43 node_hmac= hmac.new(node_key,msg.encode('utf-8'),sha).hexdigest()
44 auth['value']= node_hmac
50 def serialize_params( call_params ):
52 convert a list of parameters into a format that will be used in the
53 hmac generation. both the boot manager and plc must have a common
54 format. full documentation is in the boot manager technical document,
55 but essentially we are going to take all the values (and keys for
56 dictionary objects), and put them into a list. sort them, and combine
57 them into one long string encased in a set of braces.
62 for param in call_params:
63 if isinstance(param,list) or isinstance(param,tuple):
64 values += serialize_params(param)
65 elif isinstance(param,dict):
66 values += serialize_params(param.values())
68 values.append(unicode(param))
73 def call_api_function( vars, function, user_params ):
75 call the named api function with params, and return the
76 value to the caller. the authentication structure is handled
77 automatically, and doesn't need to be passed in with params.
79 If the call fails, a BootManagerException is raised.
83 api_server= vars['API_SERVER_INST']
85 raise BootManagerException, "No connection to the API server exists."
87 auth= create_auth_structure(vars,user_params)
89 raise BootManagerException, \
90 "Could not create auth structure, missing values."
93 params= params + user_params
96 exec( "rc= api_server.%s(*params)" % function )
98 except xmlrpclib.Fault, fault:
99 raise BootManagerException, "API Fault: %s" % fault
100 except xmlrpclib.ProtocolError, err:
101 raise BootManagerException,"XML RPC protocol error: %s" % err
102 except xml.parsers.expat.ExpatError, err:
103 raise BootManagerException,"XML parsing error: %s" % err