class FileMgrDispatcher(Dispatcher): '''The file manager dispatcher handles all XML-RPC calls. ''' def __init__(self, catalog, repo, xfer, userDB): self.catalog, self.repo, self.xfer, self.userDB = catalog, repo, xfer, userDB self.tracker = TransferStatusTracker(self.catalog) def handleRequest(self, methodSpecifier, params, user, password): '''Handle an XML-RPC request. First, authenticate the user. If the user's authentic (by dint of providing a correct user ID and password pair), then authorize if the method the user is trying to call is available. ''' password = _encodePassword(password) if self.userDB.authenticate(user, password): if self.userDB.authorize(user, methodSpecifier): obj, method = methodSpecifier.split('.') if obj not in ('filemgr', 'usermgr'): raise ValueError('Unknown object') func = getattr(self, method) return func(params) raise ValueError('Not authorized for "%s"' % methodSpecifier) raise ValueError('Illegal user name "%s" and/or password' % user) def getProductTypeByName(self, params): return Result(None, Structs.getXmlRpcProductType(self.repo.getProductTypeByName(params[0]))) def ingestProduct(self, params): productHash, metadata, clientXfer = params p = Structs.getProductFromXmlRpc(productHash) p.setTransferStatus(Product.STATUS_TRANSFER) self.catalog.addProduct(p) m = Metadata() m.addMetadata(metadata) self.catalog.addMetadata(m, p) if not clientXfer: versioner = GenericFileManagerObjectFactory.getVersionerFromClassName(p.getProductType().getVersioner()) versioner.createDataStoreReferences(p, m) self.catalog.addProductReferences(p) self.xfer.transferProduct(p) p.setTransferStatus(Product.STATUS_RECEIVED) self.catalog.setProductTranfserStatus(p) return Result(None, p.getProductId()) def addProductReferences(self, params): self.catalog.addProductReferences(Structs.getProductFromXmlRpc(params[0])) return Result(Boolean, 'true') def transferringProduct(self, params): self.tracker.transferringProduct(Structs.getProductFromXmlRpc(params[0])) return Result(Boolean, 'true') def removeProductTransferStatus(self, params): self.tracker.removeProductTransferStatus(Structs.getProductFromXmlRpc(params[0])) return Result(Boolean, 'true') def setProductTransferStatus(self, params): self.catalog.setProductTransferStatus(Structs.getProductFromXmlRpc(params[0])) return Result(Boolean, 'true') def getCurrentFileTransfer(self, params): status = self.tracker.getCurrentFileTransfer() if status is None: return Result(None, Hashtable()) else: return Result(None, Structs.getXmlRpcFileTransferStatus(status)) def getCurrentFileTransfers(self, params): xfers = self.tracker.getCurrentFileTransfers() if xfers is not None and len(xfers) > 0: return Result(None, Structs.getXmlRpcFileTransferStatuses(xfers)) else: return Result(None, Vector()) def getProductPctTransferred(self, params): return Result(Double, str(self.tracker.getPctTransferred((Structs.getProductFromXmlRpc(params[0]))))) def getRefPctTransferred(self, params): pct = self.tracker.getPctTransferred(Structs.getReferenceFromXmlRpc(params[0])) return Result(Double, str(pct)) def isTransferComplete(self, params): return Result(Boolean, _toJavaBoolean(self.tracker.isTransferComplete(Structs.getProductFromXmlRpc(params[0])))) def pagedQuery(self, params): ptype = Structs.getProductTypeFromXmlRpc(params[1]) query = Structs.getQueryFromXmlRpc(params[0]) return Result(None, Structs.getXmlRpcProductPage(self.catalog.pagedQuery(query, ptype, params[2]))) def getFirstPage(self, params): ptype = Structs.getProductTypeFromXmlRpc(params[0]) return Result(None, Structs.getXmlRpcProductPage(self.catalog.getFirstPage(ptype))) def getLastPage(self, params): ptype = Structs.getProductTypeFromXmlRpc(params[0]) return Result(None, Structs.getXmlRpcProductPage(self.catalog.getLastProductPage(ptype))) def getNextPage(self, params): ptype = Structs.getProductTypeFromXmlRpc(params[0]) page = Structs.getProductPageFromXmlRpc(params[1]) return Result(None, Structs.getXmlRpcProductPage(self.catalog.getNextPage(ptype, page))) def getPrevPage(self, params): ptype = Structs.getProductTypeFromXmlRpc(params[0]) page = Structs.getProductPageFromXmlRpc(params[1]) return Result(None, Structs.getXmlRpcProductPage(self.catalog.getPrevPage(ptype, page))) def addProductType(self, params): ptype = Structs.getProductTypeFromXmlRpc(params[0]) self.repo.addProductType(ptype) return Result(None, ptype.getProductTypeId()) def getNumProducts(self, params): ptype = Structs.getProductTypeFromXmlRpc(params[0]) return Result(Integer, str(self.catalog.getNumProducts(ptype))) def getTopNProducts(self, params): if len(params) == 1: return Result(None, Structs.getXmlRpcProductList(self.catalog.getTopNProducts(params[0]))) ptype = Structs.getProductTypeFromXmlRpc(params[1]) return Result(None, Structs.getXmlRpcProductList(self.catalog.getTopNProducts(params[0], ptype))) def hasProduct(self, params): p = self.catalog.getProductByName(params[0]) return Result(Boolean, _toJavaBoolean(p is not None and p.transferStatus == Product.STATUS_RECEIVED)) def getMetadata(self, params): return Result(None, self.catalog.getMetadata(Structs.getProductFromXmlRpc(params[0])).getHashtable()) def getProductTypes(self, params): return Result(None, Structs.getXmlRpcProductList(self.repo.getProductTypes())) def getProductReferences(self, params): p = Structs.getProductFromXmlRpc(params[0]) return Result(None, Structs.getXmlRpcReferences(self.catalog.getProductReferences(p))) def getProductById(self, params): return Result(None, Structs.getXmlRpcProduct(self.catalog.getProductById(params[0]))) def getProductByName(self, params): return Result(None, Structs.getXmlRpcProduct(self.catalog.getProductByName(params[0]))) def getProductsByProductType(self, params): ptype = Structs.getProductTypeFromXmlRpc(params[0]) return Result(None, Structs.getXmlRpcProductList(self.catalog.getProductsByProductType(ptype))) def getElementsByProductType(self, params): ptype = Structs.getProductTypeFromXmlRpc(params[0]) return Structs.getXmlRpcElementList(self.catalog.getValidationLayer().getElements(ptype)) def getElementById(self, params): return Structs.getXmlRpcElement(self.catalog.getValidationLayer().getElementById(params[0])) def getElementByName(self, params): return Structs.getXmlRpcElement(self.catalog.getValidationLayer().getElementByName(params[0])) def query(self, params): q = Structs.getQueryFromXmlRpc(params[0]) ptype = Structs.getProductTypeFromXmlRpc(params[1]) ids = self.catalog.query(q, ptype) if ids is not None and len(ids) > 0: return Result(None, [self.catalog.getProductById(i) for i in ids]) return Result(None, Vector()) def getProductTypeById(self, params): ptype = self.repo.getProductTypeById(params[0]) return Result(None, Structs.getXmlRpcProductType(ptype)) def catalogProduct(self, params): p = Structs.getProductFromXmlRpc(params[0]) return Result(None, self.catalog.addProduct(p)) def addMetadata(self, params): p = Structs.getProductFromXmlRpc(params[0]) m = Metadata() m.addMetadata(params[1]) self.catalog.addMetadata(m, p) return Result(Boolean, 'true') def transferFile(self, params): outFile, data, offset, numBytes = params if os.path.exists(outFile): out = file(outFile, 'ab') else: dirPath = os.dirname(outFile) os.makedirs(dirPath) out = file(outFile, 'wb') out.seek(offset) out.write(data) out.close() return Result(Boolean, 'true') def removeFile(self, params): os.remove(params[0]) return Result(Boolean, 'true') def addUser(self, params): userID = params[0] user = User(userID, params[1], params[2], _encodePassword(params[3]), []) self.userDB.users[userID] = user self.userDB.save() return Result(Boolean, 'true') def removeUser(self, params): del self.userDB.users[params[0]] return Result(Boolean, 'true') def addGroup(self, params): groupID = params[0] group = Group(groupID, params[1], params[2]) self.userDB.groups[groupID] = group self.userDB.save() return Result(Boolean, 'true') def removeGroup(self, params): groupID = params[0] del self.userDB.groups[groupID] for user in self.userDB.users.itervalues(): indexes = [] index = 0 for group in user.groups: if group.groupID == groupID: indexes.append(index) index += 1 indexes.reverse() for index in indexes: del user.groups[index] self.userDB.save() return Result(Boolean, 'true') def addUserToGroup(self, params): self.userDB.users[params[0]].groups.append(self.userDB.groups[params[1]]) return Result(Boolean, 'true') def removeUserFromGroup(self, params): groupID = params[1] user = self.userDB.users[params[0]] indexes = [] index = 0 for group in user.group: if group.groupID == groupID: indexes.append(index) index += 1 indexes.reverse() for index in indexes: del user.groups[index] self.userDB.save() return Result(Boolean, 'true') def addPermissionToGroup(self, params): self.userDB.groups[params[0]].perms.append(params[1]) self.userDB.save() return Result(Boolean, 'true') def removePermissionFromGroup(self, params): permName = params[1] group = self.userDB.groups[params[0]] indexes = [] index = 0 for perm in group.perms: if perm == permName: indexes.append(index) indexes.reverse() for index in indexes: del group.perms[index] self.userDB.save() return Result(Boolean, 'true')