def vserial_ready(self, gate): if not self.TRCloudapi: self.TRCloudapi = CloudApiv1(self.TRAccesskey) gate_online = False app_ready = False app_info = {} gate_status_ret = self.TRCloudapi.get_gate_status(gate) if gate_status_ret: if gate_status_ret['message'] == "ONLINE": gate_online = True else: gate_online = False if gate_online: gate_apps_ret = self.TRCloudapi.get_gate_apps(gate) if gate_apps_ret: gate_apps = gate_apps_ret['message'] for app in gate_apps: if app.get('info').get('inst') == "freeioe_Vserial_npc": app_info = app.get('info') break for app in gate_apps: if app.get('info').get( 'inst') == "freeioe_Vserial_npc" and app.get( 'info').get( 'name') == "APP00000378" and app.get( 'info').get('running'): app_ready = True break return gate_online, {"ready": app_ready, "info": app_info}
def vserial_action(self, gate, action): now_str = str(time.time()) action_data = { "install": { "id": gate + '/freeioe_Vserial_npc/install/' + now_str, "device": gate, "data": { "inst": "freeioe_Vserial_npc", "name": "APP00000378", "version": 'latest', "conf": {} } }, "start": { "id": gate + '/freeioe_Vserial_npc/start/' + now_str, "device": gate, "data": { "inst": "freeioe_Vserial_npc" } }, "stop": { "id": gate + '/freeioe_Vserial_npc/stop/' + now_str, "device": gate, "data": { "inst": "freeioe_Vserial_npc" } }, "uninstall": { "id": gate + '/freeioe_Vserial_npc/uninstall/' + now_str, "device": gate, "data": { "inst": "freeioe_Vserial_npc" } }, "upgrade": { "id": gate + '/freeioe_Vserial_npc/upgrade/' + now_str, "device": gate, "data": { "inst": "freeioe_Vserial_npc", "name": "APP00000378", "version": 'latest', "conf": {} } } } if not self.TRCloudapi: self.TRCloudapi = CloudApiv1(self.TRAccesskey) ret, gate_action_ret = None, None if action_data.get(action): ret, gate_action_ret = self.TRCloudapi.post_action_to_app( action, action_data.get(action)) return ret, gate_action_ret
def start_vserial(self): if not self._vserial_is_running: if not self.TRCloudapi: self.TRCloudapi = CloudApiv1(self.TRAccesskey) self.enable_heartbeat(True, 60) if not self.NPSApi: self.NPSApi = npsApiv1(self.nps_host) if not self.__auth_key: self.nps_authcode() if not self.userinfo['tid']: self.nps_tunnel() if self.userinfo['tid']: now_time = str(int(time.time())) auth_key_md5 = hashlib.md5( (self.__auth_key + now_time).encode(encoding="UTF-8")).hexdigest() if not self.userinfo['client_status']: # print("用户 {0} 当前禁用".format(self.userinfo["name"])) ret = self.NPSApi.nps_api_post( "/client/changestatus/", { "auth_key": auth_key_md5, "timestamp": now_time, "id": self.userinfo['cid'], "status": 1 }) if not self.userinfo['tunnel_status']: # print("隧道 {0} 当前禁用".format(self.userinfo["tunnel_alias"])) ret = self.NPSApi.nps_api_post( "/index/start/", { "auth_key": auth_key_md5, "timestamp": now_time, "id": self.userinfo['tid'] }) # 检测网关是否在线 gate_status_ret = self.TRCloudapi.get_gate_status( self.userinfo['gate']) if gate_status_ret: if gate_status_ret['message'] == "ONLINE": self._gate_online = True self.userinfo['gate_status'] = "ONLINE" else: self._gate_online = False self.userinfo['gate_status'] = "OFFLINE" if self._gate_online: model = sn_model_map.get( self.userinfo.get("gate")[0:6]) or sn_model_map.get( self.userinfo.get("gate")[0:7]) or "C202" gate_port = model_port_map.get(model).get( self.userinfo.get("gate_port_name")) or "/dev/ttyS1" gate_vserial_command = { "port": gate_port, "nps": { "server_addr": self.userinfo['tunnel_host'] + ":7088", "vkey": self.userinfo['vkey'] }, "user_id": self.userinfo['name'] } gate_datas = { "id": self.userinfo['gate'] + '/send_command/start/' + str(time.time()), "device": self.userinfo['gate'], "data": { "device": self.userinfo['gate'] + ".freeioe_Vserial_npc", "cmd": "start", "param": gate_vserial_command } } ret, ret_content = self.TRCloudapi.post_command_to_cloud( gate_datas) # print(json.dumps(ret, sort_keys=False, indent=4, separators=(',', ':'))) if ret: if ret_content["gate_mes"]["result"]: local_ports = self.list_all() local_newPort = None for x in range(0, len(local_ports) + 1): local_newPort = "COM" + str(x + 1) if local_newPort not in local_ports: break self.userinfo["local_port_name"] = local_newPort self._vserial_is_running = True self._start_time = time.time() self.userinfo["info"] = { "user": self.userinfo.get("name"), "gate": self.userinfo.get("gate"), "gate_port": self.userinfo.get("gate_port_name"), "serial_driver": "vspax" } handler = TcpClientHander( self.userinfo.get("local_port_name"), self.userinfo.get("tunnel_host"), int(self.userinfo.get("tunnel_port")), self.userinfo.get("info")) self.add(handler) return self._vserial_is_running, self.userinfo else: self.clean_cfg() return False, "下发指令到网关不正常,请检查后重试" else: self.clean_cfg() return False, "网关Npc服务启动不正常,请检查后重试" else: self.clean_cfg() return False, "网关不在线,或你无权访问此网关,请检查后重试" else: self.clean_cfg() return False, "NPS连接错误或无此用户 {0} ".format( self.userinfo.get("name")) else: return False, "用户 {0} 正在使用中……,如需重新配置,请先停止再启动".format( self.userinfo.get("name"))
def start_vnet(self): if not self._vnet_is_running: self.check_frpc_service() self.check_tinc_service() if not self.FRPApi: self.FRPApi = frpcManager(self.frps_host) if not self.TRCloudapi: self.TRCloudapi = CloudApiv1(self.TRAccesskey) self.enable_heartbeat(True, 60) gate_status_ret = self.TRCloudapi.get_gate_status(self.userinfo['gate']) if gate_status_ret: if gate_status_ret['message'] == "ONLINE": self._gate_online = True self.userinfo['gate_status'] = "ONLINE" else: self._gate_online = False self.userinfo['gate_status'] = "OFFLINE" if self._gate_online: self.gate_vpn_data() local_vnet_ip = self.userinfo["local_vnet_ip"] local_vnet_netmask = self.userinfo["gate_lan_netmask"] if local_vnet_ip and is_ipv4(local_vnet_ip): cfgfile = os.getcwd() + r'\vnet\_frpc\frpc.ini' self.FRPApi.wirte_common_frpcini(cfgfile, {"server_addr": self.userinfo.get('tunnel_host'), "server_port": self.frps_port, "token": self.frps_token}) self.FRPApi.add_proxycfg_frpcini(cfgfile, { "vnet_bridge@" + self.userinfo.get('gate'): frpc_proxy['bridge']}) self.wmi_in_thread(self.prepend_tap, "vnet", [local_vnet_ip], ["255.255.255.0"]) self.services_start() if self._service_is_running: local_proxy = None for i in range(3): self._log.info(str(i) + ' query local_proxy_status!') local_proxy = self.FRPApi.local_frpcproxy_status("vnet_bridge@" + self.userinfo.get('gate')) if local_proxy: break time.sleep(i + 2) if local_proxy: if local_proxy['status'] == 'running': self.userinfo['client_online'] = 'online' peer_host = local_proxy['remote_addr'].split(':')[0] self.userinfo['tunnel_port'] = local_proxy['remote_addr'].split(':')[1] self._log.info('post vnet start command to gate: ' + self.userinfo.get("gate")) gate_vnet_config = {"net": "bridge", "Address": self.userinfo['tunnel_host'], "Port": str(self.userinfo['tunnel_port']), "proxy_name": "vnet_bridge@" + self.userinfo.get('gate'), "user_id": self.userinfo['name']} gate_datas = {"id": self.userinfo['gate'] + '/send_command/start/' + str(time.time()), "device": self.userinfo['gate'], "data": {"device": self.userinfo['gate'] + ".freeioe_Vnet_frpc", "cmd": "start", "param": gate_vnet_config}} ret, ret_content = self.TRCloudapi.post_command_to_cloud(gate_datas) # print(json.dumps(ret, sort_keys=False, indent=4, separators=(',', ':'))) if ret: if ret_content["gate_mes"]["result"]: self._vnet_is_running = True self._start_time = time.time() return self._vnet_is_running, self.userinfo else: print(json.dumps(ret_content, sort_keys=False, indent=4, separators=(',', ':'))) self.services_stop() return False, "下发指令到网关不正常,请检查后重试" else: self.services_stop() return False, "网关VPN服务启动不正常,请检查后重试" else: self.services_stop() return False, "本地代理服务(frpc_vnet)工作不正常,请检查frpc日志" else: self.services_stop() return False, "本地代理服务(frpc_vnet)工作不正常,请检查frpc日志" else: self.services_stop() return False, "本地服务启动不正常,请检查后重试" else: return False, "无法获取到网关LAN口IP地址,网关可能未安装应用,或未开启数据上传,请检查后重试" else: return False, "网关不在线,或你无权访问此网关,请检查后重试" else: return False, "用户 {0} 正在使用中……,如需重新配置,请先停止再启动".format(self.userinfo.get("name"))
def start_vnet(self): if not self._vnet_is_running: self.check_tinc_service() if not self.TRCloudapi: self.TRCloudapi = CloudApiv1(self.TRAccesskey) self.enable_heartbeat(True, 60) if not self.NPSApi: self.NPSApi = npsApiv1(self.nps_host) if not self.__auth_key: self.nps_authcode() if not self.userinfo['tid']: # print("get tid") self.nps_tunnel() if self.userinfo['tid']: now_time = str(int(time.time())) auth_key_md5 = hashlib.md5((self.__auth_key + now_time).encode(encoding="UTF-8")).hexdigest() if not self.userinfo['client_status']: # print("用户 {0} 当前禁用".format(self.userinfo["name"])) ret = self.NPSApi.nps_api_post("/client/changestatus/", {"auth_key": auth_key_md5, "timestamp": now_time, "id": self.userinfo['cid'], "status": 1}) if not self.userinfo['tunnel_status']: # print("隧道 {0} 当前禁用".format(self.userinfo["tunnel_alias"])) ret = self.NPSApi.nps_api_post("/index/start/", {"auth_key": auth_key_md5, "timestamp": now_time, "id": self.userinfo['tid']}) # 检测网关是否在线 gate_status_ret = self.TRCloudapi.get_gate_status(self.userinfo['gate']) if gate_status_ret: if gate_status_ret['message'] == "ONLINE": self._gate_online = True self.userinfo['gate_status'] = "ONLINE" else: self._gate_online = False self.userinfo['gate_status'] = "OFFLINE" if self._gate_online: self.gate_vpn_data() local_vnet_ip = self.userinfo["local_vnet_ip"] local_vnet_netmask = self.userinfo["gate_lan_netmask"] if local_vnet_ip and is_ipv4(local_vnet_ip): self.nps_changevk() time.sleep(0.5) self.wmi_in_thread(self.prepend_tap, "vnet", [local_vnet_ip], ["255.255.255.0"]) self.services_start() gate_vnet_config = {"net": "bridge", "Address": self.userinfo['tunnel_host'], "Port": str(self.userinfo['tunnel_port']), "proxy_name": "vnet_npc_proxy", "user_id": self.userinfo['name']} gate_datas = {"id": self.userinfo['gate'] + '/send_command/start/' + str(time.time()), "device": self.userinfo['gate'], "data": {"device": self.userinfo['gate'] + ".freeioe_Vnet_npc", "cmd": "start", "param": gate_vnet_config}} ret, ret_content = self.TRCloudapi.post_command_to_cloud(gate_datas) # print(json.dumps(ret, sort_keys=False, indent=4, separators=(',', ':'))) if ret: if ret_content["gate_mes"]["result"]: self._vnet_is_running = True self._start_time = time.time() return self._vnet_is_running, self.userinfo else: self.services_stop() self.clean_cfg() return False, "下发指令到网关不正常,请检查后重试" else: self.services_stop() self.clean_cfg() return False, "网关VPN服务启动不正常,请检查后重试" else: self.services_stop() self.clean_cfg() return False, "无法获取正确的本地Vnet IP,网关可能未安装应用,或未开启数据上传,请检查后重试" else: self.services_stop() self.clean_cfg() return False, "网关不在线,或你无权访问此网关,请检查后重试" else: self.services_stop() self.clean_cfg() return False, "NPS连接错误或无此用户 {0} ".format(self.userinfo.get("name")) else: return False, "用户 {0} 正在使用中……,如需重新配置,请先停止再启动".format(self.userinfo.get("name"))
def online(self, sn): if not self.TRCloudapi: self.TRCloudapi = CloudApiv1(self.TRAccesskey) return self.TRCloudapi.get_gate_status(sn)
def gatelist(self): if not self.TRCloudapi: self.TRCloudapi = CloudApiv1(self.TRAccesskey) return self.TRCloudapi.get_gate_list()