예제 #1
0
 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())
예제 #2
0
    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})
예제 #3
0
 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)
예제 #4
0
 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)
예제 #5
0
    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(),
        )
예제 #6
0
    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(),
        )
예제 #7
0
def test_find_access_user(app):
    users = User.select(User.port == 1025,
                        User.method == "chacha20-ietf-poly1305")
    first_user = users.first()
    print(first_user)
예제 #8
0
 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))
예제 #9
0
 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)