63 lines
1.5 KiB
Text
63 lines
1.5 KiB
Text
|
#!/usr/bin/env python3
|
||
|
import argparse
|
||
|
import datetime
|
||
|
import logging
|
||
|
import pathlib
|
||
|
import subprocess
|
||
|
|
||
|
|
||
|
def compress_file(filename):
|
||
|
subprocess.run(["xz", "-z", str(filename)])
|
||
|
|
||
|
|
||
|
def find_files(base_dir, extension, days):
|
||
|
delta = datetime.timedelta(days=days)
|
||
|
now = datetime.datetime.now()
|
||
|
for path in base_dir.rglob(f"*{extension}"):
|
||
|
stem = path.name.removesuffix(extension)
|
||
|
date = datetime.datetime.fromisoformat(stem)
|
||
|
if date < now - delta:
|
||
|
yield path
|
||
|
|
||
|
|
||
|
def compress_logs(base_dir, days):
|
||
|
for path in find_files(base_dir, ".log", days):
|
||
|
logging.info("Compressing log file %s", str(path))
|
||
|
compress_file(path)
|
||
|
|
||
|
|
||
|
def remove_logs(base_dir, days):
|
||
|
for path in find_files(base_dir, ".log.xz", days):
|
||
|
logging.info("Removing log file %s", str(path))
|
||
|
path.unlink()
|
||
|
|
||
|
|
||
|
def main():
|
||
|
|
||
|
parser = argparse.ArgumentParser()
|
||
|
parser.add_argument("--compress-days", type=int, default=0)
|
||
|
parser.add_argument("--keep-days", type=int, default=0)
|
||
|
parser.add_argument(
|
||
|
"--base-dir", type=pathlib.Path, default="/var/log/remote"
|
||
|
)
|
||
|
|
||
|
args = parser.parse_args()
|
||
|
|
||
|
logging.basicConfig(
|
||
|
format="[%(asctime)s] %(levelname)s %(message)s", level=logging.INFO
|
||
|
)
|
||
|
|
||
|
logging.info("Rotate script started")
|
||
|
|
||
|
if args.compress_days > 0:
|
||
|
compress_logs(args.base_dir, args.compress_days)
|
||
|
|
||
|
if args.keep_days > 0:
|
||
|
remove_logs(args.base_dir, args.keep_days)
|
||
|
|
||
|
logging.info("Rotate script done")
|
||
|
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
main()
|