def winacl_reset(self, path, owner=None, group=None, exclude=None, recursive=True): if exclude is None: exclude = [] if isinstance(owner, bytes): owner = owner.decode('utf-8') if isinstance(group, bytes): group = group.decode('utf-8') if isinstance(path, bytes): path = path.decode('utf-8') aclfile = os.path.join(path, ACL_WINDOWS_FILE) if not os.path.exists(aclfile): open(aclfile, 'a').close() winacl = "/usr/local/bin/winacl" args = "-a reset" if owner is not None: args = "%s -O '%s'" % (args, owner) if group is not None: args = "%s -G '%s'" % (args, group) apply_paths = exclude_path(path, exclude) apply_paths = [(y, f' {"-r " if recursive else ""}') for y in apply_paths] if len(apply_paths) > 1: apply_paths.insert(0, (path, '')) for apath, flags in apply_paths: fargs = args + "%s -p '%s'" % (flags, apath) cmd = "%s %s" % (winacl, fargs) log.debug("winacl_reset: cmd = %s", cmd) self._system(cmd)
def mp_change_permission(self, path='/mnt', user=None, group=None, mode=None, recursive=False, acl='unix', exclude=None): if exclude is None: exclude = [] if isinstance(group, bytes): group = group.decode('utf-8') if isinstance(user, bytes): user = user.decode('utf-8') if isinstance(mode, bytes): mode = mode.decode('utf-8') if isinstance(path, bytes): path = path.decode('utf-8') winacl = os.path.join(path, ACL_WINDOWS_FILE) macacl = os.path.join(path, ACL_MAC_FILE) winexists = os.path.exists(winacl) with libzfs.ZFS() as zfs: zfs_dataset_name = zfs.get_dataset_by_path(path).name if acl == 'windows': if not winexists: open(winacl, 'a').close() winexists = True if os.path.isfile(macacl): os.unlink(macacl) elif acl == 'mac': if winexists: os.unlink(winacl) if not os.path.isfile(macacl): open(macacl, 'a').close() elif acl == 'unix': if winexists: os.unlink(winacl) winexists = False if os.path.isfile(macacl): os.unlink(macacl) if winexists: self.zfs_set_option(zfs_dataset_name, "aclmode", "restricted", recursive) script = "/usr/local/bin/winacl" args = '' if user is not None: args += " -O '%s'" % user if group is not None: args += " -G '%s'" % group args += " -a reset " if recursive: apply_paths = exclude_path(path, exclude) apply_paths = [(y, ' -r ') for y in apply_paths] if len(apply_paths) > 1: apply_paths.insert(0, (path, '')) else: apply_paths = [(path, '')] for apath, flags in apply_paths: fargs = args + "%s -p '%s'" % (flags, apath) cmd = "%s %s" % (script, fargs) log.debug("XXX: CMD = %s", cmd) self._system(cmd) else: self.zfs_set_option(zfs_dataset_name, "aclmode", "passthrough", recursive) if recursive: apply_paths = exclude_path(path, exclude) apply_paths = [(y, '-R') for y in apply_paths] if len(apply_paths) > 1: apply_paths.insert(0, (path, '')) else: apply_paths = [(path, '')] for apath, flags in apply_paths: if user is not None and group is not None: self._system("/usr/sbin/chown %s '%s':'%s' '%s'" % (flags, user, group, apath)) elif user is not None: self._system("/usr/sbin/chown %s '%s' '%s'" % (flags, user, apath)) elif group is not None: self._system("/usr/sbin/chown %s :'%s' '%s'" % (flags, group, apath)) if mode is not None: self._system("/bin/chmod %s %s '%s'" % (flags, mode, apath))