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)
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)
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.")
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 })
def userData(request): ''' 返回用户信息: 在线人数、今日签到、从未签到、从未使用 ''' data = [NodeOnlineLog.totalOnlineUser(), len(User.todayRegister()), SSUser.userTodyChecked(), SSUser.userNeverChecked(), SSUser.userNeverUsed(), ] return JsonResponse({'data': data})
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)
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={})
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")
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)
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)
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
def userData(request): ''' 返回用户信息: 在线人数、今日签到、从未签到、从未使用 ''' data = [ NodeOnlineLog.totalOnlineUser(), len(User.todayRegister()), SSUser.userTodyChecked(), SSUser.userNeverChecked(), SSUser.userNeverUsed(), ] return JsonResponse({'data': data})
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})
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})
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"))
def system_status(request): """跳转到后台界面""" context = {"total_user_num": User.get_total_user_num()} return render(request, "backend/index.html", context=context)
def check_user_state(self): """检测用户状态,将所有账号到期的用户状态重置""" User.check_and_disable_expired_users() UserTraffic.check_and_disable_out_of_traffic_user()
def username(self, instance): return User.get_by_id_with_cache(instance.user_id).username
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={})
def check_user_state(): """检测用户状态,将所有账号到期的用户状态重置""" User.check_and_disable_expired_users() UserTraffic.check_and_disable_out_of_traffic_user() print("Time: {} CHECKED".format(timezone.now()))
def get(self, request): """跳转到后台界面""" context = {"total_user_num": User.get_total_user_num()} return render(request, "my_admin/index.html", context=context)