local/library/gsettings.py
Kenneth Benzie (Benie) 8e0743cbba Add gsettings module & use it
Disable switch-input-source & switch-input-source-backward keybindings.
2024-07-06 21:02:42 +01:00

147 lines
3.7 KiB
Python

# -*- coding: utf-8 -*-
from typing import Tuple
from ansible.module_utils.basic import AnsibleModule
DOCUMENTATION = """
module: gsettings
author:
- Kenneth Benzie (Benie)
short_description: Ansible module for the gsettings configuration tool
options:
schema:
description:
- Schema ID of the settings to configure.
type: str
key:
description:
- Key of an individaul setting to configure.
type: str
value:
description:
- Value to configure the setting with.
- Mutually exclusive with reset.
type: str
reset:
description:
- Flag to reset the setting to the default value.
- Mutually exclusive with value.
type:
default: false
"""
EXAMPLES = """
- name: get gnome color-scheme current value
gsettings:
schema: org.gnome.desktop.interface
key: color-scheme
register: color_scheme
- debug: msg={{color_scheme.value}}
- name: set gnome color-scheme to 'prefer-dark'
gsettings:
schema: org.gnome.desktop.interface
key: color-scheme
value: "'prefer-dark'"
- name: reset gnome color-scheme to default value
gsettings:
schema: org.gnome.desktop.interface
key: color-scheme
reset: true
"""
RETURN = """
value:
description: Value of the setting.
returned: Returned when there is a value.
type: str
sample: "'default'"
stderr:
description: Error output from gsettings.
returned: Returned when there is an error.
type: str
sample: No such key “doesnt-exist”
"""
class GSettingsError(Exception):
def __init__(self, command, rc, stderr):
self.command = command
self.rc = (rc,)
self.stderr = stderr
def gsettings_get(module: AnsibleModule) -> Tuple[bool, str]:
command = [
"gsettings",
"get",
module.params["schema"],
module.params["key"],
]
rc, stdout, stderr = module.run_command(command)
if rc != 0:
raise GSettingsError(command, rc, stderr)
return False, stdout.rstrip()
def gsettings_set(module: AnsibleModule) -> Tuple[bool, str]:
command = [
"gsettings",
"set",
module.params["schema"],
module.params["key"],
module.params["value"],
]
_, before = gsettings_get(module)
rc, _, stderr = module.run_command(command)
if rc != 0:
raise GSettingsError(command, rc, stderr)
_, after = gsettings_get(module)
return before != after, after
def gsettings_reset(module: AnsibleModule) -> Tuple[bool, str]:
command = [
"gsettings",
"reset",
module.params["schema"],
module.params["key"],
]
_, before = gsettings_get(module)
rc, stdout, stderr = module.run_command(command)
if rc != 0:
raise GSettingsError(command, rc, stderr)
_, after = gsettings_get(module)
return before != after, after
def main() -> None:
module = AnsibleModule(
argument_spec=dict(
schema=dict(type="str"),
key=dict(type="str"),
value=dict(type="str"),
reset=dict(type="bool", default=False),
),
mutually_exclusive=[["value", "reset"]],
required_together=[["schema", "key"]],
)
try:
if module.params["value"]:
changed, value = gsettings_set(module)
elif module.params["reset"]:
changed, value = gsettings_reset(module)
else:
changed, value = gsettings_get(module)
module.exit_json(changed=changed, value=value)
except GSettingsError as error:
module.fail_json(
f"{error.command} failed ({error.rc}): {error.stderr}", stderr=error.stderr
)
if __name__ == "__main__":
main()