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

@@ -28,6 +28,7 @@ from utils import (
db_add_download, db_add_download,
db_get_file, db_get_file,
db_delete_file, db_delete_file,
db_maintenance,
) )
__MINI_FLEES_VERSION__ = "20230818.0" __MINI_FLEES_VERSION__ = "20230818.0"
@@ -109,6 +110,12 @@ def ls():
return "\n".join(file_list()), 200 return "\n".join(file_list()), 200
@app.route("/maintenance", methods=["GET"])
def maintenance():
secret = request.headers.get("Secret", "")
if secret != app.config["ACCESS_TOKEN"]:
return "Error", 401
return db_maintenance(), 200
@app.route("/dl/<token>/<name>", methods=["GET"]) @app.route("/dl/<token>/<name>", methods=["GET"])

View File

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

View File

@@ -3,6 +3,10 @@ from flask import current_app as app
def file_date_human(num): 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") return datetime.fromtimestamp(num).strftime("%y-%m-%d %H:%M")

View File

@@ -148,3 +148,20 @@ if true; then
-H "Secret: dff789f0bbe8183d3254258b33a147d580c1131f39a698c56d3f640ac8415714" \ -H "Secret: dff789f0bbe8183d3254258b33a147d580c1131f39a698c56d3f640ac8415714" \
"$ROOTURL"/ls "$ROOTURL"/ls
fi fi
if true; then
pv "$SMALL" | \
curl -fL -w "\n" -F file="@-" -X POST \
-H "Name: $SMALL" \
-H "Max-Downloads: 4000" \
-H "Expires-Days: -5" \
-H "Secret: dff789f0bbe8183d3254258b33a147d580c1131f39a698c56d3f640ac8415714" \
"$ROOTURL"/upload
curl -fL -w "\n" \
-H "Secret: dff789f0bbe8183d3254258b33a147d580c1131f39a698c56d3f640ac8415714" \
"$ROOTURL"/maintenance
fi