maint script

This commit is contained in:
Q
2023-08-19 12:28:58 +03:00
parent aa6a1d2373
commit bdacb80c43
4 changed files with 60 additions and 32 deletions

View File

@@ -7,6 +7,7 @@ import json
import stat
import time
import sqlite3
import shutil
from .misc import *
from .crypt import *
@@ -41,6 +42,7 @@ def db_get_file(token, name):
(token, name),
).fetchone()
def db_get_files():
db, c = get_db()
return db.execute(
@@ -78,39 +80,45 @@ def db_add_download(token, name):
return
def file_autoremove():
def db_maintenance():
messages = []
db, c = get_db()
rows = db.execute(
"""
select
token, name
from files
where expires > ? or downloads >= max_downloads
where expires < ? or downloads >= max_downloads
""",
(int(time.time()),),
)
deleted_tokens = []
for row in rows:
try:
os.remove(os.path.join(os.getenv("DATAFOLDER"), row[0], row[1]))
except FileNotFoundError:
pass
try:
os.rmdir(os.path.join(os.getenv("DATAFOLDER"), row[0]))
except FileNotFoundError:
pass
deleted_tokens.append(row[0])
deleted_tokens.append((row[0],))
messages.append(f"Deleting DB {row[0]}/{row[1]}")
if len(deleted_tokens) > 0:
db, c = get_db()
for token in deleted_tokens:
c.execute(
"""
DELETE FROM files WHERE token = ?
""",
(token,),
)
db.commit()
return
c.executemany("DELETE FROM files WHERE token = ?", deleted_tokens)
if c.rowcount > 0:
db.commit()
subdirs = next(os.walk(app.config["DATAFOLDER"]))[1]
db, c = get_db()
for d in subdirs:
keep = db.execute(
"SELECT 1 FROM files WHERE token = ?",
(d,),
).fetchone()
if not keep:
try:
for fname in os.listdir(os.path.join(app.config["DATAFOLDER"],d)):
os.remove(os.path.join(app.config["DATAFOLDER"],d,fname))
messages.append(f"Deleting file {d}/{fname}")
except Exception:
pass
shutil.rmtree(os.path.join(app.config["DATAFOLDER"],d), ignore_errors=True)
messages.append(f"Deleting folder {d}")
return "\n".join(messages)
def file_age(path):
@@ -146,24 +154,16 @@ def file_details(token, name):
except FileNotFoundError:
return {}
def file_list():
def file_list():
files = list(db_get_files())
details = []
maxlen = 4
for file in files:
maxlen = max(maxlen, len(file[1]))
details = []
details.append(
"Added/Expiry DL/MaxDL URL"
)
details.append(" Added/Expiry DL/MaxDL URL")
details.append("=" * 75)
for file in files:
url = f"{app.config['PUBLIC_URL']}/dl/{file[0]}/{file[1]}"
details.append(
" ".join((
str(file[2]),str(file[3]),str(file[4]),str(file[5]),
f"{app.config['PUBLIC_URL']}/dl/{file[0]}/{file[1]}"
))
f"{file_date_human(file[2])}/{file_date_human(file[3])} {file[4]:4d}/{file[5]:4d} {url}"
)
return details

View File

@@ -3,6 +3,10 @@ from flask import current_app as app
def file_date_human(num):
return datetime.fromtimestamp(num).strftime("%y-%m-%d")
def file_time_human(num):
return datetime.fromtimestamp(num).strftime("%y-%m-%d %H:%M")