# -*- coding: utf-8 -*-
import sys, os
from threadpool import makeRequests, ThreadPool
from paramiko import AutoAddPolicy, SSHClient, SFTPClient

def ssh_upload(ecs):
    try:
        local_file = ecs['local']
        remote_file = ecs['remote']
        ssh = SSHClient()
        ssh.set_missing_host_key_policy(AutoAddPolicy())
        ssh.connect(hostname=ecs['ip'], port=ecs['port'], username=ecs['user'], password=ecs['password'], timeout=12000)
        a = ssh.exec_command('hostname')
        stdin, stdout, stderr = a
        print('%s  %s' % (ecs['hostname'], stdout.read().decode('utf-8')))
        SFTPClient.from_transport(ssh.get_transport())
        sftp = ssh.open_sftp()
        sftp.put(local_file, remote_file)
        ssh.close()
    except Exception as e:
        print(e)
        print('%s !!! %s' % (ecs['hostname'], 'fail'))

def mutil_upload(ecs_list):
        pool = ThreadPool(50)
        requests = makeRequests(ssh_upload, ecs_list)
        [pool.putRequest(req) for req in requests]
        pool.wait()

def single_upload(ecs_list):
    t = 0
    for ecs in ecs_list:
        t = t + 1
        ssh_upload(ecs)
        print(t)
        
def mutil_exec(ecs_list):
    pool = ThreadPool(50)
    requests = makeRequests(exec_ssh_cmd, ecs_list)
    [pool.putRequest(req) for req in requests]
    pool.wait()

def single_exec(esc_list):
    t = 0
    for esc in esc_list:
        t = t + 1
        print(t)
        exec_ssh_cmd(esc)

def exec_ssh_cmd(ecs):
    try:
        ssh = SSHClient()
        ssh.set_missing_host_key_policy(AutoAddPolicy())
        
        ssh.connect(hostname=ecs['ip'], port=22, username=ecs['user'], password=ecs['password'], timeout=12000)
        a = ssh.exec_command(command=ecs['cmd'], timeout=12000)
        stdin, stdout, stderr = a
        ret = ' '.join(stdout.readlines())
        ssh.close()
        print('%s  %s' % (ecs['hostname'], ret))
    except:
        print('%s !!! %s' % (ecs['hostname'], 'fail'))

def getIpsMap(filePath):
    ipsMap = {}
    with open(filePath, 'r', encoding='utf-8', newline='') as f:
        for line in f:
            if len(line.strip()) <= 0:
                continue
            if line.startswith('#'):
                continue
            host_arr = line.split('|')
            if len(host_arr) < 5:
                continue

            host_arr = [one.strip() for one in host_arr]
            if len(host_arr) == 5:
                env, module, hostname, ip, intraIp = host_arr

            if len(host_arr) == 6:
                env, module, hostname, ip, intraIp, port = host_arr

            uniqueKey = '%s_%s' % (env, hostname)

            host = {'hostname': hostname, 'ip': ip, 'intraIp': intraIp}

            if env not in ipsMap.keys():
                ipsMap[env] = {}

            if uniqueKey not in ipsMap[env].keys():
                ipsMap[env][uniqueKey] = []

            ipsMap[env][uniqueKey] = host

    return ipsMap
if __name__ == "__main__":
    filePath = os.path.dirname(sys.argv[0]) + '/hosts-ssh-i.txt'
    ipsMap = getIpsMap(filePath)
    ips = ipsMap['real']
    ## print(ips)

    errorHostnames = []
    ecs_list = []
    cmd = '/usr/bin/pm2 delete node-video && /usr/bin/pm2 start /alidata/www/node-video/process.json'
    # cmd = 'cat /proc/loadavg'
    # cmd = 'apt-get update && apt install software-properties-common -y &&  add-apt-repository ppa:jonathonf/ffmpeg-4 -y &&  apt-get update && apt-get install ffmpeg -y && ffmpeg -version'
    for key in ips:
        ecs = ips[key]
        ecs['user'] = 'root'
        ecs['password'] = ''
        ecs['cmd'] = 'netstat -nalp | grep 8085'
        #ecs['cmd'] = cmd
        ecs_list.append(ecs)

    print(ecs_list)
    mutil_exec(ecs_list)