def create(self): print "In order to create a new group, we need some information." self.group = LBEGroup() self.group.name = "groups" self._setGroupName() print "---------------------------------------------------------" print "Enter the ID of the Object Template:" self._setObjectTemplate() print "---------------------------------------------------------" print "Enter the ID of script for the group:" self._setScript() print "---------------------------------------------------------" print "- \033[33mWARNING\033[0m -" print "---------------------------------------------------------" self.group.objectTemplate = self.objectTemplate self.group.script = self.script self.viewGroup() choice = raw_input("Do you want to create the new group? [Y/n]\033[0m") if choice == 'n': return False self.group.synced_at = django.utils.timezone.now() groupHelper = GroupInstanceHelper(self.group, LBEGroupInstance(self.group)) groupHelper.createTemplate() self.group.save() print "\033[32mGroup Saved!\033[0m" return True
def searchPattern(request, pattern): if request.is_ajax(): if pattern == '': return HttpResponse('Please enter a query.') objectsTemplate = LBEObjectTemplate.objects.all() resultObjects = [] groupsTemplate = LBEGroup.objects.all() resultGroups = [] for ot in objectsTemplate: objectHelper = LBEObjectInstanceHelper(ot) result = objectHelper.searchPattern(pattern) if result: resultObjects.append(result) for gt in groupsTemplate: groupHelper = GroupInstanceHelper(gt) result = groupHelper.searchPattern(pattern) if result: resultGroups.append(result) return render_to_response("directory/default/search/result.html", { 'objects': resultObjects, 'groups': resultGroups }, context_instance=RequestContext(request))
def viewGroup(request, group_id): groupList = [] groupName = "" object_id = 0 try: lbeGroup = LBEGroup.objects.get(id=group_id) groupInstance = GroupInstanceHelper(lbeGroup) groupValues = groupInstance.get() groupName = groupValues.name object_id = lbeGroup.objectTemplate.id if ( not groupInstance.attributeName in groupValues.changes["set"] or groupValues.changes["set"][groupInstance.attributeName] == [] ): groupList = groupValues.attributes[groupInstance.attributeName] else: groupList = groupValues.changes["set"][groupInstance.attributeName] except BaseException as e: print e groupValues = [] return render_to_response( "directory/default/group/view.html", {"groupName": groupName, "groupList": groupList, "group_id": group_id, "object_id": object_id}, context_instance=RequestContext(request), )
def manageGroup(request, group_id=None): try: form = [] groups = LBEGroup.objects.all() group = LBEGroup.objects.get(id=group_id) oldObjectTemplate = group.objectTemplate oldNameObjectTemplate = group.displayName if request.method == "POST": POST = request.POST.copy() POST['synced_at'] = group.synced_at form = LBEGroupForm(POST, instance=group) if form.is_valid(): form.save() # Manage it to the Backend groupHelper = GroupInstanceHelper(group, LBEGroupInstance(form.instance)) groupHelper.modifyTemplate(oldObjectTemplate, oldNameObjectTemplate) messages.add_message(request, messages.SUCCESS, "Group saved") else: messages.add_message(request, messages.ERROR, "Error to save the Group.") else: form = LBEGroupForm(instance=group) except BaseException as e: print e try: form = LBEGroupForm(instance=groups[0]) group_id = groups[0].id except BaseException: pass info_change_object = "By changing the Object Template, all employees's group will be removed." return render_to_response('config/group/modify.html',{'groupForm':form,'groups':groups,'group_id':group_id, 'info_change_object': info_change_object}, context_instance=RequestContext(request))
def manageGroup(request, group_id): try: lbeGroup = LBEGroup.objects.get(id=group_id) groupInstance = GroupInstanceHelper(lbeGroup) if request.method == "POST": form = groupInstance.form(request.POST) if form.is_valid(): groupInstance.save() messages.add_message(request, messages.SUCCESS, "The Group is successfully saved.") else: messages.add_message(request, messages.ERROR, "Error to save the group '" + lbeGroup.displayName + "'") else: form = groupInstance.form() except BaseException as e: print e return render_to_response( "directory/default/group/manage.html", { "form": form, "group_id": group_id, "attributeName": lbeGroup.objectTemplate.instanceNameAttribute.displayName, "attributeMember": groupInstance.attributeName, }, context_instance=RequestContext(request), )
def searchPattern(request, pattern): if request.is_ajax(): if pattern == "": return HttpResponse("Please enter a query.") objectsTemplate = LBEObjectTemplate.objects.all() resultObjects = [] groupsTemplate = LBEGroup.objects.all() resultGroups = [] for ot in objectsTemplate: objectHelper = LBEObjectInstanceHelper(ot) result = objectHelper.searchPattern(pattern) if result: resultObjects.append(result) for gt in groupsTemplate: groupHelper = GroupInstanceHelper(gt) result = groupHelper.searchPattern(pattern) if result: resultGroups.append(result) return render_to_response( "directory/default/search/result.html", {"objects": resultObjects, "groups": resultGroups}, context_instance=RequestContext(request), )
def viewGroup(request, group_id): groupList = [] groupName = '' object_id = 0 try: lbeGroup = LBEGroup.objects.get(id=group_id) groupInstance = GroupInstanceHelper(lbeGroup) groupValues = groupInstance.get() groupName = groupValues.name object_id = lbeGroup.objectTemplate.id if not groupInstance.attributeName in groupValues.changes[ 'set'] or groupValues.changes['set'][ groupInstance.attributeName] == []: groupList = groupValues.attributes[groupInstance.attributeName] else: groupList = groupValues.changes['set'][groupInstance.attributeName] except BaseException as e: print e groupValues = [] return render_to_response('directory/default/group/view.html', { 'groupName': groupName, 'groupList': groupList, 'group_id': group_id, 'object_id': object_id }, context_instance=RequestContext(request))
def deleteGroup(request, group_id): try: group = LBEGroup.objects.get(id=group_id) instanceHelper = GroupInstanceHelper(group) instanceHelper.remove() messages.add_message(request, messages.SUCCESS, "group '" + group.name + "' removed.") except BaseException as e: print e pass return HttpResponseRedirect("/directory/group")
def deleteGroup(request, group_id): try: group = LBEGroup.objects.get(id=group_id) instanceHelper = GroupInstanceHelper(group) instanceHelper.remove() messages.add_message(request, messages.SUCCESS, "group '" + group.name + "' removed.") except BaseException as e: print e pass return HttpResponseRedirect('/directory/group')
def viewAllGroup(request): groups = LBEGroup.objects.all() groupsInstance = [] for group in groups: groupInstance = GroupInstanceHelper(group) try: groupsInstance.append(groupInstance.get()) except BaseException as e: print e pass return render_to_response('directory/default/group/index.html', {'groups': groupsInstance}, context_instance=RequestContext(request))
def viewAllGroup(request): groups = LBEGroup.objects.all() groupsInstance = [] for group in groups: groupInstance = GroupInstanceHelper(group) try: groupsInstance.append(groupInstance.get()) except BaseException as e: print e pass return render_to_response( "directory/default/group/index.html", {"groups": groupsInstance}, context_instance=RequestContext(request) )
def addGroup(request): if request.method == "POST": POST = request.POST.copy() POST['synced_at'] = django.utils.timezone.now() form = LBEGroupForm(POST) if form.is_valid(): # Create it to the Backend groupHelper = GroupInstanceHelper(form.instance, LBEGroupInstance(form.instance)) groupHelper.createTemplate() # Save it to LBE form.save() messages.add_message(request,messages.SUCCESS, "Group saved") else: messages.add_message(request,messages.ERROR, "Error to save the Group.") else: form = LBEGroupForm() return render_to_response('config/group/create.html', {'groupForm': form}, context_instance=RequestContext(request))
def addGroup(request): if request.method == "POST": POST = request.POST.copy() POST['synced_at'] = django.utils.timezone.now() form = LBEGroupForm(POST) if form.is_valid(): # Create it to the Backend groupHelper = GroupInstanceHelper(form.instance, LBEGroupInstance(form.instance)) groupHelper.createTemplate() # Save it to LBE form.save() messages.add_message(request, messages.SUCCESS, "Group saved") else: messages.add_message(request, messages.ERROR, "Error to save the Group.") else: form = LBEGroupForm() return render_to_response('config/group/create.html', {'groupForm': form}, context_instance=RequestContext(request))
def _notExistObjectLBE(self): print ' Checking for Objects which do not exist into LBE but in LDAP Server:' for objectTemplate in LBEObjectTemplate.objects.all(): print " - \033[35m" + objectTemplate.name + '\033[0m...' objHelper = LBEObjectInstanceHelper(objectTemplate) try: scope = objHelper.callScriptClassMethod("search_scope") except BaseException: scope = 0 objTarget = self.target.searchObjects(objectTemplate, scope) objBackend = self.backend.searchObjects(objectTemplate) number = 0 for ot in objTarget: exist = False for ob in objBackend: if ot.name == ob.name: exist = True break if not exist: number += 1 print " " + ot.name if number == 0: print ' \033[91m<None>\033[0m' print "" print ' Checking for Groups which do not exist into LBE but in LDAP Server:' number = 0 for groupTemplate in LBEGroup.objects.all(): grpHelper = GroupInstanceHelper(groupTemplate) try: scope = grpHelper.callScriptClassMethod("search_scope") except BaseException: scope = 0 grpTarget = self.target.searchObjects( groupTemplate, scope, '(cn=' + groupTemplate.displayName + ')') grpBackend = self.backend.searchObjectsByPattern( groupTemplate, groupTemplate.displayName) if not grpBackend: print " - \033[36m" + groupTemplate.displayName + "\033[0m does not exists." number += 1 if number == 0: print ' \033[91m<None>\033[0m'
def deleteObjectInstance(request, lbeObject_id, objectName): backend = BackendHelper() lbeObject = LBEObjectTemplate.objects.get(id=lbeObject_id) # change status code user: instanceHelper = LBEObjectInstanceHelper(lbeObject) # Remove the object from groups if exists: for group in LBEGroup.objects.all(): groupHelper = GroupInstanceHelper(group) try: groupHelper.removeObjectInstance(lbeObject, objectName) except KeyError: pass # same values # Set to Delete for object Instance instanceHelper.remove(objectName) # Current page from the object deleted: position = backend.positionObject(lbeObject.name, objectName) lengthMax = 10 page = int(math.ceil(position / float(lengthMax))) return HttpResponseRedirect('/directory/' + lbeObject_id + "/1")
def deleteObjectInstance(request, lbeObject_id, objectName): backend = BackendHelper() lbeObject = LBEObjectTemplate.objects.get(id=lbeObject_id) # change status code user: instanceHelper = LBEObjectInstanceHelper(lbeObject) # Remove the object from groups if exists: for group in LBEGroup.objects.all(): groupHelper = GroupInstanceHelper(group) try: groupHelper.removeObjectInstance(lbeObject, objectName) except KeyError: pass # same values # Set to Delete for object Instance instanceHelper.remove(objectName) # Current page from the object deleted: position = backend.positionObject(lbeObject.name, objectName) lengthMax = 10 page = int(math.ceil(position / float(lengthMax))) return HttpResponseRedirect("/directory/" + lbeObject_id + "/1")
def manageGroup(request, group_id): try: lbeGroup = LBEGroup.objects.get(id=group_id) groupInstance = GroupInstanceHelper(lbeGroup) if request.method == "POST": form = groupInstance.form(request.POST) if form.is_valid(): groupInstance.save() messages.add_message(request, messages.SUCCESS, "The Group is successfully saved.") else: messages.add_message( request, messages.ERROR, "Error to save the group '" + lbeGroup.displayName + "'") else: form = groupInstance.form() except BaseException as e: print e return render_to_response( 'directory/default/group/manage.html', { 'form': form, 'group_id': group_id, 'attributeName': lbeGroup.objectTemplate.instanceNameAttribute.displayName, 'attributeMember': groupInstance.attributeName }, context_instance=RequestContext(request))
def _notExistObjectLBE(self): print ' Checking for Objects which do not exist into LBE but in LDAP Server:' for objectTemplate in LBEObjectTemplate.objects.all(): print " - \033[35m" + objectTemplate.name + '\033[0m...' objHelper = LBEObjectInstanceHelper(objectTemplate) try: scope = objHelper.callScriptClassMethod("search_scope") except BaseException: scope = 0 objTarget = self.target.searchObjects(objectTemplate, scope) objBackend = self.backend.searchObjects(objectTemplate) number = 0 for ot in objTarget: exist = False for ob in objBackend: if ot.name == ob.name: exist = True break if not exist: number += 1 print " " + ot.name if number == 0: print ' \033[91m<None>\033[0m' print "" print ' Checking for Groups which do not exist into LBE but in LDAP Server:' number = 0 for groupTemplate in LBEGroup.objects.all(): grpHelper = GroupInstanceHelper(groupTemplate) try: scope = grpHelper.callScriptClassMethod("search_scope") except BaseException: scope = 0 grpTarget = self.target.searchObjects(groupTemplate, scope, '(cn=' + groupTemplate.displayName + ')') grpBackend = self.backend.searchObjectsByPattern(groupTemplate, groupTemplate.displayName) if not grpBackend: print " - \033[36m" + groupTemplate.displayName + "\033[0m does not exists." number += 1 if number == 0: print ' \033[91m<None>\033[0m'
def manageGroup(request, group_id=None): try: form = [] groups = LBEGroup.objects.all() group = LBEGroup.objects.get(id=group_id) oldObjectTemplate = group.objectTemplate oldNameObjectTemplate = group.displayName if request.method == "POST": POST = request.POST.copy() POST['synced_at'] = group.synced_at form = LBEGroupForm(POST, instance=group) if form.is_valid(): form.save() # Manage it to the Backend groupHelper = GroupInstanceHelper( group, LBEGroupInstance(form.instance)) groupHelper.modifyTemplate(oldObjectTemplate, oldNameObjectTemplate) messages.add_message(request, messages.SUCCESS, "Group saved") else: messages.add_message(request, messages.ERROR, "Error to save the Group.") else: form = LBEGroupForm(instance=group) except BaseException as e: print e try: form = LBEGroupForm(instance=groups[0]) group_id = groups[0].id except BaseException: pass info_change_object = "By changing the Object Template, all employees's group will be removed." return render_to_response('config/group/modify.html', { 'groupForm': form, 'groups': groups, 'group_id': group_id, 'info_change_object': info_change_object }, context_instance=RequestContext(request))
def modifyObject(request, obj_id=None, instance_id=None): objectForm = None lbeObjectTemplate = LBEObjectTemplate.objects.get(id=obj_id) if request.method == 'POST': # we can't modify the Synced_at value POST = request.POST.copy() POST['synced_at'] = lbeObjectTemplate.synced_at # POST modification objectForm = LBEObjectTemplateForm(POST, instance=lbeObjectTemplate) oldNAttribute = lbeObjectTemplate.instanceNameAttribute.name oldDNAttribute = lbeObjectTemplate.instanceDisplayNameAttribute.id if objectForm.is_valid(): # change the _id value if changed: if not oldNAttribute == request.POST['instanceNameAttribute']: changeID = True else: changeID = False # change the displayName value if changed: if not oldDNAttribute == int(request.POST['instanceDisplayNameAttribute']): DN = True else: DN = False if changeID or DN: if changeID is True: objectForm.instance.instanceNameBeforeAttribute = LBEAttribute.objects.get( name__iexact=oldNAttribute) objectForm.instance.needReconciliationRDN = True backend = BackendHelper() ob = backend.searchObjects(lbeObjectTemplate) try: for o in ob: if changeID: # change the _id value backend.update_id(lbeObjectTemplate, o, o.attributes[request.POST['instanceNameAttribute']][0]) # the RDN Attribute from Target Server is replace into the Reconciliation if DN: attribute = LBEAttribute.objects.get(id=request.POST['instanceDisplayNameAttribute']) backend.modifyDisplayName(lbeObjectTemplate, o.name, o.attributes[attribute.name][0]) # Groups if changeID: groups = LBEGroup.objects.filter(objectTemplate=lbeObjectTemplate) for group in groups: InstanceHelper = GroupInstanceHelper(group) InstanceHelper.changeIDObjects() except KeyError: messages.add_message(request, messages.ERROR, 'Error while saving object, "' + request.POST[ 'instanceNameAttribute'] + '" does not exist for the Object.') return redirect('/config/object/modify/' + obj_id) objectForm.save() messages.add_message(request, messages.SUCCESS, 'Object saved') return redirect('/config/object/modify/' + obj_id) else: messages.add_message(request, messages.ERROR, 'Error while saving object.') else: if obj_id is None: messages.add_message(request, messages.INFO, 'Object id is missing.') return render_to_response('config/object/list.html', {'objects': LBEObjectTemplate.objects.all()}) else: objectForm = LBEObjectTemplateForm(instance=lbeObjectTemplate) attForm = LBEAttributeInstanceForm() instances = LBEAttributeInstance.objects.filter(lbeObjectTemplate=lbeObjectTemplate).order_by('position') # which attribute have ajax request: ajaxAttribute = 'instanceNameAttribute' defaultValue = lbeObjectTemplate.instanceNameAttribute.name # Ajax function to call (js): ajaxFunction = 'selectFrom(\'' + reverse('config.views.showAttributeAJAX')[:-1] + '\',\'' + ajaxAttribute + '\');' info_missing_policy = "Variable used for setting if the Object is deleted into the Target or <br> if we need to add " info_missing_policy += " to the Backend" info_different_policy = "Variable enables to set which Server, we need to upgrade values:<br> If the value is TARGET" info_different_policy += ", then the Backend object will replace the Target object <br>else, the opposite." if lbeObjectTemplate.instanceNameBeforeAttribute is not None: attributeBefore = lbeObjectTemplate.instanceNameBeforeAttribute.name else: attributeBefore = lbeObjectTemplate.instanceNameAttribute.name return render_to_response('config/object/modify.html', {'attributeInstances': instances, 'lbeObject': lbeObjectTemplate, 'objectForm': objectForm, 'attributeForm': attForm, 'ajaxAttribute': ajaxAttribute, 'ajaxFunction': ajaxFunction, 'defaultValue': defaultValue, 'info_missing_policy': info_missing_policy, 'info_different_policy': info_different_policy, 'attributeInstanceBefore': attributeBefore}, context_instance=RequestContext(request))
def searchObjects(self, lbeObjectTemplate, SCOPE, filter=None, start=0, page=0): result_set = [] # Call methods from object's script to get basedn and objectClass objectHelper = LBEObjectInstanceHelper(lbeObjectTemplate) if filter is None: filter = '(&' for oc in objectHelper.callScriptClassMethod('object_classes'): filter += '(objectClass=' + oc + ')' filter += ')' #(modifyTimestamp>'+str(calendar.timegm(lbeObjectTemplate.synced_at.utctimetuple()))+'Z))' # Search in object's basedn if SCOPE != 0 and SCOPE != 1 and SCOPE != 2: SCOPE = 0 # BASE for dn, entry in self.handler.search( objectHelper.callScriptClassMethod('base_dn'), filter, SCOPE, ['*', '+']): # Create an empty instance objectInstance = LBEObjectInstance( lbeObjectTemplate, name=entry[lbeObjectTemplate.instanceNameAttribute.name][0]) # Add attributes defined in the template. Other ones are ignored try: # Object for attributeInstance in lbeObjectTemplate.lbeattributeinstance_set.all( ): try: objectInstance.attributes[ attributeInstance.lbeAttribute.name] = entry[ attributeInstance.lbeAttribute.name] except KeyError, e: logger.warning('The attribute ' + attributeInstance.lbeAttribute.name + ' does not exist in LDAP object: ' + dn) # Set displayName and few others attributes objectInstance.displayName = entry[ lbeObjectTemplate.instanceDisplayNameAttribute.name][0] objectInstance.status = OBJECT_STATE_IMPORTED objectInstance.created_at = datetime.datetime.strptime( entry['createTimestamp'][0], '%Y%m%d%H%M%SZ') try: objectInstance.updated_at = datetime.datetime.strptime( entry['modifyTimestamp'][0], '%Y%m%d%H%M%SZ') except KeyError: objectInstance.updated_at = datetime.datetime.strptime( entry['createTimestamp'][0], '%Y%m%d%H%M%SZ') result_set.append(objectInstance) except AttributeError: # Group: groupInstance = GroupInstanceHelper(lbeObjectTemplate) objectInstance.displayName = entry['cn'][0] objectInstance.attributes[u'cn'] = entry['cn'] if groupInstance.attributeName in entry: objectInstance.attributes[ groupInstance.attributeName] = entry[ groupInstance.attributeName] else: objectInstance.attributes[groupInstance.attributeName] = [] objectInstance.status = OBJECT_STATE_IMPORTED objectInstance.created_at = datetime.datetime.strptime( entry['createTimestamp'][0], '%Y%m%d%H%M%SZ') try: objectInstance.updated_at = datetime.datetime.strptime( entry['modifyTimestamp'][0], '%Y%m%d%H%M%SZ') except KeyError: objectInstance.updated_at = datetime.datetime.strptime( entry['createTimestamp'][0], '%Y%m%d%H%M%SZ') result_set.append(objectInstance)
def index(request): objects = LBEObjectTemplate.objects.all() groups = LBEGroup.objects.all() backend = BackendHelper() # Objects statObjects = [] for object in objects: lbeObjects = backend.searchObjects(object) ok = 0 approval = 0 needSync = 0 delete = 0 reconciliation = False for lbeobject in lbeObjects: if lbeobject.status == 0: ok += 1 elif lbeobject.status == 1: needSync += 1 elif lbeobject.status == 2: approval += 1 elif lbeobject.status == 3: reconciliation = True elif lbeobject.status == 4: delete += 1 statObjects.append({ 'name': object.displayName, 'total': len(lbeObjects), 'ok': ok, 'approval': approval, 'sync': needSync, 'reconciliation': reconciliation, 'delete': delete }) # Groups statGroups = [] try: for group in groups: groupHelper = GroupInstanceHelper(group) groupHelper.get() if groupHelper.attributeName in groupHelper.instance.changes['set'] and not \ groupHelper.instance.changes['set'][groupHelper.attributeName] == []: total = len(groupHelper.instance.changes['set'][ groupHelper.attributeName]) else: total = len( groupHelper.instance.attributes[groupHelper.attributeName]) status = groupHelper.instance.status except BaseException as e: total = 0 status = -1 statGroups.append({ 'name': group.displayName, 'total': total, 'object': groupHelper.template.objectTemplate.displayName, 'status': status }) return render_to_response('directory/default/index.html', { 'objects': statObjects, 'groups': statGroups }, context_instance=RequestContext(request))
def update(self, lbeObjectTemplate, lbeObjectInstance, SCOPE): objectHelper = LBEObjectInstanceHelper(lbeObjectTemplate) if not isinstance(lbeObjectTemplate, LBEGroup): ignore_attributes = objectHelper.callScriptClassMethod( "ignore_attributes") else: ignore_attributes = [] # RDN Attribute: rdnAttributeName = lbeObjectTemplate.instanceNameAttribute.name dn = rdnAttributeName + '=' + lbeObjectInstance.attributes[ rdnAttributeName][0] + ',' + objectHelper.callScriptClassMethod( 'base_dn') LDAPValues = self.searchObjects( lbeObjectTemplate, SCOPE, rdnAttributeName + '=' + lbeObjectInstance.attributes[rdnAttributeName][0])[0].attributes # Need to check if the RDN changed: if not lbeObjectInstance.attributes[rdnAttributeName][ 0] == lbeObjectInstance.changes['set'][rdnAttributeName][ 0] and not lbeObjectInstance.changes['set'][ rdnAttributeName][0] == '': newDN = rdnAttributeName + '=' + lbeObjectInstance.changes['set'][ rdnAttributeName][0] self.handler.changeRDN(dn, newDN.encode("utf-8")) dn = newDN + ',' + objectHelper.callScriptClassMethod('base_dn') # Update: for key, value in lbeObjectInstance.changes['set'].items(): if key in ignore_attributes: continue noKey = not LDAPValues.has_key( key) # key exists into the object target? if isinstance(lbeObjectTemplate, LBEGroup) and value == []: objectHelper = GroupInstanceHelper(lbeObjectTemplate, lbeObjectInstance) modList = [ (ldap.MOD_DELETE, key.encode("utf-8"), LDAPValues[objectHelper.attributeName][0].encode("utf-8")) ] try: self.handler.update(dn, modList) except BaseException: pass # do not care if object does not exist elif noKey or not value == LDAPValues[key] and not value[0] == '': # 1 value: Replace if len(value) == 1: if noKey: # ADD: modList = [(ldap.MOD_ADD, key.encode("utf-8"), value[0].encode("utf-8"))] else: # REPLACE: modList = [(ldap.MOD_REPLACE, key.encode("utf-8"), value[0].encode("utf-8"))] self.handler.update(dn, modList) else: # MultiValue: if noKey: # ADD: for val in value: modList = [(ldap.MOD_ADD, key.encode("utf-8"), val.encode("utf-8"))] self.handler.update(dn, modList) else: # REMOVE: for val in LDAPValues[key]: modList = [(ldap.MOD_DELETE, key.encode("utf-8"), val.encode("utf-8"))] self.handler.update(dn, modList) # ADD: for val in value: modList = [(ldap.MOD_ADD, key.encode("utf-8"), val.encode("utf-8"))] self.handler.update(dn, modList)
def start(self): print " Upgrade the Target server with the Backend server..." for objectTemplate in LBEObjectTemplate.objects.all(): # need to check if we need to change (before making reconciliation) the RDN attribute self._changeRDN(objectTemplate) # And the objects class self._changeClass(objectTemplate) # We're looking for all objects with state = OBJECT_STATE_AWAITING_SYNC for objectInstance in self.backend.searchObjectsToUpdate(objectTemplate): # First of all, applies all changes stored in backend [ such Virtual attributes ] # & create the parent DN if not exist: obj = LBEObjectInstanceHelper(objectTemplate, objectInstance) try: scope = obj.callScriptClassMethod("search_scope") except BaseException: scope = 0 self._createParent(objectTemplate, obj) # obj.compute(objectInstance) # then, upgrade: if objectInstance.changes["type"] == OBJECT_CHANGE_CREATE_OBJECT: try: print " |-> Object '\033[35m" + objectInstance.displayName + "\033[0m' is \033[34mcreating\033[0m..." self._createObject(objectTemplate, objectInstance) # TODO: We should have a target exception rather ldap except ldap.ALREADY_EXISTS: print " |-> Object '\033[35m" + objectInstance.displayName + "'\033[0m already exists" changes = {} changes["status"] = OBJECT_STATE_SYNCED changes["changes"] = {} changes["changes"]["set"] = {} changes["changes"]["type"] = -1 changes["synced_at"] = django.utils.timezone.now() self.backend.updateObject(objectTemplate, objectInstance, changes) pass elif objectInstance.changes["type"] == OBJECT_CHANGE_DELETE_OBJECT: try: print " |-> Object '\033[35m" + objectInstance.displayName + "' is \033[33mdeleting\033[0m..." self._deleteObject(objectTemplate, objectInstance) except BaseException as e: print " |-> Object '\033[35m" + objectInstance.displayName + "'\033[0m does not exist." changes = {} changes["status"] = OBJECT_STATE_DELETED changes["changes"] = {} changes["changes"]["set"] = {} changes["changes"]["type"] = -1 changes["synced_at"] = django.utils.timezone.now() self.backend.updateObject(objectTemplate, objectInstance, changes) pass elif objectInstance.changes["type"] == OBJECT_CHANGE_UPDATE_OBJECT: try: print " |-> Object '\033[35m" + objectInstance.displayName + "'\033[0m is \033[36mupdating\033[0m..." # Group for group in LBEGroup.objects.all(): if group.objectTemplate.id == objectTemplate.id: GroupInstanceHelper(group).updateMember(obj.getObject(obj.instance.name)) self._modifyObject(objectTemplate, objectInstance, scope) except BaseException as e: print e print " |-> Object '\033[35m" + objectInstance.displayName + "' does not exist, being \033[34mcreated\033[0m..." # Create object if not exists: # Firstly, compute attributes values: # Then, create it: try: self._createObject(objectTemplate, objectInstance) except Exception as e: print e pass pass # Synced object: objectTemplate.synced_at = django.utils.timezone.now() objectTemplate.save() print "" print " Upgrade Groups Objects:" for groupTemplate in LBEGroup.objects.all(): for groupInstance in self.backend.searchObjectsToUpdate(groupTemplate): grp = GroupInstanceHelper(groupTemplate, groupInstance) try: scope = grp.callScriptClassMethod("search_scope") except BaseException: scope = 0 self._createParent(groupTemplate, grp) if groupInstance.changes["type"] == OBJECT_CHANGE_CREATE_OBJECT: print " |-> Group '\033[35m" + groupInstance.displayName + "\033[0m' is \033[34mcreating\033[0m..." try: groupInstance.changes["set"][grp.attributeName] = self._getRDN( groupTemplate.objectTemplate, groupInstance.changes["set"][grp.attributeName] ) self._createObject(groupTemplate, groupInstance) ############################################### if not groupInstance.changes["set"] == {}: groupInstance.changes["set"][grp.attributeName] = self._getID( groupInstance.changes["set"][grp.attributeName] ) groupInstance.attributes["cn"] = groupInstance.changes["set"]["cn"] self.backend.updateObject( groupTemplate, groupInstance, {"changes": {"set": {"cn": [groupInstance.displayName]}, "type": -1}}, ) ############################################### except ldap.ALREADY_EXISTS: print " |-> Group '\033[35m" + groupInstance.displayName + "'\033[0m already exists" elif groupInstance.changes["type"] == OBJECT_CHANGE_UPDATE_OBJECT: try: print " |-> Group '\033[35m" + groupInstance.displayName + "'\033[0m is \033[36mupdating\033[0m..." groupInstance.changes["set"][grp.attributeName] = self._getRDN( groupTemplate.objectTemplate, groupInstance.changes["set"][grp.attributeName] ) self._modifyObject(groupTemplate, groupInstance, scope) ############################################### groupInstance.changes["set"][grp.attributeName] = self._getID( groupInstance.changes["set"][grp.attributeName] ) groupInstance.attributes["cn"] = groupInstance.changes["set"]["cn"] self.backend.updateObject( groupTemplate, groupInstance, {"changes": {"set": {"cn": [groupInstance.displayName]}, "type": -1}}, ) ############################################### except BaseException as e: print e print " |-> Group '\033[35m" + groupInstance.displayName + "' does not exist, being \033[34mcreated\033[0m..." groupInstance.changes["set"][grp.attributeName] = self._getRDN( groupTemplate.objectTemplate, groupInstance.changes["set"][grp.attributeName] ) self._createObject(groupTemplate, groupInstance) ############################################### groupInstance.changes["set"][grp.attributeName] = self._getID( groupInstance.changes["set"][grp.attributeName] ) groupInstance.attributes["cn"] = groupInstance.changes["set"]["cn"] self.backend.updateObject( groupTemplate, groupInstance, {"changes": {"set": {"cn": [groupInstance.displayName]}, "type": -1}}, ) ############################################### elif groupInstance.changes["type"] == OBJECT_CHANGE_DELETE_OBJECT: print " |-> Group '\033[35m" + groupInstance.displayName + "' is \033[33mdeleting\033[0m..." self._deleteObject(groupTemplate, groupInstance) print " End."
def save(self): print 'Checking for Objects which do not exist into LBE Backend but in LDAP Server:' for objectTemplate in LBEObjectTemplate.objects.all(): objectHelper = LBEObjectInstanceHelper(objectTemplate) try: scope = objectHelper.callScriptClassMethod("search_scope") except BaseException: scope = 0 filter = '(&' for oc in objectHelper.callScriptClassMethod('object_classes'): filter += '(objectClass=' + oc + ')' filter += ')' print '\033[91m' + objectTemplate.name + '\033[0m: (\033[95m' + objectHelper.callScriptClassMethod("base_dn") + '\033[0m) using \033[95m' + filter + '\033[0m' objTarget = self.target.searchObjects(objectTemplate, scope) objBackend = self.backend.searchObjects(objectTemplate) number = 0 for ot in objTarget: exist = False for ob in objBackend: if ot.name == ob.name: exist = True break if not exist: number += 1 print '=> Adding \033[95m' + ot.name + '\033[0m object into LBE Backend... ' print " values: " + str(ot.attributes) try: self.backend.createObject(objectTemplate, ot, True) print "\033[92mDone.\033[0m\n" except BaseException as e: print "\033[91mFail.\033[0m" print "''''''''" print e print "''''''''" if number == 0: print '<None>' # Synced object: objectTemplate.synced_at = django.utils.timezone.now() objectTemplate.save() print '.........................' print 'Checking for Groups which do not exist into LBE Backend but in Target:' for groupTemplate in LBEGroup.objects.all(): groupInstance = GroupInstanceHelper(groupTemplate) try: scope = groupInstance.callScriptClassMethod("search_scope") except BaseException: scope = 0 grpTarget = self.target.searchObjects(groupTemplate, scope) grpBackend = self.backend.searchObjects(groupTemplate) for gt in grpTarget: exist = False for gb in grpBackend: if gt.name == gb.name: exist = True break if not exist: # import only existing group into LBE config try: LBEGroup.objects.get(displayName__iexact=gt.displayName) except BaseException: continue print '=> Adding \033[95m' + gt.name + '\033[0m group into LBE Backend... ' print " values: " + str(gt.attributes) try: if groupInstance.attributeName in gt.attributes: gt.attributes[groupInstance.attributeName] = self._getID(gt.attributes[groupInstance.attributeName]) groupHelper = GroupInstanceHelper(groupTemplate, gt) groupHelper.createTemplate(True) #print " >\033[91mThis group does not exists in LBE Configuration Group.\033[0m" #print " >\033[91mIn order to see, manage it, please create it using some extra attribute:" #print " >\033[91m'Display Name': \033[95m" + gt.name + "\033[0m" #print " >\033[91mInto the Script file:" #print " >'DN Attribute': \033[95m" + groupHelper.callScriptClassMethod("base_dn") + "\033[91m" #print " >'Attribute Name' & 'Object Classes': as you wish.\033[0m" print "\033[92mDone.\033[0m\n" except BaseException as e: print "\033[91mFail.\033[0m\n" print "''''''''" print e print "''''''''" # Synced group: groupTemplate.synced_at = django.utils.timezone.now() groupTemplate.save() print "End."
def start(self): print " Upgrade the Target server with the Backend server..." for objectTemplate in LBEObjectTemplate.objects.all(): # need to check if we need to change (before making reconciliation) the RDN attribute self._changeRDN(objectTemplate) # And the objects class self._changeClass(objectTemplate) # We're looking for all objects with state = OBJECT_STATE_AWAITING_SYNC for objectInstance in self.backend.searchObjectsToUpdate( objectTemplate): # First of all, applies all changes stored in backend [ such Virtual attributes ] # & create the parent DN if not exist: obj = LBEObjectInstanceHelper(objectTemplate, objectInstance) try: scope = obj.callScriptClassMethod("search_scope") except BaseException: scope = 0 self._createParent(objectTemplate, obj) #obj.compute(objectInstance) # then, upgrade: if objectInstance.changes[ 'type'] == OBJECT_CHANGE_CREATE_OBJECT: try: print " |-> Object '\033[35m" + objectInstance.displayName + "\033[0m' is \033[34mcreating\033[0m..." self._createObject(objectTemplate, objectInstance) # TODO: We should have a target exception rather ldap except ldap.ALREADY_EXISTS: print " |-> Object '\033[35m" + objectInstance.displayName + "'\033[0m already exists" changes = {} changes['status'] = OBJECT_STATE_SYNCED changes['changes'] = {} changes['changes']['set'] = {} changes['changes']['type'] = -1 changes['synced_at'] = django.utils.timezone.now() self.backend.updateObject(objectTemplate, objectInstance, changes) pass elif objectInstance.changes[ 'type'] == OBJECT_CHANGE_DELETE_OBJECT: try: print " |-> Object '\033[35m" + objectInstance.displayName + "' is \033[33mdeleting\033[0m..." self._deleteObject(objectTemplate, objectInstance) except BaseException as e: print " |-> Object '\033[35m" + objectInstance.displayName + "'\033[0m does not exist." changes = {} changes['status'] = OBJECT_STATE_DELETED changes['changes'] = {} changes['changes']['set'] = {} changes['changes']['type'] = -1 changes['synced_at'] = django.utils.timezone.now() self.backend.updateObject(objectTemplate, objectInstance, changes) pass elif objectInstance.changes[ 'type'] == OBJECT_CHANGE_UPDATE_OBJECT: try: print " |-> Object '\033[35m" + objectInstance.displayName + "'\033[0m is \033[36mupdating\033[0m..." # Group for group in LBEGroup.objects.all(): if group.objectTemplate.id == objectTemplate.id: GroupInstanceHelper(group).updateMember( obj.getObject(obj.instance.name)) self._modifyObject(objectTemplate, objectInstance, scope) except BaseException as e: print e print " |-> Object '\033[35m" + objectInstance.displayName + "' does not exist, being \033[34mcreated\033[0m..." # Create object if not exists: # Firstly, compute attributes values: # Then, create it: try: self._createObject(objectTemplate, objectInstance) except Exception as e: print e pass pass # Synced object: objectTemplate.synced_at = django.utils.timezone.now() objectTemplate.save() print '' print " Upgrade Groups Objects:" for groupTemplate in LBEGroup.objects.all(): for groupInstance in self.backend.searchObjectsToUpdate( groupTemplate): grp = GroupInstanceHelper(groupTemplate, groupInstance) try: scope = grp.callScriptClassMethod("search_scope") except BaseException: scope = 0 self._createParent(groupTemplate, grp) if groupInstance.changes[ 'type'] == OBJECT_CHANGE_CREATE_OBJECT: print " |-> Group '\033[35m" + groupInstance.displayName + "\033[0m' is \033[34mcreating\033[0m..." try: groupInstance.changes['set'][ grp.attributeName] = self._getRDN( groupTemplate.objectTemplate, groupInstance.changes['set'][ grp.attributeName]) self._createObject(groupTemplate, groupInstance) ############################################### if not groupInstance.changes['set'] == {}: groupInstance.changes['set'][ grp.attributeName] = self._getID( groupInstance.changes['set'][ grp.attributeName]) groupInstance.attributes[ 'cn'] = groupInstance.changes['set']['cn'] self.backend.updateObject( groupTemplate, groupInstance, { 'changes': { 'set': { 'cn': [groupInstance.displayName] }, 'type': -1 } }) ############################################### except ldap.ALREADY_EXISTS: print " |-> Group '\033[35m" + groupInstance.displayName + "'\033[0m already exists" elif groupInstance.changes[ 'type'] == OBJECT_CHANGE_UPDATE_OBJECT: try: print " |-> Group '\033[35m" + groupInstance.displayName + "'\033[0m is \033[36mupdating\033[0m..." groupInstance.changes['set'][ grp.attributeName] = self._getRDN( groupTemplate.objectTemplate, groupInstance.changes['set'][ grp.attributeName]) self._modifyObject(groupTemplate, groupInstance, scope) ############################################### groupInstance.changes['set'][ grp.attributeName] = self._getID( groupInstance.changes['set'][ grp.attributeName]) groupInstance.attributes['cn'] = groupInstance.changes[ 'set']['cn'] self.backend.updateObject( groupTemplate, groupInstance, { 'changes': { 'set': { 'cn': [groupInstance.displayName] }, 'type': -1 } }) ############################################### except BaseException as e: print e print " |-> Group '\033[35m" + groupInstance.displayName + "' does not exist, being \033[34mcreated\033[0m..." groupInstance.changes['set'][ grp.attributeName] = self._getRDN( groupTemplate.objectTemplate, groupInstance.changes['set'][ grp.attributeName]) self._createObject(groupTemplate, groupInstance) ############################################### groupInstance.changes['set'][ grp.attributeName] = self._getID( groupInstance.changes['set'][ grp.attributeName]) groupInstance.attributes['cn'] = groupInstance.changes[ 'set']['cn'] self.backend.updateObject( groupTemplate, groupInstance, { 'changes': { 'set': { 'cn': [groupInstance.displayName] }, 'type': -1 } }) ############################################### elif groupInstance.changes[ 'type'] == OBJECT_CHANGE_DELETE_OBJECT: print " |-> Group '\033[35m" + groupInstance.displayName + "' is \033[33mdeleting\033[0m..." self._deleteObject(groupTemplate, groupInstance) print " End."
def index(request): objects = LBEObjectTemplate.objects.all() groups = LBEGroup.objects.all() backend = BackendHelper() # Objects statObjects = [] for object in objects: lbeObjects = backend.searchObjects(object) ok = 0 approval = 0 needSync = 0 delete = 0 reconciliation = False for lbeobject in lbeObjects: if lbeobject.status == 0: ok += 1 elif lbeobject.status == 1: needSync += 1 elif lbeobject.status == 2: approval += 1 elif lbeobject.status == 3: reconciliation = True elif lbeobject.status == 4: delete += 1 statObjects.append( { "name": object.displayName, "total": len(lbeObjects), "ok": ok, "approval": approval, "sync": needSync, "reconciliation": reconciliation, "delete": delete, } ) # Groups statGroups = [] try: for group in groups: groupHelper = GroupInstanceHelper(group) groupHelper.get() if ( groupHelper.attributeName in groupHelper.instance.changes["set"] and not groupHelper.instance.changes["set"][groupHelper.attributeName] == [] ): total = len(groupHelper.instance.changes["set"][groupHelper.attributeName]) else: total = len(groupHelper.instance.attributes[groupHelper.attributeName]) status = groupHelper.instance.status except BaseException as e: total = 0 status = -1 statGroups.append( { "name": group.displayName, "total": total, "object": groupHelper.template.objectTemplate.displayName, "status": status, } ) return render_to_response( "directory/default/index.html", {"objects": statObjects, "groups": statGroups}, context_instance=RequestContext(request), )
def save(self): print 'Checking for Objects which do not exist into LBE Backend but in LDAP Server:' for objectTemplate in LBEObjectTemplate.objects.all(): objectHelper = LBEObjectInstanceHelper(objectTemplate) try: scope = objectHelper.callScriptClassMethod("search_scope") except BaseException: scope = 0 filter = '(&' for oc in objectHelper.callScriptClassMethod('object_classes'): filter += '(objectClass=' + oc + ')' filter += ')' print '\033[91m' + objectTemplate.name + '\033[0m: (\033[95m' + objectHelper.callScriptClassMethod( "base_dn") + '\033[0m) using \033[95m' + filter + '\033[0m' objTarget = self.target.searchObjects(objectTemplate, scope) objBackend = self.backend.searchObjects(objectTemplate) number = 0 for ot in objTarget: exist = False for ob in objBackend: if ot.name == ob.name: exist = True break if not exist: number += 1 print '=> Adding \033[95m' + ot.name + '\033[0m object into LBE Backend... ' print " values: " + str(ot.attributes) try: self.backend.createObject(objectTemplate, ot, True) print "\033[92mDone.\033[0m\n" except BaseException as e: print "\033[91mFail.\033[0m" print "''''''''" print e print "''''''''" if number == 0: print '<None>' # Synced object: objectTemplate.synced_at = django.utils.timezone.now() objectTemplate.save() print '.........................' print 'Checking for Groups which do not exist into LBE Backend but in Target:' for groupTemplate in LBEGroup.objects.all(): groupInstance = GroupInstanceHelper(groupTemplate) try: scope = groupInstance.callScriptClassMethod("search_scope") except BaseException: scope = 0 grpTarget = self.target.searchObjects(groupTemplate, scope) grpBackend = self.backend.searchObjects(groupTemplate) for gt in grpTarget: exist = False for gb in grpBackend: if gt.name == gb.name: exist = True break if not exist: # import only existing group into LBE config try: LBEGroup.objects.get( displayName__iexact=gt.displayName) except BaseException: continue print '=> Adding \033[95m' + gt.name + '\033[0m group into LBE Backend... ' print " values: " + str(gt.attributes) try: if groupInstance.attributeName in gt.attributes: gt.attributes[ groupInstance.attributeName] = self._getID( gt.attributes[groupInstance.attributeName]) groupHelper = GroupInstanceHelper(groupTemplate, gt) groupHelper.createTemplate(True) #print " >\033[91mThis group does not exists in LBE Configuration Group.\033[0m" #print " >\033[91mIn order to see, manage it, please create it using some extra attribute:" #print " >\033[91m'Display Name': \033[95m" + gt.name + "\033[0m" #print " >\033[91mInto the Script file:" #print " >'DN Attribute': \033[95m" + groupHelper.callScriptClassMethod("base_dn") + "\033[91m" #print " >'Attribute Name' & 'Object Classes': as you wish.\033[0m" print "\033[92mDone.\033[0m\n" except BaseException as e: print "\033[91mFail.\033[0m\n" print "''''''''" print e print "''''''''" # Synced group: groupTemplate.synced_at = django.utils.timezone.now() groupTemplate.save() print "End."
def modifyObject(request, obj_id=None, instance_id=None): objectForm = None lbeObjectTemplate = LBEObjectTemplate.objects.get(id=obj_id) if request.method == 'POST': # we can't modify the Synced_at value POST = request.POST.copy() POST['synced_at'] = lbeObjectTemplate.synced_at # POST modification objectForm = LBEObjectTemplateForm(POST, instance=lbeObjectTemplate) oldNAttribute = lbeObjectTemplate.instanceNameAttribute.name oldDNAttribute = lbeObjectTemplate.instanceDisplayNameAttribute.id if objectForm.is_valid(): # change the _id value if changed: if not oldNAttribute == request.POST['instanceNameAttribute']: changeID = True else: changeID = False # change the displayName value if changed: if not oldDNAttribute == int( request.POST['instanceDisplayNameAttribute']): DN = True else: DN = False if changeID or DN: if changeID is True: objectForm.instance.instanceNameBeforeAttribute = LBEAttribute.objects.get( name__iexact=oldNAttribute) objectForm.instance.needReconciliationRDN = True backend = BackendHelper() ob = backend.searchObjects(lbeObjectTemplate) try: for o in ob: if changeID: # change the _id value backend.update_id( lbeObjectTemplate, o, o.attributes[ request.POST['instanceNameAttribute']][0]) # the RDN Attribute from Target Server is replace into the Reconciliation if DN: attribute = LBEAttribute.objects.get( id=request.POST['instanceDisplayNameAttribute'] ) backend.modifyDisplayName( lbeObjectTemplate, o.name, o.attributes[attribute.name][0]) # Groups if changeID: groups = LBEGroup.objects.filter( objectTemplate=lbeObjectTemplate) for group in groups: InstanceHelper = GroupInstanceHelper(group) InstanceHelper.changeIDObjects() except KeyError: messages.add_message( request, messages.ERROR, 'Error while saving object, "' + request.POST['instanceNameAttribute'] + '" does not exist for the Object.') return redirect('/config/object/modify/' + obj_id) objectForm.save() messages.add_message(request, messages.SUCCESS, 'Object saved') return redirect('/config/object/modify/' + obj_id) else: messages.add_message(request, messages.ERROR, 'Error while saving object.') else: if obj_id is None: messages.add_message(request, messages.INFO, 'Object id is missing.') return render_to_response( 'config/object/list.html', {'objects': LBEObjectTemplate.objects.all()}) else: objectForm = LBEObjectTemplateForm(instance=lbeObjectTemplate) attForm = LBEAttributeInstanceForm() instances = LBEAttributeInstance.objects.filter( lbeObjectTemplate=lbeObjectTemplate).order_by('position') # which attribute have ajax request: ajaxAttribute = 'instanceNameAttribute' defaultValue = lbeObjectTemplate.instanceNameAttribute.name # Ajax function to call (js): ajaxFunction = 'selectFrom(\'' + reverse( 'config.views.showAttributeAJAX' )[:-1] + '\',\'' + ajaxAttribute + '\');' info_missing_policy = "Variable used for setting if the Object is deleted into the Target or <br> if we need to add " info_missing_policy += " to the Backend" info_different_policy = "Variable enables to set which Server, we need to upgrade values:<br> If the value is TARGET" info_different_policy += ", then the Backend object will replace the Target object <br>else, the opposite." if lbeObjectTemplate.instanceNameBeforeAttribute is not None: attributeBefore = lbeObjectTemplate.instanceNameBeforeAttribute.name else: attributeBefore = lbeObjectTemplate.instanceNameAttribute.name return render_to_response('config/object/modify.html', { 'attributeInstances': instances, 'lbeObject': lbeObjectTemplate, 'objectForm': objectForm, 'attributeForm': attForm, 'ajaxAttribute': ajaxAttribute, 'ajaxFunction': ajaxFunction, 'defaultValue': defaultValue, 'info_missing_policy': info_missing_policy, 'info_different_policy': info_different_policy, 'attributeInstanceBefore': attributeBefore }, context_instance=RequestContext(request))