97 lines
2.3 KiB
Python
Executable File
97 lines
2.3 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# Note We're doing this using uscpi-tcp for inital testing
|
|
# We'll add the socket stuff later
|
|
import sqlite3
|
|
import os
|
|
import random
|
|
import pickle
|
|
import sys
|
|
import logging
|
|
import subprocess
|
|
import os.path
|
|
from settings import *
|
|
DYN_TYPE = 76
|
|
BANNER_TYPE = 11
|
|
PLAINTEXT_TYPE = 255
|
|
CRLF = '\r\n'
|
|
|
|
|
|
def eat_pickle(sP):
|
|
|
|
cmd = pickle.loads(sP)
|
|
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
|
|
return p.stdout.read().decode("ascii")
|
|
|
|
|
|
os.chdir(BASEDIR)
|
|
dbcon = None
|
|
try:
|
|
dbcon = sqlite3.connect(DBNAME)
|
|
except Exception as e:
|
|
sys.stdout.write(str(e))
|
|
|
|
|
|
def banner_query():
|
|
|
|
from random import choice
|
|
sqls = "SELECT data FROM lusers WHERE type=?"
|
|
cur = dbcon.cursor()
|
|
cur.execute(sqls, [BANNER_TYPE])
|
|
bList = cur.fetchall()
|
|
b = choice(bList)
|
|
return b[0] + CRLF
|
|
|
|
def parse_and_query(uname):
|
|
|
|
rv = "No such entity\r\n"
|
|
if uname == '':
|
|
banner_query()
|
|
else:
|
|
sqls = "SELECT type, data FROM lusers WHERE unix_name=?"
|
|
cur = dbcon.cursor()
|
|
cur.execute(sqls, [uname])
|
|
data = cur.fetchone()
|
|
if data:
|
|
rv = eat_pickle(data[1])+CRLF if int(data[0]
|
|
) == DYN_TYPE else data[1]+CRLF
|
|
else:
|
|
if os.path.exists(f'/home/{uname}/.plan'):
|
|
fp = open(f"/home/{uname}/.plan")
|
|
rv = fp.read() + CRLF
|
|
return rv
|
|
|
|
|
|
def info_query(uname):
|
|
|
|
cur = dbcon.cursor()
|
|
cur.execute("SELECT data FROM lusers WHERE unix_name=?", [uname])
|
|
data = cur.fetchone()
|
|
rv = data[0] + CRLF if data else "404 No such entity\r\n"
|
|
return rv
|
|
|
|
|
|
def send_stdin():
|
|
return sys.stdin.readline()
|
|
|
|
|
|
recv_query = send_stdin
|
|
|
|
|
|
def send_msg(x): return sys.stdout.write(str(x))
|
|
|
|
def entry():
|
|
logging.basicConfig(filename=LOGFILE, filemode='w',
|
|
format='%(asctime)s - %(message)s', datefmt='%d-%b-%y %H:%M:%S')
|
|
line = recv_query()
|
|
if line == "\r\n" or line == "\n":
|
|
logging.warning("Query was blank sending banner")
|
|
send_msg(banner_query())
|
|
else:
|
|
resp = parse_and_query(line.strip(CRLF))
|
|
logging.warning("Query was %s sent %s", line.strip(
|
|
CRLF), str(resp).strip(CRLF))
|
|
send_msg(resp)
|
|
sys.exit(0)
|
|
|
|
if __name__ == '__main__':
|
|
entry() |