108 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
#!/usr/bin/env python3
 | 
						|
# -*- coding: utf-8 -*-
 | 
						|
# This file is part of dnmgmt, a number resource management system
 | 
						|
# Licensed under GNU General Public License v3 or later
 | 
						|
# Written by Sebastian Lohff (seba@someserver.de)
 | 
						|
 | 
						|
import argparse
 | 
						|
import socketserver
 | 
						|
import os
 | 
						|
import sys
 | 
						|
import django
 | 
						|
import logging
 | 
						|
import select
 | 
						|
 | 
						|
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dnmgmt.settings")
 | 
						|
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 | 
						|
sys.path.append(BASE_DIR)
 | 
						|
django.setup()
 | 
						|
 | 
						|
from whoisdb.helpers import findInDatabase, getWhoisObjectFields
 | 
						|
 | 
						|
log = logging.getLogger("whoisd")
 | 
						|
 | 
						|
__VERSION__ = '0.1'
 | 
						|
 | 
						|
class WhoisHandler(socketserver.BaseRequestHandler):
 | 
						|
    header = "% This is the DARKNET database query service.\n" \
 | 
						|
            "% The objects should be in something like RPSL format.\n" \
 | 
						|
            "%\n" \
 | 
						|
            "% The DARKNET database is subject to terms and conditions.\n" \
 | 
						|
            "% Mostly these are \"be nice\" and \"don't knowingly break things\".\n" \
 | 
						|
            "\n"
 | 
						|
 | 
						|
    def handle(self):
 | 
						|
        self.request.sendall(self.header.encode())
 | 
						|
        line = self.request.recv(1024)
 | 
						|
        line = line.split(b"\n", 2)[0].strip()
 | 
						|
        print("Request object is %s" % line)
 | 
						|
        log.info("Request by %s for %s" % (self.request.getpeername()[0], line))
 | 
						|
        self.request.send(b"\n")
 | 
						|
 | 
						|
        objs = findInDatabase(line.decode())
 | 
						|
        if len(objs) > 0:
 | 
						|
            self.request.sendall(("%% %d result%s\n" % (len(objs), "" if len(objs)==1 else "s")).encode())
 | 
						|
            for obj in objs:
 | 
						|
                self.sendObject(obj)
 | 
						|
        else:
 | 
						|
            self.request.sendall(b"%% NOT FOUND\n\n")
 | 
						|
 | 
						|
    def sendObject(self, obj):
 | 
						|
        result = [
 | 
						|
            "",
 | 
						|
            "%% Object %s (%s)" % (obj, obj.getClassName()),
 | 
						|
            ""
 | 
						|
        ]
 | 
						|
 | 
						|
        for field, value in getWhoisObjectFields(obj, False):
 | 
						|
            fieldName = field.lower().replace(" ", "-") + ":"
 | 
						|
            if not value:
 | 
						|
                value = ""
 | 
						|
 | 
						|
            if hasattr(value, "through"):
 | 
						|
                for v in value.all():
 | 
						|
                    result.append("%-16s %s" % (fieldName, v))
 | 
						|
            else:
 | 
						|
                result.append("%-16s %s" % (fieldName, value))
 | 
						|
        result.extend(["", ""])
 | 
						|
 | 
						|
        self.request.sendall("\n".join(result).encode())
 | 
						|
 | 
						|
class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
 | 
						|
    allow_reuse_address = True
 | 
						|
 | 
						|
 | 
						|
def _parser():
 | 
						|
    parser = argparse.ArgumentParser(
 | 
						|
                 #prog='foo',
 | 
						|
                 #description='do some awesome foo',
 | 
						|
    )
 | 
						|
 | 
						|
    parser.add_argument("-p", "--port", default=43, type=int, help="whoisd port")
 | 
						|
    #parser.add_argument("-v", "--verbose", default=False, action="store_true", help="Be more verbose")
 | 
						|
 | 
						|
    parser.add_argument("--version", action="version", version="%(prog)s " + __VERSION__)
 | 
						|
 | 
						|
    return parser
 | 
						|
 | 
						|
def main():
 | 
						|
    parser = _parser()
 | 
						|
    args = parser.parse_args()
 | 
						|
 | 
						|
    server = ThreadedTCPServer(('', args.port), WhoisHandler)
 | 
						|
 | 
						|
    while True:
 | 
						|
        try:
 | 
						|
            server.serve_forever()
 | 
						|
        except select.error as e:
 | 
						|
            log.exception(e)
 | 
						|
        except KeyboardInterrupt:
 | 
						|
            log.info("^c hit, quitting.")
 | 
						|
            break
 | 
						|
 | 
						|
    server.server_close()
 | 
						|
 | 
						|
 | 
						|
if __name__ == '__main__':
 | 
						|
    main()
 |