|
|
@@ -891,20 +891,16 @@ def api_cluster_adblock():
|
|
|
subprocess.run(["systemctl", "restart", config.BIND_SERVICE])
|
|
|
return jsonify({"status": "success", "message": "RPZ synced on slave."})
|
|
|
|
|
|
-# Στο app.py του SLAVE
|
|
|
@app.route('/api/v1/cluster/zone', methods=['POST'])
|
|
|
@api_required
|
|
|
def api_add_slave():
|
|
|
- # force=True για να διαβάσει το JSON ακόμα κι αν το content-type λείπει
|
|
|
data = request.get_json(force=True, silent=True) or {}
|
|
|
domain = data.get('domain')
|
|
|
if not domain:
|
|
|
return jsonify({"status": "error", "message": "No domain provided"}), 400
|
|
|
|
|
|
- # Καθαρισμός domain
|
|
|
domain = re.sub(r'[^a-zA-Z0-9\.\-\/]', '', domain).replace('../', '')
|
|
|
|
|
|
- # Λήψη των Masters (είτε από το payload είτε από την IP του Master)
|
|
|
masters_list = data.get('masters', [])
|
|
|
if not masters_list:
|
|
|
master_ip = request.headers.get('X-Forwarded-For', request.remote_addr).split(',')[0].strip()
|
|
|
@@ -913,16 +909,25 @@ def api_add_slave():
|
|
|
masters_string = "".join([f" {ip};" for ip in masters_list])
|
|
|
|
|
|
conf = fm.read_file(config.LOCAL_CONF)
|
|
|
- # Αν υπάρχει ήδη, δεν την ξαναφτιάχνουμε
|
|
|
- if f'zone "{domain}"' in conf:
|
|
|
- return jsonify({"status": "success", "message": "Already exists"}), 200
|
|
|
+
|
|
|
+ # --- OVERWRITE LOGIC ---
|
|
|
+ # Αν η ζώνη υπάρχει, βρίσκουμε το παλιό block και το αφαιρούμε
|
|
|
+ old_block = dns.get_zone_block(conf, domain)
|
|
|
+ if old_block:
|
|
|
+ conf = conf.replace(old_block, "")
|
|
|
+ message = f"Zone {domain} overwritten"
|
|
|
+ else:
|
|
|
+ message = f"Zone {domain} added"
|
|
|
+ # -----------------------
|
|
|
|
|
|
path = os.path.join(config.CACHE_PATH, f"db.{domain}")
|
|
|
new_zone = f'\nzone "{domain}" {{\n type slave;\n file "{path}";\n masters {{{masters_string} }};\n masterfile-format text;\n}};\n'
|
|
|
|
|
|
- fm.write_file(config.LOCAL_CONF, conf + new_zone)
|
|
|
+ # Γράφουμε το καθαρό config (χωρίς το παλιό block) + τη νέα ζώνη
|
|
|
+ fm.write_file(config.LOCAL_CONF, (conf.strip() + "\n" + new_zone).strip() + "\n")
|
|
|
+
|
|
|
subprocess.run(["rndc", "reconfig"])
|
|
|
- return jsonify({"status": "success", "message": f"Zone {domain} added"})
|
|
|
+ return jsonify({"status": "success", "message": message})
|
|
|
|
|
|
@app.route('/api/v1/cluster/zone/<domain>', methods=['DELETE'])
|
|
|
@api_required
|