mirror of
https://github.com/pjones/plasma-manager.git
synced 2024-10-05 19:58:27 +03:00
Add immutableByDefault option (#225)
This commit is contained in:
parent
d67f2f550a
commit
a3b881f62e
@ -1,4 +1,4 @@
|
|||||||
{ lib, ... }:
|
{ lib, config, ... }:
|
||||||
let
|
let
|
||||||
##############################################################################
|
##############################################################################
|
||||||
# Types for storing settings.
|
# Types for storing settings.
|
||||||
@ -13,7 +13,7 @@ let
|
|||||||
};
|
};
|
||||||
immutable = lib.mkOption {
|
immutable = lib.mkOption {
|
||||||
type = bool;
|
type = bool;
|
||||||
default = false;
|
default = config.programs.plasma.immutableByDefault;
|
||||||
description = ''
|
description = ''
|
||||||
Whether to make the key immutable. This corresponds to adding [$i] to
|
Whether to make the key immutable. This corresponds to adding [$i] to
|
||||||
the end of the key.
|
the end of the key.
|
||||||
|
@ -23,9 +23,10 @@ let
|
|||||||
resetFilesList ++ [ "${config.xdg.dataHome}/plasma-manager/last_run_*" ]
|
resetFilesList ++ [ "${config.xdg.dataHome}/plasma-manager/last_run_*" ]
|
||||||
else
|
else
|
||||||
resetFilesList);
|
resetFilesList);
|
||||||
|
immutableByDefault = (builtins.toString config.programs.plasma.immutableByDefault);
|
||||||
in
|
in
|
||||||
''
|
''
|
||||||
${writeConfigScript}/bin/write_config ${jsonFile} "${resetFilesStr}"
|
${writeConfigScript}/bin/write_config ${jsonFile} "${resetFilesStr}" "${immutableByDefault}"
|
||||||
'';
|
'';
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{ config, lib, pkgs, ... }:
|
{ config, lib, pkgs, ... }:
|
||||||
let
|
let
|
||||||
inherit (import ../../lib/types.nix { inherit lib; }) basicSettingsType;
|
inherit (import ../../lib/types.nix { inherit lib; inherit config; }) basicSettingsType;
|
||||||
|
|
||||||
# used as shown in the example in the library docs:
|
# used as shown in the example in the library docs:
|
||||||
# https://ryantm.github.io/nixpkgs/functions/library/attrsets/#function-library-lib.attrsets.mapAttrs-prime
|
# https://ryantm.github.io/nixpkgs/functions/library/attrsets/#function-library-lib.attrsets.mapAttrs-prime
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
let
|
let
|
||||||
inherit (import ../lib/writeconfig.nix { inherit lib pkgs config; }) writeConfig;
|
inherit (import ../lib/writeconfig.nix { inherit lib pkgs config; }) writeConfig;
|
||||||
inherit (import ../lib/types.nix { inherit lib; }) coercedSettingsType;
|
inherit (import ../lib/types.nix { inherit lib; inherit config; }) coercedSettingsType;
|
||||||
|
|
||||||
# Helper function to prepend the appropriate path prefix (e.g. XDG_CONFIG_HOME) to file
|
# Helper function to prepend the appropriate path prefix (e.g. XDG_CONFIG_HOME) to file
|
||||||
prependPath = prefix: attrset:
|
prependPath = prefix: attrset:
|
||||||
@ -114,6 +114,7 @@ in
|
|||||||
Config-files which explicitly should not be deleted on each generation.
|
Config-files which explicitly should not be deleted on each generation.
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
immutableByDefault = lib.mkEnableOption "Make keys written by plasma-manager immutable by default.";
|
||||||
};
|
};
|
||||||
|
|
||||||
imports = [
|
imports = [
|
||||||
|
@ -138,7 +138,9 @@ class ConfigValue:
|
|||||||
|
|
||||||
|
|
||||||
class KConfManager:
|
class KConfManager:
|
||||||
def __init__(self, filepath: str, json_dict: Dict, reset: bool):
|
def __init__(
|
||||||
|
self, filepath: str, json_dict: Dict, reset: bool, immutable_by_default: bool
|
||||||
|
):
|
||||||
"""
|
"""
|
||||||
filepath (str): The full path to the config-file to manage
|
filepath (str): The full path to the config-file to manage
|
||||||
json_dict (Dict): The nix-configuration presented in a dictionary (converted from json)
|
json_dict (Dict): The nix-configuration presented in a dictionary (converted from json)
|
||||||
@ -148,6 +150,7 @@ class KConfManager:
|
|||||||
self.json_dict = json_dict
|
self.json_dict = json_dict
|
||||||
self.filepath = filepath
|
self.filepath = filepath
|
||||||
self.reset = reset
|
self.reset = reset
|
||||||
|
self.immutable_by_default = immutable_by_default
|
||||||
self._json_value_checks()
|
self._json_value_checks()
|
||||||
# The nix expressions will have / to separate groups, and \/ to escape a /.
|
# The nix expressions will have / to separate groups, and \/ to escape a /.
|
||||||
# This parses the groups into tuples of unescaped group names.
|
# This parses the groups into tuples of unescaped group names.
|
||||||
@ -162,35 +165,32 @@ class KConfManager:
|
|||||||
def _json_value_checks(self):
|
def _json_value_checks(self):
|
||||||
for group, entry in self.json_dict.items():
|
for group, entry in self.json_dict.items():
|
||||||
for key, value in entry.items():
|
for key, value in entry.items():
|
||||||
if value["immutable"] and value["value"] is None:
|
non_default_immutability = (
|
||||||
# We don't allow immutability for keys with no value given (it doesn't make sense).
|
value["immutable"] != self.immutable_by_default
|
||||||
|
)
|
||||||
|
if (
|
||||||
|
value["value"] is None
|
||||||
|
and not value["persistent"]
|
||||||
|
and (non_default_immutability or value["shellExpand"])
|
||||||
|
):
|
||||||
raise Exception(
|
raise Exception(
|
||||||
f'Plasma-manager: Immutability enabled for key "{key}" in group "{group}" in configfile "{self.filepath}"'
|
f'Plasma-manager: No value or persistency set for key "{key}" in group "{group}" in configfile "{self.filepath}"'
|
||||||
" with no value set. Keys without values cannot be declared immutable"
|
", but one of immutability/persistency takes a non-default value. This is not supported"
|
||||||
)
|
|
||||||
if value["shellExpand"] and value["value"] is None:
|
|
||||||
# We don't allow immutability for keys with no value given (it doesn't make sense).
|
|
||||||
raise Exception(
|
|
||||||
f'Plasma-manager: Shell-expansion enabled for key "{key}" in group "{group}" in configfile "{self.filepath}"'
|
|
||||||
" with no value set. Keys without values cannot have shell-expansion enabled"
|
|
||||||
)
|
)
|
||||||
elif value["persistent"]:
|
elif value["persistent"]:
|
||||||
base_msg = f'Plasma-manager: Persistency enabled for key "{key}" in group "{group}" in configfile "{self.filepath}"'
|
base_msg = f'Plasma-manager: Persistency enabled for key "{key}" in group "{group}" in configfile "{self.filepath}"'
|
||||||
# We don't allow persistency when the value is set,
|
|
||||||
# immutability is enabled, or when shell-expansion is
|
|
||||||
# enabled.
|
|
||||||
if value["value"] is not None:
|
if value["value"] is not None:
|
||||||
raise Exception(
|
raise Exception(
|
||||||
f"{base_msg} with non-null value \"{value['value']}\". "
|
f"{base_msg} with non-null value \"{value['value']}\". "
|
||||||
"A value cannot be given when persistency is enabled"
|
"A value cannot be given when persistency is enabled"
|
||||||
)
|
)
|
||||||
elif value["immutable"]:
|
elif non_default_immutability:
|
||||||
raise Exception(
|
raise Exception(
|
||||||
f"{base_msg} with immutability enabled. Persistency and immutability cannot both be enabled"
|
f"{base_msg} with non-default immutability. Persistency with non-default immutability is not supported"
|
||||||
)
|
)
|
||||||
elif value["shellExpand"]:
|
elif value["shellExpand"]:
|
||||||
raise Exception(
|
raise Exception(
|
||||||
f"{base_msg} with shell-expansion enabled. Persistency and shell-expansion cannot both be enabled"
|
f"{base_msg} with shell-expansion enabled. Persistency with shell-expansion enabled is not supported"
|
||||||
)
|
)
|
||||||
|
|
||||||
def key_is_persistent(self, group, key) -> bool:
|
def key_is_persistent(self, group, key) -> bool:
|
||||||
@ -308,15 +308,17 @@ def remove_config_files(d: Dict, reset_files: Set):
|
|||||||
os.remove(file_to_del)
|
os.remove(file_to_del)
|
||||||
|
|
||||||
|
|
||||||
def write_configs(d: Dict, reset_files: Set):
|
def write_configs(d: Dict, reset_files: Set, immutable_by_default: bool):
|
||||||
for filepath, c in d.items():
|
for filepath, c in d.items():
|
||||||
config = KConfManager(filepath, c, filepath in reset_files)
|
config = KConfManager(
|
||||||
|
filepath, c, filepath in reset_files, immutable_by_default
|
||||||
|
)
|
||||||
config.run()
|
config.run()
|
||||||
config.save()
|
config.save()
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
if len(sys.argv) != 3:
|
if len(sys.argv) != 4:
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
f"Must receive exactly two arguments, got: {len(sys.argv) - 1}"
|
f"Must receive exactly two arguments, got: {len(sys.argv) - 1}"
|
||||||
)
|
)
|
||||||
@ -325,10 +327,11 @@ def main():
|
|||||||
with open(json_path, "r") as f:
|
with open(json_path, "r") as f:
|
||||||
json_str = f.read()
|
json_str = f.read()
|
||||||
|
|
||||||
reset_files = set(sys.argv[2].split(" ")) if len(sys.argv) >= 2 else {}
|
reset_files = set(sys.argv[2].split(" ")) if sys.argv[2] != "" else set()
|
||||||
|
immutable_by_default = bool(sys.argv[3])
|
||||||
d = json.loads(json_str)
|
d = json.loads(json_str)
|
||||||
remove_config_files(d, reset_files)
|
remove_config_files(d, reset_files)
|
||||||
write_configs(d, reset_files)
|
write_configs(d, reset_files, immutable_by_default)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
Loading…
Reference in New Issue
Block a user