#! /usr/bin/env python3

import sys
import os
import argparse
import subprocess
import logging

from string import Template
from tempfile import NamedTemporaryFile
from json import dumps

logging.basicConfig(filename='{}/openuds-remmina.log'.format(os.environ['TMP']),
    filemode='a',
    format='%(asctime)s,%(msecs)d %(name)s %(levelname)s %(message)s',
    datefmt='%H:%M:%S',
    level=logging.DEBUG)
logger = logging.getLogger('openuds-stub')

def parse(args):
    parser = argparse.ArgumentParser(args, add_help=False)
    parser.add_argument(
        "-t", type=lambda s: [i for i in s.split(':')], default = ['Default'], help="Window Title", required=False
    )
    parser.add_argument(
        "-w", type=lambda s: [i for i in s.split(':')], default = ['1024'], help="Window width", required=False
    )
    parser.add_argument(
        "-h", type=lambda s: [i for i in s.split(':')], default = ['768'], help="Window height", required=False
    )
    parser.add_argument(
        "-u", type=lambda s: [i for i in s.split(':')], default = [''], help="User", required=False
    )
    parser.add_argument(
        "-p", type=lambda s: [i for i in s.split(':')], default = [''], help="Password", required=False
    )
    parser.add_argument(
        "-d", type=lambda s: [i for i in s.split(':')], default = [''], help="Domain", required=False
    )
    parser.add_argument("-cert-ignore", action='store_true', help="Ignore certificate", required=False)
    parser.add_argument("-clipboard", action='store_true', help="Disable Redirect clipboard", required=False)
    parser.add_argument(
        "-smartcard", type=lambda s: [i for i in s.split(':')], default = ['0'], help="Redirect the smartcard devices containing any of the <str> in their names.", required=False
    )
    parser.add_argument("-microphone", action='store_true', help="Audio input (microphone)", required=False)
    parser.add_argument("-sound", action='store_true', help="Audio output (sound)", required=False)
    parser.add_argument(
        "-video", type=lambda s: [i for i in s.split(':')], default = [''], help="Video optimized remoting channel", required=False
    )
    parser.add_argument(
        "-drive", type=lambda s: [i for i in s.split(':')], default = [''], help="Redirect directory <path> as named share <name>.", required=False
    )
    parser.add_argument(
        "-media", type=lambda s: [i for i in s.split(':')], default = [''], help="Enable media", required=False
    )
    parser.add_argument(
        "-serial", type=lambda s: [i for i in s.split(':')], default = [''], help="Redirect serial device", required=False
    )
    parser.add_argument(
        "-printer", type=lambda s: [i for i in s.split(':')], default = [''], help="Redirect printer device", required=False
    )
    parser.add_argument(
        "-multimon", type=lambda s: [i for i in s.split(':')], default = [''], help="Enable multi monitor", required=False
    )
    parser.add_argument(
        "-f", type=lambda s: [i for i in s.split(':')], help="Enable full-screen mode", required=False
    )
    parser.add_argument(
        "-bpp", type=lambda s: [i for i in s.split(':')], help="Bit per pixel", default=['32'], required=False
    )
    parser.add_argument(
        "-fonts", type=lambda s: [i for i in s.split(':')], default = [''], help="Enable fonts", required=False
    )
    parser.add_argument(
        "-v", type=lambda s: [i for i in s.split(':')], default = [''], help="Server", required=False
    )
    parser.add_argument('-sec', type=str, default='rdp', help='Protocol', required=False)
    parser.add_argument('port', type=int, default=3389, help='Port number')
    args = parser.parse_args(args)
    return args

def generate_template(args, connection_file):
    templ_string = ("[remmina]\n"
                    "password=$password \n"
                    "gateway_username=\n"
                    "ssh_server=\n"
                    "window_height=$height \n"
                    "ssh_privatekey=\n"
                    "serialname=\n"
                    "enableproxy=0\n"
                    "ssh_password=\n"
                    "printer_overrides=\n"
                    "ssh_auth=0\n"
                    "name=$title\n"
                    "console=0\n"
                    "colordepth=$bpp\n"
                    "security=\n"
                    "precommand=\n"
                    "disable_fastpath=0\n"
                    "postcommand=\n"
                    "ssh_charset=\n"
                    "group=\n"
                    "server=$server\n"
                    "ssh_enabled=0\n"
                    "glyph-cache=0\n"
                    "disableclipboard=$clipboard\n"
                    "parallelpath=\n"
                    "cert_ignore=$cert_ignore\n"
                    "gateway_server=\n"
                    "serialpermissive=0\n"
                    "protocol=RDP\n"
                    "old-license=0\n"
                    "resolution_mode=2\n"
                    "disableautoreconnect=0\n"
                    "loadbalanceinfo=\n"
                    "clientname=\n"
                    "save_ssh_username=\n"
                    "resolution_width=0\n"
                    "ssh_username=\n"
                    "relax-order-checks=0\n"
                    "username=$user\n"
                    "gateway_domain=\n"
                    "serialdriver=config\n"
                    "gateway_password=\n"
                    "domain=$domain\n"
                    "smartcardname=\n"
                    "exec=\n"
                    "serialpath=$serial\n"
                    "save_ssh_server=\n"
                    "ssh_loopback=0\n"
                    "enable-autostart=0\n"
                    "shareprinter=0\n"
                    "viewmode=1\n"
                    "shareparallel=0\n"
                    "quality=0\n"
                    "disablepasswordstoring=0\n"
                    "parallelname=\n"
                    "execpath=\n"
                    "shareserial=0\n"
                    "sharefolder=$drive\n"
                    "sharesmartcard=0\n"
                    "resolution_height=0\n"
                    "microphone=$microphone\n"
                    "gwtransp=http\n"
                    "window_maximize=1\n"
                    "ignore-tls-errors=1\n"
                    "gateway_usage=0\n"
                    "window_width=$width\n"
                    "sound=off\n"
                    "ssh_passphrase=\n"
                    "scale=2\n")
    config = Template(templ_string).substitute(
        password=args.p[0],
        width=args.w[0],
        bpp=args.bpp[0],
        clipboard=1 if args.clipboard is not None else 0,
        cert_ignore=1 if args.cert_ignore is not None else 0,
        user=args.u[0],
        domain=args.d[0],
        drive=args.drive[0],
        microphone=1 if args.microphone is not None else 0,
        height=args.h[0],
        title=args.t[0],
        server=args.v[0],
        serial=args.serial[0])
    connection_file.write(config.encode())
    connection_file.flush()

def call_remmina(remmina, file_name):
    try:
       retcode = subprocess.call('{} -c {}'.format(remmina, file_name.name), shell=True)
       if retcode < 0:
           logger.debug("Child was terminated by signal: {}".format(-retcode))
       else:
           logger.debug("Child returned: {}".format(retcode))
    except OSError as e:
        logger.debug("Execution failed: {}".format(str(e)))

def main():
    remmina = '/usr/bin/remmina'
    logger.debug('CLI: {}'.format(str(sys.argv)))
    parse_string = ''.join(sys.argv[1:]).replace('/', ' -').replace(':', ' ')
    logger.debug('Parse string: {}'.format(parse_string))
    args = parse(parse_string.split())
    logger.debug(dumps(vars(args), indent=2))
    with NamedTemporaryFile(suffix='.remmina', dir=os.environ['TMP']) as file_name:
        logger.debug('Remmina file: {}'.format(file_name.name))
        generate_template(args, file_name)
        call_remmina(remmina, file_name)

if __name__ == '__main__':
    main()

