#!/usr/bin/env python
# -*- mode: python -*-
# This script takes a list of .forward files and generates a list of colon
# delimited fields for import into a ldap directory. The fields represent
# the user and their email forwarding.
#
# A sample invokation..
#   cd /home
#   find -name ".foward" -maxdepth 2 | mkforwardlist | sort | less
# Then correct any invalid forward files if possible. After that stash the
# output in a file, remove the invalid lines and import it.
#
# It also understand .qmail type files

import re, time, getopt, os, sys, pwd, stat;

AddressSplit = re.compile("<(.*)>");

while (1):
   File = sys.stdin.readline().strip()
   if File == "":
      break;

   # Attempt to determine the UID   
   try:
      User = pwd.getpwuid(os.stat(File)[stat.ST_UID])[0];
   except KeyError:
      print "Invalid0", File;
      continue;

   # Read the first two non comment non empty lines
   Forward = open(File,"r");
   Line = None;
   while (1):
      Line2 = Forward.readline().strip()
      if Line2 == "":
         break;
      if Line2[0] == '#' or Line2[0] == '\n':
         continue;
      if Line == None:
         Line = Line2;
      else:
         break;

   # If we got more than one line or no lines at all it is invalid
   if Line == None or Line == "" or Line2 != "":
      print "Invalid1", File;
      continue;

   # Abort for funky things like pipes or directions to mailboxes
   if Line[0] == '/' or Line[0] == '|' or Line[0] == '.' or Line[-1] == '/' or \
      Line.find('@') == -1:
      print "Invalid2", File;
      continue;

   # Split off the address part
   Address = AddressSplit.match(Line);
   if Address == None: 
      # Or parse a qmail adddress..
      Address = Line;
      if Address[0] == '&':
         Address = Address[1:];

   if Address == "":
      print "Invalid3", File;
      continue;

   print User + ":",Address;
