-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlogParser.py
More file actions
110 lines (89 loc) · 2.79 KB
/
Copy pathlogParser.py
File metadata and controls
110 lines (89 loc) · 2.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import asyncio
import configparser
import json
import psycopg2
import re
def config(filename, section):
parser = configparser.ConfigParser()
parser.read(filename)
data = {}
if parser.has_section(section):
params = parser.items(section)
for param in params:
data[param[0]] = param[1]
else:
raise Exception(f"Section {section} not found in {filename}")
return data
def initDb():
global conn, cursor
try:
params = config("database.ini", "postgresql")
conn = psycopg2.connect(**params)
cursor = conn.cursor()
except:
print("Cannot connect to postgres")
quit()
def parseLine(line):
escapedLine = line.decode().replace("\\", "\\\\")
return json.loads(escapedLine)
def parseOs(userAgent):
if userAgent is None:
return None
if re.search("windows", userAgent, re.IGNORECASE):
return "Windows"
if re.search("macintosh", userAgent, re.IGNORECASE):
return "Mac"
if re.search("(linux|x11)", userAgent, re.IGNORECASE):
return "Linux"
if re.search("iphone", userAgent, re.IGNORECASE):
return "iPhone"
if re.search("android", userAgent, re.IGNORECASE):
return "Android"
if re.search("\+http", userAgent, re.IGNORECASE) or "Googlebot" in userAgent:
return "Spider"
return None
def parseParams(data):
timestamp = data["time"]
ip = data["ip"]
referer = data["referer"]
userAgent = data["user_agent"]
tls = data["tls"]
host = data["host"]
request = data["request"]
httpMethod = data["http_method"]
path = data["path"]
status = data["status"]
bytesSent = data["body_bytes_sent"]
requestTime = data["request_time"]
if referer == "-":
referer = None
if tls == "-":
tls = None
if userAgent == "-":
userAgent = None
os = parseOs(userAgent)
return (timestamp, ip, referer, userAgent, os, tls, host, request, httpMethod,
path, status, bytesSent, requestTime)
def executeSql(data):
global conn, cursor
query = """
INSERT INTO aeromancer_log (timestamp, ip, referer, user_agent, os, tls,
host, request, http_method, path, status, bytes_sent, request_time)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s);"""
params = parseParams(data)
try:
cursor.execute(query, params)
conn.commit()
except Exception as e:
conn.rollback()
raise e
async def handleMessage(reader, writer):
while line := await reader.readline():
data = parseLine(line)
executeSql(data)
async def run_server():
server = await asyncio.start_server(handleMessage, "localhost", 9123)
async with server:
await server.serve_forever()
initDb()
asyncio.run(run_server())