X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=cloudeebus%2Fcloudeebus.py;h=5a69f9d3a891709d88fd75332c9467de5abe54cb;hb=448f060448f3e237ba258a6e1e37264ccb8a68fc;hp=a432f078c3e5106e6a3eff466e937c14dbe71e89;hpb=60bdc429ec2005fcf696e08a0fc29feafb9c0c34;p=contrib%2Fcloudeebus.git diff --git a/cloudeebus/cloudeebus.py b/cloudeebus/cloudeebus.py index a432f07..5a69f9d 100755 --- a/cloudeebus/cloudeebus.py +++ b/cloudeebus/cloudeebus.py @@ -51,10 +51,11 @@ from xml.etree.ElementTree import XMLParser ############################################################################### -VERSION = "0.3.2" +VERSION = "0.5.99" OPENDOOR = False CREDENTIALS = {} WHITELIST = [] +SERVICELIST = [] NETMASK = [] ############################################################################### @@ -278,17 +279,20 @@ class XmlCbParser: # The target object of the parser +############################################################################### +def createClassName(objectPath): + return re.sub('/', '_', objectPath[1:]) + ################################################################################ class DynDBusClass(): def __init__(self, className, globalCtx, localCtx): - self.className = className self.xmlCB = XmlCbParser(self) self.signature = {} self.class_code = ExecCode(globalCtx, localCtx) self.class_code.indent_increment = 4 self.class_code.append_stmt("import dbus") self.class_code.append_stmt("\n") - self.class_code.append_stmt("class " + self.className + "(dbus.service.Object):") + self.class_code.append_stmt("class " + className + "(dbus.service.Object):") self.class_code.indent() ## Overload of __init__ method @@ -431,6 +435,7 @@ class CloudeebusService: self.permissions = {}; self.permissions['permissions'] = permissions['permissions'] self.permissions['authextra'] = permissions['authextra'] + self.permissions['services'] = permissions['services'] self.proxyObjects = {} self.proxyMethods = {} self.pendingCalls = [] @@ -571,7 +576,13 @@ class CloudeebusService: 'errorCB': async_error_cb} if methodId not in self.servicePendingCalls: self.servicePendingCalls[methodId] = {'count': 0, 'calls': []} - pendingCallStr = json.dumps({'callIndex': len(self.servicePendingCalls[methodId]['calls']), 'args': args}) + + try: + pendingCallStr = json.dumps({'callIndex': len(self.servicePendingCalls[methodId]['calls']), 'args': args}) + except Exception, e: + args = eval( str(args).replace("dbus.Byte", "dbus.Int16") ) + pendingCallStr = json.dumps({'callIndex': len(self.servicePendingCalls[methodId]['calls']), 'args': args}) + self.servicePendingCalls[methodId]['calls'].append(cb) self.servicePendingCalls[methodId]['count'] = self.servicePendingCalls[methodId]['count'] + 1 factory.dispatch(methodId, pendingCallStr) @@ -582,9 +593,12 @@ class CloudeebusService: arguments: busName, srvName ''' busName = list[0] - self.bus = cache.dbusConnexion( busName['name'] ) + self.bus = cache.dbusConnexion( busName ) self.srvName = list[1] - if (self.services.has_key(self.srvName) == False): + if not OPENDOOR and (SERVICELIST == [] or SERVICELIST != [] and self.permissions['services'] == None): + SERVICELIST.index(self.srvName) + + if (self.services.has_key(self.srvName) == False): self.services[self.srvName] = dbus.service.BusName(name = self.srvName, bus = self.bus) return self.srvName @@ -598,27 +612,28 @@ class CloudeebusService: self.services.pop(self.srvName) return self.srvName else: - raise Exception(self.srvName + " do not exist") + raise Exception(self.srvName + " does not exist") @exportRpc def serviceAddAgent(self, list): ''' arguments: objectPath, xmlTemplate ''' - self.agentObjectPath = list[0] - xmlTemplate = list[1] - self.className = re.sub('/', '_', self.agentObjectPath[1:]) - if (self.dynDBusClasses.has_key(self.className) == False): - self.dynDBusClasses[self.className] = DynDBusClass(self.className, self.globalCtx, self.localCtx) - self.dynDBusClasses[self.className].createDBusServiceFromXML(xmlTemplate) - self.dynDBusClasses[self.className].declare() + srvName = list[0] + agentObjectPath = list[1] + xmlTemplate = list[2] + className = createClassName(agentObjectPath) + if (self.dynDBusClasses.has_key(className) == False): + self.dynDBusClasses[className] = DynDBusClass(className, self.globalCtx, self.localCtx) + self.dynDBusClasses[className].createDBusServiceFromXML(xmlTemplate) + self.dynDBusClasses[className].declare() ## Class already exist, instanciate it if not already instanciated - if (self.serviceAgents.has_key(self.className) == False): - self.serviceAgents[self.className] = eval(self.className + "(self.bus, callback=self.srvCB, objPath=self.agentObjectPath, busName=self.srvName)", self.globalCtx, self.localCtx) + if (self.serviceAgents.has_key(className) == False): + self.serviceAgents[className] = eval(className + "(self.bus, callback=self.srvCB, objPath='"+agentObjectPath+"', busName='"+srvName+"')", self.globalCtx, self.localCtx) - self.serviceAgents[self.className].add_to_connection() - return (self.agentObjectPath) + self.serviceAgents[className].add_to_connection() + return (agentObjectPath) @exportRpc def serviceDelAgent(self, list): @@ -626,11 +641,13 @@ class CloudeebusService: arguments: objectPath, xmlTemplate ''' agentObjectPath = list[0] - className = re.sub('/', '_', agentObjectPath[1:]) + className = createClassName(agentObjectPath) + + print 'PY Try to remove ' + className if (self.serviceAgents.has_key(className)): - self.serviceAgents[self.className].remove_from_connection() - self.serviceAgents.pop(self.className) + self.serviceAgents[className].remove_from_connection() + self.serviceAgents.pop(className) else: raise Exception(agentObjectPath + " doesn't exist!") @@ -661,7 +678,8 @@ class CloudeebusServerProtocol(WampCraServerProtocol): def getAuthPermissions(self, key, extra): return {'permissions': extra.get("permissions", None), - 'authextra': extra.get("authextra", None)} + 'authextra': extra.get("authextra", None), + 'services': extra.get("services", None)} def getAuthSecret(self, key): secret = CREDENTIALS.get(key, None) @@ -687,8 +705,13 @@ class CloudeebusServerProtocol(WampCraServerProtocol): if key is None: raise Exception("Authentication failed") # check permissions, array.index throws exception - for req in permissions['permissions']: + if (permissions['permissions'] != None): + for req in permissions['permissions']: WHITELIST.index(req); + # check allowed service creation, array.index throws exception + if (permissions['services'] != None): + for req in permissions['services']: + SERVICELIST.index(req); # create cloudeebus service instance self.cloudeebusService = CloudeebusService(permissions) # register it for RPC @@ -722,7 +745,9 @@ if __name__ == '__main__': parser.add_argument('-c', '--credentials', help='path to credentials file') parser.add_argument('-w', '--whitelist', - help='path to whitelist file') + help='path to whitelist file (DBus services to use)') + parser.add_argument('-s', '--servicelist', + help='path to servicelist file (DBus services to export)') parser.add_argument('-n', '--netmask', help='netmask,IP filter (comma separated.) eg. : -n 127.0.0.1,192.168.2.0/24,10.12.16.0/255.255.255.0') @@ -747,6 +772,11 @@ if __name__ == '__main__': WHITELIST = json.load(jfile) jfile.close() + if args.servicelist: + jfile = open(args.servicelist) + SERVICELIST = json.load(jfile) + jfile.close() + if args.netmask: iplist = args.netmask.split(",") for ip in iplist: @@ -758,7 +788,7 @@ if __name__ == '__main__': ipAllowed = ip mask = "255.255.255.255" NETMASK.append( {'ipAllowed': ipV4ToHex(ipAllowed), 'mask' : ipV4ToHex(mask)} ) - + uri = "ws://localhost:" + args.port factory = WampServerFactory(uri, debugWamp = args.debug)