mirror of
https://github.com/tuna/tunasync.git
synced 2025-06-16 07:02:44 +00:00
83 lines
2.3 KiB
Python
83 lines
2.3 KiB
Python
#!/usr/bin/env python2
|
|
# -*- coding:utf-8 -*-
|
|
import sh
|
|
import os
|
|
from .hook import JobHook
|
|
from datetime import datetime
|
|
|
|
|
|
class LogLimitHook(JobHook):
|
|
|
|
def __init__(self, limit=10):
|
|
self.limit = limit
|
|
|
|
def before_job(self, provider, ctx={}, *args, **kwargs):
|
|
log_dir = provider.log_dir
|
|
self.ensure_log_dir(log_dir)
|
|
log_file = provider.log_file.format(
|
|
date=datetime.now().strftime("%Y-%m-%d_%H-%M"))
|
|
ctx['log_file'] = log_file
|
|
if log_file == "/dev/null":
|
|
return
|
|
|
|
log_link = os.path.join(log_dir, "latest")
|
|
ctx['log_link'] = log_link
|
|
|
|
lfiles = [os.path.join(log_dir, lfile)
|
|
for lfile in os.listdir(log_dir)
|
|
if lfile.startswith(provider.name)]
|
|
|
|
lfiles_set = set(lfiles)
|
|
# sort to get the newest 10 files
|
|
lfiles_ts = sorted(
|
|
[(os.path.getmtime(lfile), lfile) for lfile in lfiles],
|
|
key=lambda x: x[0],
|
|
reverse=True)
|
|
lfiles_keep = set([x[1] for x in lfiles_ts[:self.limit]])
|
|
lfiles_rm = lfiles_set - lfiles_keep
|
|
# remove old files
|
|
for lfile in lfiles_rm:
|
|
try:
|
|
sh.rm(lfile)
|
|
except:
|
|
pass
|
|
|
|
# create a soft link
|
|
self.create_link(log_link, log_file)
|
|
|
|
def after_job(self, status=None, ctx={}, *args, **kwargs):
|
|
log_file = ctx.get('log_file', None)
|
|
log_link = ctx.get('log_link', None)
|
|
if log_file == "/dev/null":
|
|
return
|
|
if status == "fail":
|
|
log_file_save = log_file + ".fail"
|
|
try:
|
|
sh.mv(log_file, log_file_save)
|
|
except:
|
|
pass
|
|
self.create_link(log_link, log_file_save)
|
|
|
|
def ensure_log_dir(self, log_dir):
|
|
if not os.path.exists(log_dir):
|
|
sh.mkdir("-p", log_dir)
|
|
|
|
def create_link(self, log_link, log_file):
|
|
if log_link == log_file:
|
|
return
|
|
if not (log_link and log_file):
|
|
return
|
|
|
|
if os.path.lexists(log_link):
|
|
try:
|
|
sh.rm(log_link)
|
|
except:
|
|
return
|
|
try:
|
|
sh.ln('-s', log_file, log_link)
|
|
except:
|
|
return
|
|
|
|
|
|
# vim: ts=4 sw=4 sts=4 expandtab
|