new: implemented log rotation (closes #527)
This commit is contained in:
parent
8d5834232b
commit
97a019fe25
@ -84,8 +84,6 @@ main:
|
|||||||
mon_start_cmd: /usr/bin/monstart
|
mon_start_cmd: /usr/bin/monstart
|
||||||
mon_stop_cmd: /usr/bin/monstop
|
mon_stop_cmd: /usr/bin/monstop
|
||||||
mon_max_blind_epochs: 50
|
mon_max_blind_epochs: 50
|
||||||
# log file
|
|
||||||
log: /var/log/pwnagotchi.log
|
|
||||||
# if true, will not restart the wifi module
|
# if true, will not restart the wifi module
|
||||||
no_restart: false
|
no_restart: false
|
||||||
# access points to ignore
|
# access points to ignore
|
||||||
@ -94,6 +92,14 @@ main:
|
|||||||
- ANOTHER_EXAMPLE_NETWORK
|
- ANOTHER_EXAMPLE_NETWORK
|
||||||
# if not null, filter access points by this regular expression
|
# if not null, filter access points by this regular expression
|
||||||
filter: null
|
filter: null
|
||||||
|
# logging
|
||||||
|
log:
|
||||||
|
# file to log to
|
||||||
|
path: /var/log/pwnagotchi.log
|
||||||
|
rotation:
|
||||||
|
enabled: true
|
||||||
|
# specify a maximum size to rotate ( format is 10/10B, 10K, 10M 10G )
|
||||||
|
size: '10M'
|
||||||
|
|
||||||
ai:
|
ai:
|
||||||
# if false, only the default 'personality' will be used
|
# if false, only the default 'personality' will be used
|
||||||
|
@ -26,7 +26,7 @@ class LastSession(object):
|
|||||||
def __init__(self, config):
|
def __init__(self, config):
|
||||||
self.config = config
|
self.config = config
|
||||||
self.voice = Voice(lang=config['main']['lang'])
|
self.voice = Voice(lang=config['main']['lang'])
|
||||||
self.path = config['main']['log']
|
self.path = config['main']['log']['path']
|
||||||
self.last_session = []
|
self.last_session = []
|
||||||
self.last_session_id = ''
|
self.last_session_id = ''
|
||||||
self.last_saved_session_id = ''
|
self.last_saved_session_id = ''
|
||||||
|
@ -3,11 +3,13 @@ from enum import Enum
|
|||||||
import logging
|
import logging
|
||||||
import glob
|
import glob
|
||||||
import os
|
import os
|
||||||
|
import re
|
||||||
import time
|
import time
|
||||||
import subprocess
|
import subprocess
|
||||||
import yaml
|
import yaml
|
||||||
import json
|
import json
|
||||||
import shutil
|
import shutil
|
||||||
|
import gzip
|
||||||
|
|
||||||
import pwnagotchi
|
import pwnagotchi
|
||||||
|
|
||||||
@ -117,14 +119,80 @@ def load_config(args):
|
|||||||
return config
|
return config
|
||||||
|
|
||||||
|
|
||||||
|
def parse_max_size(s):
|
||||||
|
parts = re.findall(r'(^\d+)([bBkKmMgG]?)', s)
|
||||||
|
if len(parts) != 1:
|
||||||
|
raise Exception("can't parse %s as a max size" % s)
|
||||||
|
|
||||||
|
num, unit = parts[1]
|
||||||
|
num = int(num)
|
||||||
|
unit = unit.lower()
|
||||||
|
|
||||||
|
if unit == 'k':
|
||||||
|
return num * 1024
|
||||||
|
elif unit == 'm':
|
||||||
|
return num * 1024 * 1024
|
||||||
|
elif unit == 'g':
|
||||||
|
return num * 1024 * 1024 * 1024
|
||||||
|
else:
|
||||||
|
return num
|
||||||
|
|
||||||
|
|
||||||
|
def do_rotate(filename, stats, cfg):
|
||||||
|
base_path = os.path.dirname(filename)
|
||||||
|
name = os.path.splitext(os.path.basename(filename))[0]
|
||||||
|
archive_filename = os.path.join(base_path, "%s.gz" % name)
|
||||||
|
counter = 2
|
||||||
|
|
||||||
|
while os.path.exists(archive_filename):
|
||||||
|
archive_filename = os.path.join(base_path, "%s-%d.gz" % (name, counter))
|
||||||
|
counter += 1
|
||||||
|
|
||||||
|
log_filename = archive_filename.replace('gz', 'log')
|
||||||
|
|
||||||
|
print("%s is %d bytes big, rotating to %s ..." % (filename, stats.st_size, log_filename))
|
||||||
|
|
||||||
|
shutil.move(filename, log_filename)
|
||||||
|
|
||||||
|
print("compressing to %s ..." % archive_filename)
|
||||||
|
|
||||||
|
with open(log_filename, 'rb') as src:
|
||||||
|
with gzip.open(archive_filename, 'wb') as dst:
|
||||||
|
dst.writelines(src)
|
||||||
|
|
||||||
|
|
||||||
|
def log_rotation(filename, cfg):
|
||||||
|
rotation = cfg['rotation']
|
||||||
|
if not rotation['enabled']:
|
||||||
|
return
|
||||||
|
elif not os.path.isfile(filename):
|
||||||
|
return
|
||||||
|
|
||||||
|
stats = os.stat(filename)
|
||||||
|
# specify a maximum size to rotate ( format is 10/10B, 10K, 10M 10G )
|
||||||
|
if rotation['size']:
|
||||||
|
max_size = parse_max_size(rotation['size'])
|
||||||
|
if stats.st_size >= max_size:
|
||||||
|
do_rotate(filename, stats, cfg)
|
||||||
|
else:
|
||||||
|
raise Exception("log rotation is enabled but log.rotation.size was not specified")
|
||||||
|
|
||||||
|
|
||||||
def setup_logging(args, config):
|
def setup_logging(args, config):
|
||||||
|
cfg = config['main']['log']
|
||||||
|
filename = cfg['path']
|
||||||
|
|
||||||
formatter = logging.Formatter("[%(asctime)s] [%(levelname)s] %(message)s")
|
formatter = logging.Formatter("[%(asctime)s] [%(levelname)s] %(message)s")
|
||||||
root = logging.getLogger()
|
root = logging.getLogger()
|
||||||
|
|
||||||
root.setLevel(logging.DEBUG if args.debug else logging.INFO)
|
root.setLevel(logging.DEBUG if args.debug else logging.INFO)
|
||||||
|
|
||||||
if config['main']['log']:
|
if filename:
|
||||||
file_handler = logging.FileHandler(config['main']['log'])
|
# since python default log rotation might break session data in different files,
|
||||||
|
# we need to do log rotation ourselves
|
||||||
|
log_rotation(filename, cfg)
|
||||||
|
|
||||||
|
file_handler = logging.FileHandler(filename)
|
||||||
file_handler.setFormatter(formatter)
|
file_handler.setFormatter(formatter)
|
||||||
root.addHandler(file_handler)
|
root.addHandler(file_handler)
|
||||||
|
|
||||||
|
@ -16,6 +16,7 @@ FILES_TO_BACKUP=(
|
|||||||
/root/peers
|
/root/peers
|
||||||
/etc/pwnagotchi/
|
/etc/pwnagotchi/
|
||||||
/var/log/pwnagotchi.log
|
/var/log/pwnagotchi.log
|
||||||
|
/var/log/pwnagotchi*.gz
|
||||||
/home/pi/.bashrc
|
/home/pi/.bashrc
|
||||||
)
|
)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user