diff --git a/src/python/dm/common/utility/ftpUtility.py b/src/python/dm/common/utility/ftpUtility.py index ab6f03146e13f9b4b90361973627e8001af13a83..8a75aed46f25d0ed5805ca8d33ca6486bc6b9ba0 100755 --- a/src/python/dm/common/utility/ftpUtility.py +++ b/src/python/dm/common/utility/ftpUtility.py @@ -82,6 +82,6 @@ class FtpUtility: # Testing. if __name__ == '__main__': - ftpUtility = FtpUtility('zagreb', 2811) - files=ftpUtility.getFiles('/tmp/test') + ftpUtility = FtpUtility('s8dserv', 2811) + files=ftpUtility.getFiles('/export/8-id-i/test') print files diff --git a/src/python/dm/common/utility/ldapLinuxPlatformUtility.py b/src/python/dm/common/utility/ldapLinuxPlatformUtility.py index 4db4845577f4b25d4d44ae666ed51701a4b01f98..3b4e1a1aff2c0dba6ef9b356d9db3023a8c29417 100755 --- a/src/python/dm/common/utility/ldapLinuxPlatformUtility.py +++ b/src/python/dm/common/utility/ldapLinuxPlatformUtility.py @@ -1,5 +1,6 @@ #!/usr/bin/env python +import grp import ldap import ldap.modlist import copy @@ -165,22 +166,57 @@ class LdapLinuxPlatformUtility: logger.error('Could not add user %s to group %s: %s' % (username, groupName, ex)) raise InternalError(exception=ex) + def deleteUserFromGroup(self, username, groupName): + """ Remove user from group. """ + logger = self.getLogger() + ldapClient = self.getLdapClient() + username = str(username) + groupName = str(groupName) + try: + groupDn = self.groupDnFormat % groupName + resultList = ldapClient.search_s(groupDn, ldap.SCOPE_BASE) + groupTuple = resultList[0] + groupAttrs = groupTuple[1] + memberUidList = groupAttrs.get('memberUid', []) + if username not in memberUidList: + logger.debug('Group %s does not contain user %s' % (groupName, username)) + return + except Exception, ex: + raise InternalError(exception=ex) + logger.debug('Removing user %s from group %s' % (username, groupName)) + memberUidList2 = copy.copy(memberUidList) + memberUidList2.remove(username) + groupAttrs2 = copy.copy(groupAttrs) + groupAttrs2['memberUid'] = memberUidList2 + try: + groupLdif = ldap.modlist.modifyModlist(groupAttrs, groupAttrs2) + ldapClient.modify_s(groupDn, groupLdif) + except Exception, ex: + logger.error('Could not remove user %s from group %s: %s' % (username, groupName, ex)) + raise InternalError(exception=ex) @classmethod - def addLocalUserToGroup(cls, username, groupName): - """ Add local user to group. """ + def createLocalGroup(cls, name): + """ Create local group if it does not exist. """ logger = cls.getLogger() - logger.debug('Adding local user %s to group %s' % (username, groupName)) - cmd = '%s -a %s %s' % (cls.GPASSWD_CMD, username, groupName) + try: + group = grp.getgrnam(name) + logger.debug('Group %s already exists' % name) + return + except KeyError, ex: + # ok, we need to create group + pass + logger.debug('Creating group %s' % name) + cmd = '%s %s' % (cls.GROUPADD_CMD, name) cls.executeSudoCommand(cmd) - @classmethod - def deleteLocalUserFromGroup(cls, username, groupName): + def addLocalUserToGroup(self, username, groupName): + """ Add local user to group. """ + self.addUserToGroup(username, groupName) + + def deleteLocalUserFromGroup(self, username, groupName): """ Remove local user from group. """ - logger = cls.getLogger() - logger.debug('Removing local user %s from group %s' % (username, groupName)) - cmd = '%s -d %s %s' % (cls.GPASSWD_CMD, username, groupName) - cls.executeSudoCommand(cmd) + self.deleteUserFromGroup(username, groupName) def getGroupInfo(self, groupName): """ Get given group info. """ @@ -241,5 +277,9 @@ class LdapLinuxPlatformUtility: if __name__ == '__main__': utility = LdapLinuxPlatformUtility('ldaps://dmid-vm.xray.aps.anl.gov:636', 'uid=dmadmin,ou=People,o=aps.anl.gov,dc=aps,dc=anl,dc=gov', '/tmp/ldapPassword', groupDnFormat='cn=%s,ou=DM,ou=Group,o=aps.anl.gov,dc=aps,dc=anl,dc=gov', minGidNumber=66000) - print utility.getGroupInfo(u'satija201510') + print utility.getGroupInfo(u'id8i-test02') + utility.addLocalUserToGroup(u'sveseli', u'id8i-test02') + print utility.getGroupInfo(u'id8i-test02') + #utility.deleteLocalUserFromGroup(u'sveseli', u'id8i-test02') + #print utility.getGroupInfo(u'id8i-test02') diff --git a/src/python/dm/daq_web_service/service/impl/experimentSessionControllerImpl.py b/src/python/dm/daq_web_service/service/impl/experimentSessionControllerImpl.py index c047191b20cf0088144e83df7bf61b85dcb348c6..07085c6d180fb1717b6bd48f664dd47dd0d3662a 100755 --- a/src/python/dm/daq_web_service/service/impl/experimentSessionControllerImpl.py +++ b/src/python/dm/daq_web_service/service/impl/experimentSessionControllerImpl.py @@ -86,7 +86,12 @@ class ExperimentSessionControllerImpl(DmObjectManager): fileInfo['daqInfo'] = daqInfo fileInfo['uploadId'] = uploadId fileUploadInfo = { 'processed' : False } - FileUtility.statFile(filePath, fileUploadInfo) + # Stat should be done by agent, not by observer. + try: + FileUtility.statFile(filePath, fileUploadInfo) + except: + # Ok, may be remote file + pass fileDict[filePath] = fileUploadInfo fileProcessingManager.processFile(fileInfo) uploadInfo['fileDict'] = fileDict diff --git a/src/python/dm/ds_web_service/api/fileRestApi.py b/src/python/dm/ds_web_service/api/fileRestApi.py index 6d0c5d96683d53ea32e434ea8f61bb4f2815597e..52cf596eef2f7d795662d86159cc81539b69d7ba 100755 --- a/src/python/dm/ds_web_service/api/fileRestApi.py +++ b/src/python/dm/ds_web_service/api/fileRestApi.py @@ -64,8 +64,10 @@ class FileRestApi(DsRestApi): if experimentFilePath: src = '%s/%s' % (src, experimentFilePath) dest = destDirectory - - fileTransfer = RsyncFileTransfer(src=src, dest=dest) + + rsyncPath = '/tmp/rsync.%s.%s' % (username, experimentName) + flags = '-arvlP --rsync-path="%s"' % rsyncPath + fileTransfer = RsyncFileTransfer(src=src, dest=dest, flags=flags) self.logger.info('Executing file download on behalf of %s (experiment: %s)' % (username, experimentName)) fileTransfer.execute() finally: diff --git a/src/python/dm/ds_web_service/service/impl/experimentManager.py b/src/python/dm/ds_web_service/service/impl/experimentManager.py index 108b62ff5d01959dafffc3962d75504dbd4ed626..de809aeb4357f43bfd568911358d774d9c8b18f1 100755 --- a/src/python/dm/ds_web_service/service/impl/experimentManager.py +++ b/src/python/dm/ds_web_service/service/impl/experimentManager.py @@ -24,6 +24,7 @@ class ExperimentManager(Singleton): MANAGE_STORAGE_PERMISSIONS_KEY = 'managestoragepermissions' PLATFORM_UTILITY_KEY = 'platformutility' + RSYNC_SCRIPT_PERMISSIONS_MODE = 0755 FILE_PERMISSIONS_MODE = 0640 DIR_PERMISSIONS_MODE = 0750 @@ -91,22 +92,39 @@ class ExperimentManager(Singleton): experimentUsers = experiment.get('experimentUsernameList', []) self.platformUtility.setGroupUsers(experimentName, experimentUsers) + def createRsyncScript(self, username, experimentName): + fileName = '/tmp/rsync.%s.%s' % (username, experimentName) + self.logger.debug('Creating rsync script %s' % (fileName)) + f = open(fileName, 'w') + f.write('#!/bin/sh\n') + f.write('exec sg %s "rsync $*"\n' % experimentName) + f.close() + OsUtility.chmodPath(fileName, fileMode=self.RSYNC_SCRIPT_PERMISSIONS_MODE) + def deleteRsyncScript(self, username, experimentName): + fileName = '/tmp/rsync.%s.%s' % (username, experimentName) + self.logger.debug('Removing rsync script %s' % (fileName)) + OsUtility.removeFile(fileName) + def authorizeDownload(self, username, experimentName): + self.logger.debug('Authorizing download for %s from experiment %s' % (username, experimentName)) experiment = self.experimentDbApi.getExperimentByName(experimentName) storageDirectory = self.updateExperimentWithStorageDataDirectory(experiment) if os.path.exists(storageDirectory): self.platformUtility.addLocalUserToGroup(username, experimentName) else: raise InvalidRequest('Experiment %s has not been started.' % experimentName) + self.createRsyncScript(username, experimentName) return experiment def deauthorizeDownload(self, username, experimentName): experiment = self.experimentDbApi.getExperimentByName(experimentName) + self.logger.debug('De-authorizing download for %s from experiment %s' % (username, experimentName)) storageDirectory = self.updateExperimentWithStorageDataDirectory(experiment) if os.path.exists(storageDirectory): self.platformUtility.deleteLocalUserFromGroup(username, experimentName) else: raise InvalidRequest('Experiment %s has not been started.' % experimentName) + self.deleteRsyncScript(username, experimentName) return experiment def createExperimentGroup(self, experiment):