60 lines
1.5 KiB
Python
60 lines
1.5 KiB
Python
#!/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="%(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()
|