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

# googleapps-account-userlist.py
# - List users account from Google Apps
#
# Copyright (C) KAMEI Yutaka @ Open Source Solution Technology Co. Ltd.
# License: GNU General Public License version 2 or later
# Date: 2012-10-24

# Command Option
# -d domain name of Google Apps(Must)
# -g group list flag

import sys
import getopt
import googleappsutils.usercommand
import googleappsutils.client

def usage():
  sys.stderr.write("Usage:" + sys.argv[0] + " [-g] -d domain\n"
                  + "\n"
                  + "Output format:\n"
                  + "without -g ... "
                  + '"username", "sn", "givenName", "org", "active" '
                  + "(comma-delimited)\n"
                  + "with    -g ... "
                  + '"username", "group1", "group2",... '
                  + "(colon-delimited)\n"
                  )
  sys.exit(1)

def main():
  # Group, organization list flag
  group_flag = False

  # Create objects
  userEntryClient = googleappsutils.client.GoogleAppsAccountClient()
  configClient    = googleappsutils.domain.Domain()

  # Parse option - getopt()
  try:
    (opts, args) = getopt.getopt(sys.argv[1:], "d:g")
  except:
    sys.stderr.write("Error : Invalid Option.\n")
    usage()

  # Parse option - get each option
  for (opt, value) in opts:
    if value.startswith("-"):
      usage()
    elif opt == "-d":
      userEntryClient.domain = value
    elif opt == "-g":
      group_flag = True

  # Check necessary option
  if not userEntryClient.domain:
    usage()

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

  # Set config parameters to user entry client object
  userEntryClient.readConfigFromDomainObject(configClient)

  # Action
  try:
    if not group_flag:
      result = userEntryClient.listUserEntries()
      sys.stdout.write(",".join(["username"] + result.pop("!user!")) + "\n")
      for key in sorted(result):
        sys.stdout.write(
            (",".join([key] + result[key]) + "\n").encode("utf-8"))
    else:
      result = userEntryClient.listGroupsByUsers()
      sys.stdout.write(":".join(["username"] + result.pop("!user!")) + "\n")
      for key in sorted(result):
        sys.stdout.write(
            (key + ":" + ",".join(result[key]) + "\n").encode("utf-8"))

  except googleappsutils.client.ConnectError:
    msg = ("Error : Failed to connect to Google Apps.\n")
    sys.stderr.write(msg)
    sys.exit(1)
  except Exception, e:
    sys.stderr.write(e.errormsg)
    sys.exit(1)
  else:
    sys.exit(0)

main()

