| Current Path : /opt/cpanel/ |
| Current File : //opt/cpanel/updatedns.py |
#!/usr/bin/env python3
import socket
import ssl
import struct
import uuid
# ----- Config -----
EPP_HOST = "epp.zarc.net.za"
EPP_PORT = 700
EPP_USER = "enetworks"
EPP_PASS = "36ancerg9a2"
NS_SERVERS = [
{"host": "ns1.enetworks.co.za", "ip": "102.164.121.121"},
{"host": "ns2.enetworks.net", "ip": "45.220.159.159"}
]
# ----- EPP Helpers -----
def frame(xml_string):
xml_bytes = xml_string.encode("utf-8")
return struct.pack("!I", len(xml_bytes) + 4) + xml_bytes
def read_response(sock):
header = sock.recv(4)
if not header:
return None
total_length = struct.unpack("!I", header)[0]
data = b""
while len(data) < total_length - 4:
chunk = sock.recv(total_length - 4 - len(data))
if not chunk:
break
data += chunk
return data.decode("utf-8")
def build_login_xml():
return f"""<?xml version="1.0" encoding="UTF-8"?>
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
<command>
<login>
<clID>{EPP_USER}</clID>
<pw>{EPP_PASS}</pw>
<options>
<version>1.0</version>
<lang>en</lang>
</options>
<svcs>
<objURI>urn:ietf:params:xml:ns:domain-1.0</objURI>
<objURI>urn:ietf:params:xml:ns:contact-1.0</objURI>
<objURI>http://co.za/epp/extensions/cozadomain-1-0</objURI>
<objURI>http://co.za/epp/extensions/cozacontact-1-0</objURI>
</svcs>
</login>
<clTRID>{uuid.uuid4()}</clTRID>
</command>
</epp>"""
def build_update_ns_xml(domain):
add_ns_xml = ""
for ns in NS_SERVERS:
add_ns_xml += f"""
<domain:hostAttr>
<domain:hostName>{ns['host']}</domain:hostName>
</domain:hostAttr>"""
return f"""<?xml version="1.0" encoding="UTF-8"?>
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
<command>
<update>
<domain:update xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
<domain:name>{domain}</domain:name>
<domain:add>
<domain:ns>{add_ns_xml}
</domain:ns>
</domain:add>
</domain:update>
</update>
<clTRID>{uuid.uuid4()}</clTRID>
</command>
</epp>"""
# ----- Main -----
def main():
import sys
if len(sys.argv) < 2:
print("Usage: python zarc_update_dns.py <domain.co.za>")
return
domain = sys.argv[1]
context = ssl.create_default_context()
with socket.create_connection((EPP_HOST, EPP_PORT)) as tcp_sock:
with context.wrap_socket(tcp_sock, server_hostname=EPP_HOST) as epp_sock:
print("[+] Connected to ZARC via TLS")
# Greeting
greeting = read_response(epp_sock)
print("[i] Greeting:\n", greeting)
# Login
print("[*] Logging in...")
epp_sock.sendall(frame(build_login_xml()))
login_response = read_response(epp_sock)
print("[i] Login Response:\n", login_response)
# Update NS
print(f"[*] Updating nameservers for {domain}...")
update_xml = build_update_ns_xml(domain)
epp_sock.sendall(frame(update_xml))
update_response = read_response(epp_sock)
print("[+] Update Response:\n", update_response)
if __name__ == "__main__":
main()