#! /usr/local/bin/ruby # -*- ruby -*- #func Extraire les alias # # Retourne un tableau associatif (hash) qui # associe à un alias la liste des destinataires. # def aliases # a est un tableau associatif vide au départ a = {} # fd est un descripteur représentant le résultat de # la commande ypcat -k aliases (ouvert en lecture) fd = open ("|ypcat -k aliases", "r") # Pour chaque ligne, que l'on appelle localement l fd.each_line {|l| # Enlever le caractère \n de fin de ligne l.chomp! # Repérer l'expression alias: nom1, nom2, nom3 l =~ /^(\S+)\s(.*)$/ # Renseigner le tableau associatif avec # a['alias'] = ['nom1', 'nom2', 'nom3'] a[$1] = $2.split /,\s*/ } # On ferme le descripteur fd.close # On retourne le tableau return a end # # Exemple: # # a = aliases # a ["postmaster"] # => ["dax", "beyssac", "tardieu"] # #func Trouver les comptes correspondant à un alias # Entrée: l'alias à rechercher et le tableau associatif des alias # Sortie: la liste des comptes qualifiés dans lesquels se trouve ce compte def cherche_aliases nom, al if al.key? nom then # Ce nom est présent dans les alias, le résoudre et aplatir # la liste (flatten). Mais d'abord, retirer le nom lui-même # de la liste. dests = al[nom] dests.delete nom (dests.map {|a| cherche_aliases a, al}).flatten else [nom] end end # # Exemple: # # a = aliases # cherche_aliases "postmaster", a # => ["dax@inf", "beyssac@bofh", "tardieu@inf"] # #func Liste des alias associés à un compte # Entrée: le tableau associatif des alias # Sortie: le tableau associant à chaque compte qualifié les alias # auxquels il appartient def list_aliases aliases # Tableau associatif de résultats, initialement vide r = {} # Pour chaque alias appelé localement a aliases.keys.each {|a| # Pour chaque compte appelé localement c associé à cet alias (cherche_aliases a, aliases).each {|c| # Si ce compte existe dans le tableau résultat, rajouter # l'alias, sinon créer la liste initiale (à un élément pour l'instant) if r.key? c then r[c] << a else r[c] = [a] end } } return r end # # Exemple: # # a = aliases # r = list_aliases a # r['peyrade@dir'] # => ["marc.peyrade", "enst.fr-administrative-contact", "peyrade"] # #func Extraire les comptes # # Retourne un tableau associatif contenant les comptes présents dans # la commande ypcat passwd et les prénom/nom associés (sous forme # d'une chaîne unique). # def accounts # Tableau associatif vide initialement c = {} # fd est un descripteur représentant le résultat de # la commande ypcat passwd (ouvert en lecture) fd = open ("|ypcat passwd", "r") # Pour chaque ligne, que l'on appelle localement l fd.each_line {|l| # Repérer nom:XXX:XXX:XXX:Prénom Nom etc.:... l =~ /^([^:]+):[^:]*:[^:]*:[^:]*:([^:]*):/ # Enregister le prénom et le nom, en enlevant ce qu'il peut y # avoir après la virgule c[$1] = ($2.split ',')[0] } # On ferme le descripteur fd.close # On retourne le tableau associatif return c end # # Exemple: # # c = accounts # c['tardieu'] # => "Samuel Tardieu" #