Ejemplo n.º 1
0
	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)
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
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')
Ejemplo n.º 4
0
	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"))
Ejemplo n.º 5
0
	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"))