Ejemplo n.º 1
0
    def get(self, request):
        today_register_user = User.get_today_register_user().values()[:10]
        # find inviter
        for u in today_register_user:
            try:
                u["inviter"] = User.objects.get(pk=u["inviter_id"])
            except User.DoesNotExist:
                u["inviter"] = "None"

        context = {
            "total_user_num":
            User.get_total_user_num(),
            "alive_user_count":
            NodeOnlineLog.get_all_node_online_user_count(),
            "today_checked_user_count":
            UserCheckInLog.get_today_checkin_user_count(),
            "today_register_user_count":
            len(today_register_user),
            "traffic_users":
            UserTraffic.get_user_order_by_traffic(count=10),
            "rich_users_data":
            Donate.get_most_donated_user_by_count(10),
            "today_register_user":
            today_register_user,
        }
        return render(request, "my_admin/user_status.html", context=context)
Ejemplo n.º 2
0
    def get(self, request):
        user_status = [
            NodeOnlineLog.get_all_node_online_user_count(),
            User.get_today_register_user().count(),
            UserCheckInLog.get_today_checkin_user_count(),
            User.get_never_used_user_count(),
        ]
        donate_status = [
            Donate.get_donate_count_by_date(),
            Donate.get_donate_money_by_date(),
            Donate.get_donate_count_by_date(date=pendulum.today()),
            Donate.get_donate_money_by_date(date=pendulum.today()),
        ]

        active_nodes = SSNode.get_active_nodes() + VmessNode.get_active_nodes()

        node_status = {
            "names": [node.name for node in active_nodes],
            "traffics": [
                round(node.used_traffic / settings.GB, 2) for node in active_nodes
            ],
        }
        data = {
            "user_status": user_status,
            "donate_status": donate_status,
            "node_status": node_status,
        }
        return JsonResponse(data)
Ejemplo n.º 3
0
    def handle(self, *args, **options):
        options.setdefault("interactive", False)
        database = options.get("database")
        password = options.get("password")
        username = options.get("username")
        email = options.get("email")

        if not password or not username or not email:
            raise CommandError(
                "--email --username and --password are required options")

        error_msg = self._validate_username(username, "username", database)
        if error_msg:
            raise CommandError(error_msg)

        user_data = {
            "username": username,
            "password": password,
            "email": email,
            "vmess_uuid": str(uuid4()),
            "ss_port": User.get_not_used_port(),
        }

        with transaction.atomic():
            user = self.UserModel._default_manager.db_manager(
                database).create_superuser(**user_data)
        if options.get("verbosity", 0) >= 1:
            self.stdout.write(f"Admin: {user} created successfully.")
Ejemplo n.º 4
0
 def get(self, request, pk):
     user = User.get_by_pk(pk)
     form = UserForm(instance=user)
     return render(request,
                   "my_admin/user_detail.html",
                   context={
                       "form": form,
                       "user": user
                   })
Ejemplo n.º 5
0
def userData(request):
    '''
    返回用户信息:
    在线人数、今日签到、从未签到、从未使用
    '''

    data = [NodeOnlineLog.totalOnlineUser(), len(User.todayRegister()),
            SSUser.userTodyChecked(), SSUser.userNeverChecked(),
            SSUser.userNeverUsed(), ]
    return JsonResponse({'data': data})
Ejemplo n.º 6
0
 def get(self, request):
     token = request.GET.get("token")
     if not token:
         return HttpResponseNotFound()
     user = User.get_or_none(encoder.string2int(token))
     if not user:
         return HttpResponseNotFound()
     sub_links = user.get_sub_links()
     sub_links = base64.urlsafe_b64encode(sub_links.encode()).decode()
     return HttpResponse(sub_links)
Ejemplo n.º 7
0
    def post(self, request, node_id):
        node = VmessNode.get_or_none_by_node_id(node_id)
        if not node:
            return HttpResponseNotFound()

        log_time = get_current_datetime()
        node_total_traffic = 0
        need_clear_cache = False
        trafficlog_model_list = []
        user_model_list = []

        for log in request.json["user_traffics"]:
            user_id = log["user_id"]
            u = int(log["ut"] * node.enlarge_scale)
            d = int(log["dt"] * node.enlarge_scale)
            # 个人流量增量
            user = User.get_by_pk(user_id)
            user.download_traffic += d
            user.upload_traffic += u
            user.last_use_time = log_time
            user_model_list.append(user)
            if user.overflow:
                need_clear_cache = True
            # 个人流量记录
            trafficlog_model_list.append(
                UserTrafficLog(
                    node_type=UserTrafficLog.NODE_TYPE_VMESS,
                    node_id=node_id,
                    user_id=user_id,
                    download_traffic=u,
                    upload_traffic=d,
                )
            )
            # 节点流量增量
            node_total_traffic += u + d
        # 节点流量记录
        VmessNode.increase_used_traffic(node_id, node_total_traffic)
        # 流量记录
        UserTrafficLog.objects.bulk_create(trafficlog_model_list)
        # TODO 在线IP
        # 个人流量记录
        User.objects.bulk_update(
            user_model_list, ["download_traffic", "upload_traffic", "last_use_time"],
        )
        # 节点在线人数
        NodeOnlineLog.add_log(
            NodeOnlineLog.NODE_TYPE_VMESS, node_id, len(request.json["user_traffics"])
        )
        # check node && user traffic
        if node.overflow:
            node.enable = False
        if need_clear_cache or node.overflow:
            node.save()
        return JsonResponse(data={})
Ejemplo n.º 8
0
    def get(self, request):
        token = request.GET.get("token")
        if not token:
            return HttpResponseNotFound()
        user = User.get_or_none(encoder.string2int(token))
        if not user:
            return HttpResponseNotFound()

        sub_type = request.GET.get("sub_type")
        sub_links = UserSubManager(user, sub_type, request).get_sub_links()
        return HttpResponse(sub_links, content_type="text/plain; charset=utf-8")
Ejemplo n.º 9
0
    def get(self, request):
        token = request.GET.get("token")
        if not token:
            return HttpResponseNotFound()
        user = User.get_or_none(encoder.string2int(token))
        if not user:
            return HttpResponseNotFound()

        sub_type = request.GET.get("sub_type")
        sub_links = user.get_sub_links(sub_type)
        return HttpResponse(sub_links)
Ejemplo n.º 10
0
 def post(self, request, pk):
     user = User.get_by_pk(pk)
     form = UserForm(request.POST, instance=user)
     if form.is_valid():
         form.save()
         messages.success(request, "数据更新成功", extra_tags="修改成功")
         return HttpResponseRedirect(reverse("sspanel:admin_user_list"))
     else:
         messages.error(request, "数据填写错误", extra_tags="错误")
         context = {"form": form, "user": user}
         return render(request, "my_admin/user_detail.html", context=context)
Ejemplo n.º 11
0
 def get(self, request):
     token = request.GET.get("token")
     if not token:
         return HttpResponseNotFound()
     user = User.get_by_pk(encoder.string2int(token))
     sub_links = user.get_sub_links()
     sub_links = base64.b64encode(bytes(sub_links, "utf8")).decode("ascii")
     resp = StreamingHttpResponse(sub_links)
     resp["Content-Type"] = "application/octet-stream; charset=utf-8"
     resp["Content-Disposition"] = "attachment; filename={}.txt".format(token)
     resp["Cache-Control"] = "no-store, no-cache, must-revalidate"
     resp["Content-Length"] = len(sub_links)
     return resp
Ejemplo n.º 12
0
def userData(request):
    '''
    返回用户信息:
    在线人数、今日签到、从未签到、从未使用
    '''

    data = [
        NodeOnlineLog.totalOnlineUser(),
        len(User.todayRegister()),
        SSUser.userTodyChecked(),
        SSUser.userNeverChecked(),
        SSUser.userNeverUsed(),
    ]
    return JsonResponse({'data': data})
Ejemplo n.º 13
0
def userData(request):
    '''
    返回用户信息:
    在线人数、今日签到、从未签到、从未使用
    '''

    data = [
        NodeOnlineLog.totalOnlineUser(),
        User.get_today_register_user().count(),
        Suser.get_today_checked_user_num(),
        Suser.get_never_checked_user_num(),
        Suser.get_never_used_num(),
    ]
    return JsonResponse({'data': data})
Ejemplo n.º 14
0
    def post(self, request):
        if not settings.ALLOW_REGISTER:
            return HttpResponse("已经关闭注册了喵")

        form = RegisterForm(data=request.POST)
        if form.is_valid():
            user = User.add_new_user(form.cleaned_data)
            if not user:
                messages.error(request, "服务出现了点小问题", extra_tags="请尝试或者联系站长~")
                return render(request, "sspanel/register.html", {"form": form})
            else:
                messages.success(request, "自动跳转到用户中心", extra_tags="注册成功!")
                user = authenticate(
                    username=form.cleaned_data["username"],
                    password=form.cleaned_data["password1"],
                )
                login(request, user)
                return HttpResponseRedirect(reverse("sspanel:userinfo"))
        return render(request, "sspanel/register.html", {"form": form})
Ejemplo n.º 15
0
 def get(self, request, user_id):
     user = User.get_by_pk(user_id)
     user.delete()
     messages.success(request, "成功啦", extra_tags="删除用户")
     return HttpResponseRedirect(
         reverse("sspanel:admin_user_ss_config_list"))
Ejemplo n.º 16
0
def system_status(request):
    """跳转到后台界面"""
    context = {"total_user_num": User.get_total_user_num()}
    return render(request, "backend/index.html", context=context)
Ejemplo n.º 17
0
 def check_user_state(self):
     """检测用户状态,将所有账号到期的用户状态重置"""
     User.check_and_disable_expired_users()
     UserTraffic.check_and_disable_out_of_traffic_user()
Ejemplo n.º 18
0
 def username(self, instance):
     return User.get_by_id_with_cache(instance.user_id).username
Ejemplo n.º 19
0
    def post(self, request, node_id):
        """
        这个接口操作比较重,所以为了避免发信号
        所有写操作都需要用BULK的方式
        1 更新节点流量
        2 更新用户流量
        3 记录节点在线IP
        4 关闭超出流量的节点
        """
        ss_node = SSNode.get_or_none_by_node_id(node_id)
        if not ss_node:
            return HttpResponseNotFound()

        data = request.json["data"]
        node_total_traffic = 0
        log_time = get_current_datetime()
        active_tcp_connections = 0
        need_clear_cache = False
        user_model_list = []
        trafficlog_model_list = []
        online_ip_log_model_list = []

        for user_data in data:
            user_id = user_data["user_id"]
            u = int(user_data["upload_traffic"] * ss_node.enlarge_scale)
            d = int(user_data["download_traffic"] * ss_node.enlarge_scale)
            # 个人流量增量
            user = User.get_by_pk(user_id)
            user.download_traffic += d
            user.upload_traffic += u
            user.last_use_time = log_time
            user_model_list.append(user)
            if user.overflow:
                need_clear_cache = True
            # 个人流量记录
            trafficlog_model_list.append(
                UserTrafficLog(
                    node_type=UserTrafficLog.NODE_TYPE_SS,
                    node_id=node_id,
                    user_id=user_id,
                    download_traffic=u,
                    upload_traffic=d,
                )
            )
            # 节点流量增量
            node_total_traffic += u + d
            # active_tcp_connections
            active_tcp_connections += user_data["tcp_conn_num"]
            # online ip log
            for ip in user_data.get("ip_list", []):
                online_ip_log_model_list.append(
                    UserOnLineIpLog(user_id=user_id, node_id=node_id, ip=ip)
                )

        # 用户流量
        User.objects.bulk_update(
            user_model_list, ["download_traffic", "upload_traffic", "last_use_time"],
        )
        # 节点流量记录
        SSNode.increase_used_traffic(node_id, node_total_traffic)
        # 流量记录
        UserTrafficLog.objects.bulk_create(trafficlog_model_list)
        # 在线IP
        UserOnLineIpLog.objects.bulk_create(online_ip_log_model_list)
        # 节点在线人数
        NodeOnlineLog.add_log(
            NodeOnlineLog.NODE_TYPE_SS, node_id, len(data), active_tcp_connections
        )
        # check node && user traffic
        if ss_node.overflow:
            ss_node.enable = False
        if need_clear_cache or ss_node.overflow:
            ss_node.save()
        return JsonResponse(data={})
Ejemplo n.º 20
0
def check_user_state():
    """检测用户状态,将所有账号到期的用户状态重置"""
    User.check_and_disable_expired_users()
    UserTraffic.check_and_disable_out_of_traffic_user()
    print("Time: {} CHECKED".format(timezone.now()))
Ejemplo n.º 21
0
 def get(self, request):
     """跳转到后台界面"""
     context = {"total_user_num": User.get_total_user_num()}
     return render(request, "my_admin/index.html", context=context)