Initial YakPanel commit

This commit is contained in:
Niranjan
2026-04-07 02:04:22 +05:30
commit 2826d3e7f3
5359 changed files with 1390724 additions and 0 deletions

View File

@@ -0,0 +1,162 @@
# coding: utf-8
# ------------------------------
# 对外接口
# ------------------------------
import json
from datetime import datetime
import public
from panelDnsapi import extract_zone
from public.validate import Param
from .model import DnsDomainProvider, DnsDomainSSL, DnsDomainRecord
class SubPanelApi:
date_format = "%Y-%m-%d"
@staticmethod
def _end_time(data_str: str) -> int:
try:
if not data_str:
return 0
today = datetime.today().date()
end_date = datetime.strptime(data_str, SubPanelApi.date_format).date()
return (end_date - today).days if today <= end_date else 0
except ValueError:
return 0
def account_create_record(self, get):
try:
get.validate([
Param("body").String().Require(),
], [
public.validate.trim_filter(),
])
body = json.loads(get.body)
except json.JSONDecodeError:
body = get.body
except Exception as ex:
return public.fail_v2(str(ex))
domain = body.pop("domain", None)
if not domain:
return public.fail_v2("Domain not found!")
root, zone, _ = extract_zone(domain)
if not root:
return public.fail_v2("Domain not valid!")
# body = {
# "domain": "example.com",
# "record": "record",
# "record_value": "record_value",
# "record_type": "A",
# "ttl" : 1, # AUTO
# "proxied": 0不代理 , 1 代理,
# "priority": 10, 邮件参数, 按需要传入
# }
sys_name = "Sub YakPanel"
body["domain_name"] = root
p = DnsDomainProvider.objects.filter(domains__contains=root).first()
if p:
dns_obj = p.dns_obj
if body.get("record_type") == "TXT" and "v=spf" in body.get("record_value"):
# 处理spf记录
db_record = body.get("domain") if body.get("record") == "@" else body.get("record")
for item in DnsDomainRecord.objects.filter(
domain=body.get("domain"),
record__startswith=db_record,
record_type="TXT",
record_value__like="v=spf",
):
try:
item.delete_record(sys_name)
except:
continue
try:
res = dns_obj.create_org_record(**body)
except Exception as e:
return public.fail_v2(f"Failed! {str(e)}")
msg_body = (f'{sys_name} account Create Dns Record ['
f'domain={domain}, '
f'record={body.get("record")}, '
f'type={body.get("record_type")}, '
f'value={body.get("record_value")}'
f'] ')
if res.get("status"):
msg_body += "Successfully!"
public.WriteLog("DnsSSLManager", msg_body)
return public.success_v2("Successfully!")
else:
msg_body += f"Failed!, error: {res.get('msg')}"
public.WriteLog("DnsSSLManager", msg_body)
return public.fail_v2(res.get("msg", "Failed!"))
else:
return public.fail_v2("Provider account not found!")
def account_list_ssl_info(self, get):
"""
证书列表
"""
try:
get.validate([
Param("p").Integer(),
Param("limit").String(),
Param("domain").String(),
], [
public.validate.trim_filter(),
])
except Exception as ex:
public.print_log("error info: {}".format(ex))
return public.return_message(-1, 0, str(ex))
page = int(getattr(get, "p", 1))
limit = int(getattr(get, "limit", 100))
ssl_obj = DnsDomainSSL.objects.all()
if hasattr(get, "domain") and get.domain:
ssl_obj = ssl_obj.filter(subject__like=get.domain)
total = ssl_obj.count()
ssl_obj.limit(limit).offset((page - 1) * limit)
res = []
for ssl in ssl_obj:
if ssl.provider_id:
provider = DnsDomainProvider.objects.filter(id=ssl.provider_id).fields(
"name", "api_user", "api_key", "permission", "domains"
).first()
if provider:
provider = provider.as_dict()
else:
provider = {}
data = {
"provider": provider,
"ssl_info": ssl.info,
"end_time": self._end_time(ssl.not_after),
"end_date": ssl.not_after,
"last_apply_time": ssl.create_time,
"cert": {
"csr": public.readFile(ssl.path + "/fullchain.pem"), # 证书
"key": public.readFile(ssl.path + "/privkey.pem"), # 密钥
},
}
res.append(data)
return public.success_v2({"data": res, "total": total})
def account_domain_provider(self, get):
try:
get.validate([
Param("domain").String().Require(),
], [
public.validate.trim_filter(),
])
except Exception as ex:
public.print_log("error info: {}".format(ex))
return public.return_message(-1, 0, str(ex))
res = {}
for p in DnsDomainProvider.objects.all():
if get.domain in p.domains:
res = p.as_dict()
break
return public.success_v2(res)