|
|
@@ -894,28 +894,36 @@ def api_cluster_adblock():
|
|
|
@app.route('/api/v1/cluster/zone', methods=['POST'])
|
|
|
@api_required
|
|
|
def api_add_slave():
|
|
|
- data = request.json
|
|
|
+ data = request.get_json(force=True, silent=True) or {}
|
|
|
if not data or 'domain' not in data:
|
|
|
return jsonify({"status": "error", "message": "Missing parameters"}), 400
|
|
|
|
|
|
domain = re.sub(r'[^a-zA-Z0-9\.\-\/]', '', data['domain']).replace('../', '')
|
|
|
- master_ip = request.headers.get('X-Forwarded-For', request.remote_addr).split(',')[0].strip()
|
|
|
|
|
|
- conf = fm.read_file(config.LOCAL_CONF)
|
|
|
+ # --- Η ΝΕΑ ΛΟΓΙΚΗ ---
|
|
|
+ # 1. Αν ο Master μας έστειλε λίστα, τη χρησιμοποιούμε αυτούσια
|
|
|
+ if data.get('masters'):
|
|
|
+ masters_list = data['masters']
|
|
|
+ else:
|
|
|
+ # 2. Fallback στην IP αυτού που μας κάλεσε (αν δεν στάλθηκαν IPs)
|
|
|
+ master_ip = request.headers.get('X-Forwarded-For', request.remote_addr).split(',')[0].strip()
|
|
|
+ masters_list = [master_ip]
|
|
|
|
|
|
- # ΠΡΟΣΤΑΣΙΑ: Αν η ζώνη υπάρχει ήδη, ΔΕΝ την πειράζουμε καθόλου. Κρατάει τον Master που είχε!
|
|
|
+ # Μετατροπή της λίστας σε string για το BIND config (π.χ. "1.1.1.1; 2.2.2.2;")
|
|
|
+ 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": "error", "message": "Zone already exists"}), 409
|
|
|
|
|
|
path = os.path.join(config.CACHE_PATH, f"db.{domain}")
|
|
|
- conf += f'\nzone "{domain}" {{\n type slave;\n file "{path}";\n masters {{ {master_ip}; }};\n masterfile-format text;\n}};\n'
|
|
|
+ conf += 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)
|
|
|
subprocess.run(["rndc", "reconfig"])
|
|
|
- fm.log_audit("API_SYNC", domain, f"Auto-created as Slave (Master Auto-Detected: {master_ip})")
|
|
|
+ fm.log_audit("API_SYNC", domain, f"Auto-created Slave (Masters: {masters_string})")
|
|
|
|
|
|
- # ΑΦΑΙΡΕΘΗΚΕ ΤΟ AUTO-LINKING! Ο κώδικας δεν πειράζει πια τα settings του Slave.
|
|
|
- return jsonify({"status": "success", "message": f"Slave zone {domain} configured."})
|
|
|
+ return jsonify({"status": "success", "message": f"Slave zone {domain} configured with masters: {masters_string}"})
|
|
|
|
|
|
@app.route('/api/v1/cluster/zone/<domain>', methods=['DELETE'])
|
|
|
@api_required
|