feat: make BIND paths configurable via env vars (RHEL/CentOS support)
默认路径仍为 Debian/Ubuntu 的 /etc/bind/*。通过环境变量可在 RHEL/CentOS (默认 /var/named + /etc/named.conf)上运行: BIND_CONF_DIR, BIND_ZONES_DIR, BIND_CONF_LOCAL, BIND_CONF_OPTIONS, BIND_RNDC_KEY, BIND_SERVICE README 增加 RHEL/CentOS 安装步骤、systemd Environment 示例, 并提示覆盖 BIND_CONF_LOCAL 后必须在 named.conf 里 include。 Motivation: 同一项目在 CentOS 7 上 zone 文件写不到 /var/named, Web 端新增域名后 rndc reload 找不到 zone。
This commit is contained in:
@@ -27,12 +27,16 @@ app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
|
||||
db = SQLAlchemy(app)
|
||||
|
||||
# ─── BIND paths ───
|
||||
BIND_CONF_DIR = "/etc/bind"
|
||||
BIND_ZONES_DIR = "/etc/bind/zones"
|
||||
BIND_CONF_LOCAL = "/etc/bind/named.conf.local"
|
||||
BIND_CONF_OPTIONS = "/etc/bind/named.conf.options"
|
||||
BIND_RNDC_KEY = "/etc/bind/rndc.key"
|
||||
BIND_SERVICE = "named"
|
||||
# Defaults are Debian/Ubuntu (bind9). Override via env on RHEL/CentOS/Rocky:
|
||||
# BIND_CONF_DIR=/etc BIND_CONF_LOCAL=/etc/named.conf
|
||||
# BIND_ZONES_DIR=/var/named BIND_CONF_OPTIONS=/etc/named.conf.options
|
||||
# BIND_RNDC_KEY=/etc/rndc.key
|
||||
BIND_CONF_DIR = os.environ.get("BIND_CONF_DIR", "/etc/bind")
|
||||
BIND_ZONES_DIR = os.environ.get("BIND_ZONES_DIR", "/etc/bind/zones")
|
||||
BIND_CONF_LOCAL = os.environ.get("BIND_CONF_LOCAL", "/etc/bind/named.conf.local")
|
||||
BIND_CONF_OPTIONS = os.environ.get("BIND_CONF_OPTIONS", "/etc/bind/named.conf.options")
|
||||
BIND_RNDC_KEY = os.environ.get("BIND_RNDC_KEY", "/etc/bind/rndc.key")
|
||||
BIND_SERVICE = os.environ.get("BIND_SERVICE", "named")
|
||||
|
||||
# ─── Record types ───
|
||||
RECORD_TYPES = ["A", "AAAA", "CNAME", "MX", "TXT", "NS", "PTR", "SRV", "CAA", "SOA"]
|
||||
@@ -890,17 +894,17 @@ def record_delete(zone_name, idx):
|
||||
def service_control(action):
|
||||
u = current_user()
|
||||
if action == "start":
|
||||
rc, out, err = run_cmd("systemctl start named 2>&1")
|
||||
rc, out, err = run_cmd("systemctl start named")
|
||||
AuditLog.log(u.username, "启动BIND服务")
|
||||
msg = "BIND 服务已启动" if rc == 0 else f"启动失败: {err}"
|
||||
msg = "BIND 服务已启动" if rc == 0 else f"启动失败: {out} {err}"
|
||||
elif action == "stop":
|
||||
rc, out, err = run_cmd("systemctl stop named 2>&1")
|
||||
rc, out, err = run_cmd("systemctl stop named")
|
||||
AuditLog.log(u.username, "停止BIND服务")
|
||||
msg = "BIND 服务已停止" if rc == 0 else f"停止失败: {err}"
|
||||
msg = "BIND 服务已停止" if rc == 0 else f"停止失败: {out} {err}"
|
||||
elif action == "restart":
|
||||
rc, out, err = run_cmd("systemctl restart named 2>&1")
|
||||
rc, out, err = run_cmd("systemctl restart named")
|
||||
AuditLog.log(u.username, "重启BIND服务")
|
||||
msg = "BIND 服务已重启" if rc == 0 else f"重启失败: {err}"
|
||||
msg = "BIND 服务已重启" if rc == 0 else f"重启失败: {out} {err}"
|
||||
elif action == "reload":
|
||||
ok, msg = bind_reload()
|
||||
AuditLog.log(u.username, "重载BIND配置")
|
||||
@@ -934,7 +938,7 @@ def config_view():
|
||||
main_content = ""
|
||||
|
||||
# Check config
|
||||
rc, out, err = run_cmd("named-checkconf 2>&1")
|
||||
rc, out, err = run_cmd("named-checkconf")
|
||||
config_ok = rc == 0
|
||||
config_msg = out + err
|
||||
|
||||
@@ -956,11 +960,11 @@ def config_options_save():
|
||||
# Write to temp and validate
|
||||
with open("/tmp/named_check.tmp", 'w') as f:
|
||||
f.write(content)
|
||||
rc, out, err = run_cmd("named-checkconf /tmp/named_check.tmp 2>&1")
|
||||
rc, out, err = run_cmd("named-checkconf /tmp/named_check.tmp")
|
||||
run_cmd("rm -f /tmp/named_check.tmp")
|
||||
|
||||
if rc != 0:
|
||||
flash(f"配置验证失败: {err}", "error")
|
||||
flash(f"配置验证失败: {out} {err}", "error")
|
||||
return redirect(url_for("config_view"))
|
||||
|
||||
with open(BIND_CONF_OPTIONS, 'w') as f:
|
||||
@@ -986,10 +990,10 @@ def config_local_save():
|
||||
f.write(content)
|
||||
run_cmd(f"chown root:bind {BIND_CONF_LOCAL}")
|
||||
|
||||
rc, out, err = run_cmd("named-checkconf 2>&1")
|
||||
rc, out, err = run_cmd("named-checkconf")
|
||||
if rc != 0:
|
||||
run_cmd(f"cp {backup} {BIND_CONF_LOCAL}")
|
||||
flash(f"配置验证失败,已恢复: {err}", "error")
|
||||
flash(f"配置验证失败,已恢复: {out} {err}", "error")
|
||||
return redirect(url_for("config_view"))
|
||||
|
||||
bind_reload()
|
||||
|
||||
Reference in New Issue
Block a user