From c9bb6649ae0035f529d987959dbec2ea0a9f143a Mon Sep 17 00:00:00 2001 From: Guilhem Saurel <guilhem.saurel@laas.fr> Date: Tue, 12 Mar 2024 12:57:50 +0100 Subject: [PATCH] machines: clean --- scripts/machines.py | 75 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 61 insertions(+), 14 deletions(-) diff --git a/scripts/machines.py b/scripts/machines.py index ddbb460..cfb122e 100755 --- a/scripts/machines.py +++ b/scripts/machines.py @@ -1,10 +1,12 @@ #!/usr/bin/env python3 """Utils to manage Gepetto computers""" +from argparse import ArgumentParser from datetime import date import pandas as pd from ldap3 import Connection +from tabulate import tabulate ATTRIBUTES = [ "cn", @@ -18,6 +20,15 @@ ATTRIBUTES = [ "laas-mach-utilisateur", "roomNumber", ] +FILTERS = { + "laas-mach-group": "gepetto", + "laas-mach-type": "PC", +} + + +def short(attr: str) -> str: + """Use shorter versions of LDAP attributes for CLI & display.""" + return attr.replace("laas-", "").replace("mach-", "").replace("Number", "") def parse(k, v): @@ -31,27 +42,63 @@ def parse(k, v): return v -def machines_ldap(): +def filter(**filters) -> str: + """format some filters for LDAP query.""" + return "".join(f"({k}={v})" for k, v in filters.items()) + + +def machines_ldap(utilisateur="", responsable="", room="", **kwargs): """Get a dict of Gepettists machines from LDAP.""" + filters = FILTERS + if utilisateur: + filters["laas-mach-utilisateur"] = utilisateur + if responsable: + filters["laas-mach-responsable"] = responsable + if room: + filters["roomNumber"] = room + conn = Connection("ldap.laas.fr", auto_bind=True) conn.search( "ou=machines,dc=laas,dc=fr", - "(&(laas-mach-group=gepetto)(laas-mach-type=PC))", + f"(&{filter(**filters)})", attributes=ATTRIBUTES, ) - df = pd.DataFrame( - { - str(entry.cn): { - k: parse(k, v) - for k, v in entry.entry_attributes_as_dict.items() - if k != "cn" - } - for entry in conn.entries + + return { + str(entry.cn): { + short(k): parse(k, v) for k, v in entry.entry_attributes_as_dict.items() } - ).T.sort_values(by="laas-mach-datePeremption") - print(df.to_markdown()) - return df + for entry in conn.entries + } + + +def display(data, sort_by="datePeremption"): + """Pandas & Tabulate magic to display data.""" + df = pd.DataFrame(data).T.sort_values(by=sort_by) + print(tabulate(df.drop("cn", axis=1), headers="keys")) + + +def get_parser() -> ArgumentParser: + """Configure argparse.""" + parser = ArgumentParser(description=__doc__) + + # Filtering + parser.add_argument("-u", "--utilisateur") + parser.add_argument("-r", "--responsable") + parser.add_argument("-R", "--room") + + # Sorting + parser.add_argument( + "-s", + "--sort_by", + choices=[short(a) for a in ATTRIBUTES], + default="datePeremption", + ) + + return parser if __name__ == "__main__": - df = machines_ldap() + args = get_parser().parse_args() + data = machines_ldap(**vars(args)) + display(data, args.sort_by) -- GitLab