105 lines
3.4 KiB
Python
105 lines
3.4 KiB
Python
"""
|
|
Handles API login and logout stuff
|
|
"""
|
|
import yaml
|
|
import requests
|
|
|
|
|
|
def get_iway_token(config_path="iway-certbot-dns-auth.yml"):
|
|
"""
|
|
Reads the config file, authenticates with iway, and returns the token.
|
|
"""
|
|
url = "https://backend.login.iway.ch/api/login"
|
|
# Using a session ensures we capture the cookies sent by the server
|
|
session = requests.Session()
|
|
try:
|
|
with open(config_path, "r", encoding="utf-8") as file:
|
|
config = yaml.safe_load(file)
|
|
payload = {
|
|
"username": config["account"]["username"],
|
|
"password": config["account"]["password"],
|
|
}
|
|
headers = {
|
|
"Content-Type": "application/json",
|
|
}
|
|
response = session.post(url,headers=headers, json=payload, timeout=3)
|
|
response.raise_for_status()
|
|
data = response.json()
|
|
auth_token = data.get("token")
|
|
# Extract the csrftoken from the session cookies
|
|
csrf_token = session.cookies.get("csrftoken")
|
|
return auth_token, csrf_token
|
|
# print(f"Login successful! Token: {token}")
|
|
except FileNotFoundError:
|
|
print(f"Error: Configuration file '{config_path}' not found.")
|
|
except (requests.exceptions.RequestException, KeyError) as e:
|
|
print(f"Authentication failed: {e}")
|
|
|
|
return None, None
|
|
|
|
def logout_iway_token(auth_token, csrf_token):
|
|
"""
|
|
Reads the config file, authenticates with iway, and returns the token.
|
|
"""
|
|
url = "https://backend.login.iway.ch/api/logout"
|
|
try:
|
|
headers = {
|
|
"Content-Type": "application/json",
|
|
"Authorization": f"Bearer {auth_token}",
|
|
"X-CSRFToken": csrf_token,
|
|
}
|
|
cookies = {"csrftoken": csrf_token}
|
|
response = requests.post(url, headers=headers, cookies=cookies, timeout=3)
|
|
response.raise_for_status()
|
|
data = response.json()
|
|
return data.get("detail")
|
|
except (requests.exceptions.RequestException, KeyError) as e:
|
|
print(f"Authentication failed: {e}")
|
|
except() as e:
|
|
print(e)
|
|
|
|
return None
|
|
|
|
|
|
def update_dns_record(domain, record_name, record_type, new_content, auth_token, csrf_token):
|
|
"""
|
|
Updates a specific RRSet in the iWay DNS forward zone.
|
|
"""
|
|
url = f"https://backend.login.iway.ch/api/services/dns/forward/{domain}"
|
|
|
|
headers = {
|
|
"Content-Type": "application/json",
|
|
"Authorization": auth_token, # Use f"Bearer {auth_token}" if the API requires it
|
|
"X-CSRFToken": csrf_token
|
|
}
|
|
|
|
cookies = {"csrftoken": csrf_token}
|
|
|
|
# The payload structure for updating an RRSet
|
|
payload = {
|
|
"rrsets": [
|
|
{
|
|
"name": record_name,
|
|
"type": record_type,
|
|
"ttl": 600,
|
|
"changetype": "REPLACE",
|
|
"records": [
|
|
{
|
|
"content": new_content,
|
|
"disabled": False
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
try:
|
|
# We use PATCH to update specific items in the rrsets list
|
|
response = requests.patch(url, json=payload, headers=headers, cookies=cookies, timeout=30)
|
|
response.raise_for_status()
|
|
return True
|
|
except requests.exceptions.RequestException as e:
|
|
print(f"Failed to update DNS: {e}")
|
|
if hasattr(e, 'response') and e.response is not None:
|
|
print(f"Response: {e.response.text}")
|
|
return False
|