#!/usr/bin/python # -*- coding: utf-8 -*- # (c) 2021, Alexei Znamensky # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) from __future__ import absolute_import, division, print_function __metaclass__ = type DOCUMENTATION = ''' module: xfconf_info author: - "Alexei Znamensky (@russoz)" short_description: Retrieve XFCE4 configurations version_added: 3.5.0 description: - This module allows retrieving Xfce 4 configurations with the help of C(xfconf-query). options: channel: description: - > A Xfconf preference channel is a top-level tree key, inside of the Xfconf repository that corresponds to the location for which all application properties/keys are stored. - If not provided, the module will list all available channels. type: str property: description: - > A Xfce preference key is an element in the Xfconf repository that corresponds to an application preference. - If provided, then I(channel) is required. - If not provided and a I(channel) is provided, then the module will list all available properties in that I(channel). type: str notes: - See man xfconf-query(1) for more details. ''' EXAMPLES = """ - name: Get list of all available channels community.general.xfconf_info: {} register: result - name: Get list of all properties in a specific channel community.general.xfconf_info: channel: xsettings register: result - name: Retrieve the DPI value community.general.xfconf_info: channel: xsettings property: /Xft/DPI register: result - name: Get workspace names (4) community.general.xfconf_info: channel: xfwm4 property: /general/workspace_names register: result """ RETURN = ''' channels: description: - List of available channels. - Returned when the module receives no parameter at all. returned: success type: list elements: str sample: - xfce4-desktop - displays - xsettings - xfwm4 properties: description: - List of available properties for a specific channel. - Returned by passed only the I(channel) parameter to the module. returned: success type: list elements: str sample: - /Gdk/WindowScalingFactor - /Gtk/ButtonImages - /Gtk/CursorThemeSize - /Gtk/DecorationLayout - /Gtk/FontName - /Gtk/MenuImages - /Gtk/MonospaceFontName - /Net/DoubleClickTime - /Net/IconThemeName - /Net/ThemeName - /Xft/Antialias - /Xft/Hinting - /Xft/HintStyle - /Xft/RGBA is_array: description: - Flag indicating whether the property is an array or not. returned: success type: bool value: description: - The value of the property. Empty if the property is of array type. returned: success type: str sample: Monospace 10 value_array: description: - The array value of the property. Empty if the property is not of array type. returned: success type: list elements: str sample: - Main - Work - Tmp ''' from ansible_collections.community.general.plugins.module_utils.module_helper import CmdModuleHelper, ArgFormat class XFConfException(Exception): pass class XFConfInfo(CmdModuleHelper): module = dict( argument_spec=dict( channel=dict(type='str'), property=dict(type='str'), ), required_by=dict( property=['channel'] ), supports_check_mode=True, ) command = 'xfconf-query' command_args_formats = dict( channel=dict(fmt=['--channel', '{0}']), property=dict(fmt=['--property', '{0}']), _list_arg=dict(fmt="--list", style=ArgFormat.BOOLEAN), ) check_rc = True def __init_module__(self): self.vars.set("_list_arg", False, output=False) self.vars.set("is_array", False) def process_command_output(self, rc, out, err): result = out.rstrip() if "Value is an array with" in result: result = result.split("\n") result.pop(0) result.pop(0) self.vars.is_array = True return result def _process_list_properties(self, rc, out, err): return out.splitlines() def _process_list_channels(self, rc, out, err): lines = out.splitlines() lines.pop(0) lines = [s.lstrip() for s in lines] return lines def __run__(self): self.vars._list_arg = not (bool(self.vars.channel) and bool(self.vars.property)) output = 'value' proc = self.process_command_output if self.vars.channel is None: output = 'channels' proc = self._process_list_channels elif self.vars.property is None: output = 'properties' proc = self._process_list_properties result = self.run_command(params=('_list_arg', 'channel', 'property'), process_output=proc) if not self.vars._list_arg and self.vars.is_array: output = "value_array" self.vars.set(output, result) def main(): xfconf = XFConfInfo() xfconf.run() if __name__ == '__main__': main()