49 lines
1.7 KiB
Python
49 lines
1.7 KiB
Python
import socket
|
|
from os import getenv
|
|
from datetime import datetime
|
|
import pymysql
|
|
|
|
class LogItem:
|
|
def __init__(self,line):
|
|
self.ip = line.split(" ")[0]
|
|
self.timestamp = datetime.strptime(line.split("[")[1].split("]")[0].split("+")[0].strip(),"%d/%b/%Y:%H:%M:%S")
|
|
req = line.split('"')[1].split(' ')
|
|
self.method = req[0]
|
|
self.path = req[1]
|
|
self.http = req[2]
|
|
self.status = int(line.split('"')[2].split(' ')[1])
|
|
|
|
print("Starting log server")
|
|
db_conn = pymysql.connect(host=getenv("db_host"),user=getenv("db_user"),password=getenv("db_pass"),db=getenv("db_db"),autocommit=True)
|
|
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
s.bind((getenv("tcp_ip"),int(getenv("tcp_port"))))
|
|
s.listen(True)
|
|
|
|
with db_conn.cursor() as db:
|
|
db.execute("""
|
|
CREATE TABLE IF NOT EXISTS `caddy_logs` (
|
|
`ip` varchar(255) DEFAULT NULL,
|
|
`timestamp` datetime DEFAULT NULL,
|
|
`path` varchar(255) DEFAULT NULL,
|
|
`method` varchar(255) DEFAULT NULL,
|
|
`http` varchar(255) DEFAULT NULL,
|
|
`status` int(11) DEFAULT NULL
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|
""")
|
|
|
|
while True:
|
|
conn, addr = s.accept()
|
|
print("Caddy connected from {}".format(addr))
|
|
while True:
|
|
data = conn.recv(4096)
|
|
if not data:
|
|
break
|
|
data = data.decode("utf-8").split("]:")[1].strip()
|
|
itm = LogItem(data)
|
|
try:
|
|
with db_conn.cursor() as db:
|
|
db.execute("INSERT INTO `caddy_logs` (`ip`, `timestamp`, `path`, `method`, `http`, `status`) VALUES (%s, %s, %s, %s, %s, %s)",(itm.ip,itm.timestamp,itm.path,itm.method,itm.http,itm.status,))
|
|
except Exception:
|
|
continue
|
|
conn.close()
|