X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=cloudeebus%2Fcloudeebus.py;h=fade6fe57f38b0a3747518273f1ec8c1b4e6f864;hb=50f9107a8bf3455e9d3e8797ffa2b8d3c1dc4c06;hp=4e3bae4f5f0e49048da9c4ead3f8541576df4916;hpb=236c26d85a85cccc2cc43f8678524e6de3c909b4;p=contrib%2Fcloudeebus.git diff --git a/cloudeebus/cloudeebus.py b/cloudeebus/cloudeebus.py index 4e3bae4..fade6fe 100755 --- a/cloudeebus/cloudeebus.py +++ b/cloudeebus/cloudeebus.py @@ -51,10 +51,11 @@ from xml.etree.ElementTree import XMLParser ############################################################################### -VERSION = "0.5.0" +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 = [] @@ -588,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 @@ -604,7 +612,7 @@ 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): @@ -613,17 +621,17 @@ class CloudeebusService: ''' 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() + className = createClassName(self.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=self.agentObjectPath, busName=self.srvName)", self.globalCtx, self.localCtx) - self.serviceAgents[self.className].add_to_connection() + self.serviceAgents[className].add_to_connection() return (self.agentObjectPath) @exportRpc @@ -632,11 +640,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!") @@ -667,7 +677,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) @@ -693,8 +704,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 @@ -728,7 +744,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') @@ -753,6 +771,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: @@ -764,7 +787,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)