avoid pointless recursion + show scan summary

This commit is contained in:
ed 2022-05-09 23:43:59 +02:00
parent 6bcf330ae0
commit 2fb46551a2

View file

@ -411,7 +411,7 @@ class VFS(object):
return [abspath, real, virt_vis] return [abspath, real, virt_vis]
def walk(self, rel, rem, seen, uname, permsets, dots, scandir, lstat): def walk(self, rel, rem, seen, uname, permsets, dots, scandir, lstat, subvols=True):
""" """
recursively yields from ./rem; recursively yields from ./rem;
rel is a unix-style user-defined vpath (not vfs-related) rel is a unix-style user-defined vpath (not vfs-related)
@ -444,9 +444,14 @@ class VFS(object):
wrel = (rel + "/" + rdir).lstrip("/") wrel = (rel + "/" + rdir).lstrip("/")
wrem = (rem + "/" + rdir).lstrip("/") wrem = (rem + "/" + rdir).lstrip("/")
for x in self.walk(wrel, wrem, seen, uname, permsets, dots, scandir, lstat): for x in self.walk(
wrel, wrem, seen, uname, permsets, dots, scandir, lstat, subvols
):
yield x yield x
if not subvols:
return
for n, vfs in sorted(vfs_virt.items()): for n, vfs in sorted(vfs_virt.items()):
if not dots and n.startswith("."): if not dots and n.startswith("."):
continue continue
@ -1107,7 +1112,7 @@ class AuthSrv(object):
flag_p = "p" in flags flag_p = "p" in flags
flag_r = "r" in flags flag_r = "r" in flags
n_bads = 0 bads = []
for v in vols: for v in vols:
v = v[1:] v = v[1:]
vtop = "/{}/".format(v) if v else "/" vtop = "/{}/".format(v) if v else "/"
@ -1119,10 +1124,19 @@ class AuthSrv(object):
continue continue
atop = vn.realpath atop = vn.realpath
safeabs = atop + os.sep
g = vn.walk( g = vn.walk(
vn.vpath, "", [], u, [[True]], True, not self.args.no_scandir, False vn.vpath,
"",
[],
u,
[[True]],
True,
not self.args.no_scandir,
False,
False,
) )
for _, _, vpath, apath, files, _, _ in g: for _, _, vpath, apath, files, dirs, _ in g:
fnames = [n[0] for n in files] fnames = [n[0] for n in files]
vpaths = [vpath + "/" + n for n in fnames] if vpath else fnames vpaths = [vpath + "/" + n for n in fnames] if vpath else fnames
vpaths = [vtop + x for x in vpaths] vpaths = [vtop + x for x in vpaths]
@ -1130,8 +1144,10 @@ class AuthSrv(object):
files = [[vpath + "/", apath + os.sep]] + list(zip(vpaths, apaths)) files = [[vpath + "/", apath + os.sep]] + list(zip(vpaths, apaths))
if flag_ln: if flag_ln:
files = [x for x in files if not x[1].startswith(atop + os.sep)] files = [x for x in files if not x[1].startswith(safeabs)]
n_bads += len(files) if files:
dirs[:] = [] # stop recursion
bads.append(files[0][0])
if not files: if not files:
continue continue
@ -1141,12 +1157,15 @@ class AuthSrv(object):
for vp, ap in files for vp, ap in files
] ]
else: else:
msg = ["user {}: {} =>".format(u, files[0][0])] msg = ["user {}, vol {}: {} =>".format(u, vtop, files[0][0])]
msg += [x[1] for x in files] msg += [x[1] for x in files]
self.log("\n".join(msg)) self.log("\n".join(msg))
if n_bads and flag_p: if bads:
self.log("\n ".join(["found symlinks leaving volume:"] + bads))
if bads and flag_p:
raise Exception("found symlink leaving volume, and strict is set") raise Exception("found symlink leaving volume, and strict is set")
if not flag_r: if not flag_r: