HEX
Server: Apache/2.2.34 (Unix) mod_fastcgi/mod_fastcgi-SNAP-0910052141
System: Linux Kou-Etsu-Dou 4.4.59+ #25556 SMP PREEMPT Thu Mar 4 18:03:46 CST 2021 x86_64
User: hosam (1026)
PHP: 7.2.29
Disabled: NONE
Upload Files
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()