#!/opt/osstech/bin/python2.7
# -*- coding: utf-8 -*-

# googleapps-account-userlist.py 
# - get account list from Google Apps
#
# Copyright (C) TAKEDA Yasuma @ Open Source Solution Technology Co. Ltd.
# License: GNU General Public License version 2 or later
# Date: 2009-08-26

import os, sys, csv, datetime, getopt, string

# from Google
import gdata.apps.service
import gdata.apps.emailsettings.service

# from OSSTech
import googleappsutils.domain


# Command Option
# -d domain name of Google Apps(Must)
# -l directory of result file
# -s directory of summary file

def usage():
    sys.stderr.write("Usage:" + sys.argv[0] + " -d domain [-l resultfile] [-s summaryfile]\n")
    sys.exit(1)

def main():
    domain = None
    resultfile = None
    summaryfile = None
    # Parse option
    try:
        (opts, args) = getopt.getopt(sys.argv[1:], "d:l:s:")
    except getopt.GetoptError:
        sys.stderr.write("Error : Invalid Option\n")
        usage()

    for (opt, value) in opts:
        if opt == "-d":
            domain = value
        if opt == "-l":
            resultfile = value
        if opt == "-s":
            summaryfile = value

    if domain == None:
        usage()

    # Read Configuration
    gDomain = googleappsutils.domain.Domain()
    try:
        gDomain.readConfig(domain)
    except Exception, e:
        sys.stderr.write("Error : Invalid configuration [" + domain + "]\n")
        sys.stderr.write(str(e))
        sys.exit(1)

    # Setup result files
    type = "userlist"
    now = datetime.datetime.now()    
    baseFileName = gDomain.getBaseFilename(now, type, domain)
    if resultfile == None:
        resultfile = gDomain.resultDir + baseFileName + "-result.csv"
    if summaryfile == None:
        summaryfile = gDomain.summaryDir + baseFileName + ".summary"

    try:
        resultFd = open(resultfile, "w")
        summaryFd = open(summaryfile, "w")
    except Exception, e:
        sys.stderr.write("Error : Failed to open file.\n")
        sys.stderr.write(str(e))
        sys.exit(1)

    # Connect to Google Apps
    try:
        service = gdata.apps.service.AppsService(gDomain.admin,gDomain.adminPass, gDomain.domain)
        service.ProgrammaticLogin()
    except Exception, e:
        sys.stderr.write("Error : Failed to connect to Google Apps.\n" + str(e) + "\n")
        sys.exit(1)

    
    start_username=None
    finished = False
    success = 0
    error = 0
    try:
        resultFd.write("username,sn,givenName,active\n")
        sys.stdout.write("username,sn,givenName,active\n")
        while not finished:
            userFeed = service.RetrievePageOfUsers(start_username)
            for entry in userFeed.entry:
                success = success + 1
                if entry.login.suspended == "false":
                    active = True
                else:
                    active = False
                msg = entry.login.user_name + "," + entry.name.family_name + "," + entry.name.given_name + "," + str(active) + "\n"
                sys.stdout.write(msg)
                resultFd.write(msg)
                resultFd.flush()
        
            start_username = None
            for item in userFeed.link:
                if item.rel == "next":
                    userindex = item.href.index("startUsername")
                    start_username = item.href[(userindex+len("startUsername=")):]

            if not start_username:
                finished = True


    except gdata.apps.service.AppsForYourDomainException, e:
           errormsg = gDomain.errorstr(e) + "\n"
           sys.stderr.write(errormsg)
           resultFd.write(errormsg)
           error = error + 1
    except Exception,e:
        errormsg = str(e) + "\n"
        sys.stderr.write(errormsg)
        resultFd.write(errormsg)
        error = error + 1

    # Create summary
    msg = str(success + error) + " user entries are handled.\n"
    summaryFd.write(msg)
    msg = "Success to get:" + str(success) + " user entries\n"
    summaryFd.write(msg)
    msg = "Fail to get:" + str(error) + " user entries\n"
    summaryFd.write(msg)

    resultFd.close()
    summaryFd.close()
    sys.exit(0)



main()
