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

# googleapps-account-csvuserdisable.py 
# - Disable account of Google Apps by reading CSV file
#
# Copyright (C) TAKEDA Yasuma @ Open Source Solution Technology Co. Ltd.
# License: GNU General Public License version 2 or later
# Date: 2009-03-13

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)
# -f csv file(Must)
# -l directory of result file
# -s directory of summary file

# CSV Format
# |username| <--- header
# |user1   |
# |user2   |


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

def isYes(str):
    if string.upper(str) == "YES":
        return True
    return False

def main():
    domain = None
    csvfile = None
    resultfile = None
    summaryfile = None
    # Parse option
    try:
        (opts, args) = getopt.getopt(sys.argv[1:], "d:f: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 == "-f":
            csvfile = value
        if opt == "-l":
            resultfile = value
        if opt == "-s":
            summaryfile = value

    if domain == None or csvfile == None:
        usage()

    # try to open csv file.
    try:
        csvFd = open(csvfile, 'r')
    except Exception, e:
        sys.stderr.write("Error : Failed to open csvfile.\n")
        sys.stderr.write(str(e) + "\n")
        sys.exit(1)

    # 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 = "userdisable"
    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)

    # Read entries from csv file
    try:
        reader = csv.reader(csvFd)
    except Exception , e:
        sys.stderr.write("Error : Failed to read entry from csv file.\n")
        sys.stderr.write(str(e)+"\n")
        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)

    # Handle each entries
    r = 0 # counter of row. 0 is header
    error = 0
    success = 0
    for row in reader:
        username = None
        if len(row) == 0:
            continue

        if r > 0:
            username = row[0]

            # Check ignore user or not
            if gDomain.isIgnoreUsers(username):
                continue

            # Add user to Google Apps
            try:
                service.SuspendUser(username)
            except gdata.apps.service.AppsForYourDomainException, e:
                errormsg = username + "," + gDomain.errorstr(e) + "\n"
                sys.stderr.write(errormsg)
                resultFd.write(errormsg)
                error = error + 1
            except Exception , e:
                errormsg = username + "," + '"' + str(e) + '"' + "\n"
                sys.stderr.write(errormsg)
                resultFd.write(errormsg)
                error = error + 1
            else:
                msg = username + ",OK\n"
                sys.stdout.write(msg)
                resultFd.write(msg)
                success = success + 1

        resultFd.flush()
        r = r + 1  # Increment row counter
                 

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

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

main()
