69 lines
2.3 KiB
Python
69 lines
2.3 KiB
Python
import configparser
|
|
import requests
|
|
|
|
|
|
def reverse_ip_to_standard(reverse_ip):
|
|
parts = reverse_ip.split(".")
|
|
parts = parts[:4]
|
|
standard_ip = ".".join(reversed(parts))
|
|
|
|
return standard_ip
|
|
|
|
|
|
class HetznerBackend:
|
|
def __init__(self, config_file='config.ini'):
|
|
self.config_file = config_file
|
|
self.username = None
|
|
self.password = None
|
|
|
|
self.load_credentials()
|
|
|
|
def load_credentials(self):
|
|
config = configparser.ConfigParser()
|
|
config.read(self.config_file)
|
|
|
|
if "Hetzner" not in config:
|
|
raise ValueError("Hetzner section not found in config.ini")
|
|
|
|
self.username = config["Hetzner"].get("username")
|
|
self.password = config["Hetzner"].get("password")
|
|
|
|
if not self.username or not self.password:
|
|
raise ValueError("Hetzner username or password not provided in config.ini")
|
|
|
|
def update_record(self, reverse_ip, record):
|
|
ip = reverse_ip_to_standard(reverse_ip)
|
|
|
|
# Check if the record contains the necessary data
|
|
if not record or "content" not in record[0]:
|
|
print("Invalid record data. 'content' field is missing.")
|
|
return None
|
|
|
|
domain = record[0]["content"].strip(".")
|
|
|
|
data = {"ptr": domain}
|
|
response = requests.post(f"https://robot-ws.your-server.de/rdns/{ip}",
|
|
data=data, auth=(self.username, self.password))
|
|
|
|
if response.status_code == 200:
|
|
print("Updated RDNS record for: " + ip + " to: " + record[0]["content"])
|
|
return response.json()
|
|
else:
|
|
print(f"Failed to fetch rDNS data. Status code: {response.status_code}")
|
|
return None
|
|
|
|
def create_record(self, reverse_ip, record):
|
|
# Hetzner's API treats creation and updates the same way so just call update_record instead
|
|
self.update_record(reverse_ip, record)
|
|
pass
|
|
|
|
def delete_record(self, reverse_ip):
|
|
ip = reverse_ip_to_standard(reverse_ip)
|
|
response = requests.delete(f"https://robot-ws.your-server.de/rdns/{ip}", auth=(self.username, self.password))
|
|
|
|
if response.status_code == 200:
|
|
print("Deleted RDNS record for: " + ip)
|
|
else:
|
|
print(f"Failed to delete rDNS record. Status code: {response.status_code}")
|
|
return None
|