#! /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"
#
