# coding=utf-8
import json
import csv
import time
import re
import requests
import os
import paho.mqtt.client as mqtt
import threading
import random
import paramiko
import sys

# 网关SN从csv文件读取
HOST = "mqtt.lnxall.com"
PORT = 3883

url = "http://iot.lnxall.com"
username = "xieneng"
password = "123456"

date_str = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())

script_url = "http://qa.frps.lnxall.com:5011/xpzhao/woolink/openwrt_lora/feeds/lnxall_package/dy_base-files/lib/dyiot/bin/update_rootfs.sh"

rootfs_url = sys.argv[1] #"http://qa.frps.lnxall.com:5008/images/gw_lora_v3/20210930/rootfs_clear.tar.gz"

before = date_str + url + " before"
after = date_str + url + " after"

headers1 = {
    'Accept': 'application/json, text/plain, */*',
    'Referer': 'http://iot.lnxall.com/login',
    'Origin': 'http://iot.lnxall.com',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36',
    'Content-Type': 'application/json;charset=UTF-8',
    'Host': 'iot.lnxall.com',
    'Connection': 'keep-alive',
    'Accept-Language': 'zh-CN',
    'Accept-Encoding': 'gzip, deflate'
}

data1 = '{"username":"' + username + '","password":"' + password + '"}'
response1 = requests.post('%s/iot/system/user/login' % url, headers=headers1, data=data1)
print("This is text:", response1.text, "This is status code:", response1.status_code)
tokenjson = json.loads(response1.text)  # 将字符串转为dict输出，反正dumps可以将dict转为str输出
admintokenhead = tokenjson['data']['tokenHead']
admintoken = tokenjson['data']['token']

adminauth = admintokenhead + admintoken
headers2 = {
    'Accept': 'application/json, text/plain, */*',
    'Referer': 'http://iot.lnxall.com/devmgr/index',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36',
    'Authorization': adminauth,
    'Host': 'iot.lnxall.com'
}

params = (('gateWayType', '15'), ('page', '1'), ('size', '200'), ('sort', 'channelNumber'),)
response4 = requests.get('%s/iot/gateway/findPageList' % url, headers=headers2, params=params)
gatewayinfo = json.loads(response4.text)
gatewaycount = gatewayinfo['pagination']['totalCount']
gatewaylist = gatewayinfo['data']
print("gatewaylist:", gatewaylist)


response = requests.get('http://192.168.22.246:7500/api/proxy/tcp', auth=('dywl', 'dywlfrp123'))
frptcpinfo = json.loads(response.text)
frpproxies = frptcpinfo['proxies']  # list格式
# print("frpcount::",len(frpproxies),"frpproxies:",frpproxies)

frp_table = {}

for frp in frpproxies:
    if frp['status'] == 'online':
        gatewaysnre = re.search('[0-9a-fA-F]+', frp['name'])
        if (gatewaysnre is not None):
            gatewaysn = gatewaysnre.group()
            frp_table[gatewaysn] = frp['conf']['remote_port']

print(frp_table)
print(len(frp_table))

# frp服务器登录信息
ssh_ip = "192.168.22.246"
ssh_port = 22
ssh_user = "support"
ssh_password = "dywlfrp123"

# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接FRP跳转服务器
ssh.connect(hostname=ssh_ip, port=ssh_port, username=ssh_user, password=ssh_password)
resp = ''
# 二次登录new session
channel = ssh.invoke_shell()
channel.settimeout(600)

for gw in gatewaylist:
    # 创建SSH对象
    ssh = paramiko.SSHClient()
    # 允许连接不在know_hosts文件中的主机
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    # 连接FRP跳转服务器
    ssh.connect(hostname=ssh_ip, port=ssh_port, username=ssh_user, password=ssh_password)
    resp = ''
    # 二次登录new session
    channel = ssh.invoke_shell()
    channel.settimeout(600)
    print("=====")
    gw_sn = gw['channelNumber']
    if gw_sn not in frp_table.keys():
        continue
    port = frp_table[gw_sn]
    #gw_sn='218804000168'
    #port=14043
    print(gw_sn)
    channel.recv(9999)
    cmd = 'ssh -p ' + str(port) + ' root' + '@' + 'localhost'
    print(cmd)
    channel.send(cmd + '\n')

    time.sleep(7)
    resplogin = channel.recv(9999)
    print(resplogin)
    if ("password" not in str(resplogin, "utf8", "ignore")):
        time.sleep(5)  # 如果慢的网关再等5秒
    channel.send('lnxall123' + '\n')  # 默认发送的密码
    time.sleep(2)
    respoldpasswd = channel.recv(9999)
    print(respoldpasswd)
    if ("~#" in str(respoldpasswd, "utf8", "ignore")):
        print("login %s with new password..." % (gw_sn))
        resp = ''
    else:
        channel.send('dyiot123' + '\n')  # 老架构发送的密码
        time.sleep(2)
        respnewpasswd = channel.recv(9999)
        print(respnewpasswd)
        #print("respnewpasswd:", str(respnewpasswd,"utf8","ignore"))
        if ("~#" in str(respnewpasswd,"utf8","ignore")):
            print("login %s with old password..." % (gw_sn))
            resp = ''
        else:   #2个密码都不对报错,退出
            print(str(respnewpasswd,"utf8","ignore"))
            print("--------------Password for %s  failed..." % (gw_sn))
            resp = ''
            continue

    channel.send('cd /tmp;' + '\n')  # 发送命令
    resp = channel.recv(9999)
    print(resp)
    if ("tmp#" in str(resp, "utf8", "ignore")):
        #print ("Check %s gateway..." % gatewaysn)
        resp = ''
    else:
        time.sleep(2)  # 取不到再等2秒
        resp = channel.recv(9999)
        if ("tmp#" in str(resp, "utf8", "ignore")):
            resp = ''
        else:
            print("--------------tmp# not in %s failed..." % (gw_sn))
            resp = ''
            channel.send('exit' + '\n')  # 发送命令
            continue

    cmd = 'if [ ! -f "/app/update_rootfs.sh" ]; then  wget ' + script_url + ' -O /app/update_rootfs.sh; fi'
    channel.send(cmd + '\n')  # 发送命令
    time.sleep(5)
    resp = channel.recv(9999)
    print(resp)
    if ("tmp#" in str(resp, "utf8", "ignore")):
        #print ("Check %s gateway..." % gatewaysn)
        resp = ''
    else:
        time.sleep(2)  # 取不到再等2秒
        resp = channel.recv(9999)
        if ("tmp#" in str(resp, "utf8", "ignore")):
            resp = ''
        else:
            print("--------------tmp# not in %s failed..." % (gw_sn))
            resp = ''
            channel.send('exit' + '\n')  # 发送命令
            continue

    cmd = 'sh /app/update_rootfs.sh ' + rootfs_url + ' &'
    print(cmd)
    channel.send(cmd + '\n')  # 发送命令
    time.sleep(2)
    channel.send('exit' + '\n')  # 发送命令
    # 关闭连接
    ssh.close()
    #break
