Skip to content

Commit

Permalink
feat: Refactor API and ProxyNode models
Browse files Browse the repository at this point in the history
  • Loading branch information
Ehco1996 committed Feb 26, 2024
1 parent e71c597 commit 77e5543
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 18 deletions.
10 changes: 3 additions & 7 deletions apps/api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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={})
Expand Down
Original file line number Diff line number Diff line change
@@ -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="备注"
),
),
]
43 changes: 32 additions & 11 deletions apps/proxy/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
)
Expand All @@ -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
Expand Down Expand Up @@ -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 = "中转节点"
Expand All @@ -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:
Expand Down Expand Up @@ -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):
Expand Down Expand Up @@ -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)

Expand Down

0 comments on commit 77e5543

Please sign in to comment.