diff --git a/apps/api/views.py b/apps/api/views.py index a5483bd452..b289e71774 100644 --- a/apps/api/views.py +++ b/apps/api/views.py @@ -179,11 +179,7 @@ def dispatch(self, *args, **kwargs): @method_decorator(api_authorized) def get(self, request, node_id): node: m.RelayNode = m.RelayNode.get_or_none(node_id) - return ( - JsonResponse(node.get_relay_rules_configs()) - if node - else HttpResponseBadRequest() - ) + return JsonResponse(node.get_config()) if node else HttpResponseBadRequest() @method_decorator(handle_json_request) @method_decorator(api_authorized) @@ -201,8 +197,8 @@ def post(self, request, node_id): name = data["relay_label"] if name in name_rule_map: rule = name_rule_map[name] - rule.up_traffic += data["stats"]["up"] - rule.down_traffic += data["stats"]["down"] + rule.up_traffic += data["stats"]["up"] * node.enlarge_scale + rule.down_traffic += data["stats"]["down"] * node.enlarge_scale for rule in rules: rule.save() return JsonResponse(data={}) diff --git a/apps/proxy/migrations/0028_relaynode_relay_sync_duration_and_more.py b/apps/proxy/migrations/0028_relaynode_relay_sync_duration_and_more.py new file mode 100644 index 0000000000..dfcc36f58a --- /dev/null +++ b/apps/proxy/migrations/0028_relaynode_relay_sync_duration_and_more.py @@ -0,0 +1,50 @@ +# Generated by Django 4.2.6 on 2024-02-26 03:52 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("proxy", "0027_remove_relayrule_proxy_node_and_more"), + ] + + operations = [ + migrations.AddField( + model_name="relaynode", + name="relay_sync_duration", + field=models.IntegerField(null=True, verbose_name="上报间隔(秒)"), + ), + migrations.AddField( + model_name="relaynode", + name="reload_interval", + field=models.IntegerField(null=True, verbose_name="配置重载间隔(秒)"), + ), + migrations.AddField( + model_name="relaynode", + name="web_auth_pass", + field=models.CharField( + blank=True, max_length=64, null=True, verbose_name="Web用户密码" + ), + ), + migrations.AddField( + model_name="relaynode", + name="web_auth_user", + field=models.CharField( + blank=True, max_length=64, null=True, verbose_name="Web用户名" + ), + ), + migrations.AddField( + model_name="relaynode", + name="web_host", + field=models.CharField( + blank=True, max_length=64, null=True, verbose_name="Web地址" + ), + ), + migrations.AlterField( + model_name="relaynode", + name="remark", + field=models.CharField( + default="", max_length=64, null=True, verbose_name="备注" + ), + ), + ] diff --git a/apps/proxy/models.py b/apps/proxy/models.py index d5fd826eff..fadbe9be2b 100644 --- a/apps/proxy/models.py +++ b/apps/proxy/models.py @@ -210,8 +210,12 @@ class ProxyNode(BaseNodeModel, SequenceMixin): xray_grpc_port = models.IntegerField("xray grpc port", default=23456) provider_remark = models.CharField("vps备注", max_length=64, default="") - ehco_listen_host = models.CharField("隧道监听地址", max_length=64, blank=True, null=True) - ehco_listen_port = models.CharField("隧道监听端口", max_length=64, blank=True, null=True) + ehco_listen_host = models.CharField( + "隧道监听地址", max_length=64, blank=True, null=True + ) + ehco_listen_port = models.CharField( + "隧道监听端口", max_length=64, blank=True, null=True + ) ehco_listen_type = models.CharField( "隧道监听类型", max_length=64, choices=c.LISTEN_TYPES, default=c.LISTEN_RAW ) @@ -231,7 +235,9 @@ class ProxyNode(BaseNodeModel, SequenceMixin): ehco_reload_interval = models.IntegerField("配置重载间隔", default=0) upload_bandwidth_bytes = models.BigIntegerField("上传带宽", default=0) - current_used_upload_bandwidth_bytes = models.BigIntegerField("当前使用的上传带宽", default=0) + current_used_upload_bandwidth_bytes = models.BigIntegerField( + "当前使用的上传带宽", default=0 + ) download_bandwidth_bytes = models.BigIntegerField("下载带宽", default=0) current_used_download_bandwidth_bytes = models.BigIntegerField( "当前使用的下载带宽", default=0 @@ -644,13 +650,21 @@ class RelayNode(BaseNodeModel): ) isp = models.CharField("ISP线路", max_length=64, choices=ISP_TYPES, default=BGP) - remark = models.CharField("备注", max_length=64, default="") + remark = models.CharField("备注", max_length=64, default="", null=True) enable_ping = models.BooleanField("是否开启PING", default=True) enable_udp = models.BooleanField("是否开启UDP 转发", default=True) + + web_host = models.CharField("Web地址", max_length=64, null=True, blank=True) web_port = models.IntegerField("Web端口", default=0) web_token = models.CharField( "Web验证Token", max_length=64, default="", null=True, blank=True ) + web_auth_user = models.CharField("Web用户名", max_length=64, null=True, blank=True) + web_auth_pass = models.CharField( + "Web用户密码", max_length=64, null=True, blank=True + ) + reload_interval = models.IntegerField("配置重载间隔(秒)", null=True) + relay_sync_duration = models.IntegerField("上报间隔(秒)", null=True) class Meta: verbose_name = "中转节点" @@ -659,7 +673,7 @@ class Meta: def __str__(self) -> str: return f"{self.name}-{self.remark}" if self.remark else self.name - def get_relay_rules_configs(self): + def get_config(self): relay_configs = [] rules = self.relay_rules.prefetch_related("proxy_nodes") for rule in rules: @@ -694,14 +708,19 @@ def get_relay_rules_configs(self): "transport_type": rule.transport_type, } ) - return { - "web_port": self.web_port, - "web_token": self.web_token, + cfg = { "enable_ping": self.enable_ping, "relay_configs": relay_configs, - "relay_sync_duration": 10, - "relay_sync_url": self.api_endpoint, + "reload_interval": self.reload_interval, + "relay_sync_duration": self.relay_sync_duration, } + if self.web_host and self.web_port: + cfg["web_host"] = self.web_host + cfg["web_port"] = self.web_port + cfg["web_token"] = self.web_token + cfg["web_auth_user"] = self.web_auth_user + cfg["web_auth_pass"] = self.web_auth_pass + return cfg @property def api_endpoint(self): @@ -966,7 +985,9 @@ class UserProxyNodeOccupancy(BaseModel): ProxyNode, on_delete=models.CASCADE, verbose_name="代理节点" ) start_time = models.DateTimeField(auto_now_add=True, verbose_name="开始占用时间") - end_time = models.DateTimeField(null=False, blank=False, verbose_name="结束占用时间") + end_time = models.DateTimeField( + null=False, blank=False, verbose_name="结束占用时间" + ) used_traffic = models.BigIntegerField("已用流量(单位字节)", default=0) total_traffic = models.BigIntegerField("总流量(单位字节)", default=settings.GB)