#!/usr/bin/python
# -*- encoding: utf-8 -*-

import sys
import argparse
import subprocess
import time
import os


def parse_options():
    parser = argparse.ArgumentParser(description="Создать мастер-соединение к серверу по ssh")

    group = parser.add_mutually_exclusive_group(required=True)
    group.add_argument(
        "-H", "--host", dest="host", type=str,
        help="хост, к которому хотим создать мастер-соединение"
    )
    group.add_argument(
        "--svn", dest="svn", action='store_true',
        help="создать мастер-соединение с svn.yandex.ru"
    )
    group.add_argument(
        "--arcadia", dest="arcadia", action='store_true',
        help="создать мастер-соединение с arcadia.yandex.ru"
    )

    parser.add_argument(
        "-t", "--timeout", dest="timeout", type=int, default=3600,
        help="время (в секундах), через которое неиспользуемое соединение будет остановлено"
    )
    parser.add_argument(
        "-f", "--file", dest="file", type=str, required=True,
        help="название сокета (с путем) для соединения"
    )
    parser.add_argument(
        "-u", "--user", dest="user", type=str,
        help="пользователь, от которого надо создать соединение"
    )
    parser.add_argument(
        "--force-error", dest="force_error", action='store_true',
        help="если не получилось создать мастер-соединение, то завершаемся с кодом 1"
    )
    opts, extra = parser.parse_known_args()

    if len(extra) > 0:
        sys.exit("There are unknown parameters")

    return opts
    

def run():
    retries = 3
    FNULL = open(os.devnull, 'w')
    opts = parse_options()

    if opts.svn:
        run_cmd = [
            'svn', 'info', "svn+ssh://svn.yandex.ru/direct-utils",
            '--config-option=config:tunnels:ssh=ssh -M -S %s -o %s' % (opts.file, "'ControlPersist=%ss'" % opts.timeout)
        ]
    elif opts.arcadia:
        run_cmd = [
            'svn', 'info', 'svn+ssh://arcadia.yandex.ru/arc',
            '--config-option=config:tunnels:ssh=ssh -M -S %s -o %s' % (opts.file, "'ControlPersist=%ss'" % opts.timeout)
        ]
    else:
        run_cmd = ['ssh', '-M', '-S', opts.file]
        if opts.user:
            run_cmd += ["-l", opts.user]
        run_cmd += [
            '-o', 'ConnectTimeout=10',
            '-o', 'ControlPersist=%ds' % opts.timeout,
            "-o", "StrictHostKeyChecking=no", opts.host,
            'exit'
        ]

    for i in xrange(retries):
        exit_code = subprocess.call(run_cmd, stdout=FNULL, stderr=subprocess.STDOUT)

        if os.path.exists(opts.file):
            return

        time.sleep(5)

    host = ""
    if opts.host:
        host = opts.host
    elif opts.svn:
        host = "svn.yandex.ru"
    elif opts.arcadia:
        host = "arcadia.yandex.ru"
    print "WARNING: can't create master connection to '%s'" % host

    if opts.force_error:
        sys.exit(1)


if __name__ == '__main__':
    run()

