From 214a367f48437995ed86309e79a2daa02d3de0e5 Mon Sep 17 00:00:00 2001 From: ed Date: Thu, 12 May 2022 20:26:48 +0200 Subject: [PATCH] be loud about segfaults and such --- copyparty/httpconn.py | 3 ++- copyparty/mtag.py | 13 ++++++----- copyparty/th_srv.py | 2 ++ copyparty/util.py | 50 +++++++++++++++++++++++++++++++++++++++---- tests/test_httpcli.py | 1 + tests/test_vfs.py | 1 + 6 files changed, 60 insertions(+), 10 deletions(-) diff --git a/copyparty/httpconn.py b/copyparty/httpconn.py index ae25070c..fb10b1b1 100644 --- a/copyparty/httpconn.py +++ b/copyparty/httpconn.py @@ -18,6 +18,7 @@ from .httpcli import HttpCli from .u2idx import U2idx from .th_cli import ThumbCli from .th_srv import HAVE_PIL, HAVE_VIPS +from .mtag import HAVE_FFMPEG from .ico import Ico @@ -38,7 +39,7 @@ class HttpConn(object): self.cert_path = hsrv.cert_path self.u2fh = hsrv.u2fh - enth = (HAVE_PIL or HAVE_VIPS) and not self.args.no_thumb + enth = (HAVE_PIL or HAVE_VIPS or HAVE_FFMPEG) and not self.args.no_thumb self.thumbcli = ThumbCli(hsrv) if enth else None self.ico = Ico(self.args) diff --git a/copyparty/mtag.py b/copyparty/mtag.py index 14d86edb..ce723f3b 100644 --- a/copyparty/mtag.py +++ b/copyparty/mtag.py @@ -8,7 +8,7 @@ import shutil import subprocess as sp from .__init__ import PY2, WINDOWS, unicode -from .util import fsenc, fsdec, uncyg, runcmd, REKOBO_LKEY +from .util import fsenc, fsdec, uncyg, runcmd, retchk, REKOBO_LKEY from .bos import bos @@ -82,8 +82,9 @@ def ffprobe(abspath, timeout=10): b"--", fsenc(abspath), ] - rc = runcmd(cmd, timeout=timeout) - return parse_ffprobe(rc[1]) + rc, so, se = runcmd(cmd, timeout=timeout) + retchk(rc, cmd, se) + return parse_ffprobe(so) def parse_ffprobe(txt): @@ -491,12 +492,14 @@ class MTag(object): cmd = ["nice"] + cmd cmd = [fsenc(x) for x in cmd] - v = sp.check_output(cmd, **args).strip() + rc, v, err = runcmd(cmd, **args) + retchk(rc, cmd, err, self.log, 5) + v = v.strip() if not v: continue if "," not in tagname: - ret[tagname] = v.decode("utf-8") + ret[tagname] = v else: v = json.loads(v) for tag in tagname.split(","): diff --git a/copyparty/th_srv.py b/copyparty/th_srv.py index a84d0bac..2c87dded 100644 --- a/copyparty/th_srv.py +++ b/copyparty/th_srv.py @@ -343,6 +343,8 @@ class ThumbSrv(object): def conv_ffmpeg(self, abspath, tpath): ret, _ = ffprobe(abspath) + if not ret: + return ext = abspath.rsplit(".")[-1].lower() if ext in ["h264", "h265"] or ext in self.fmt_ffi: diff --git a/copyparty/util.py b/copyparty/util.py index 6ba788a4..7fcc246e 100644 --- a/copyparty/util.py +++ b/copyparty/util.py @@ -9,6 +9,7 @@ import time import base64 import select import struct +import signal import hashlib import platform import traceback @@ -1350,8 +1351,8 @@ def guess_mime(url, fallback="application/octet-stream"): return ret -def runcmd(argv, timeout=None): - p = sp.Popen(argv, stdout=sp.PIPE, stderr=sp.PIPE) +def runcmd(argv, timeout=None, **ka): + p = sp.Popen(argv, stdout=sp.PIPE, stderr=sp.PIPE, **ka) if not timeout or PY2: stdout, stderr = p.communicate() else: @@ -1366,9 +1367,10 @@ def runcmd(argv, timeout=None): return [p.returncode, stdout, stderr] -def chkcmd(argv): - ok, sout, serr = runcmd(argv) +def chkcmd(argv, **ka): + ok, sout, serr = runcmd(argv, **ka) if ok != 0: + retchk(ok, argv, serr) raise Exception(serr) return sout, serr @@ -1385,6 +1387,46 @@ def mchkcmd(argv, timeout=10): raise sp.CalledProcessError(rv, (argv[0], b"...", argv[-1])) +def retchk(rc, cmd, serr, logger=None, color=None): + if rc < 0: + rc = 128 - rc + + if rc < 126: + return + + s = None + if rc > 128: + try: + s = str(signal.Signals(rc - 128)) + except: + pass + elif rc == 126: + s = "invalid program" + elif rc == 127: + s = "program not found" + else: + s = "invalid retcode" + + if s: + m = "{} <{}>".format(rc, s) + else: + m = str(rc) + + try: + c = " ".join([fsdec(x) for x in cmd]) + except: + c = str(cmd) + + m = "error {} from [{}]".format(m, c) + if serr: + m += "\n" + serr + + if logger: + logger(m, color) + else: + raise Exception(m) + + def gzip_orig_sz(fn): with open(fsenc(fn), "rb") as f: f.seek(-4, 2) diff --git a/tests/test_httpcli.py b/tests/test_httpcli.py index b38202a5..4a5f1b3d 100644 --- a/tests/test_httpcli.py +++ b/tests/test_httpcli.py @@ -59,6 +59,7 @@ class Cfg(Namespace): theme=0, themes=0, turbo=0, + logout=573, hist=None, no_idx=None, no_hash=None, diff --git a/tests/test_vfs.py b/tests/test_vfs.py index 1e2d66cc..9f904cc3 100644 --- a/tests/test_vfs.py +++ b/tests/test_vfs.py @@ -39,6 +39,7 @@ class Cfg(Namespace): "theme": 0, "themes": 0, "turbo": 0, + "logout": 573, } ex.update(ex2) super(Cfg, self).__init__(a=a or [], v=v or [], c=c, **ex)