async def sync_from_remote(self): try: User.flush_metrics_to_remote(self.api_endpoint) User.create_or_update_from_remote(self.api_endpoint) except Exception as e: logging.warning(f"sync user error {e}") for user in User.select().where(User.enable == True): await self.loop.create_task(self.init_server(user)) for user in User.select().where(User.enable == False): self.close_user_server(user) self.loop.call_later(self.sync_time, self.loop.create_task, self.sync_from_remote())
async def flush_metrics_to_remote(url): fields = [ User.user_id, User.ip_list, User.tcp_conn_num, User.upload_traffic, User.download_traffic, ] with db.atomic("EXCLUSIVE"): users = list(User.select(*fields).where(User.need_sync == True)) User.update( ip_list=set(), upload_traffic=0, download_traffic=0, need_sync=False ).where(User.need_sync == True).execute() data = [] for user in users: data.append( { "user_id": user.user_id, "ip_list": list(user.ip_list), "tcp_conn_num": user.tcp_conn_num, "upload_traffic": user.upload_traffic, "download_traffic": user.download_traffic, } ) async with httpx.AsyncClient() as client: await client.post(url, json={"data": data})
async def __report_user_stats(self): """ 上报用户数据 :return: """ users = User.select().where(User.is_deleted == False) User.update(conn_ip_set=set(), upload_traffic=0, download_traffic=0, total_traffic=0).where(User.is_deleted == False) await self.api.report_user_stats(user_data=users)
async def start_remote_sync_server(self, api_endpoint, sync_time): try: User.create_or_update_from_remote(api_endpoint) # TODO 用户流量记录 # UserServer.flush_metrics_to_remote(api_endpoint) for user in User.select(): await self.loop.create_task(self.init_server(user)) except Exception as e: logging.warning(f"sync user error {e}") self.loop.call_later(sync_time, self.start_remote_sync_server, api_endpoint, sync_time)
async def start_and_check_ss_server(self): """ 启动ss server并且定期检查是否要开启新的server TODO 关闭不需要的server """ if self.use_json: await self.sync_from_json_cron() else: await self.sync_from_remote_cron() for user in User.select().where(User.enable == True): try: await self.init_server(user) except Exception as e: logging.error(e) self.loop.stop() self.loop.call_later( self.sync_time, self.loop.create_task, self.start_and_check_ss_server(), )
async def start_and_check_ss_server(self): """ 启动ss server并且定期检查是否要开启新的server TODO 关闭不需要的server :return: """ if self.use_json: await self.__sync_from_json() else: await self.__sync_from_remote() for user in User.select().where(User.is_deleted == False): try: await self.__init_server(user) except Exception as e: logger.exception(e) self.loop.stop() self.loop.call_later( self.sync_time, self.loop.create_task, self.start_and_check_ss_server(), )
def test_find_access_user(app): users = User.select(User.port == 1025, User.method == "chacha20-ietf-poly1305") first_user = users.first() print(first_user)
async def start_ss_json_server(self): User.create_or_update_from_json("userconfigs.json") for user in User.select().where(User.enable == True): await self.loop.create_task(self.init_server(user))
async def start_ss_server(self): for user in User.select().where(User.enable == True): await self.loop.create_task(self.init_server(user)) for user in User.select().where(User.enable == False): self.close_user_server(user)