소스 검색

Bind DNS Server Management

root 6 달 전
부모
커밋
600235ef93
1개의 변경된 파일과 14개의 추가작업 그리고 9개의 파일을 삭제
  1. 14 9
      app.py

+ 14 - 9
app.py

@@ -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