From 3d375d51146e5334a27892c12cde6f8b7d91b5b6 Mon Sep 17 00:00:00 2001 From: ed Date: Sun, 21 Mar 2021 14:15:55 +0100 Subject: [PATCH] assert mtm/mtp is used by mte --- README.md | 6 ++++++ copyparty/__main__.py | 4 ++-- copyparty/authsrv.py | 48 ++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 55 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index a0ebb428..9efeed5d 100644 --- a/README.md +++ b/README.md @@ -169,6 +169,12 @@ copyparty can invoke external programs to collect additional metadata for files * `-v ~/music::r:cmtp=.bpm=~/bin/audio-bpm.py:cmtp=key=f,t5,~/bin/audio-key.py` both as a per-volume config wow this is getting ugly +## complete examples + +* read-only music server with bpm and key scanning +* `python copyparty-sfx.py -v /mnt/nas/music:/music:r -e2dsa -e2ts -mtp .bpm=f,~/bin/audio-bpm.py -mtp key=f,~/bin/audio-key.py` + + # client examples * javascript: dump some state into a file (two separate examples) diff --git a/copyparty/__main__.py b/copyparty/__main__.py index 5877668c..62532723 100644 --- a/copyparty/__main__.py +++ b/copyparty/__main__.py @@ -262,7 +262,7 @@ def main(): ap.add_argument("-nid", action="store_true", help="no info disk-usage") ap.add_argument("--no-sendfile", action="store_true", help="disable sendfile (for debugging)") ap.add_argument("--no-scandir", action="store_true", help="disable scandir (for debugging)") - ap.add_argument("--urlform", type=str, default="print,get", help="how to handle url-forms") + ap.add_argument("--urlform", metavar="MODE", type=str, default="print,get", help="how to handle url-forms") ap.add_argument("--salt", type=str, default="hunter2", help="up2k file-hash salt") ap2 = ap.add_argument_group('database options') @@ -283,7 +283,7 @@ def main(): ap2 = ap.add_argument_group('SSL/TLS options') ap2.add_argument("--http-only", action="store_true", help="disable ssl/tls") ap2.add_argument("--https-only", action="store_true", help="disable plaintext") - ap2.add_argument("--ssl-ver", type=str, help="ssl/tls versions to allow") + ap2.add_argument("--ssl-ver", metavar="LIST", type=str, help="ssl/tls versions to allow") ap2.add_argument("--ciphers", metavar="LIST", help="set allowed ciphers") ap2.add_argument("--ssl-dbg", action="store_true", help="dump some tls info") ap2.add_argument("--ssl-log", metavar="PATH", help="log master secrets") diff --git a/copyparty/authsrv.py b/copyparty/authsrv.py index 16a77839..7c89c096 100644 --- a/copyparty/authsrv.py +++ b/copyparty/authsrv.py @@ -1,8 +1,9 @@ # coding: utf-8 from __future__ import print_function, unicode_literals -import os import re +import os +import sys import threading from .__init__ import PY2, WINDOWS @@ -318,6 +319,8 @@ class AuthSrv(object): ) raise Exception("invalid config") + all_mte = {} + errors = False for vol in vfs.all_vols.values(): if (self.args.e2ds and vol.uwrite) or self.args.e2dsa: vol.flags["e2ds"] = True @@ -340,6 +343,49 @@ class AuthSrv(object): # append parsers from argv to volume-flags self._read_volflag(vol.flags, "mtp", self.args.mtp, True) + # verify tags mentioned by -mt[mp] are used by -mte + local_mtp = {} + local_only_mtp = {} + for a in vol.flags.get("mtp", []) + vol.flags.get("mtm", []): + a = a.split("=")[0] + local_mtp[a] = True + local = True + for b in self.args.mtp: + b = b.split("=")[0] + if a == b: + local = False + + if local: + local_only_mtp[a] = True + + local_mte = {} + for a in vol.flags.get("mte", "").split(","): + local = True + all_mte[a] = True + local_mte[a] = True + for b in self.args.mte.split(","): + if not a or not b: + continue + + if a == b: + local = False + + for mtp in local_only_mtp.keys(): + if mtp not in local_mte: + m = 'volume "/{}" defines metadata tag "{}", but doesnt use it in "-mte" (or with "cmte" in its volume-flags)' + self.log(m.format(vol.vpath, mtp), 1) + errors = True + + for mtp in self.args.mtp: + mtp = mtp.split("=")[0] + if mtp not in all_mte: + m = 'metadata tag "{}" is defined by "-mtm" or "-mtp", but is not used by "-mte" (or by any "cmte" volume-flag)' + self.log(m.format(mtp), 1) + errors = True + + if errors: + sys.exit(1) + try: v, _ = vfs.get("/", "*", False, True) if self.warn_anonwrite and os.getcwd() == v.realpath: