Merge branch 'deluser' into 'main'
Add deletion of local user media See merge request sspaeth/cleanmedia!8
This commit is contained in:
commit
4ddec53928
37
cleanmedia
37
cleanmedia
@ -123,6 +123,23 @@ class MediaRepository:
|
|||||||
# creation_ts is ms since the epoch, so convert to seconds
|
# creation_ts is ms since the epoch, so convert to seconds
|
||||||
return File(self, row[0], row[1] // 1000, row[2])
|
return File(self, row[0], row[1] // 1000, row[2])
|
||||||
|
|
||||||
|
def get_local_user_media(self, user_id: str) -> List[File]:
|
||||||
|
"""Return all media created by a local user
|
||||||
|
|
||||||
|
:params:
|
||||||
|
:user_id: (`str`) of form "@user:servername.com"
|
||||||
|
:returns: `List[File]`
|
||||||
|
"""
|
||||||
|
with self.conn.cursor() as cur:
|
||||||
|
sql_str = "SELECT media_id, creation_ts, base64hash from mediaapi_media_repository WHERE user_id = %s;"
|
||||||
|
cur.execute(sql_str, (user_id,))
|
||||||
|
files = []
|
||||||
|
for row in cur.fetchall():
|
||||||
|
# creation_ts is ms since the epoch, so convert to seconds
|
||||||
|
f = File(self, row[0], row[1] // 1000, row[2])
|
||||||
|
files.append(f)
|
||||||
|
return files
|
||||||
|
|
||||||
def get_all_media(self, local: bool = False) -> List[File]:
|
def get_all_media(self, local: bool = False) -> List[File]:
|
||||||
"""Return List[File] of remote media or ALL media if local==True"""
|
"""Return List[File] of remote media or ALL media if local==True"""
|
||||||
with self.conn.cursor() as cur:
|
with self.conn.cursor() as cur:
|
||||||
@ -241,11 +258,13 @@ def parse_options() -> argparse.Namespace:
|
|||||||
parser.add_argument('-c', '--config', default="config.yaml", help="location of the dendrite.yaml config file.")
|
parser.add_argument('-c', '--config', default="config.yaml", help="location of the dendrite.yaml config file.")
|
||||||
parser.add_argument('-m', '--mxid', dest="mxid",
|
parser.add_argument('-m', '--mxid', dest="mxid",
|
||||||
help="Just delete media <MXID>. (no cleanup otherwise)")
|
help="Just delete media <MXID>. (no cleanup otherwise)")
|
||||||
|
parser.add_argument('-u', '--userid', dest="userid",
|
||||||
|
help="Delete all media by local user '\\@user:domain.com'. (ie, a user on hour homeserver. no cleanup otherwise)")
|
||||||
parser.add_argument('-t', '--days', dest="days",
|
parser.add_argument('-t', '--days', dest="days",
|
||||||
default="30", type=int,
|
default="30", type=int,
|
||||||
help="Keep remote media for <DAYS> days.")
|
help="Keep remote media for <DAYS> days.")
|
||||||
parser.add_argument('-l', '--local', action='store_true',
|
parser.add_argument('-l', '--local', action='store_true',
|
||||||
help="Also include local (ie, from *our* users) media files when purging.")
|
help="Also purge local (ie, from *our* users) media.")
|
||||||
parser.add_argument('-n', '--dryrun', action='store_true',
|
parser.add_argument('-n', '--dryrun', action='store_true',
|
||||||
help="Dry run (don't actually modify any files).")
|
help="Dry run (don't actually modify any files).")
|
||||||
parser.add_argument('-q', '--quiet', action='store_true', help="Reduce output verbosity.")
|
parser.add_argument('-q', '--quiet', action='store_true', help="Reduce output verbosity.")
|
||||||
@ -266,11 +285,27 @@ if __name__ == '__main__':
|
|||||||
|
|
||||||
if args.mxid:
|
if args.mxid:
|
||||||
# Just clean a single media
|
# Just clean a single media
|
||||||
|
logging.info("Attempting to delete media '%s'", args.mxid)
|
||||||
file = mr.get_single_media(args.mxid)
|
file = mr.get_single_media(args.mxid)
|
||||||
if file:
|
if file:
|
||||||
logging.info("Found media with id '%s'", args.mxid)
|
logging.info("Found media with id '%s'", args.mxid)
|
||||||
if not args.dryrun:
|
if not args.dryrun:
|
||||||
file.delete()
|
file.delete()
|
||||||
|
elif args.userid:
|
||||||
|
logging.info("Attempting to delete media by user '%s'", args.userid)
|
||||||
|
files = mr.get_local_user_media(args.userid)
|
||||||
|
num_deleted = 0
|
||||||
|
for file in files:
|
||||||
|
num_deleted += 1
|
||||||
|
if args.dryrun: # the great pretender
|
||||||
|
logging.info(f"Pretending to delete file id {file.media_id} on path {file.fullpath}.")
|
||||||
|
else:
|
||||||
|
file.delete()
|
||||||
|
info_str = "Deleted %d files during the run."
|
||||||
|
if args.dryrun:
|
||||||
|
info_str = "%d files would have been deleted during the run."
|
||||||
|
logging.info(info_str, num_deleted)
|
||||||
|
|
||||||
else: # main clean out...
|
else: # main clean out...
|
||||||
# Sanity checks
|
# Sanity checks
|
||||||
mr.sanity_check_thumbnails() # warn in case of superfluous thumbnails
|
mr.sanity_check_thumbnails() # warn in case of superfluous thumbnails
|
||||||
|
Loading…
x
Reference in New Issue
Block a user