async def delete_zone(self, nodeId): zone_name = validate_node_id(nodeId, "DNS_ZONE")[0] zone_info = await self.get_zone(zone_name) if zone_info is None: raise Exception("This zone doesn't exists.") r = await self.delete(f"/api/v1/servers/localhost/zones/{zone_name}") return 200 <= r.status < 300
async def update_zone(self, nodeId, soa): zone_name = validate_node_id(nodeId, "DNS_ZONE")[0] zone_info = await self.get_zone(zone_name) if zone_info is None: raise Exception("This zone doesn't exists.") await self.update_soa(zone_name, soa) return await self.get_zone(zone_name)
async def delete_middleware(self, nodeId): (name,) = validate_node_id(nodeId, "TRAEFIK_MW") middleware = await self.http_api.get_middleware(name) if middleware["provider"] != "redis": raise PMException("You can't delete this middleware") redis_name = name.split("@")[0] if "@" in name else name await self.delete_pattern(f"{self.root}/http/middlewares/{redis_name}/*") await asyncio.sleep(1)
async def delete_service(self, nodeId): protocol, name = validate_node_id(nodeId, "TRAEFIK_SERVICE") service = await self.http_api.get_service(protocol, name) if service["provider"] != "redis": raise PMException("You can't delete this service") redis_name = name.split("@")[0] if "@" in name else name await self.delete_pattern(f"{self.root}/{protocol}/services/{redis_name}/*") await asyncio.sleep(1)
async def enable_rule(self, nodeId, enabled): zone, name, type = validate_node_id(nodeId, "DNS_RULE") rule = await self.get_rule(zone, name, type) if rule is None: raise Exception("Rule not found") for record in rule["records"]: record["enabled"] = enabled return await self.rule_replace(zone, name, type, rule["ttl"], rule["records"])
async def delete_router(self, nodeId): protocol, name = validate_node_id(nodeId, "TRAEFIK_ROUTER") router = await self.http_api.get_router(protocol, name) if router["provider"] != "redis": raise PMException("You can't delete this router") redis_name = name.split("@")[0] await self.delete_pattern(f"{self.root}/{protocol}/routers/{redis_name}/*") await asyncio.sleep(1)
async def update_rule(self, nodeId, ttl, records): zone, name, type = validate_node_id(nodeId, "DNS_RULE") if type == "LUA": record = records[0] escaped_content = escape_lua(record["content"]) formated = f'A "{escaped_content}"' records = [{"content": formated, "enabled": record["enabled"]}] type = "LUA" return await self.rule_replace(zone, name, type, ttl, records)
async def update_middleware(self, nodeId, type_name, patch): (name, ) = validate_node_id(nodeId, "TRAEFIK_MW") middleware = await self.http_api.get_middleware(name) if middleware["provider"] != "redis": raise PMException("You can't edit this middleware") prefix = f"{self.root}/http/middlewares/{middleware['name'].split('@')[0]}/{type_name}" for key, option in patch.items(): await self.delete_pattern(f"{prefix}/{key}/*") await self.create_from_object({key: option}, prefix) await asyncio.sleep(1)
async def check_rule(self, nodeId): zone, name, type = validate_node_id(nodeId, "DNS_RULE") local_rule = await self.get_rule(zone, name, type) local_records = sorted( [r["content"] for r in local_rule["records"] if not r["disabled"]]) results = [{"name": "Local", "records": local_records}] for resolver_name, resolver_ip in PROPAGATION_RESOLVERS.items(): results.append({ "name": f"{resolver_name} ({resolver_ip})", "records": resolve_rule(name, type, resolver_ip) }) return results
async def update_rule(self, nodeId, ttl, records): from app.dns.rules import escape_lua zone, name, type = validate_node_id(nodeId, "DNS_RULE") if type == "LUA": old_rule = await self.get_rule(zone, name, type) real_type = old_rule["records"][0]["content"].split(" ")[0] record = records[0] escaped_content = escape_lua(record["content"]) formated = f'{real_type} "{escaped_content}"' records = [{"content": formated, "enabled": record["enabled"]}] type = "LUA" return await self.rule_replace(zone, name, type, ttl, records)
async def update_router(self, nodeId, patch): protocol, name = validate_node_id(nodeId, "TRAEFIK_ROUTER") router = await self.http_api.get_router(protocol, name) if router["provider"] != "redis": raise PMException("You can't edit this router") prefix = ( f"{self.root}/{router['protocol']}/routers/{router['name'].split('@')[0]}" ) for key, option in patch.items(): await self.delete_pattern(f"{prefix}/{key}/*") await self.create_from_object({key: option}, prefix) await asyncio.sleep(1)
async def delete_rule(self, nodeId): zone, name, type = validate_node_id(nodeId, "DNS_RULE") rrset = {"name": name, "type": type, "changetype": "DELETE"} r = await self.patch(f"/api/v1/servers/localhost/zones/{zone}", {"rrsets": [rrset]}) return 200 <= r.status < 300