diff --git a/mwhoisd b/mwhoisd index 0000000..6e21fcc 100755 --- a/mwhoisd +++ b/mwhoisd @@ -54,7 +54,7 @@ def isDomain(qr): if(len(qr.split(".")) == 1): return False zones = qr.split(".") - ac = re.compile("^[a-z0-9\.-]+\n") + ac = re.compile(r"^[a-z0-9\.-]+\n") for zone in zones: if(zone == ""): return False @@ -66,6 +66,13 @@ def isDomain(qr): return False return True +# Check if the input is a valid SCION AS identifier +def isAS(qr): + # Check if format matches SCION AS identifier (e.g., "2:2:0") + if re.match(r'^\d+:\d+:\d+$', qr): + return True + return False + # Check if an IP belongs to a CIDR IP block def isIPinCIDR(ip, network): return IPAddress(ip) in IPNetwork(network) @@ -76,14 +83,16 @@ while True: while True: query = con.recv(MAX_QUERY_SIZE) if not query: break - log = log + query.replace("\r\n", "").replace("\n", "") + " - " - query = sanitizeQuery(query) + # Decode bytes to string + query_str = query.decode('utf-8', errors='ignore') + log = log + query_str.replace("\r\n", "").replace("\n", "") + " - " + query = sanitizeQuery(query_str) rsp = "# +-----------------------------------+" + n - rsp = rsp + "# | DaKnObNET |" + n + rsp = rsp + "# | AXPO SYSTEMS AG |" + n rsp = rsp + "# +-----------------------------------+" + n rsp = rsp + "# | This query was served by mwhois |" + n rsp = rsp + "# +-----------------------------------+" + n rsp = rsp + n if(isIP(query)): @@ -115,13 +124,27 @@ while True: rsp = rsp + n rsp = rsp + "# Domain name was not found in the whois database" + n log = log + " (Not found)" + n + elif(isAS(query)): + # WHOIS SCION AS + log = log + "SCION AS" + n + + if os.path.exists("db/as/" + query): + dd = open("db/as/" + query, "r") + rsp = rsp + dd.read() + dd.close() + found = True + log = log + n + else: + rsp = rsp + n + rsp = rsp + "# SCION AS was not found in the whois database" + n + log = log + " (Not found)" + n else: # Unrecognized log = log + "Unrecognized" + n rsp = rsp + n - rsp = rsp + "# Error. Unknown query type. Query is not IPv4 or Domain" + n - con.send(rsp) + rsp = rsp + "# Error. Unknown query type. Query is not IPv4, Domain or SCION AS" + n + # Encode string to bytes before sending + con.send(rsp.encode('utf-8')) con.close() if(LOGFILE!=""): # Save to logs diff --git a/add-as b/add-as new file mode 100755 index 0000000..05f0df7 --- /dev/null +++ b/add-as @@ -0,0 +1,38 @@ +#!/usr/bin/python + +# Use this file to add SCION AS entries to the whois database + +import os +import json + +# Ensure the AS database directory exists +os.system("mkdir -p db/as") + +as_id = input("Enter SCION AS Identifier (format ISD:AS:Instance, e.g. 2:2:0): ") + +# Validate AS ID format +import re +if not re.match(r'^\d+:\d+:\d+$', as_id): + print("Invalid SCION AS Identifier format. Expected format: ISD:AS:Instance (e.g. 2:2:0)") + exit(1) + +# Get AS details +isd = input("Enter ISD: ") +as_decimal = input("Enter AS decimal value: ") +organization = input("Enter Organization: ") +country = input("Enter Country Code: ") +status = input("Enter Status (ASSIGNED/ALLOCATED): ") +description = input("Enter Description: ") +contact = input("Enter Contact Email: ") +date_allocated = input("Enter Date Allocated (YYYY-MM-DD): ") + +# Prepare AS data +n = "\r\n" +body = "% SCION AS WHOIS Information" + n + n +body += "AS Identifier: " + as_id + n +body += "ISD: " + isd + n +body += "AS decimal: " + as_decimal + n +body += "Organization: " + organization + n +body += "Country: " + country + n +body += "Status: " + status + n +body += "Description: " + description + n +body += "Contact: " + contact + n +body += "DateAllocated: " + date_allocated + n + +# Save to file +d = open("db/as/" + as_id, "w+") +d.write(body) +d.close() +print("Done! SCION AS record added successfully.")