#!/usr/bin/python

#
# (c) 2004 Epigenomics AG
#
# written by Robert Sander <robert.sander@epigenomics.com>
#
# released under GPL
#
#
# This script collects nearly all possible
# local parts for emails on a qmail system.
#
# It is for use with the RECIPIENTS extension
# from http://www.fehcom.de/qmail/qmail.html
#
# It reads users from the system password database,
# /var/qmail/users/assign, aliases from /etc/aliases (fastforward)
# and /var/qmail/alias. It also reads virtual users for domains
# managed by vpopmail, if they exist.
#
# It does not read users for other virtual domains.
#
# Use at your own risk.
#

import cdb, pwd, commands, os, os.path, sys

locals = map(lambda x: x.strip(), open("/var/qmail/control/locals").readlines())

def execute(command):
    rc, output = commands.getstatusoutput(command)
    if rc:
        print output
        sys.exit(rc)
    else:
        return output

def get_users():
    output = []
    for user in pwd.getpwall():
        try:
            st_mode, st_ino, st_dev, st_nlink, st_uid, st_gid, st_size, st_atime, st_mtime, st_ctime = os.stat(user[5])
            if st_uid and st_uid == user[2] and user[0] == user[0].lower():
                output = output + map(lambda x: "%s@%s" % (user[0], x), locals)
        except OSError:
            pass
    return output

def get_users_assign():
    output = []
    try:
        assign = open("/var/qmail/users/assign").readlines()
        for line in assign:
            if line[0] == "=":
                local, user, uid, gid, homedir, dash, ext, rem = line.strip().split(":")
                output = output + map(lambda x: "%s@%s" % (local[1:], x), locals)
    except IOError:
        pass
    return output

def get_alias():
    input = execute("/bin/ls /var/qmail/alias/.qmail-* | cut -f 2- -d - | tr [:] [.]").split("\n")
    input.sort()
    output = []
    for alias in input:
        if alias[-8:] == "-default":
            if alias[:-8] in output:
                continue
            if alias[-15:] == "-accept-default" or alias[-15:] == "-reject-default" or alias[-15:] == "-return-default":
                if alias[:-15] in output:
                    continue
            alias = alias[:-8]
        if alias[-6:] == "-owner":
            if alias[:-6] in output:
                continue
        output.append(alias)
    aliases = []
    for alias in output:
        aliases = aliases + map(lambda x: "%s@%s" % (alias, x), locals)
    return(aliases)

def get_etcaliases(host):
    output = []
    try:
        for alias in open("/etc/aliases").readlines():
            if alias[0] != "#":
                local, rem = alias.split(":")
                output = output + map(lambda x: "%s@%s" % (local, x), locals)
    except IOError:
        pass
    return output

def get_cdb():
    output = []
    for virtualdomain in open("/var/qmail/control/virtualdomains").readlines():
        domain, user = virtualdomain.strip().split(":")
        passwdfile = os.path.join(pwd.getpwnam(user)[5], "passwd.cdb")
        if os.path.isfile(passwdfile):
            passwdcdb = cdb.init(passwdfile)
            output = output + map(lambda x: "%s@%s" % (x, domain), passwdcdb.keys())
    return output

aliases = get_users() + get_users_assign() + get_alias() + get_cdb()

print "\n".join(aliases)
