Пример #1
0
    def post(self, residence, prenom, nom, mail, phone, go_redirect=True):

        member_uid = Translations.to_uid(prenom, nom)
        if phone == '':
            phone = ' '
#end if

        residence_dn = Residences.get_dn_by_name(self.user, residence)

        # On modifie silencieusement le nom de la machine si il existe déjà
        def try_name(name, number):
            actual_name = name
            if number > 0:
                actual_name = name + str(number)
            #end if

            member = Member.get_by_uid(self.user, residence_dn, actual_name)
            if member is not None:
                return try_name(name, number + 1)
            else:
                return actual_name
            #end if
#endif

        def year_directory_exists(year):
            search = self.user.ldap_bind.search(
                ldap_config.username_base_dn + residence_dn,
                "(ou=" + str(year) + ")")
            if len(search) == 0:
                BrieLogging.get().info("Year " + str(year) +
                                       " directory does not exist. Creating.")
                directory_attrs = {
                    "objectClass": ["top", "organizationalUnit"],
                    "ou": str(year).encode("utf-8")
                }
                directory_dn = "ou=" + str(
                    year) + "," + ldap_config.username_base_dn + residence_dn
                self.user.ldap_bind.add_entry(directory_dn, directory_attrs)

        member_uid = try_name(member_uid, 0)

        member = Member.entry_attr(member_uid, prenom, nom, mail, phone, -1)

        year = CotisationComputes.registration_current_year()

        member_dn = "uid=" + member_uid + ",ou=" + str(
            year) + "," + ldap_config.username_base_dn + residence_dn
        year_directory_exists(year)
        self.user.ldap_bind.add_entry(member_dn, member)

        #preview = member, room
        #index_result["preview"] = preview

        if go_redirect:
            redirect("/edit/member/" + residence + "/" + member_uid)
        else:
            return member_uid
Пример #2
0
    def post(self, residence, prenom, nom, mail, phone, go_redirect=True):

        member_uid = Translations.to_uid(prenom, nom)
        if phone == "":
            phone = " "
        # end if

        residence_dn = Residences.get_dn_by_name(self.user, residence)

        # On modifie silencieusement le nom de la machine si il existe déjà
        def try_name(name, number):
            actual_name = name
            if number > 0:
                actual_name = name + str(number)
            # end if

            member = Member.get_by_uid(self.user, residence_dn, actual_name)
            if member is not None:
                return try_name(name, number + 1)
            else:
                return actual_name
            # end if

        # endif

        def year_directory_exists(year):
            search = self.user.ldap_bind.search(ldap_config.username_base_dn + residence_dn, "(ou=" + str(year) + ")")
            if len(search) == 0:
                BrieLogging.get().info("Year " + str(year) + " directory does not exist. Creating.")
                directory_attrs = {"objectClass": ["top", "organizationalUnit"], "ou": str(year).encode("utf-8")}
                directory_dn = "ou=" + str(year) + "," + ldap_config.username_base_dn + residence_dn
                self.user.ldap_bind.add_entry(directory_dn, directory_attrs)

        member_uid = try_name(member_uid, 0)

        member = Member.entry_attr(member_uid, prenom, nom, mail, phone, -1)

        year = CotisationComputes.registration_current_year()

        member_dn = "uid=" + member_uid + ",ou=" + str(year) + "," + ldap_config.username_base_dn + residence_dn
        year_directory_exists(year)
        self.user.ldap_bind.add_entry(member_dn, member)

        # preview = member, room
        # index_result["preview"] = preview

        if go_redirect:
            redirect("/edit/member/" + residence + "/" + member_uid)
        else:
            return member_uid
Пример #3
0
    def post(self, residence, member_uid, name, mac, go_redirect=True, plugin_action=None):
        residence_dn = Residences.get_dn_by_name(self.user, residence)
        member_base_dn = ldap_config.username_base_dn + residence_dn
        member = Member.get_by_uid(self.user, residence_dn, member_uid)

        mac = mac.strip()
        name = name.strip().replace(" ", "-").replace("_", "-")
        name = Translations.formatName(name)
        # name = Translations.strip_accents(name)

        # Vérification que l'adresse mac soit correcte
        mac_match = re.match("^([0-9A-Fa-f]{2}[:-]?){5}([0-9A-Fa-f]{2})$", mac)
        if mac_match is None:
            # TODO : changer l'exception en une page d'erreur
            raise Exception("mac non valide")
        # endif

        # Remplacement de l'adresse mac non séparée
        mac_match = re.match(
            "^([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})$", mac
        )
        if mac_match is not None:
            mac = (
                mac_match.group(1)
                + ":"
                + mac_match.group(2)
                + ":"
                + mac_match.group(3)
                + ":"
                + mac_match.group(4)
                + ":"
                + mac_match.group(5)
                + ":"
                + mac_match.group(6)
            )
        # endif

        # Remplacement de l'adresse mac séparée par des tirets
        mac_match = re.match(
            "^([0-9A-Fa-f]{2})-([0-9A-Fa-f]{2})-([0-9A-Fa-f]{2})-([0-9A-Fa-f]{2})-([0-9A-Fa-f]{2})-([0-9A-Fa-f]{2})$",
            mac,
        )
        if mac_match is not None:
            mac = (
                mac_match.group(1)
                + ":"
                + mac_match.group(2)
                + ":"
                + mac_match.group(3)
                + ":"
                + mac_match.group(4)
                + ":"
                + mac_match.group(5)
                + ":"
                + mac_match.group(6)
            )
        # endif

        # Passage au format lowercase
        mac = mac.lower()

        # Vérification que le membre existe
        if member is None:
            # TODO : membre inexistant
            pass
        # endif

        # Vérification que l'adresse mac de la machine n'existe pas déjà
        # Note : on cherche sur toute la résidence (residence_dn)
        machine = Machine.get_dhcp_by_mac(self.user, member_base_dn, mac)
        if machine is not None:
            # TODO : gérer l'exception
            raise Exception("mac address already exist")
        # endif

        # Nettoyage des erreurs communes

        # On modifie silencieusement le nom de la machine si il existe déjà
        def try_name(name, number):
            actual_name = name
            if number > 0:
                actual_name = name + "-" + str(number)
            # end if

            machine = Machine.get_dns_by_name(self.user, member_base_dn, actual_name)
            if machine is not None:
                return try_name(name, number + 1)
            else:
                return actual_name
            # end if

        # endif

        # On retire les underscore interdits
        name = re.sub("_", "-", name)

        name = try_name(name, 0)

        # Génération de l'id de la machine et recherche d'une ip libre
        ip = IpReservation.get_first_free(self.user, residence_dn)

        if ip is None:
            raise Exception("le pool d'adresse IP est vide. aucune adresse IP disponible pour ajouter une machine")
        # end if

        # Indique que l'ip est prise
        taken_attribute = IpReservation.taken_attr(str(datetime.today()))
        self.user.ldap_bind.add_attr(ip.dn, taken_attribute)

        machine_folder = Machine.folder_attr()
        machine_folder_dn = ldap_config.machine_base_dn + member.dn
        try:
            self.user.ldap_bind.add_entry(machine_folder_dn, machine_folder)
        except ldap.ALREADY_EXISTS:
            pass  # OKAY
        # end try

        # Attributs ldap de l'objet machine (regroupant dns et dhcp)
        machine_top = Machine.entry_attr(name)

        # Attributs ldap des objets dhcp et dns, fils de l'objet machine
        machine_dhcp = Machine.dhcp_attr(name, mac)
        machine_dns = Machine.dns_attr(name, ip.cn.first())

        # Construction du dn et ajout de l'objet machine
        # en fils du membre (membre.dn)
        machine_dn = "cn=" + name + "," + ldap_config.machine_base_dn + member.dn
        self.user.ldap_bind.add_entry(machine_dn, machine_top)

        # Construction du dn et ajout de l'objet dhcp
        # en fils de la machine (machine_dn)
        dhcp_dn = "cn=dhcp," + machine_dn
        self.user.ldap_bind.add_entry(dhcp_dn, machine_dhcp)

        # Construction du dn et ajout de l'objet dns
        dns_dn = "cn=dns," + machine_dn
        self.user.ldap_bind.add_entry(dns_dn, machine_dns)

        # Ajout de l'entrée dans les logs
        BrieLogging.get().info(
            "ajout machine " + mac + " pour l'utilisateur " + member.dn + " par l'admin " + self.user.attrs.dn
        )

        plugin_vars = {"machine_dn": machine_dn, "name": name, "ip": ip, "mac": mac}

        plugin_action(self.user, residence, plugin_vars)

        if go_redirect:
            redirect("/edit/member/" + residence + "/" + member_uid)
Пример #4
0
    def post(self,
             residence,
             member_uid,
             name,
             mac,
             go_redirect=True,
             plugin_action=None):
        residence_dn = Residences.get_dn_by_name(self.user, residence)
        member_base_dn = ldap_config.username_base_dn + residence_dn
        member = Member.get_by_uid(self.user, residence_dn, member_uid)

        mac = mac.strip()
        name = name.strip().replace(" ", "-").replace("_", "-")
        name = Translations.formatName(name)
        #name = Translations.strip_accents(name)

        #Vérification que l'adresse mac soit correcte
        mac_match = re.match('^([0-9A-Fa-f]{2}[:-]?){5}([0-9A-Fa-f]{2})$', mac)
        if mac_match is None:
            #TODO : changer l'exception en une page d'erreur
            raise Exception("mac non valide")
        #endif

        #Remplacement de l'adresse mac non séparée
        mac_match = re.match(
            '^([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})$',
            mac)
        if mac_match is not None:
            mac = mac_match.group(1) + ":" + mac_match.group(
                2) + ":" + mac_match.group(3) + ":" + mac_match.group(
                    4) + ":" + mac_match.group(5) + ":" + mac_match.group(6)
        #endif

        #Remplacement de l'adresse mac séparée par des tirets
        mac_match = re.match(
            '^([0-9A-Fa-f]{2})-([0-9A-Fa-f]{2})-([0-9A-Fa-f]{2})-([0-9A-Fa-f]{2})-([0-9A-Fa-f]{2})-([0-9A-Fa-f]{2})$',
            mac)
        if mac_match is not None:
            mac = mac_match.group(1) + ":" + mac_match.group(
                2) + ":" + mac_match.group(3) + ":" + mac_match.group(
                    4) + ":" + mac_match.group(5) + ":" + mac_match.group(6)
        #endif

        #Passage au format lowercase
        mac = mac.lower()

        # Vérification que le membre existe
        if member is None:
            #TODO : membre inexistant
            pass
        #endif

        # Vérification que l'adresse mac de la machine n'existe pas déjà
        # Note : on cherche sur toute la résidence (residence_dn)
        machine = Machine.get_dhcp_by_mac(self.user, member_base_dn, mac)
        if machine is not None:
            #TODO : gérer l'exception
            raise Exception("mac address already exist")
        #endif

        # Nettoyage des erreurs communes

        # On modifie silencieusement le nom de la machine si il existe déjà
        def try_name(name, number):
            actual_name = name
            if number > 0:
                actual_name = name + "-" + str(number)
            #end if

            machine = Machine.get_dns_by_name(self.user, member_base_dn,
                                              actual_name)
            if machine is not None:
                return try_name(name, number + 1)
            else:
                return actual_name
            #end if

        #endif

        #On retire les underscore interdits
        name = re.sub('_', '-', name)

        name = try_name(name, 0)

        # Génération de l'id de la machine et recherche d'une ip libre
        ip = IpReservation.get_first_free(self.user, residence_dn)

        if ip is None:
            raise Exception(
                "le pool d'adresse IP est vide. aucune adresse IP disponible pour ajouter une machine"
            )
        #end if

        # Indique que l'ip est prise
        taken_attribute = IpReservation.taken_attr(str(datetime.today()))
        self.user.ldap_bind.add_attr(ip.dn, taken_attribute)

        machine_folder = Machine.folder_attr()
        machine_folder_dn = ldap_config.machine_base_dn + member.dn
        try:
            self.user.ldap_bind.add_entry(machine_folder_dn, machine_folder)
        except ldap.ALREADY_EXISTS:
            pass  # OKAY
        #end try

        # Attributs ldap de l'objet machine (regroupant dns et dhcp)
        machine_top = Machine.entry_attr(name)

        # Attributs ldap des objets dhcp et dns, fils de l'objet machine
        machine_dhcp = Machine.dhcp_attr(name, mac)
        machine_dns = Machine.dns_attr(name, ip.cn.first())

        # Construction du dn et ajout de l'objet machine
        # en fils du membre (membre.dn)
        machine_dn = "cn=" + name + "," + ldap_config.machine_base_dn + member.dn
        self.user.ldap_bind.add_entry(machine_dn, machine_top)

        # Construction du dn et ajout de l'objet dhcp
        # en fils de la machine (machine_dn)
        dhcp_dn = "cn=dhcp," + machine_dn
        self.user.ldap_bind.add_entry(dhcp_dn, machine_dhcp)

        # Construction du dn et ajout de l'objet dns
        dns_dn = "cn=dns," + machine_dn
        self.user.ldap_bind.add_entry(dns_dn, machine_dns)

        # Ajout de l'entrée dans les logs
        BrieLogging.get().info("ajout machine " + mac +
                               " pour l'utilisateur " + member.dn +
                               " par l'admin " + self.user.attrs.dn)

        plugin_vars = {
            "machine_dn": machine_dn,
            "name": name,
            "ip": ip,
            "mac": mac
        }

        plugin_action(self.user, residence, plugin_vars)

        if go_redirect:
            redirect("/edit/member/" + residence + "/" + member_uid)