whos_lc.py 7.01 KB
Newer Older
1
#!/bin/bash /usr/scripts/python.sh
2 3 4 5 6 7
# -*- coding: utf-8 -*-
#
# Auteur : Pierre-Elliott Bécue <becue@crans.org>
# Licence : GPLv3
# Date : 01/09/2014

8
import sys
9 10 11
import argparse
from ldap import SIZELIMIT_EXCEEDED

12
from gestion.config import encoding
13
import lc_ldap.shortcuts
14 15 16 17
import lc_ldap.objets
import lc_ldap.filter2 as lfilter
import lc_ldap.crans_utils

18
ENCODING = encoding.in_encoding
19 20

def explore_db(args):
21
    """Utilise le contenu de args pour décider comment explorer la base de données."""
22
    data = search_ldap(args)
23
    data = macro_expand(data, args)
24 25 26 27 28
    data = limits(data, args)
    dataLen = sum([len(elem) for elem in data.itervalues()])
    if dataLen:
        for elem in data.itervalues():
            if len(elem) == 1:
29 30 31 32 33 34 35 36
                elem[0].display(
                    historique=args.historique,
                    blacklist=args.blacklist,
                    disp_adresse=args.adresse,
                    disp_telephone=args.telephone,
                    sshfp=args.sshfp,
                    ipsec=args.ipsec,
                    )
37
            else:
38
                print lc_ldap.printing.sprint_list(elem).encode(ENCODING)
39 40 41
                print "%s résultats" % len(elem)

def search_ldap(args):
42
    """Cherche et trie"""
43 44
    data = {}
    if args.ldap:
45
        search_filter = args.filtre.decode(ENCODING)
46
    else:
47 48 49 50 51 52 53 54 55 56 57
        search_filter = lfilter.human_to_ldap(args.filtre.decode(ENCODING))

    try:
        resultats = LDAP.search(search_filter, sizelimit=args.limit)
    except SIZELIMIT_EXCEEDED:
        raise EnvironmentError("La limite de résultats LDAP (%s) a été dépassée. Vous pouvez l'augmenter avec l'option -l" % (args.limit,))

    for elem in resultats:
        if not data.has_key(elem.__class__.__name__):
            data[elem.__class__.__name__] = [elem]
        else:
58 59
            if elem not in data[elem.__class__.__name__]:
                data[elem.__class__.__name__].append(elem)
60

61 62
    return data

63 64 65 66 67 68 69
def macro_expand(data, args):
    """Gère les macros spécifiques à whos_lc.
    Permet de récupérer les propriétaires d'objets cherchés,
    ou les factures ou les machines. De chercher par prise,
    etc etc"""
    return data

70
def limits(data, args):
71
    """Applique les limitations dans la recherche.
72
    Les cas sont a priori conflictuels.
73

74 75 76 77
    """
    data_restricted = {}
    data_restricted.update(data)
    contentFilter = []
78

79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
    if args.adherent:
        contentFilter = ["adherent"]
    elif args.club:
        contentFilter = ["club"]
    elif args.machine:
        contentFilter = ["machineFixe", "machineWifi", "machineCrans", "switchCrans", "borneWifi"]
    elif args.crans:
        contentFilter = ["machineCrans", "switchCrans", "borneWifi"]
    elif args.switch:
        contentFilter = ["switchCrans"]
    elif args.borne:
        contentFilter = ["borneWifi"]
    # Special cases.
    elif args.adm:
        contentFilter = []
        out = []
        for machine in data.get('machineCrans', []):
            if lc_ldap.crans_utils.find_rid_plage(machine['rid'][0].value)[0].startswith('adm'):
                out.append(machine)
        data_restricted = {'machineCrans' : out,}
    elif args.special:
        contentFilter = []
        out = []
        for machine in data.get('machineCrans', []):
            if lc_ldap.crans_utils.find_rid_plage(machine['rid'][0].value)[0].startswith('special'):
                out.append(machine)
        data_restricted = {'machineCrans' : out,}
    elif args.serveur:
        contentFilter = []
        out = []
        for machine in data.get('machineCrans', []):
            if lc_ldap.crans_utils.find_rid_plage(machine['rid'][0].value)[0].startswith('serveur'):
                out.append(machine)
        data_restricted = {'machineCrans' : out,}
113

114 115
    if contentFilter:
        data_restricted = {a: data.get(a, []) for a in contentFilter}
116

117 118 119 120 121
    return data_restricted

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Recherche dans la base des adhérents", add_help=False)
    parser.add_argument('-A', '--adresse', help="Affiche l'adresse de l'adhérent.", action="store_true")
122
    parser.add_argument('-d', '--blacklist', type=int, help="Choix du nombre d'entrées blacklist à afficher pour les entrées détaillées.", action="store", default=10)
123 124 125
    parser.add_argument('-h', '--help', help="Affiche ce message et quitte.", action="store_true")
    parser.add_argument('-i', '--ipsec', help="Affichage de la clef wifi de la machine.", action="store_true")
    parser.add_argument('-l', '--limit', type=int, help="Modifier la taille limite de recherche dans la base LDAP", action="store", default=1000)
126
    parser.add_argument('-L', '--historique', type=int, help="Choix du nombre d'entrées d'historique à afficher pour les entrées détaillées.", action="store", default=10)
127 128
    parser.add_argument('-s', '--sshfp', help="Affiche les fingerprint SSH si elles existent.", action="store_true")
    parser.add_argument('-t', '--ldap', help="Utiliser les filtres tels que définis dans ldap", action="store_true")
129
    parser.add_argument('-T', '--telephone', help="Afficher le numéro de téléphone de l'adhérent.", action="store_true")
130
    parser.add_argument('--test', help="Se connecter à la base de test", action="store_true")
131 132
    parser.add_argument('-v', '--verbose', help="Rend le script (très) verbeux.", action="store_true")
    parser.add_argument('filtre', type=str, nargs="?", help="Le filtre whos à utiliser")
133 134 135 136 137 138 139

    type_group = parser.add_mutually_exclusive_group(required=False)
    type_group.add_argument('-a', '--adherent', help="Limite l'affichage aux adhérents.", action="store_true")
    type_group.add_argument('--adm', help="Limite l'affichage aux machines adm.", action="store_true")
    type_group.add_argument('-b', '--borne', help="Limite l'affichage aux bornes.", action="store_true")
    type_group.add_argument('-c', '--club', help="Limite l'affichage aux clubs.", action="store_true")
    type_group.add_argument('--crans', help="Limite l'affichage aux machines crans.", action="store_true")
140
    type_group.add_argument('-F', '--factures', help="Récupère les factures de l'objet cherché.", action="store_true")
141
    type_group.add_argument('-m', '--machine', help="Limite l'affichage aux machines.", action="store_true")
142 143
    type_group.add_argument('-M', '--machines', help="Récupère les machines de l'objet cherché.", action="store_true")
    type_group.add_argument('-P', '--proprietaire', help="Récupère le propriétaire de l'objet cherché.", action="store_true")
144 145 146 147
    type_group.add_argument('--serveur', help="Limite l'affichage aux serveurs.", action="store_true")
    type_group.add_argument('--special', help="Limite l'affichage aux machines spéciales.", action="store_true")
    type_group.add_argument('--switch', help="Limite l'affichage aux switches (pas encore implémenté).", action="store_true")

148 149 150 151 152
    args = parser.parse_args()

    if args.help:
        parser.print_help()
        sys.exit(0)
153 154
    if args.test:
        LDAP = lc_ldap.shortcuts.lc_ldap_test()
155
    else:
156 157 158
        LDAP = lc_ldap.shortcuts.lc_ldap_readonly()

    explore_db(args)