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

# unicornidm-passwd.py
# - Changing password by Unicorn ID Manager
#
# Copyright (C) TAKEDA Yasuma @ Open Source Solution Technology Co. Ltd.
# License: GNU General Public License version 2 or later
# Date: 2011-02-01

import os, subprocess, sys, getpass
from optparse import OptionParser

def main():
    UNICORNIDM_PATH = "/opt/osstech/lib/unicornIDM"
    UNICORNIDM_CMD = "%s/manage.py" % UNICORNIDM_PATH

    if os.getuid() != 0:
        sys.stderr.write("You are not root.\n")
        sys.exit(1)

    usage = "usage: %prog -t <target> -u <username> -s"

    parser = OptionParser(usage=usage)
    parser.add_option("-t", "--target", dest="orgname", help="Target organization name")
    parser.add_option("-u", "--username", dest="username", help="Username")
    parser.add_option("-s", dest="stdin", action="store_true", help="Input password from stdin")

    (opts, args) = parser.parse_args(sys.argv)

    if not args:
        parser.print_help()
        sys.exit(1)

    if not opts.orgname:
        sys.stderr.write("Target organization is not specified.\n")
        parser.print_help()
        sys.exit(1)
    else:
        orgname = opts.orgname

    if not opts.username:
        sys.stderr.write("Username is not specified.\n")
        parser.print_help()
        sys.exit(1)
    else:
        username = opts.username

    password = None
    if opts.stdin:
        password = sys.stdin.readline().strip()
    else:
        while (True):
            password = getpass.getpass("(New) password: ")
            password2 = getpass.getpass("Retype (New) password: ")
            if password != password2:
                sys.stderr.write("BAD PASSWORD: password is mismatch.\n")
                continue
            else:
                break

    error = False
    try:
        cmd = [UNICORNIDM_CMD, "passwd", "-t", orgname, "-u", username, "-p", password]
        p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, cwd=UNICORNIDM_PATH)
        output = p.stdout.readlines()
        for line in output:
            sys.stdout.write(line)

        r = p.wait()
        if (r == 0):
            return
        else:
            # Fail to execute
            error = True
    except Exception, e:
        sys.stderr.write("Failed to change password. \n%s\n" % str(e))
        error = True

    if error:
        sys.exit(1)

    return

main()
