def gate_vpn_data(self): data = self.TRCloudapi.get_device_data(self.userinfo['gate'], self.userinfo['gate'] + ".freeioe_Vnet_frpc") if data: try: rawdata = data['message'] # print(json.dumps(rawdata, sort_keys=False, indent=4, separators=(',', ':'))) if rawdata: gate_lan_ip = rawdata.get("lan_ip").get("PV") if gate_lan_ip and is_ipv4(gate_lan_ip): local_vnet_ip = ".".join(gate_lan_ip.split(".")[0:3]) + "." + str(random.randint(11, 244)) if rawdata.get("bridge_run").get("PV") == "running": self.userinfo["gate_vpn_status"] = True self._gate_vpn_is_running = True else: self.userinfo["gate_vpn_status"] = False self._gate_vpn_is_running = False if rawdata.get("bridge_config").get("PV") != "": self.userinfo["gate_vpn_config"] = json.loads(rawdata.get("bridge_config").get("PV")) if not self.userinfo["gate_lan_ip"]: self.userinfo["gate_lan_ip"] = gate_lan_ip self.userinfo["gate_lan_netmask"] = rawdata.get("lan_netmask").get("PV") if not self.userinfo["local_vnet_ip"]: self.userinfo["local_vnet_ip"] = local_vnet_ip if not self.userinfo["dest_ip"]: self.userinfo["dest_ip"] = gate_lan_ip except Exception as ex: self._log.exception(ex)
def api_start(params: vnetItem): if not type(params) is dict: params = params.dict() # print(json.dumps(params, sort_keys=True, indent=4, separators=(',', ':'))) id = params.get("id") or uuid.uuid1() host = params.get("host") user = params.get("user") gate = params.get("gate") ret, ret_content = None, None if host and user and gate: if not urlCheck(host).get_url(): return failure(id, "host must be domain or ipv4 or url") else: vret, vret_content = APIHandler.Manager.vnet_status() if vret: str = "用户 {0} 正在使用中……,如需重新配置,请先停止再启动".format( vret_content.userinfo.get("name")) return failure(id, str) else: auth_code = params.get( "auth_code") or APPCtrl().get_accesskey() if auth_code: APIHandler.Manager.TRAccesskey = auth_code else: return failure(id, "params lost auth_code") if params.get("local_ip"): if is_ipv4(params.get("local_ip")): APIHandler.Manager.userinfo[ 'local_vnet_ip'] = params.get("local_ip") if params.get("dest_ip"): if is_ipv4(params.get("dest_ip")): APIHandler.Manager.userinfo['dest_ip'] = params.get( "dest_ip") APIHandler.Manager.nps_host = urlCheck(host).get_url() APIHandler.Manager.userinfo['name'] = user APIHandler.Manager.userinfo['tunnel_host'] = urlCheck( host).get_host() APIHandler.Manager.userinfo['gate'] = gate ret, ret_content = APIHandler.Manager.start_vnet() else: ret_content = "params lost host or user or gate" if ret: return success(id, ret_content) else: return failure(id, ret_content)
def api_bench(params: benchItem): if not type(params) is dict: params = params.dict() # print(json.dumps(params, sort_keys=True, indent=4, separators=(',', ':'))) id = params.get("id") or uuid.uuid1() host = params.get("host") port = params.get("port") size = params.get("size") direct = params.get("direct") if not is_ipv4(host): return failure(id, "host must be ipv4") ret = APIHandler.Manager.speed_bench(host, port, size, direct) if ret: return success(id, ret) else: return failure(id, 'error')
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"))