138 lines
4.2 KiB
Python
138 lines
4.2 KiB
Python
|
|
# coding: utf-8
|
|||
|
|
# -------------------------------------------------------------------
|
|||
|
|
# YakPanel
|
|||
|
|
# -------------------------------------------------------------------
|
|||
|
|
# Copyright (c) 2014-2099 YakPanel(www.yakpanel.com) All rights reserved.
|
|||
|
|
# -------------------------------------------------------------------
|
|||
|
|
# Author: yakpanel
|
|||
|
|
# -------------------------------------------------------------------
|
|||
|
|
# aaDNS config
|
|||
|
|
# ------------------------------
|
|||
|
|
import json
|
|||
|
|
|
|||
|
|
import os
|
|||
|
|
import re
|
|||
|
|
import sys
|
|||
|
|
|
|||
|
|
if not "class_v2" in sys.path:
|
|||
|
|
sys.path.append("class_v2")
|
|||
|
|
|
|||
|
|
__all__ = [
|
|||
|
|
"aaDnsConfig",
|
|||
|
|
"zone_pattern",
|
|||
|
|
"file_pattern",
|
|||
|
|
"record_pattern",
|
|||
|
|
"ZONES_DIR",
|
|||
|
|
"ZONES",
|
|||
|
|
"APP_DIR",
|
|||
|
|
"SERVICE_INSTALL_NAME",
|
|||
|
|
"PUBLIC_SERVER",
|
|||
|
|
"DNS_AUTH_LOCK",
|
|||
|
|
"aaDNS_CONF",
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
zone_pattern = re.compile(r'zone\s+"[^"]+"\s*(?:IN)?\s*\{[\s\S]*?};', re.MULTILINE)
|
|||
|
|
file_pattern = re.compile(r'file\s+"([^"]+)"')
|
|||
|
|
record_pattern = re.compile(r'^(\S+)\s+(?:(\d+)\s+)?(?:(IN)\s+)?(\S+)\s+(.*)$')
|
|||
|
|
|
|||
|
|
ZONES_DIR = "/var/named/chroot/var/named/"
|
|||
|
|
ZONES = "/var/named/chroot/etc/named.rfc1912.zones"
|
|||
|
|
|
|||
|
|
APP_DIR = os.path.dirname(os.path.abspath(__file__))
|
|||
|
|
SERVICE_INSTALL_NAME = f"{APP_DIR}/aadns.pl"
|
|||
|
|
aaDNS_CONF = os.path.join(APP_DIR, "aaDns_conf.json")
|
|||
|
|
DNS_AUTH_LOCK = f"{APP_DIR}/dns_auth.pl"
|
|||
|
|
|
|||
|
|
PUBLIC_SERVER = [
|
|||
|
|
("Google", ["8.8.8.8"]),
|
|||
|
|
("Cloudflare", ["1.1.1.1"]),
|
|||
|
|
("Quad9", ["9.9.9.9"]),
|
|||
|
|
("OpenDNS", ["208.67.222.222"]),
|
|||
|
|
("DNS.Watch", ["84.200.69.80"]),
|
|||
|
|
("Comodo Secure DNS", ["8.26.56.26"]),
|
|||
|
|
("AdGuard DNS", ["94.140.14.14"]),
|
|||
|
|
("CleanBrowsing", ["185.228.168.9"]),
|
|||
|
|
("Neustar DNS", ["207.177.68.4"]),
|
|||
|
|
("Freenom World", ["83.145.86.7"]),
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
class aaDnsConfig:
|
|||
|
|
if os.path.exists("/etc/redhat-release"):
|
|||
|
|
os_type = "redhat"
|
|||
|
|
package = "yum"
|
|||
|
|
else:
|
|||
|
|
os_type = "ubuntu"
|
|||
|
|
package = "apt"
|
|||
|
|
|
|||
|
|
def __init__(self):
|
|||
|
|
self.install_service = None
|
|||
|
|
self.ns_server = None
|
|||
|
|
self.bind_service_name = "named"
|
|||
|
|
self.pnds_service_name = "pdns"
|
|||
|
|
self._init_env()
|
|||
|
|
|
|||
|
|
def _init_env(self):
|
|||
|
|
# RHEL/CentOS,检查 bind-chroot 服务具体名称
|
|||
|
|
if os.path.exists("/usr/lib/systemd/system/named-chroot.service"):
|
|||
|
|
self.bind_service_name = "named-chroot"
|
|||
|
|
|
|||
|
|
if os.path.exists(SERVICE_INSTALL_NAME):
|
|||
|
|
with open(SERVICE_INSTALL_NAME, "r") as f:
|
|||
|
|
self.install_service = f.read().strip()
|
|||
|
|
if self.install_service not in ["bind", "pdns"]:
|
|||
|
|
try:
|
|||
|
|
os.remove(SERVICE_INSTALL_NAME)
|
|||
|
|
except:
|
|||
|
|
pass
|
|||
|
|
self.install_service = None
|
|||
|
|
|
|||
|
|
if os.path.exists(aaDNS_CONF):
|
|||
|
|
try:
|
|||
|
|
with open(aaDNS_CONF, "r") as f:
|
|||
|
|
content = f.read().strip()
|
|||
|
|
self.ns_server = json.loads(content) if content else None
|
|||
|
|
except:
|
|||
|
|
pass
|
|||
|
|
|
|||
|
|
@property
|
|||
|
|
def pdns_paths(self):
|
|||
|
|
if self.os_type == "ubuntu": # debian
|
|||
|
|
return {
|
|||
|
|
"config": "/etc/powerdns/pdns.conf",
|
|||
|
|
"zones": ZONES,
|
|||
|
|
"zone_dir": ZONES_DIR,
|
|||
|
|
"service_name": self.pnds_service_name,
|
|||
|
|
"package_name": "pdns-server",
|
|||
|
|
}
|
|||
|
|
else: # redhat, centos
|
|||
|
|
return {
|
|||
|
|
"config": "/etc/pdns/pdns.conf",
|
|||
|
|
"zones": ZONES,
|
|||
|
|
"zone_dir": ZONES_DIR,
|
|||
|
|
"service_name": self.pnds_service_name,
|
|||
|
|
"package_name": "bind-chroot" if self.os_type == "redhat" else "bind9",
|
|||
|
|
"main": "/var/named/chroot/etc/named.conf",
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
@property
|
|||
|
|
def bind_paths(self):
|
|||
|
|
return {
|
|||
|
|
"config": "/var/named/chroot/etc/named.conf",
|
|||
|
|
"zones": "/var/named/chroot/etc/named.conf.local",
|
|||
|
|
"zone_dir": ZONES_DIR,
|
|||
|
|
"service_name": self.bind_service_name,
|
|||
|
|
"package_name": "bind-chroot" if self.os_type == "redhat" else "bind9",
|
|||
|
|
"main": "/var/named/chroot/etc/named.conf",
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
@property
|
|||
|
|
def service_path(self):
|
|||
|
|
if self.install_service == "bind":
|
|||
|
|
return self.bind_paths
|
|||
|
|
elif self.install_service == "pdns":
|
|||
|
|
return self.pdns_paths
|
|||
|
|
else:
|
|||
|
|
return {}
|