#!/usr/bin/env python

import sys
import random

def usage():
    print >> sys.stderr,\
        "usage: %s [options...] hostlist cmd [args...]" % sys.argv[0]
    print >> sys.stderr, "options:", "[--stdin]", "[--debug]",\
        "[--to timeout]", "[--user login]", "[--bash]", "[--patient]"
    print >> sys.stderr, "please visit",\
        "https://wiki.yandex-team.ru/nomoresky/sdel"
    exit(1)

if __name__ == "__main__":
    if len(sys.argv) < 3:
        usage()
        #never reach here

    sys.path.append("/skynet")

    runFlags = set()
    noskyFlags = {'RESULT_IN_ONE_MSG': None}
    timeout = 10
    runCmd = None

    while True:
        if sys.argv[1] == "--stdin":
            runFlags.add("stdin")
            del sys.argv[1]
        elif sys.argv[1] == "--debug":
            noskyFlags['DEBUG'] = None
            del sys.argv[1]
        elif sys.argv[1] == "--to":
            timeout = float(sys.argv[2])
            del sys.argv[1:3]
        elif sys.argv[1] == "--user":
            noskyFlags["SSH_USER"] = sys.argv[2]
            del sys.argv[1:3]
        elif sys.argv[1] == "--bash":
            runCmd = ["bash", "-c"]
            del sys.argv[1]
        elif sys.argv[1] == "--patient":
            noskyFlags['SSH_OPTIONS'] = [
                "ConnectTimeout=300", "ConnectionAttempts=2",
                "ServerAliveInterval=100", "ServerAliveCountMax=4"]
            del sys.argv[1]
        elif sys.argv[1] == "--help":
            usage()
            # never reach here
        elif sys.argv[1].startswith("--"):
            usage()
            # never reach here
        else:
            break

    if runCmd is None:
        runCmd = sys.argv[2:]
    else:
        print >> sys.stderr, "bash command:", ' '.join(sys.argv[2:])
        runCmd.append(' '.join(sys.argv[2:]))

    from library.nomoresky.nomorutil import shuffle
    from library.nomoresky.nomorutil import resolveHostsBySkyList
    hostList = list(resolveHostsBySkyList(sys.argv[1]))
    if len(hostList) == 0:
        exit(1)
    shuffle(hostList)

    print("running on %d hosts" % len(hostList))

    from library.nomoresky.nomorutil import NoskyTask
    from library.nomoresky.nomorutil import ResultDictEater
    from library.nomoresky.nomorutil import printCompactOutput

    eater = ResultDictEater(timeout)
    r = NoskyTask(hostList, cmd=runCmd, flags=noskyFlags, eater=eater)
    if "stdin" in runFlags:
        try:
            while True:
                stdinData = sys.stdin.read(32768)
                if len(stdinData) == 0:
                    break
                r.pushDown("*", stdinData)
        finally:
            r.pushDownCloseStdin("*")
    printCompactOutput(eater, r)
