File: /volume1/@appstore/DNSServer/script/logmigrate.py
#!/bin/python
#Copyright (c) 2000-2017 Synology Inc. All rights reserved.
import logging
import glob
import sys
import os
import sqlite3
from os import stat
from pwd import getpwuid
'''
Parse all 'default-log*' which owner is DNSServer, and inserted all into SYNODNSLOGDB.
When parsing any line failed, preserve this line into legacy-log.
After parsed, whether success or not, delete default-log.
'''
LEGACY_LOGS = "/var/packages/DNSServer/target/named/var/log/legacy-log"
DEFAULT_LOGS = glob.glob("/var/packages/DNSServer/target/named/var/log/default-log*")
DBFILE = "/var/packages/DNSServer/target/named/var/log/SYNODNSLOGDB"
OWNER = "DNSServer"
def insert_log(conn, t):
# NOTE: if need change table field, remember to change table definition in SYNODNSLogDBSizeSet(), synodnslog.conf
conn.execute('INSERT INTO LOGS (TIME,TAG,CATAGORY,MODULE,SEVERITY,CONTENT) VALUES (?,?,?,?,?,?)', t);
def parse_line_get_time(line):
time_raw = line[0:20]
millisecond = line[21:25]
from datetime import datetime
date = datetime.strptime(time_raw, '%d-%b-%Y %X')
return "{0:04d}/{1:02d}/{2:02d} {3:02d}:{4:02d}:{5:02d}.{6:03d}".format(date.year, date.month, date.day, date.hour, date.minute, date.second, millisecond)
def parse_line_get_catagory_and_content(line):
i = line.find(":",25)
catagory = line[25:i]
content = line[i+2:len(line)-1]
return (catagory, content)
def parse_line(line):
time = parse_line_get_time(line)
catagory_content = parse_line_get_catagory_and_content(line)
return (time,'',catagory_content[0], '', -1, catagory_content[1])
def parse_log_and_insert(conn, f):
with open(LEGACY_LOGS, "w") as legacy_logs:
with open(f) as fh:
for line in fh:
try:
t = parse_line(line)
insert_log(conn, t)
except Exception, e:
logging.error('Failed to insert log:' + str(e))
#unkown error, give up this log line
#log into legacy_logs
legacy_logs.write(line);
continue
def migrate_log(f):
conn = sqlite3.connect(DBFILE)
with conn:
parse_log_and_insert(conn, f)
return True
def migrate_default_log():
for f in DEFAULT_LOGS:
if (OWNER == getpwuid(stat(f).st_uid).pw_name):
migrate_log(f)
os.remove(f)
if __name__ == "__main__":
if (False == os.path.isfile(DBFILE)):
print "Failed, ", DBFILE, " not exist"
sys.exit(2)
migrate_default_log()