# -*- coding: utf-8 -*-
import paramiko
import sys, os

class SSHConnection(object):
    def __init__(self, host, port, username, password):
        self._host = host
        self._port = port
        self._username = username
        self._password = password
        self._transport = None
        self._sftp = None
        self._client = None
        self._connect()  # 建立连接

    def _connect(self):
        transport = paramiko.Transport((self._host, self._port))
        transport.banner_timeout = 60
        transport.connect(username=self._username, password=self._password)
        self._transport = transport

    # 下载
    def download(self, remotepath, localpath):
        if self._sftp is None:
            self._sftp = paramiko.SFTPClient.from_transport(self._transport)
        self._sftp.get(remotepath, localpath)

    # 上传
    def upload(self, localpath, remotepath):
        if self._sftp is None:
            self._sftp = paramiko.SFTPClient.from_transport(self._transport)
        self._sftp.put(localpath, remotepath)

    # 执行命令
    def exec_command(self, command):
        if self._client is None:
            self._client = paramiko.SSHClient()
            self._client._transport = self._transport
        stdin, stdout, stderr = self._client.exec_command(command=command, timeout=3000)
        data = stdout.read().decode('utf-8')
        err = stderr.read().decode('utf-8')
        return [data, err]


    def close(self):
        if self._transport:
            self._transport.close()
        if self._client:
            self._client.close()

    @staticmethod
    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 = SSHConnection.getIpsMap(filePath)
    ips = ipsMap['real']
    print(ips)

    errorHostnames = []

    for key in ips:
        ecs = ips[key]

        try:
            ## conn = SSHConnection(ecs['ip'], 22, 'root', 'Az%CKdz22@i383#I#Z5L@u')  ## zndz
            conn = SSHConnection(ecs['ip'], 22, 'root', 'I3$i8238*^##O3zxZ5L@u') ## ms
            ## conn = SSHConnection(ecs['ip'], 22, 'root', '32@da9$U#HGl5L@u')  ## tbms
            ## conn = SSHConnection(ecs['ip'], 22, 'root', 'LI#KU50lk#&%0->#la')  ## 1688

            ## cmd = 'echo `hostname` > /alidata/server/rsync/rsyncd.motd;';
            ## cmd = 'wget -qO- https://ae-rt.oss-cn-beijing.aliyuncs.com/ops/init-ks.sh | /bin/bash >> ~/init-ks.log'

            ## cmd = "hostname %s; echo `hostname` > /etc/hostname; cat /etc/hostname; rm -f /alidata/server/rsync/rsync.log; echo `hostname` > /alidata/server/rsync/rsyncd.motd; rm -f /alidata/server/rsync/rsync2.log;" % ecs['hostname']
            ## cmd = "/alidata/server/php/bin/php -v"
            ## cmd = "echo `hostname` > /alidata/server/rsync/rsyncd.motd;"


            cmd = "cd /alidata/server/httpd/conf/vhosts; rm -f fb.conf; wget https://ae-rt.oss-cn-beijing.aliyuncs.com/ops/fb.conf; "
            cmd += "/etc/init.d/httpd -k graceful; sleep 1; ls -al /alidata/server/httpd/logs/httpd.pid"

            ## cmd = 'wget -qO- https://ae-rt.oss-cn-beijing.aliyuncs.com/ops/addhosts.sh | /bin/bash >> ~/addhosts.log'
            ## cmd = "chown daemon.daemon /alidata/s/*; chmod 400 /alidata/s/*;";
            ## cmd = 'wget -qO- https://ae-rt.oss-cn-beijing.aliyuncs.com/ops/init-fb-dz.sh | /bin/bash >> ~/init-fb-dz.log;'
            ## cmd = 'chown root.root /alidata/log';
            ## cmd = 'jk_init -v -j /alidata/log ping extendedshell; jk_cp -vj /alidata/log curl; jk_cp -vj /alidata/log /etc/ssl/certs/ca-certificates.crt;'

            ## cmd = '/bin/echo "127.0.0.1 fb.chengji-inc.com fb.szchengji-inc.com" >> /etc/hosts; ';
            ## cmd = '/usr/bin/crontab -l | { /bin/cat; /bin/echo -e ""; /bin/echo "*/1 * * * * /alidata/server/php/bin/php /alidata/www/pdd/shell/timer_trigger_zc_sp.php >> /alidata/log/crontab/pdd_sp_timer_trigger_zc.log 2>&1"; } | /usr/bin/crontab -;'
            ## cmd = '/usr/bin/crontab -l | { /bin/cat; /bin/echo "*/1 * * * * /alidata/server/php/bin/php /alidata/www/pdd/shell/timer_trigger_zc_sp.php >> /alidata/log/crontab/pdd_sp_timer_trigger_zc.log 2>&1"; } | /usr/bin/crontab -;'
            ## cmd = '/usr/bin/crontab -l | /bin/grep -v "timer_trigger_zc_od" | /usr/bin/crontab -'

            ## cmd = 'cp /alidata/server/httpd/conf/httpd.conf /alidata/server/httpd/conf/httpd.conf.bak20191029; '
            ## cmd += '/bin/sed -i "s#HostnameLookups off#HostnameLookups off\\nTraceEnable off#g" /alidata/server/httpd/conf/httpd.conf; '
            ## cmd += "/etc/init.d/httpd -k graceful; sleep 1; ls -al /alidata/server/httpd/logs/httpd.pid"
            ## cmd = 'curl -v -X TRACE http://127.0.0.1';

            ## cmd = 'mkdir -p /alidata/log/pdddz-biz; chown -R daemon.daemon /alidata/log/pdddz-biz'

            ## cmd = '/bin/sed -i "s#pdddz.jiancent.com#pdddz.jiancent.com\\n127.0.0.1       sh.pdddz.jiancent.com#g" /etc/hosts; '

            ## cmd = 'apt upgrade rsync -y';
            print(cmd)
            if conn is not None:
                [ret, err] = conn.exec_command(cmd)
                print(ecs['hostname'] + " -> " + ret + " -> " + err)
                conn.close()

            ## break
        except:
            errorHostnames.append(ecs['hostname'])


    print("errorHostnames:")
    print(errorHostnames)