handy-scripts/Caddy_Logger/caddy_logger.py

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()