From b11a5dd26581b52de69eede10bf464c1ca38262d Mon Sep 17 00:00:00 2001 From: Sinisa Veseli <sveseli@aps.anl.gov> Date: Tue, 11 Oct 2016 13:47:30 +0000 Subject: [PATCH] added rest web service functionality for adding/modifying users --- .../cli/updateUsersFromApsDbCli.py | 87 +++++++++++++++++++ src/python/dm/common/utility/encoder.py | 4 + .../dm/ds_web_service/api/userRestApi.py | 2 +- .../service/userInfoSessionController.py | 2 + 4 files changed, 94 insertions(+), 1 deletion(-) create mode 100755 src/python/dm/aps_user_db/cli/updateUsersFromApsDbCli.py diff --git a/src/python/dm/aps_user_db/cli/updateUsersFromApsDbCli.py b/src/python/dm/aps_user_db/cli/updateUsersFromApsDbCli.py new file mode 100755 index 00000000..7b99e8c3 --- /dev/null +++ b/src/python/dm/aps_user_db/cli/updateUsersFromApsDbCli.py @@ -0,0 +1,87 @@ +#!/usr/bin/env python + +from dm.common.exceptions.invalidRequest import InvalidRequest +from dm.common.cli.dmCli import DmCli +from dm.common.utility.configurationManager import ConfigurationManager +from dm.common.utility.ldapUserManager import LdapUserManager +from dm.aps_user_db.api.apsUserDbApi import ApsUserDbApi +from dm.ds_web_service.api.dsRestApiFactory import DsRestApiFactory + +class UpdateUsersFromApsDbCli(DmCli): + def __init__(self): + DmCli.__init__(self) + + def runCommand(self): + self.parseArgs(usage=""" + dm-update-users-from-aps-db + +Description: + Updates all users in DM LDAP and database using information from APS DB. + """) + ConfigurationManager.getInstance().setConfigFile('/home/oxygen/SVESELI/Work/DM/etc/dm.conf') + print ConfigurationManager.getInstance().getConfigOption('DsRestApiFactory', 'username') + apsUserDbApi = ApsUserDbApi() + userRestApi = DsRestApiFactory.getUserRestApi() + + + apsUsers = apsUserDbApi.getApsUsers() + self.logger.debug('Number of APS Users: %s' % len(apsUsers)) + dmUsers = userRestApi.getUsers() + self.logger.debug('Number of DM Users: %s' % len(dmUsers)) + dmUserBadgeMap = {} + for dmUser in dmUsers: + badge = dmUser.get('badge') + if badge: + dmUserBadgeMap[badge] = dmUser + self.logger.debug('Number of DM Users with badge: %s' % len(dmUserBadgeMap)) + + nCreatedUsers = 0 + nUpdatedUsers = 0 + for apsUser in apsUsers: + apsLastChangeDate = apsUser.get('lastChangeDate') + + badge = apsUser['badgeNumber'] + username = 'd%s' % badge + firstName = apsUser.get('firstName') + middleName = apsUser.get('middleName') + lastName = apsUser.get('lastName') + email = apsUser.get('email') + isLocalUser = 0 + lastUpdate = str(apsLastChangeDate) + globusUsername = None + description = None + password = None + + dmUser = dmUserBadgeMap.get(badge) + if not dmUser: + self.logger.debug('Creating user with badge %s: %s' % (badge, apsUser['name'])) + + userRestApi.addUser(username, firstName, lastName, middleName, email, badge, globusUsername, description, password, isLocalUser, lastUpdate) + nCreatedUsers += 1 + else: + dmLastUpdate = dmUser.get('lastUpdate') + if not dmLastUpdate or dmLastUpdate < apsLastChangeDate: + id = dmUser.get('id') + self.logger.debug('Modifying user with badge %s: %s (DM id: %s)' % (badge, apsUser['name'], id)) + userRestApi.updateUser(id, username, firstName, lastName, middleName, email, badge, globusUsername, description, password, isLocalUser, lastUpdate) + nUpdatedUsers += 1 + else: + # User is up to date + pass + + + #ldapUserManager = LdapUserManager('ldaps://dmid-vm.xray.aps.anl.gov:636', 'uid=dmadmin,ou=People,o=aps.anl.gov,dc=aps,dc=anl,dc=gov', '/tmp/ldapPassword', userDnFormat='uid=%s,ou=DM,ou=People,o=aps.anl.gov,dc=aps,dc=anl,dc=gov', groupDnFormat='cn=%s,ou=DM,ou=Group,o=aps.anl.gov,dc=aps,dc=anl,dc=gov', minGidNumber=66000) + #ldapUser = ldapUserManager.getUserInfo(username) + #print 'Old LDAP User Info: ', ldapUser + #attrDict = {} + #attrDict['gecos'] = apsUser['name'] + #attrDict['userPassword'] = apsUser['passwordHashValue'] + #ldapUserManager.modifyUserInfo(username, attrDict) + #ldapUser = ldapUserManager.getUserInfo(username) + #print 'New LDAP User Info: ', ldapUser + +####################################################################### +# Run command. +if __name__ == '__main__': + cli = UpdateUsersFromApsDbCli() + cli.run() diff --git a/src/python/dm/common/utility/encoder.py b/src/python/dm/common/utility/encoder.py index b4d0e9ec..f88f5623 100755 --- a/src/python/dm/common/utility/encoder.py +++ b/src/python/dm/common/utility/encoder.py @@ -8,11 +8,15 @@ class Encoder: def encode(cls, data): # Encode twice, in order to avoid issues like '+' being # interpreted as space after decoding + if not data: + return data encodedData = base64.b64encode(base64.encodestring('%s' % data)) return encodedData @classmethod def decode(cls, encodedData): + if not encodedData: + return encodedData data = base64.decodestring(base64.b64decode('%s' % encodedData)) return data diff --git a/src/python/dm/ds_web_service/api/userRestApi.py b/src/python/dm/ds_web_service/api/userRestApi.py index 3ed80831..4a7946d9 100755 --- a/src/python/dm/ds_web_service/api/userRestApi.py +++ b/src/python/dm/ds_web_service/api/userRestApi.py @@ -64,7 +64,7 @@ class UserRestApi(DsRestApi): if isLocalUser: url += '&isLocaUser=%s' % isLocalUser if lastUpdate: - url += '&lastUpdate=%s' % lastUpdate + url += '&lastUpdate=%s' % Encoder.encode(str(lastUpdate)) responseData = self.sendSessionRequest(url=url, method='POST') return UserInfo(responseData) diff --git a/src/python/dm/ds_web_service/service/userInfoSessionController.py b/src/python/dm/ds_web_service/service/userInfoSessionController.py index 52756f87..d72fd637 100755 --- a/src/python/dm/ds_web_service/service/userInfoSessionController.py +++ b/src/python/dm/ds_web_service/service/userInfoSessionController.py @@ -1,6 +1,8 @@ #!/usr/bin/env python import cherrypy + +from dm.common.utility.encoder import Encoder from dm.common.service.dmSessionController import DmSessionController from dm.ds_web_service.service.impl.userInfoSessionControllerImpl import UserInfoSessionControllerImpl -- GitLab