def METHOD_NAME(self, isadd: bool, isuser: bool, who: str) -> None:
    """
    Modify the acls for Cobbler on the filesystem.
    :param isadd: If true then the ``who`` will be added. If false then ``who`` will be removed.
    :param isuser: If true then the ``who`` may be a user. If false then ``who`` may be a group.
    :param who: The user or group to be added or removed.
    """
    snipdir = self.settings.autoinstall_snippets_dir
    tftpboot = self.settings.tftpboot_location
    process_dirs = {
        "/var/log/cobbler": "rwx",
        "/var/log/cobbler/tasks": "rwx",
        "/var/lib/cobbler": "rwx",
        "/etc/cobbler": "rwx",
        tftpboot: "rwx",
        "/var/lib/cobbler/triggers": "rwx",
    }
    if not snipdir.startswith("/var/lib/cobbler/"):
        process_dirs[snipdir] = "r"
    for (directory, how) in process_dirs.items():
        cmd = [
            "setfacl",
            "-d",
            "-R",
            "-m" if isadd else "-x",
            f"u:{who}" if isuser else f"g:{who}",
            directory,
        ]
        if isadd:
            cmd[4] = f"{cmd[4]}:{how}"
        # We must pass in a copy of list because in case the call is async we
        # would modify the call that maybe has not been done. We don't do this
        # yet but let's be sure. Also, the tests would break if we don't pass a copy.
        setfacl_reset_return_code = utils.subprocess_call(cmd.copy(), shell=False)
        if setfacl_reset_return_code != 0:
            utils.die(f'"setfacl" command failed for "{directory}"')
        cmd.pop(1)
        setfacl_return_code = utils.subprocess_call(cmd.copy(), shell=False)
        if setfacl_return_code != 0:
            utils.die(f'"setfacl" command failed for "{directory}"')