#! /usr/bin/python

"""
Check if a cpanel user is live on the current host, or suspended.  Possible statuses are:
normal, suspended, suspended+60days
"""

import os
import socket
import sys
import re
import time

now = time.time()
ipre = re.compile("([1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*)");
ipscmd = os.popen("cat /etc/ips 2>/dev/null; ifconfig ; /sbin/ip addr 2>/dev/null","r");
ips={}
for line in ipscmd:
    match = ipre.search(line)
    if not match: continue
    ips[ match.group(1) ] =True
ipscmd.close()

def check_account_v(user):
    (accountstatus,dns) = check_account(user)
    print user+"\t" + ",".join(accountstatus) + " "+dns

def check_account(user):
    try:
        userdatafile=open("/var/cpanel/users/%s" % user,'r')
    except:
        return ([],'')
    
    accountstatus=[]
    userdata={}
    suspended=False
    names=[]
    for line in userdatafile:
        bits=line.strip().split("=",1)
        if len(bits)<2: continue
        userdata[bits[0]]=bits[1]
        
        # Check DNS
        if line.find("DNS")!=0 and line.find("XDNS")!=0:
            continue
        for prefix in ['','www.','ftp.','mail.'] :
            names.append(prefix)

    for sitefile in glob.glob("/var/cpanel/users/%s/*.*" % user):
        if sitefile.find("_")==-1:
            continue
        userdatafile=open(sitefile % user,'r')
        for line in userdatafile:
            bits=line.split();
            if bits=='ServerAlias' or bits=='ServerName':
            
    except:
        return ([],'')

    found=''
    for test in range(1,5):  # hammer the DNS requests, just in case we hit temp failures ...
        for name in names:
            if found: break
                try:
                    dns=prefix+bits[1]
                    ip=socket.gethostbyname(dns)
                    if ips.has_key(ip):
                        found=dns
                except:
                    pass

    if userdata.get("SUSPENDED","0")=="1":
        whensuspended=int(userdata.get("SUSPENDTIME",now))
        if (now-whensuspended) > 60*24*3600:
            accountstatus.append("__SUSPENDED:OVER60DAYS")
        else:
            accountstatus.append("__SUSPENDED")
    else:
        accountstatus.append("ACTIVE")
    userdatafile.close();
        
    if found:
        accountstatus.append("DNSOK")
    else:
        accountstatus.append("__NODNS")
    return (accountstatus,found)

# Main loop: parse stdin or args
did_something=0
for user in sys.argv[1:]:
    check_account_v(user)
    did_something+=1

if not sys.stdin.isatty():
    for user in sys.stdin:
        check_account_v(user)
        did_something+=1

if not did_something:
    sys.stderr.write("""Usage:
        %(argv)s [user1] ...
        ls | %(argv)s\n""" % dict(argv=sys.argv[0]))

