Skip to content
Snippets Groups Projects
Commit fee5b609 authored by sveseli's avatar sveseli
Browse files

merge from 0.7 branch

parents fbbd893c 0d07db0e
No related branches found
No related tags found
No related merge requests found
...@@ -82,6 +82,6 @@ class FtpUtility: ...@@ -82,6 +82,6 @@ class FtpUtility:
# Testing. # Testing.
if __name__ == '__main__': if __name__ == '__main__':
ftpUtility = FtpUtility('zagreb', 2811) ftpUtility = FtpUtility('s8dserv', 2811)
files=ftpUtility.getFiles('/tmp/test') files=ftpUtility.getFiles('/export/8-id-i/test')
print files print files
#!/usr/bin/env python #!/usr/bin/env python
import grp
import ldap import ldap
import ldap.modlist import ldap.modlist
import copy import copy
...@@ -165,22 +166,57 @@ class LdapLinuxPlatformUtility: ...@@ -165,22 +166,57 @@ class LdapLinuxPlatformUtility:
logger.error('Could not add user %s to group %s: %s' % (username, groupName, ex)) logger.error('Could not add user %s to group %s: %s' % (username, groupName, ex))
raise InternalError(exception=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 @classmethod
def addLocalUserToGroup(cls, username, groupName): def createLocalGroup(cls, name):
""" Add local user to group. """ """ Create local group if it does not exist. """
logger = cls.getLogger() logger = cls.getLogger()
logger.debug('Adding local user %s to group %s' % (username, groupName)) try:
cmd = '%s -a %s %s' % (cls.GPASSWD_CMD, username, groupName) 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) cls.executeSudoCommand(cmd)
@classmethod def addLocalUserToGroup(self, username, groupName):
def deleteLocalUserFromGroup(cls, username, groupName): """ Add local user to group. """
self.addUserToGroup(username, groupName)
def deleteLocalUserFromGroup(self, username, groupName):
""" Remove local user from group. """ """ Remove local user from group. """
logger = cls.getLogger() self.deleteUserFromGroup(username, groupName)
logger.debug('Removing local user %s from group %s' % (username, groupName))
cmd = '%s -d %s %s' % (cls.GPASSWD_CMD, username, groupName)
cls.executeSudoCommand(cmd)
def getGroupInfo(self, groupName): def getGroupInfo(self, groupName):
""" Get given group info. """ """ Get given group info. """
...@@ -241,5 +277,9 @@ class LdapLinuxPlatformUtility: ...@@ -241,5 +277,9 @@ class LdapLinuxPlatformUtility:
if __name__ == '__main__': 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) 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')
...@@ -86,7 +86,12 @@ class ExperimentSessionControllerImpl(DmObjectManager): ...@@ -86,7 +86,12 @@ class ExperimentSessionControllerImpl(DmObjectManager):
fileInfo['daqInfo'] = daqInfo fileInfo['daqInfo'] = daqInfo
fileInfo['uploadId'] = uploadId fileInfo['uploadId'] = uploadId
fileUploadInfo = { 'processed' : False } 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 fileDict[filePath] = fileUploadInfo
fileProcessingManager.processFile(fileInfo) fileProcessingManager.processFile(fileInfo)
uploadInfo['fileDict'] = fileDict uploadInfo['fileDict'] = fileDict
......
...@@ -64,8 +64,10 @@ class FileRestApi(DsRestApi): ...@@ -64,8 +64,10 @@ class FileRestApi(DsRestApi):
if experimentFilePath: if experimentFilePath:
src = '%s/%s' % (src, experimentFilePath) src = '%s/%s' % (src, experimentFilePath)
dest = destDirectory 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)) self.logger.info('Executing file download on behalf of %s (experiment: %s)' % (username, experimentName))
fileTransfer.execute() fileTransfer.execute()
finally: finally:
......
...@@ -24,6 +24,7 @@ class ExperimentManager(Singleton): ...@@ -24,6 +24,7 @@ class ExperimentManager(Singleton):
MANAGE_STORAGE_PERMISSIONS_KEY = 'managestoragepermissions' MANAGE_STORAGE_PERMISSIONS_KEY = 'managestoragepermissions'
PLATFORM_UTILITY_KEY = 'platformutility' PLATFORM_UTILITY_KEY = 'platformutility'
RSYNC_SCRIPT_PERMISSIONS_MODE = 0755
FILE_PERMISSIONS_MODE = 0640 FILE_PERMISSIONS_MODE = 0640
DIR_PERMISSIONS_MODE = 0750 DIR_PERMISSIONS_MODE = 0750
...@@ -91,22 +92,39 @@ class ExperimentManager(Singleton): ...@@ -91,22 +92,39 @@ class ExperimentManager(Singleton):
experimentUsers = experiment.get('experimentUsernameList', []) experimentUsers = experiment.get('experimentUsernameList', [])
self.platformUtility.setGroupUsers(experimentName, experimentUsers) 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): def authorizeDownload(self, username, experimentName):
self.logger.debug('Authorizing download for %s from experiment %s' % (username, experimentName))
experiment = self.experimentDbApi.getExperimentByName(experimentName) experiment = self.experimentDbApi.getExperimentByName(experimentName)
storageDirectory = self.updateExperimentWithStorageDataDirectory(experiment) storageDirectory = self.updateExperimentWithStorageDataDirectory(experiment)
if os.path.exists(storageDirectory): if os.path.exists(storageDirectory):
self.platformUtility.addLocalUserToGroup(username, experimentName) self.platformUtility.addLocalUserToGroup(username, experimentName)
else: else:
raise InvalidRequest('Experiment %s has not been started.' % experimentName) raise InvalidRequest('Experiment %s has not been started.' % experimentName)
self.createRsyncScript(username, experimentName)
return experiment return experiment
def deauthorizeDownload(self, username, experimentName): def deauthorizeDownload(self, username, experimentName):
experiment = self.experimentDbApi.getExperimentByName(experimentName) experiment = self.experimentDbApi.getExperimentByName(experimentName)
self.logger.debug('De-authorizing download for %s from experiment %s' % (username, experimentName))
storageDirectory = self.updateExperimentWithStorageDataDirectory(experiment) storageDirectory = self.updateExperimentWithStorageDataDirectory(experiment)
if os.path.exists(storageDirectory): if os.path.exists(storageDirectory):
self.platformUtility.deleteLocalUserFromGroup(username, experimentName) self.platformUtility.deleteLocalUserFromGroup(username, experimentName)
else: else:
raise InvalidRequest('Experiment %s has not been started.' % experimentName) raise InvalidRequest('Experiment %s has not been started.' % experimentName)
self.deleteRsyncScript(username, experimentName)
return experiment return experiment
def createExperimentGroup(self, experiment): def createExperimentGroup(self, experiment):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment