Exemple #1
0
def viewUserObjectAJAX(request, group_id, name):
    if request.is_ajax():
        group = LBEGroup.objects.get(id=group_id)
        backend = BackendHelper()
        objects = backend.searchObjectsByPattern(group.objectTemplate, name)
        list = []
        for o in objects:
            list.append(o.name)
        return HttpResponse(json.dumps(list), mimetype="application/json")
Exemple #2
0
def viewUserObjectAJAX(request, group_id, name):
    if request.is_ajax():
        group = LBEGroup.objects.get(id=group_id)
        backend = BackendHelper()
        objects = backend.searchObjectsByPattern(group.objectTemplate, name)
        list = []
        for o in objects:
            list.append(o.name)
        return HttpResponse(json.dumps(list), mimetype="application/json")
Exemple #3
0
def searchAJAX(request, lbeObject_id, search):
    if len(search) == 0:
        return HttpResponse("/")
    backend = BackendHelper()
    objects = backend.searchObjectsByPattern(LBEObjectTemplate.objects.get(id=lbeObject_id), search)
    return render_to_response(
        "ajax/directory/search.html",
        {"lbeObjectId": lbeObject_id, "objects": objects},
        context_instance=RequestContext(request),
    )
Exemple #4
0
 def _executeOU(self, userID):
     # backend db:
     backend = BackendHelper()
     values = self.word[2].split(',')
     for objectName in values:
         obj = LBEObjectTemplate.objects.filter(Q(name=objectName) | Q(displayName=objectName))[0]
         if backend.getUserUIDForObject(obj, userID):
             return True
     # No value:
     return False
Exemple #5
0
 def _executeOU(self, userID):
     # backend db:
     backend = BackendHelper()
     values = self.word[2].split(',')
     for objectName in values:
         obj = LBEObjectTemplate.objects.filter(
             Q(name=objectName) | Q(displayName=objectName))[0]
         if backend.getUserUIDForObject(obj, userID):
             return True
     # No value:
     return False
Exemple #6
0
def approvalObjectInstance(request, lbeObject_id, objectName):
    backend = BackendHelper()
    lbeObject = LBEObjectTemplate.objects.get(id=lbeObject_id)
    # change status code user:
    instanceHelper = LBEObjectInstanceHelper(lbeObject)
    instanceHelper.approval(objectName)
    # Current page from the object status changed:
    position = backend.positionObject(lbeObject.name, objectName)
    lengthMax = 10
    page = int(math.ceil(position / float(lengthMax)))
    return HttpResponseRedirect('/')  #return index(request,lbeObject_id,page)
Exemple #7
0
def searchAJAX(request, lbeObject_id, search):
    if len(search) == 0:
        return HttpResponse('/')
    backend = BackendHelper()
    objects = backend.searchObjectsByPattern(
        LBEObjectTemplate.objects.get(id=lbeObject_id), search)
    return render_to_response('ajax/directory/search.html', {
        'lbeObjectId': lbeObject_id,
        'objects': objects
    },
                              context_instance=RequestContext(request))
Exemple #8
0
def approvalObjectInstance(request, lbeObject_id, objectName):
    backend = BackendHelper()
    lbeObject = LBEObjectTemplate.objects.get(id=lbeObject_id)
    # change status code user:
    instanceHelper = LBEObjectInstanceHelper(lbeObject)
    instanceHelper.approval(objectName)
    # Current page from the object status changed:
    position = backend.positionObject(lbeObject.name, objectName)
    lengthMax = 10
    page = int(math.ceil(position / float(lengthMax)))
    return HttpResponseRedirect("/")  # return index(request,lbeObject_id,page)
Exemple #9
0
def listObjects(request, lbeObject_id=1, page=1):
    # init object:
    if lbeObject_id is None:
        lbeObject_id = 1
    if settings.PAGINATION is None:
        lengthMax = 25
    else:
        lengthMax = settings.PAGINATION
        # init pagination:
    if page is None:
        page = 1
    else:
        page = int(page)
    if page == 1:
        index = 0
    else:
        index = int(page) + lengthMax - 2
    backend = BackendHelper()
    objects = backend.searchObjects(
        LBEObjectTemplate.objects.get(id=lbeObject_id), index, lengthMax)
    lbeObject = LBEObjectTemplate.objects.get(id=lbeObject_id)
    lbeObjects = LBEObjectTemplate.objects.all()
    # Pagination:
    size = int(
        math.ceil(
            backend.lengthObjects(
                LBEObjectTemplate.objects.get(id=lbeObject_id)) /
            float(lengthMax)))
    if page < 3:
        min = 1
    else:
        min = page - 2
    if size - page > 2:
        max = page + 2
    else:
        max = size
    tabSize = []
    tabSize.append(min)
    for i in range(min, max):
        tabSize.append(i + 1)
    return render_to_response('directory/default/object/listObjects.html', {
        'objects': objects,
        'lbeObjectId': lbeObject.id,
        'objectTemplateName': lbeObject.displayName,
        'lbeObjects': lbeObjects,
        'length': tabSize,
        'page': int(page),
        'minCPage': min,
        'maxCPage': max,
        'maxPage': size
    },
                              context_instance=RequestContext(request))
Exemple #10
0
def listObjects(request, lbeObject_id=1, page=1):
    # init object:
    if lbeObject_id is None:
        lbeObject_id = 1
    if settings.PAGINATION is None:
        lengthMax = 25
    else:
        lengthMax = settings.PAGINATION
        # init pagination:
    if page is None:
        page = 1
    else:
        page = int(page)
    if page == 1:
        index = 0
    else:
        index = int(page) + lengthMax - 2
    backend = BackendHelper()
    objects = backend.searchObjects(LBEObjectTemplate.objects.get(id=lbeObject_id), index, lengthMax)
    lbeObject = LBEObjectTemplate.objects.get(id=lbeObject_id)
    lbeObjects = LBEObjectTemplate.objects.all()
    # Pagination:
    size = int(math.ceil(backend.lengthObjects(LBEObjectTemplate.objects.get(id=lbeObject_id)) / float(lengthMax)))
    if page < 3:
        min = 1
    else:
        min = page - 2
    if size - page > 2:
        max = page + 2
    else:
        max = size
    tabSize = []
    tabSize.append(min)
    for i in range(min, max):
        tabSize.append(i + 1)
    return render_to_response(
        "directory/default/object/listObjects.html",
        {
            "objects": objects,
            "lbeObjectId": lbeObject.id,
            "objectTemplateName": lbeObject.displayName,
            "lbeObjects": lbeObjects,
            "length": tabSize,
            "page": int(page),
            "minCPage": min,
            "maxCPage": max,
            "maxPage": size,
        },
        context_instance=RequestContext(request),
    )
Exemple #11
0
class Purge():
    def __init__(self):
        self.backend = BackendHelper()

    def start(self, *objects):
        for obj in objects[0]:
            print '   |-> Purging \033[90m' + obj + '\033[0m Object...'
            try:
                o = LBEObjectTemplate.objects.get(name=obj)
                for objectInstance in self.backend.searchObjects(o):
                    if objectInstance.status == OBJECT_STATE_DELETED:
                        print '   ||-> Removing \033[94m' + objectInstance.name + '\033[0m instance object...'
                        self.backend.deleteObject(o, objectInstance.name)
            except BaseException:
                print '   |-> \033[91mThe object "' + obj + '" does not exist.\033[0m'
                pass
        return 0
Exemple #12
0
 def handle(self, *args, **options):
     try:
         backend = BackendHelper()
         target = TargetHelper()
     except Exception as e:
         print >>sys.stderr, e
         sys.exit(1)
     for lbeObjectTemplate in LBEObjectTemplate.objects.all():
         now = datetime.datetime.now(utc)
         # the searchNewObjectcs methods search for backend object where createTimestamp > objectTemplate.imported_at
         for lbeObject in target.searchNewObjects(lbeObjectTemplate):
             #
             # TODO: take care about virtual/reference attributes
             # Example: an object where uid is computed as 'bbonfils', but backend value is 'asyd'
             lbeObject.synced_at = now
             backend.createObject(lbeObjectTemplate, lbeObject)
         lbeObjectTemplate.imported_at = now
         lbeObjectTemplate.save()
Exemple #13
0
 def clean(self):
     if not self.cleaned_data == {}: # no value 
         tab = []
         backend = BackendHelper()
         values = backend.searchObjects(self.template)
         list = []
         for value in values:
             if value.changes['set'] == {}:
                 list.append(value.attributes[self.template.instanceNameAttribute.name][0])
             else:
                 list.append(value.changes['set'][self.template.instanceNameAttribute.name][0])
         for value in self.cleaned_data[self.groupHelper.attributeName].split('\0'):
             if not value == "":
                 if not value in list:
                     raise forms.ValidationError("'" + value + "' is not into " + self.template.displayName)
                 tab.append(value)
         return tab
     return self.cleaned_data
Exemple #14
0
 def handle(self, *args, **options):
     try:
         backend = BackendHelper()
         target = TargetHelper()
     except Exception as e:
         print >> sys.stderr, e
         sys.exit(1)
     for lbeObjectTemplate in LBEObjectTemplate.objects.all():
         now = datetime.datetime.now(utc)
         # the searchNewObjectcs methods search for backend object where createTimestamp > objectTemplate.imported_at
         for lbeObject in target.searchNewObjects(lbeObjectTemplate):
             #
             # TODO: take care about virtual/reference attributes
             # Example: an object where uid is computed as 'bbonfils', but backend value is 'asyd'
             lbeObject.synced_at = now
             backend.createObject(lbeObjectTemplate, lbeObject)
         lbeObjectTemplate.imported_at = now
         lbeObjectTemplate.save()
Exemple #15
0
class ReinitTarget():
    def __init__(self):
        self.backend = BackendHelper()
        self.target = TargetHelper()

    def _remove(self, objectTemplate, objectInstance):
        try:
            self.target.delete(objectTemplate, objectInstance)
        except BaseException:
            # do not care if Target object does not exist
            pass

    def _create(self, objectTemplate, objectInstance):
        # replace attributes by changes set if exist
        if not objectInstance.changes['set'] == {}:
            # replace the _id value if needed:
            rdnAttributeName = objectTemplate.instanceNameAttribute.name
            if not objectInstance.attributes[rdnAttributeName][
                    0] == objectInstance.changes['set'][rdnAttributeName][0]:
                self.backend.update_id(
                    objectTemplate, objectInstance,
                    objectInstance.changes['set'][rdnAttributeName][0])
            # Replace changes['set'] to attributes
            objectInstance.attributes = objectInstance.changes['set']
        self.target.create(objectTemplate, objectInstance)
        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)

    def start(self):
        for objectTemplate in LBEObjectTemplate.objects.all():
            print "    |-> Remove & recreate all objects from \033[91m'" + objectTemplate.name + "'\033[0m :"
            for objectInstance in self.backend.searchObjects(objectTemplate):
                # do not care about deleted (or in progress deleted) object
                if not objectInstance.status == OBJECT_CHANGE_DELETE_OBJECT and \
                        not objectInstance.status == OBJECT_STATE_DELETED:
                    print "      |->  \033[95m'" + objectInstance.displayName + "\033[0m' ..."
                    self._remove(objectTemplate, objectInstance)
                    self._create(objectTemplate, objectInstance)
Exemple #16
0
class ReinitTarget():
    def __init__(self):
        self.backend = BackendHelper()
        self.target = TargetHelper()

    def _remove(self, objectTemplate, objectInstance):
        try:
            self.target.delete(objectTemplate, objectInstance)
        except BaseException:
            # do not care if Target object does not exist
            pass

    def _create(self, objectTemplate, objectInstance):
        # replace attributes by changes set if exist
        if not objectInstance.changes['set'] == {}:
            # replace the _id value if needed:
            rdnAttributeName = objectTemplate.instanceNameAttribute.name
            if not objectInstance.attributes[rdnAttributeName][0] == objectInstance.changes['set'][rdnAttributeName][0]:
                self.backend.update_id(objectTemplate, objectInstance,
                                       objectInstance.changes['set'][rdnAttributeName][0])
            # Replace changes['set'] to attributes
            objectInstance.attributes = objectInstance.changes['set']
        self.target.create(objectTemplate, objectInstance)
        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)


    def start(self):
        for objectTemplate in LBEObjectTemplate.objects.all():
            print "    |-> Remove & recreate all objects from \033[91m'" + objectTemplate.name + "'\033[0m :"
            for objectInstance in self.backend.searchObjects(objectTemplate):
                # do not care about deleted (or in progress deleted) object
                if not objectInstance.status == OBJECT_CHANGE_DELETE_OBJECT and \
                        not objectInstance.status == OBJECT_STATE_DELETED:
                    print "      |->  \033[95m'" + objectInstance.displayName + "\033[0m' ..."
                    self._remove(objectTemplate, objectInstance)
                    self._create(objectTemplate, objectInstance)
Exemple #17
0
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")
Exemple #18
0
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")
Exemple #19
0
 def __init__(self, lbeObjectTemplate, *args, **kwargs):
     super(forms.Form, self).__init__(*args, **kwargs)
     for attributeInstance in lbeObjectTemplate.lbeattributeinstance_set.all().order_by('position'):
         # Display finals attributes
         if attributeInstance.attributeType == ATTRIBUTE_TYPE_FINAL:
             # Regex attribute value [for final attribute]
             regex = ''
             if not attributeInstance.lbeAttribute.regex == '':
                 regex = ', validators=[RegexValidator(r"' + attributeInstance.lbeAttribute.regex
                 if not attributeInstance.lbeAttribute.errorMessage == '':
                     regex += '","' + attributeInstance.lbeAttribute.errorMessage
                 regex += '","")]'
             exec 'self.fields[attributeInstance.lbeAttribute.name] = ' + attributeInstance.widget + '(' + attributeInstance.widgetArgs + regex + ')'
             try:
                 self.fields[attributeInstance.lbeAttribute.name].label = attributeInstance.lbeAttribute.displayName
                 self.fields[attributeInstance.lbeAttribute.name].required = bool(attributeInstance.mandatory)
             except BaseException:
                 pass
         # Manage & Show references attributes
         elif attributeInstance.attributeType == ATTRIBUTE_TYPE_REFERENCE:
             backend = BackendHelper()
             values = backend.searchObjects(attributeInstance.reference.objectTemplate)
             objectHelper = LBEObjectInstanceHelper(attributeInstance.reference.objectTemplate)
             # Get values into Dict
             listes = dict()
             for value in values:
                 # dict[ID] = Attribute value[0] using ID = frontend's UID
                 key = attributeInstance.reference.objectTemplate.instanceNameAttribute.name + "=" + value.name + "," + objectHelper.callScriptClassMethod(
                     'base_dn')
                 listes[key] = str(value.attributes[attributeInstance.reference.objectAttribute.name][0])
             # Create the Field (Dict to tuples):
             exec 'self.fields[attributeInstance.lbeAttribute.name] = forms.ChoiceField( ' + str(
                 listes.items()) + ' )'
             try:
                 self.fields[attributeInstance.lbeAttribute.name].label = attributeInstance.lbeAttribute.displayName
                 self.fields[attributeInstance.lbeAttribute.name].required = bool(attributeInstance.mandatory)
             except BaseException:
                 pass
Exemple #20
0
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),
    )
Exemple #21
0
 def __init__(self):
     self.backend = BackendHelper()
     self.target = TargetHelper()
     self.start_date = django.utils.timezone.now()
Exemple #22
0
class UpgradeTarget():
    def __init__(self):
        self.backend = BackendHelper()
        self.target = TargetHelper()
        self.start_date = django.utils.timezone.now()

    def _changeClass(self, objectTemplate):
        objHelper = LBEObjectInstanceHelper(objectTemplate)
        try:
            scope = objHelper.callScriptClassMethod("scope_search")
        except BaseException:
            scope = 0

        ob = self.backend.searchObjects(objectTemplate)
        for objectInstance in ob:
            try:
                oldClasses = self.target.getInstanceObjectClasses(
                    objectTemplate, objectInstance, scope)
            except ldap.NO_SUCH_OBJECT:
                continue
            newClasses = objHelper.callScriptClassMethod("object_classes")

            if not sorted(oldClasses) == sorted(newClasses):
                print "    |-> The object classes have changed for '\033[35m" + objectInstance.displayName + "\033[0m'"
                try:
                    self.target.changeClass(objectTemplate, objectInstance,
                                            oldClasses, newClasses)
                except ldap.OBJECT_CLASS_VIOLATION as e:
                    print "    *\033[91mError to modify the object class " + str(
                        newClasses) + ", skip it.\033[0m"
                    print "    *\033[91m" + e[0]['info'] + "\033[0m"

    def _changeRDN(self, objectTemplate):
        if objectTemplate.needReconciliationRDN:
            print "    |-> Upgrade the RDN Target server for \033[35m" + objectTemplate.name + "\033[0m..."
            # Change the RDN Attribute to the Target Server
            ob = self.backend.searchObjects(objectTemplate)
            for o in ob:
                try:
                    self.target.changeRDN(
                        objectTemplate, o,
                        objectTemplate.instanceNameBeforeAttribute.name,
                        o.attributes[objectTemplate.
                                     instanceNameBeforeAttribute.name][0])
                except BaseException:
                    # if object does not exists into the Target Server
                    pass
                self.backend.updateStatus(objectTemplate, o.name)
            # Update values for changing RDN attribute
            objectTemplate.instanceNameBeforeAttribute = None
            objectTemplate.needReconciliationRDN = False
            objectTemplate.save()
            print "    |-> Done."

    def _createParent(self, lbeObjectTemplate, objService):
        base_dn = objService.callScriptClassMethod("base_dn")
        objectToCreate = base_dn.replace(settings.LDAP_SERVER['BASE_DN'],
                                         '')[:-1].split(',')
        objectToCreate.reverse()
        for i in range(0, len(objectToCreate)):
            dn = objectToCreate[i] + ','
            for j in range(0, i):
                dn = dn + objectToCreate[j] + ','
            dn = dn + settings.LDAP_SERVER['BASE_DN']
            attrs = {}
            attrs['objectclass'] = ['top', 'organizationalUnit']
            # do not care if the ou already exists
            try:
                self.target.createParent(dn, modlist.addModlist(attrs))
            except BaseException:
                pass

    def _createObject(self, objectTemplate, objectInstance):
        self.target.create(objectTemplate, objectInstance)
        # Ok, the object is added, empty changes set, and update object status
        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)

    def _modifyObject(self, objectTemplate, objectInstance, SCOPE):
        rdnAttributeName = objectTemplate.instanceNameAttribute.name
        self.target.update(objectTemplate, objectInstance, SCOPE)
        if not objectInstance.attributes[rdnAttributeName][
                0] == objectInstance.changes['set'][rdnAttributeName][0]:
            self.backend.update_id(
                objectTemplate, objectInstance,
                objectInstance.changes['set'][rdnAttributeName][0])
            # Update Backend value:
        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)

    def _deleteObject(self, objectTemplate, objectInstance):
        self.target.delete(objectTemplate, objectInstance)
        # Update Backend value:
        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)

    def _getRDN(self, objectTemplate, listID):
        objectHelper = LBEObjectInstanceHelper(objectTemplate)
        baseDN = objectHelper.callScriptClassMethod('base_dn')
        listObjectID = []
        for ID in listID:
            dn = objectTemplate.instanceNameAttribute.name + '=' + ID + ',' + baseDN
            listObjectID.append(dn)
        return listObjectID

    def _getID(self, listRDN):
        listID = []
        for rdn in listRDN:
            listID.append(rdn.split('=')[1].split(',')[0])
        return listID

    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."
Exemple #23
0
class LBEObjectInstanceHelper(object):
    def __init__(self, lbeObjectTemplate, lbeObjectInstance=None):
        self.template = lbeObjectTemplate
        self.instance = lbeObjectInstance
        self.scriptInstance = None
        self.backend = None

    def _backend(self):
        if self.backend is not None:
            return
        self.backend = BackendHelper()

    """
		LOAD Script
	"""

    def _load_script(self):
        if self.scriptInstance is not None:
            return

        # if lbeObjectTemplate.script is defined, create an instance
        scriptName = self.template.script.name
        if scriptName is not None:
            # the scriptName is like 'custom.employee.EmployeePostConfig', so we need to extract the module, aka custom.employee
            moduleName = '.'.join(scriptName.split('.')[:-1])
            # and the classname, EmployeePostConfig
            className = scriptName.split('.')[-1]
            __import__(moduleName)
            module = sys.modules[moduleName]
            self.scriptClass = getattr(module, className)
            # Create an instance
            #self.scriptInstance = self.scriptClass(self.template,self.instance)
        else:
            logging.error('This object does not have an associate script')

    def _create_script_instance(self, data=None):
        self._load_script()
        if self.scriptInstance is not None:
            return
        self.scriptInstance = self.scriptClass(self.template, self.instance, data)
        """
            END LOAD Script
        """

    """
		DE/COMPRESS Datas:
	"""

    def _compress_data(self, data):
        query = {}
        for key in data:
            if len(data.getlist(key)) == 1:
                query[key] = data[key]
            else:  # compress MultiValue:
                query[key] = '\0'.join(str(val) for val in data.getlist(key))
        return query

    def decompress_data(self, data):
        query = {}
        for key in data:
            if len(data.getlist(key)) == 1:
                query[key] = data[key]
            else: # decompress MultiValue:
                query[key] = data[key].split('\0')
        return query

    """
		END DE/COMPRESS Datas
	"""

    """
		MANAGE Object/Values:
	"""

    def save(self, ):
        self._checkUnique()
        # Search for an existing object
        searchResult = self.backend.getUserForObject(self.template, self.instance.name)
        if searchResult is None:
            return self.backend.createObject(self.template, self.instance)
        else:
            raise BackendObjectAlreadyExist('Already exists')

    def update(self):
        self._checkUnique()
        self.backend.createObject(self.template, self.instance.changes['set'])

    def getStatus(self, objectName):
        self._backend()
        return self.backend.getStatus(self.template, objectName)

    def modify(self):
        self._checkUnique()
        if not self.backend.getStatus(self.template, self.instance.name) == OBJECT_STATE_AWAITING_RECONCILIATION:
            self.backend.modifyObject(self.template, self.instance.name, self.instance.changes['set'],
                                  self.instance.displayName)
        else:
            raise TypeError("In order to change the Object, Your administrator needs to launch reconciliation first.")

    def remove(self, uid):
        self._backend()
        return self.backend.removeObject(self.template, uid)

    def approval(self, uid):
        self._backend()
        return self.backend.approvalObject(self.template, uid)

    def form(self, uid, data=None):
        if data is None:
            data = self.getValues(uid)
        else:
            data = self._compress_data(data)
        self._create_script_instance(data)
        return self.scriptInstance

    """
		END MANAGE Object/Values:
	"""

    """
		CALL Script
    """

    def callScriptMethod(self, methodName):
        self._create_script_instance()
        method = getattr(self.scriptInstance, methodName)
        return method()

    def callScriptClassMethod(self, methodName):
        self._load_script()
        method = getattr(self.scriptClass, methodName)
        return method()

    def callAttributeScriptMethod(self, attributeType, methodPrefix):
        for attributeInstance in self.template.lbeattributeinstance_set.filter(attributeType=attributeType):
            attributeName = attributeInstance.lbeAttribute.name
            try:
                if not self.instance.changes['set'] == {}:
                    self.instance.changes['set'][attributeName] = self.callScriptMethod(methodPrefix + attributeName)
                else:
                    self.instance.attributes[attributeName] = self.callScriptMethod(methodPrefix + attributeName)
            except AttributeError as e:
                try:
                    self.instance[attributeName] = self.callScriptMethod(methodPrefix + attributeName)
                except AttributeError as e:
                    logger.info(
                        'LBEObjectInstanceHelper: Method ' + methodPrefix + attributeName + ' not found or AttributeError exception. ' + e.__str__())
                    print (
                    'LBEObjectInstanceHelper: Method ' + methodPrefix + attributeName + ' not found or AttributeError exception. ' + e.__str__())

    def applyCustomScript(self):
        # Clean attributes before manage virtuals attributes
        #self.callAttributeScriptMethod(ATTRIBUTE_TYPE_FINAL, 'clean_')
        # Now, compute virtual attributes
        self.callAttributeScriptMethod(ATTRIBUTE_TYPE_VIRTUAL, 'compute_')

    def applyCustomScriptAttribute(self, attribute):
        try:
            attributeInstance = self.template.lbeattributeinstance_set.get(attributeType=ATTRIBUTE_TYPE_FINAL,
                                                                           lbeAttribute=LBEAttribute.objects.get(
                                                                               name__iexact=attribute))
            self.instance[attributeInstance.lbeAttribute.name] = self.callScriptMethod(
                "clean_" + attributeInstance.lbeAttribute.name)
        except BaseException as e:
            print e

    """
		END CALL Script
    """

    def _checkUnique(self):
        self._backend()
        attributesInstance = LBEAttributeInstance.objects.filter(lbeObjectTemplate=self.template, unique=True)
        objectInstances = self.backend.searchObjects(self.template)
        for attribute in attributesInstance:
            for obj in objectInstances:
                if not obj.changes['set'] == {}:
                    if obj.changes['set'].has_key(attribute.lbeAttribute.name) and self.instance.changes['set'].has_key(
                            attribute.lbeAttribute.name) \
                        and not self.instance.name == obj.name:
                        # MultiValue:
                        for objAttribute in obj.changes['set'][attribute.lbeAttribute.name]:
                            for instanceAttribute in self.instance.changes['set'][attribute.lbeAttribute.name]:
                                if objAttribute == instanceAttribute:
                                    raise ValueError("The value '" + str(
                                        self.instance.changes['set'][attribute.lbeAttribute.name][
                                            0]) + "' from the '" + attribute.lbeAttribute.name + "' attribute must be unique.\nPlease change its value or their computed values.")
                else:
                    if obj.attributes.has_key(attribute.lbeAttribute.name) and self.instance.changes['set'].has_key(
                            attribute.lbeAttribute.name) \
                        and not self.instance.name == obj.name:
                        # MultiValue:
                        for objAttribute in obj.attributes[attribute.lbeAttribute.name]:
                            for instanceAttribute in self.instance.changes['set'][attribute.lbeAttribute.name]:
                                if objAttribute == instanceAttribute:
                                    raise ValueError("The value '" + str(
                                        self.instance.changes['set'][attribute.lbeAttribute.name][
                                            0]) + "' from the '" + attribute.lbeAttribute.name + "' attribute must be unique.\nPlease change its value or their computed values.")

    def getValues(self, UID):
        """
		Function enables to get values from attributes fields and
		changes.set fields, return the new values (changes.set > attributes)
        """
        try:
            self._backend()
            valuesUser = self.backend.getUserForObject(self.template, UID)
            # Get all attributes from objects:
            attributes = LBEAttributeInstance.objects.filter(lbeObjectTemplate=self.template)
            d = dict()
            for attribute in attributes:
                # Only FINAL Attributes:
                if attribute.attributeType == 0:
                    try:
                        if valuesUser['changes']['set'].has_key(attribute.lbeAttribute.name):
                            q = QueryDict(attribute.lbeAttribute.name + '=' +
                                          valuesUser['changes']['set'][attribute.lbeAttribute.name][0])
                            q = q.copy()
                            for value in valuesUser['changes']['set'][attribute.lbeAttribute.name][1:]:
                                q.update({attribute.lbeAttribute.name: value})
                            d[attribute.lbeAttribute.name] = self._compress_data(q)[attribute.lbeAttribute.name]
                        else:
                            q = QueryDict(attribute.lbeAttribute.name + '=' +
                                          valuesUser['attributes'][attribute.lbeAttribute.name][0])
                            q = q.copy()
                            for value in valuesUser['attributes'][attribute.lbeAttribute.name][1:]:
                                q.update({attribute.lbeAttribute.name: value})
                            d[attribute.lbeAttribute.name] = self._compress_data(q)[attribute.lbeAttribute.name]
                    except BaseException:
                        d[attribute.lbeAttribute.name] = attribute.defaultValue
            return d
        except BaseException:
            # Create part:
            return None

    def getObject(self, UID):
        self._backend()
        return self.backend.searchObjectsByPattern(self.template, UID)[0]

    def searchPattern(self, pattern):
        self._backend()
        objects = self.backend.searchObjects(self.template)
        tabResult = []

        prog = re.compile(pattern, re.I)

        for object in objects:
            # check the status object & get its values
            if object.status == OBJECT_STATE_AWAITING_SYNC:
                objectValues = object.changes['set']
            else:
                objectValues = object.attributes
            # check values and pattern corresponding
            correspond = ''
            for key, values in objectValues.items():
                for cel in values:
                    if prog.search(cel):
                        attributeDisplayName = LBEAttribute.objects.get(name__iexact=key).displayName
                        correspond += cel.lower().replace(pattern, '<b>' + pattern + '</b>') + ' (<i>' + attributeDisplayName + '</i>) '
            if correspond:
                tabResult.append({'object': self.template.id, "name": object.name, 'displayName': object.displayName,
                                  "values": correspond})
        return tabResult

    def getValuesDecompressed(self, UID):
        """
		Function enables to get values from attributes fields and
		changes.set fields, return the new values (changes.set > attributes)
        """
        self._backend()
        valuesUser = self.backend.getUserForObject(self.template, UID)
        # Get all attributes from objects:
        attributes = LBEAttributeInstance.objects.filter(lbeObjectTemplate=self.template).order_by('position')
        d = dict()
        for attribute in attributes:
            try:
                if valuesUser['changes']['set'].has_key(attribute.lbeAttribute.name):
                    d[attribute.lbeAttribute.name] = valuesUser['changes']['set'][attribute.lbeAttribute.name]
                else:
                    d[attribute.lbeAttribute.name] = valuesUser['attributes'][attribute.lbeAttribute.name]
            except KeyError:
                # if no values, just set the default value:
                d[attribute.lbeAttribute.name] = attribute.defaultValue
        return d

    def createFromDict(self, request):
        # Reinit script configuration file:
        self.scriptInstance = None
        # attributes:
        attributes = {}
        for attributeInstance in self.template.lbeattributeinstance_set.all():
            # Only fetch real attributes from the request (mono and/or multi values)
            if attributeInstance.attributeType == ATTRIBUTE_TYPE_FINAL:
                attributeName = attributeInstance.lbeAttribute.name
                if len(request.POST[attributeName].split('�')) > 1:
                    attributes[attributeName] = request.POST[attributeName].split('�')
                else:
                    attributes[attributeName] = [request.POST[attributeName]]
            # IMPORTANT: We need to create an instance without the uniqueBecause because it may be a computed attribute, for example uid (compute from firstname/name)
        self.instance = LBEObjectInstance(self.template, attributes=attributes)
        self.instance.status = OBJECT_STATE_AWAITING_SYNC
        self.applyCustomScript()
        # Set uniqueName and displayName
        try:
            self.instance.name = self.instance.attributes[self.template.instanceNameAttribute.name][0]
            self.instance.displayName = self.instance.attributes[self.template.instanceDisplayNameAttribute.name][0]
            # It's a new object, the changesSet apply to all attributes
            self.instance.changes['type'] = OBJECT_CHANGE_CREATE_OBJECT
            self.instance.changes['set'] = self.instance.attributes
        except BaseException as e:
            print e.__str__()
            # TODO: Remove technical message, use another handler to send message to administrator
            messages.add_message(request, messages.ERROR,
                                 'nameAttribute or displayNameAttribute does not exist in object attributes')


    def updateFromDict(self, ID, values):
        self.scriptInstance = None
        self.instance = LBEObjectInstance(self.template, attributes=None)
        self.instance.changes['set'] = values
        self.instance.attributes = values
        # compute attributes:
        self._create_script_instance()
        self.applyCustomScript()
        # set them (if not been yet) to array:
        for key in self.instance.attributes:
            if isinstance(self.instance.attributes[key], str) or isinstance(self.instance.attributes[key], unicode):
                self.instance.attributes[key] = [self.instance.attributes[key]]
            # change the displayName value:
        self.instance.displayName = self.instance.changes['set'][self.template.instanceDisplayNameAttribute.name][0]
        # ID object:
        self.instance.name = ID

    def compute(self, lbeObjectInstance):
        self.instance = lbeObjectInstance
        self._create_script_instance()
        # Do not make change if changes.set is empty:
        if not lbeObjectInstance.changes['set'] == {}:
            self.applyCustomScript()
Exemple #24
0
 def _executePerson(self, userID):
     # backend db:
     backend = BackendHelper()
     obj = backend.getUserUIDForObject(self.object, userID)
     # check if characters:
     if self.word[3] != '':
         # split ',' values:
         val = self.word[3].split(',')
         try:
             for value in obj['attributes'][self.attribute]:
                 for attrValue in val:
                     if self.operator == '=':
                         if attrValue == value:
                             return True
                     elif self.operator == '!=':
                         if attrValue == value:
                             return False
         except BaseException as e:
             # e
             # attribute does not exist for user:
             pass
         return self.operator == '!='
     # only a number:
     elif self.number:
         try:
             if self.operator == '=':
                 number = self.number.split(',')
                 for nb in number:
                     if int(nb) == int(
                             obj['attributes'][self.attribute][0]):
                         return True
                 return False
             elif self.operator == '!=':
                 number = self.number.split(',')
                 for nb in number:
                     if int(nb) == int(
                             obj['attributes'][self.attribute][0]):
                         return False
                 return True
             elif self.operator == '>':
                 return int(
                     obj['attributes'][self.attribute][0]) > self.number
             elif self.operator == '<':
                 return int(
                     obj['attributes'][self.attribute][0]) < self.number
             elif self.operator == '<=':
                 return int(
                     obj['attributes'][self.attribute][0]) <= self.number
             elif self.operator == '>=':
                 return int(
                     obj['attributes'][self.attribute][0]) >= self.number
         except:
             # wrong key
             self.traceback = "The key " + self.attribute + "does not exist to the Backend Server for " + userID + "."
             return False
     # number range:
     elif self.numberTo and self.numberFrom:
         try:
             if self.operator == '=':
                 return self.numberTo <= int(obj['attributes'][self.attribute][0]) and \
                        self.numberFrom >= int(obj['attributes'][self.attribute][0])
             elif self.operator == '!=':
                 return self.numberTo <= int(obj['attributes'][self.attribute][0]) and \
                        self.numberFrom >= int(obj['attributes'][self.attribute][0])
         except:
             # wrong key
             self.traceback = "The key " + self.attribute + "does not exist to the Backend Server for " + userID + "."
             return False
     # not necessary:
     return False
Exemple #25
0
 def __init__(self):
     self.backend = BackendHelper()
     self.target = TargetHelper()
Exemple #26
0
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))
Exemple #27
0
 def _executePerson(self, userID):
     # backend db:
     backend = BackendHelper()
     obj = backend.getUserUIDForObject(self.object, userID)
     # check if characters:
     if self.word[3] != '':
         # split ',' values:
         val = self.word[3].split(',')
         try:
             for value in obj['attributes'][self.attribute]:
                 for attrValue in val:
                     if self.operator == '=':
                         if attrValue == value:
                             return True
                     elif self.operator == '!=':
                         if attrValue == value:
                             return False
         except BaseException as e:
             # e
             # attribute does not exist for user:
             pass
         return self.operator == '!='
     # only a number:
     elif self.number:
         try:
             if self.operator == '=':
                 number = self.number.split(',')
                 for nb in number:
                     if int(nb) == int(obj['attributes'][self.attribute][0]):
                         return True
                 return False
             elif self.operator == '!=':
                 number = self.number.split(',')
                 for nb in number:
                     if int(nb) == int(obj['attributes'][self.attribute][0]):
                         return False
                 return True
             elif self.operator == '>':
                 return int(obj['attributes'][self.attribute][0]) > self.number
             elif self.operator == '<':
                 return int(obj['attributes'][self.attribute][0]) < self.number
             elif self.operator == '<=':
                 return int(obj['attributes'][self.attribute][0]) <= self.number
             elif self.operator == '>=':
                 return int(obj['attributes'][self.attribute][0]) >= self.number
         except:
             # wrong key
             self.traceback = "The key " + self.attribute + "does not exist to the Backend Server for " + userID + "."
             return False
     # number range:
     elif self.numberTo and self.numberFrom:
         try:
             if self.operator == '=':
                 return self.numberTo <= int(obj['attributes'][self.attribute][0]) and \
                        self.numberFrom >= int(obj['attributes'][self.attribute][0])
             elif self.operator == '!=':
                 return self.numberTo <= int(obj['attributes'][self.attribute][0]) and \
                        self.numberFrom >= int(obj['attributes'][self.attribute][0])
         except:
             # wrong key
             self.traceback = "The key " + self.attribute + "does not exist to the Backend Server for " + userID + "."
             return False
     # not necessary:
     return False
Exemple #28
0
class ImportTarget():
    def __init__(self):
        self.backend = BackendHelper()
        self.target = TargetHelper()
        self.start_date = django.utils.timezone.now()

    def _getID(self, listRDN):
        listID = []
        for rdn in listRDN:
            listID.append(rdn.split('=')[1].split(',')[0])
        return listID

    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."
Exemple #29
0
class UpgradeBT():
    def __init__(self):
        self.backend = BackendHelper()
        self.target = TargetHelper()
        self.start_date = django.utils.timezone.now()

    def _deleteORCreate(self, objectTemplate, ot):
        if objectTemplate.reconciliation_object_missing_policy == OBJECT_ADD_BACKEND:
            print "    |-> Adding \033[95m'" + ot.displayName + "'\033[0m object into Backend... "
            try:
                self.backend.createObject(objectTemplate, ot, True)
                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, ot, changes)
            except BaseException as e:
                print "''''''''"
                print e
                print "''''''''"
        elif objectTemplate.reconciliation_object_missing_policy == OBJECT_DELETE_TARGET:
            print "    |-> Removing \033[95m'" + ot.displayName + "'\033[0m object from Target... "
            try:
                self.target.delete(objectTemplate, ot)
            except BaseException as e:
                print "''''''''"
                print e
                print "''''''''"

    def _upgradeObject(self, objectTemplate, objHelper, ot, ob):
        # check and replace ignore attributes:
        ignoreAttributes = objHelper.callScriptClassMethod("ignore_attributes")
        for key, values in ot.attributes.items():
            if key in ignoreAttributes:
                ob.attributes[key] = ot.attributes[key]

        if not ot.attributes == ob.attributes:
            if objectTemplate.reconciliation_object_different_policy == TARGET:
                # check if values are empty []:
                # Then, skip it.
                numberEmpty = 0
                for values in set(ot.attributes) ^ set(ob.attributes):
                    try:
                        # either empty or empty string:
                        if ob.attributes[values] == [] or ob.attributes[values] == ['']:
                            numberEmpty += 1
                    except BaseException:
                        pass
                    if not numberEmpty == 0 and numberEmpty == len(set(ot.attributes) ^ set(ob.attributes)):
                        return
                print " |-> Upgrade Object '\033[35m" + ob.displayName + "\033[0m' into Target..."
                print " |-> -------------------------------------------- "
                print " ||-> Old Values: " + str(ot.attributes)
                print " ||-> New Values: " + str(ob.attributes)
                print " |-> -------------------------------------------- "
                # Remove & Add in order to add new attributes:
                try:
                    # Remove:
                    self.target.delete(objectTemplate, ob)
                    # Add
                    self.target.create(objectTemplate, ob)
                    # Synced:
                    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, ob, changes)
                except BaseException as e:
                    print e
            elif objectTemplate.reconciliation_object_different_policy == BACKEND:
                print " |-> Upgrade Object '\033[35m" + ob.displayName + "\033[0m' into Backend..."
                print " |-> -------------------------------------------- "
                print " ||-> Old Values: " + str(ob.attributes)
                print " ||-> New Values: " + str(ot.attributes)
                print " |-> -------------------------------------------- "
                try:
                    self.backend.updateObject(objectTemplate, ob, ot)
                except BaseException as e:
                    print e

    def start(self):
        print " Upgrade Server..."
        for objectTemplate in LBEObjectTemplate.objects.all():
            print " |-> \033[91m" + 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)
            # Target to Backend:
            for ot in objTarget:
                exist = False
                for ob in objBackend:
                    if ot.name == ob.name:
                        self._upgradeObject(objectTemplate, objHelper, ot, ob)
                        exist = True
                        break
                if not exist:
                    self._deleteORCreate(objectTemplate, ot)
            # Synced object:
            objectTemplate.synced_at = django.utils.timezone.now()
            objectTemplate.save()
        print " End."
Exemple #30
0
 def _backend(self):
     if self.backend is not None:
         return
     self.backend = BackendHelper()
Exemple #31
0
class DebugTarget():
    def __init__(self):
        self.backend = BackendHelper()
        self.target = TargetHelper()

    """
	  Check which values' objects need to be sync and show them.
    """

    def _needModification(self):
        print '  Objects need change:'
        number = 0
        for objectTemplate in LBEObjectTemplate.objects.all():
            # We're looking for all objects with state = OBJECT_STATE_AWAITING_SYNC
            for objectInstance in self.backend.searchObjectsToUpdate(
                    objectTemplate):
                type = ""
                if objectInstance.changes[
                        'type'] == OBJECT_CHANGE_CREATE_OBJECT:
                    type += "\033[34mcreate"
                elif objectInstance.changes[
                        'type'] == OBJECT_CHANGE_UPDATE_OBJECT:
                    type += "\033[36mupdate"
                elif objectInstance.changes[
                        'type'] == OBJECT_CHANGE_DELETE_OBJECT:
                    type += "\033[33mdelete"
                type += "\033[0m"
                value = "    " + type + ' \033[35m' + objectInstance.displayName + '\033[0m : '
                valuesChanges = dict()
                for k in objectInstance.changes['set']:
                    try:
                        if objectInstance.attributes[
                                k] != objectInstance.changes['set'][k]:
                            valuesChanges[k] = 'new Value: ' + str(
                                objectInstance.changes['set']
                                [k]) + ' | old value: ' + str(
                                    objectInstance.attributes[k])
                    except KeyError:
                        valuesChanges[k] = 'new Value: ' + str(
                            objectInstance.changes['set'][k])
                        pass
                print value + str(valuesChanges)
                number += 1
        if number == 0:
            print "    \033[91m<None>\033[0m"

        print ""
        print '  Groups need change:'
        number = 0
        for groupTemplate in LBEGroup.objects.all():
            for groupInstance in self.backend.searchObjectsToUpdate(
                    groupTemplate):
                number += 1
                type = ""
                if groupInstance.changes[
                        'type'] == OBJECT_CHANGE_CREATE_OBJECT:
                    type += "\033[34mcreate"
                elif groupInstance.changes[
                        'type'] == OBJECT_CHANGE_UPDATE_OBJECT:
                    type += "\033[36mupdate"
                elif groupInstance.changes[
                        'type'] == OBJECT_CHANGE_DELETE_OBJECT:
                    type += "\033[33mdelete"
                type += "\033[0m"
                value = "    " + type + ' \033[35m' + groupInstance.displayName + '\033[0m : '
                valuesChanges = dict()
                for k in groupInstance.changes['set']:
                    try:
                        if groupInstance.attributes[
                                k] != groupInstance.changes['set'][k]:
                            valuesChanges[k] = 'new Value: ' + str(
                                groupInstance.changes['set']
                                [k]) + ' | old value: ' + str(
                                    groupInstance.attributes[k])
                    except KeyError:
                        valuesChanges[k] = 'new Value: ' + str(
                            groupInstance.changes['set'][k])
                        pass
                print value + str(valuesChanges)
        if number == 0:
            print "    \033[91m<None>\033[0m"

    """
	   Show objects do not exist in LBE but LDAP.
	"""

    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 start(self):
        self._needModification()
        print ""
        print '\033[93m.........................\033[0m'
        print '\033[93m.........................\033[0m'
        print ""
        self._notExistObjectLBE()
Exemple #32
0
class ImportTarget():
    def __init__(self):
        self.backend = BackendHelper()
        self.target = TargetHelper()
        self.start_date = django.utils.timezone.now()

    def _getID(self, listRDN):
        listID = []
        for rdn in listRDN:
            listID.append(rdn.split('=')[1].split(',')[0])
        return listID

    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."
Exemple #33
0
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))
Exemple #34
0
class UpgradeTarget:
    def __init__(self):
        self.backend = BackendHelper()
        self.target = TargetHelper()
        self.start_date = django.utils.timezone.now()

    def _changeClass(self, objectTemplate):
        objHelper = LBEObjectInstanceHelper(objectTemplate)
        try:
            scope = objHelper.callScriptClassMethod("scope_search")
        except BaseException:
            scope = 0

        ob = self.backend.searchObjects(objectTemplate)
        for objectInstance in ob:
            try:
                oldClasses = self.target.getInstanceObjectClasses(objectTemplate, objectInstance, scope)
            except ldap.NO_SUCH_OBJECT:
                continue
            newClasses = objHelper.callScriptClassMethod("object_classes")

            if not sorted(oldClasses) == sorted(newClasses):
                print "    |-> The object classes have changed for '\033[35m" + objectInstance.displayName + "\033[0m'"
                try:
                    self.target.changeClass(objectTemplate, objectInstance, oldClasses, newClasses)
                except ldap.OBJECT_CLASS_VIOLATION as e:
                    print "    *\033[91mError to modify the object class " + str(newClasses) + ", skip it.\033[0m"
                    print "    *\033[91m" + e[0]["info"] + "\033[0m"

    def _changeRDN(self, objectTemplate):
        if objectTemplate.needReconciliationRDN:
            print "    |-> Upgrade the RDN Target server for \033[35m" + objectTemplate.name + "\033[0m..."
            # Change the RDN Attribute to the Target Server
            ob = self.backend.searchObjects(objectTemplate)
            for o in ob:
                try:
                    self.target.changeRDN(
                        objectTemplate,
                        o,
                        objectTemplate.instanceNameBeforeAttribute.name,
                        o.attributes[objectTemplate.instanceNameBeforeAttribute.name][0],
                    )
                except BaseException:
                    # if object does not exists into the Target Server
                    pass
                self.backend.updateStatus(objectTemplate, o.name)
            # Update values for changing RDN attribute
            objectTemplate.instanceNameBeforeAttribute = None
            objectTemplate.needReconciliationRDN = False
            objectTemplate.save()
            print "    |-> Done."

    def _createParent(self, lbeObjectTemplate, objService):
        base_dn = objService.callScriptClassMethod("base_dn")
        objectToCreate = base_dn.replace(settings.LDAP_SERVER["BASE_DN"], "")[:-1].split(",")
        objectToCreate.reverse()
        for i in range(0, len(objectToCreate)):
            dn = objectToCreate[i] + ","
            for j in range(0, i):
                dn = dn + objectToCreate[j] + ","
            dn = dn + settings.LDAP_SERVER["BASE_DN"]
            attrs = {}
            attrs["objectclass"] = ["top", "organizationalUnit"]
            # do not care if the ou already exists
            try:
                self.target.createParent(dn, modlist.addModlist(attrs))
            except BaseException:
                pass

    def _createObject(self, objectTemplate, objectInstance):
        self.target.create(objectTemplate, objectInstance)
        # Ok, the object is added, empty changes set, and update object status
        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)

    def _modifyObject(self, objectTemplate, objectInstance, SCOPE):
        rdnAttributeName = objectTemplate.instanceNameAttribute.name
        self.target.update(objectTemplate, objectInstance, SCOPE)
        if not objectInstance.attributes[rdnAttributeName][0] == objectInstance.changes["set"][rdnAttributeName][0]:
            self.backend.update_id(objectTemplate, objectInstance, objectInstance.changes["set"][rdnAttributeName][0])
            # Update Backend value:
        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)

    def _deleteObject(self, objectTemplate, objectInstance):
        self.target.delete(objectTemplate, objectInstance)
        # Update Backend value:
        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)

    def _getRDN(self, objectTemplate, listID):
        objectHelper = LBEObjectInstanceHelper(objectTemplate)
        baseDN = objectHelper.callScriptClassMethod("base_dn")
        listObjectID = []
        for ID in listID:
            dn = objectTemplate.instanceNameAttribute.name + "=" + ID + "," + baseDN
            listObjectID.append(dn)
        return listObjectID

    def _getID(self, listRDN):
        listID = []
        for rdn in listRDN:
            listID.append(rdn.split("=")[1].split(",")[0])
        return listID

    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."
Exemple #35
0
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))
Exemple #36
0
 def __init__(self):
     self.backend = BackendHelper()
Exemple #37
0
class DebugTarget():
    def __init__(self):
        self.backend = BackendHelper()
        self.target = TargetHelper()

    """
	  Check which values' objects need to be sync and show them.
    """

    def _needModification(self):
        print '  Objects need change:'
        number = 0
        for objectTemplate in LBEObjectTemplate.objects.all():
            # We're looking for all objects with state = OBJECT_STATE_AWAITING_SYNC
            for objectInstance in self.backend.searchObjectsToUpdate(objectTemplate):
                type = ""
                if objectInstance.changes['type'] == OBJECT_CHANGE_CREATE_OBJECT:
                    type += "\033[34mcreate"
                elif objectInstance.changes['type'] == OBJECT_CHANGE_UPDATE_OBJECT:
                    type += "\033[36mupdate"
                elif objectInstance.changes['type'] == OBJECT_CHANGE_DELETE_OBJECT:
                    type += "\033[33mdelete"
                type += "\033[0m"
                value = "    " + type + ' \033[35m' + objectInstance.displayName + '\033[0m : '
                valuesChanges = dict()
                for k in objectInstance.changes['set']:
                    try:
                        if objectInstance.attributes[k] != objectInstance.changes['set'][k]:
                            valuesChanges[k] = 'new Value: ' + str(
                                objectInstance.changes['set'][k]) + ' | old value: ' + str(
                                objectInstance.attributes[k])
                    except KeyError:
                        valuesChanges[k] = 'new Value: ' + str(objectInstance.changes['set'][k])
                        pass
                print value + str(valuesChanges)
                number += 1
        if number == 0:
            print "    \033[91m<None>\033[0m"

        print ""
        print '  Groups need change:'
        number = 0
        for groupTemplate in LBEGroup.objects.all():
            for groupInstance in self.backend.searchObjectsToUpdate(groupTemplate):
                number += 1
                type = ""
                if groupInstance.changes['type'] == OBJECT_CHANGE_CREATE_OBJECT:
                    type += "\033[34mcreate"
                elif groupInstance.changes['type'] == OBJECT_CHANGE_UPDATE_OBJECT:
                    type += "\033[36mupdate"
                elif groupInstance.changes['type'] == OBJECT_CHANGE_DELETE_OBJECT:
                    type += "\033[33mdelete"
                type += "\033[0m"
                value = "    " + type + ' \033[35m' + groupInstance.displayName + '\033[0m : '
                valuesChanges = dict()
                for k in groupInstance.changes['set']:
                    try:
                        if groupInstance.attributes[k] != groupInstance.changes['set'][k]:
                            valuesChanges[k] = 'new Value: ' + str(
                                groupInstance.changes['set'][k]) + ' | old value: ' + str(
                                groupInstance.attributes[k])
                    except KeyError:
                        valuesChanges[k] = 'new Value: ' + str(groupInstance.changes['set'][k])
                        pass
                print value + str(valuesChanges)
        if number == 0:
            print "    \033[91m<None>\033[0m"

    """
	   Show objects do not exist in LBE but LDAP.
	"""

    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 start(self):
        self._needModification()
        print ""
        print '\033[93m.........................\033[0m'
        print '\033[93m.........................\033[0m'
        print ""
        self._notExistObjectLBE()
Exemple #38
0
 def __init__(self):
     self.backend = BackendHelper()
     self.target = TargetHelper()
Exemple #39
0
 def __init__(self):
     self.backend = BackendHelper()
     self.target = TargetHelper()
     self.start_date = django.utils.timezone.now()
Exemple #40
0
class UpgradeBT():
    def __init__(self):
        self.backend = BackendHelper()
        self.target = TargetHelper()
        self.start_date = django.utils.timezone.now()

    def _deleteORCreate(self, objectTemplate, ot):
        if objectTemplate.reconciliation_object_missing_policy == OBJECT_ADD_BACKEND:
            print "    |-> Adding \033[95m'" + ot.displayName + "'\033[0m object into Backend... "
            try:
                self.backend.createObject(objectTemplate, ot, True)
                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, ot, changes)
            except BaseException as e:
                print "''''''''"
                print e
                print "''''''''"
        elif objectTemplate.reconciliation_object_missing_policy == OBJECT_DELETE_TARGET:
            print "    |-> Removing \033[95m'" + ot.displayName + "'\033[0m object from Target... "
            try:
                self.target.delete(objectTemplate, ot)
            except BaseException as e:
                print "''''''''"
                print e
                print "''''''''"

    def _upgradeObject(self, objectTemplate, objHelper, ot, ob):
        # check and replace ignore attributes:
        ignoreAttributes = objHelper.callScriptClassMethod("ignore_attributes")
        for key, values in ot.attributes.items():
            if key in ignoreAttributes:
                ob.attributes[key] = ot.attributes[key]

        if not ot.attributes == ob.attributes:
            if objectTemplate.reconciliation_object_different_policy == TARGET:
                # check if values are empty []:
                # Then, skip it.
                numberEmpty = 0
                for values in set(ot.attributes) ^ set(ob.attributes):
                    try:
                        # either empty or empty string:
                        if ob.attributes[values] == [] or ob.attributes[
                                values] == ['']:
                            numberEmpty += 1
                    except BaseException:
                        pass
                    if not numberEmpty == 0 and numberEmpty == len(
                            set(ot.attributes) ^ set(ob.attributes)):
                        return
                print " |-> Upgrade Object '\033[35m" + ob.displayName + "\033[0m' into Target..."
                print " |-> -------------------------------------------- "
                print " ||-> Old Values: " + str(ot.attributes)
                print " ||-> New Values: " + str(ob.attributes)
                print " |-> -------------------------------------------- "
                # Remove & Add in order to add new attributes:
                try:
                    # Remove:
                    self.target.delete(objectTemplate, ob)
                    # Add
                    self.target.create(objectTemplate, ob)
                    # Synced:
                    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, ob, changes)
                except BaseException as e:
                    print e
            elif objectTemplate.reconciliation_object_different_policy == BACKEND:
                print " |-> Upgrade Object '\033[35m" + ob.displayName + "\033[0m' into Backend..."
                print " |-> -------------------------------------------- "
                print " ||-> Old Values: " + str(ob.attributes)
                print " ||-> New Values: " + str(ot.attributes)
                print " |-> -------------------------------------------- "
                try:
                    self.backend.updateObject(objectTemplate, ob, ot)
                except BaseException as e:
                    print e

    def start(self):
        print " Upgrade Server..."
        for objectTemplate in LBEObjectTemplate.objects.all():
            print " |-> \033[91m" + 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)
            # Target to Backend:
            for ot in objTarget:
                exist = False
                for ob in objBackend:
                    if ot.name == ob.name:
                        self._upgradeObject(objectTemplate, objHelper, ot, ob)
                        exist = True
                        break
                if not exist:
                    self._deleteORCreate(objectTemplate, ot)
            # Synced object:
            objectTemplate.synced_at = django.utils.timezone.now()
            objectTemplate.save()
        print " End."