Advertisement
Guest User

Untitled

a guest
May 2nd, 2017
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.68 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. from socket import socket, AF_INET, SOCK_STREAM
  5. from time import localtime, asctime, time, sleep
  6. import MySQLdb as db
  7. from os import popen, path, setuid, setgid
  8. from Queue import Queue
  9. import codecs
  10. import threading
  11.  
  12.  
  13. HOST = ''
  14. PORT = 79
  15. LOGFILE = "/var/log/fingerd.log"
  16. DBHOST = "localhost"
  17. DBNAME = "geeky"
  18. DBUSER = "fingerd"
  19. DBPASS = "G3tInf0s4b0utMyS3lf"
  20. DEFAULT = "__default__"
  21. COMPUTER = "__computer__"
  22. SPLITINFOS = "---"
  23. PLANPATH = "/Users/planfiles"
  24. THREADS = 5
  25. QUERY = 1
  26. ANSWER = 2
  27.  
  28.            
  29. def debug(msg):
  30.     if msg:
  31.         print msg,
  32.  
  33. def openFiles():
  34.     fileDict = {}
  35.     fileDict['LOG'] = codecs.open(LOGFILE, encoding='utf-8', mode='a')
  36.     planFilesProc = popen("ls -1 %s" % PLANPATH)
  37.     for i in planFilesProc.readlines():
  38.         fileDict[i.strip()] = codecs.open("%s/%s" % (PLANPATH, i.strip()), encoding='utf-8', mode='r')
  39.    
  40.     return fileDict
  41.  
  42. def closeFiles(files):
  43.     for file in files.values():
  44.         file.close()
  45.        
  46. def log(file, msg):
  47.     entry = "[%s] %s\n" % (asctime(localtime()) , msg)
  48.     try:
  49.         file.write(entry)
  50.     except:
  51.         pass
  52.     finally:
  53.         debug(entry)
  54.    
  55. def sanitize(q):
  56.     s = q.replace("_",
  57.                     "\_")
  58.     s = s.replace("%",
  59.                     "\%")
  60.     s = s.replace('"',
  61.                     '\"')
  62.     s = s.replace("'",
  63.                     "\'")
  64.     return s
  65.    
  66. def dbGet(query):
  67.     conn = db.connect(host = DBHOST,
  68.                       user = DBUSER,
  69.                       passwd = DBPASS,
  70.                       db = DBNAME )
  71.    
  72.     cursor = conn.cursor()
  73.     if query == "":
  74.         query="__computer__"
  75.    
  76.     q = sanitize(query)
  77.    
  78.     sqlq = "SELECT * FROM fingerd WHERE query = '%s'" % ((q))
  79.     try:
  80.         cursor.execute(sqlq)
  81.         if cursor.rowcount == 0:
  82.             sqlq = "SELECT * FROM fingerd WHERE query LIKE '%s%%'" % ((q))
  83.             cursor.execute(sqlq)
  84.         else:
  85.             row = cursor.fetchone()
  86.             return row[ANSWER]
  87.            
  88.     except:
  89.         return dbGet(DEFAULT)
  90.    
  91.     if cursor.rowcount == 0:
  92.         return dbGet(DEFAULT)
  93.     elif cursor.rowcount == 1:
  94.         row = cursor.fetchone()
  95.         return row[ANSWER]
  96.     elif cursor.rowcount > 1:
  97.         rows = cursor.fetchall()
  98.         ambiguous = "\"%s\" is ambiguous : \r\n" % (query)
  99.         for row in rows:
  100.             ambiguous += "\t%s \r\n" % (row[QUERY])
  101.        
  102.         return ambiguous
  103.        
  104. def planGet(query, files):
  105.     for user in files.keys():
  106.         if user.startswith(query):
  107.             plan = files[user].read()
  108.             files[user].seek(0)
  109.             return plan
  110.         else:
  111.             return "No plan"
  112.            
  113. def treat(conn, addr):
  114.     error = False
  115.     answer = ""
  116.     if not addr :
  117.         data = "Port Scan"
  118.         error = True
  119.     else:
  120.         try:
  121.             data = conn.recv(512).decode("utf-8").lower()
  122.         except:
  123.             data = "Port scan"
  124.             error = True
  125.  
  126.         if not data:
  127.             data = "Port scan"
  128.             error = True
  129.  
  130.         if len(data) > 40:
  131.             data = "Overflow Try"            
  132.             error = True
  133.            
  134.         if error :
  135.             conn.close()
  136.             endLoop = True
  137.            
  138.         else:
  139.             data=data.strip()
  140.             log(files['LOG'], "%s -> %s" % (addr[0], data))
  141.            
  142.             answer = dbGet(data)
  143.             if answer:
  144.                 answer+= "%s\n" % (SPLITINFOS)
  145.             else:
  146.                 answer = ""
  147.            
  148.             answer+= planGet(data, files)
  149.            
  150.             if not answer:
  151.                 answer=dbGet(DEFAULT)
  152.         if answer:
  153.             endloop = True
  154.  
  155.     if not error:
  156.        conn.sendall("%s\r\n" % (answer))
  157.     conn.close()
  158.  
  159.    
  160.  
  161. class Server(threading.Thread):
  162.    
  163.     def __init__(self, recvqueue):
  164.         self.__recvqueue = recvqueue
  165.         threading.Thread.__init__(self)
  166.        
  167.     def run(self):
  168.         while 1:
  169.                 # receive and treat
  170.             item = self.__recvqueue.get()
  171.             if item != None:
  172.                 conn, addr = item
  173.                 treat(conn, addr)
  174.             else:
  175.                 # wait
  176.                 sleep(THREADS)
  177.                
  178.  
  179.  
  180. ##############################################################################
  181. #
  182.  
  183. s = socket(AF_INET, SOCK_STREAM)
  184. s.bind((HOST, PORT))
  185. s.listen(THREADS)
  186. files = openFiles()
  187.  
  188. setgid(42)
  189. setuid(42)
  190.  
  191. recvQueue = Queue(THREADS)
  192.  
  193. for i in xrange(THREADS):
  194.     Server(recvQueue).start()
  195.     sleep(1)
  196.    
  197. while True:
  198.     recvQueue.put( s.accept() )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement