From 50064e1057f37bb4397e1ffa5270c5435ab98098 Mon Sep 17 00:00:00 2001 From: Jonathan Kamens Date: Fri, 24 Feb 2023 03:10:41 -0500 Subject: [PATCH] nmcli: two fixes needed to make wifi.wake-on-wlan settings work properly (#5431) * nmcli: Convert current value of wifi.wake-on-wlan before comparing The new value of wifi.wake-on-wlan is specified as an integer, but in the nmcli output it's specified as a hex string followed by a textual description of it. Therefore, to determine properly whether it's being changed we need to pull the hex string out of the current value, convert it into an integer, and finally convert the integer back to a string so that we can compare it to the new specified value. Without this change, whenever wifi.wake-on-wlan is specified in the module arguments the module will think the value is being changed even when it isn't. * nmcli: Handle wifi options correctly when connection type not specified When an nmcli task does not specify the connection type and the module ask nmcli for it, the module needs to convert nmcli's `802-11-wireless` to `wifi`, the term for this connection type used by the module. * nmcli: Correctly detect values changed to the integer 0 If the user specifies a value of 0 (without quotes) in a task, we should interpret that as an actual value, not empty, when comparing the new value to the old one. Otherwise we incorrectly conclude that there was no change. * Changelog fragment for #5431 (cherry picked from commit 490899f87faee52e3f300533f6ae9a2c150103e6) --- changelogs/fragments/5431-nmcli-wifi.yml | 4 ++++ plugins/modules/net_tools/nmcli.py | 11 ++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 changelogs/fragments/5431-nmcli-wifi.yml diff --git a/changelogs/fragments/5431-nmcli-wifi.yml b/changelogs/fragments/5431-nmcli-wifi.yml new file mode 100644 index 00000000000..0f6f4edde52 --- /dev/null +++ b/changelogs/fragments/5431-nmcli-wifi.yml @@ -0,0 +1,4 @@ +bugfixes: + - nmcli - fix failure to handle WIFI settings when connection type not specified (https://github.com/ansible-collections/community.general/pull/5431). + - nmcli - fix improper detection of changes to ``wifi.wake-on-wlan`` (https://github.com/ansible-collections/community.general/pull/5431). + - nmcli - fix change handling of values specified as an integer 0 (https://github.com/ansible-collections/community.general/pull/5431). diff --git a/plugins/modules/net_tools/nmcli.py b/plugins/modules/net_tools/nmcli.py index aa2ddafe1d4..51523b32442 100644 --- a/plugins/modules/net_tools/nmcli.py +++ b/plugins/modules/net_tools/nmcli.py @@ -2100,11 +2100,18 @@ def _compare_conn_params(self, conn_info, options): diff_after = dict() for key, value in options.items(): - if not value: + # We can't just do `if not value` because then if there's a value + # of 0 specified as an integer it'll be interpreted as empty when + # it actually isn't. + if value != 0 and not value: continue if key in conn_info: current_value = conn_info[key] + if key == '802-11-wireless.wake-on-wlan' and current_value is not None: + match = re.match('0x([0-9A-Fa-f]+)', current_value) + if match: + current_value = str(int(match.group(1), 16)) if key in ('ipv4.routes', 'ipv6.routes') and current_value is not None: current_value = self.get_route_params(current_value) if key == self.mac_setting: @@ -2160,6 +2167,8 @@ def is_connection_changed(self): if not self.type: current_con_type = self.show_connection().get('connection.type') if current_con_type: + if current_con_type == '802-11-wireless': + current_con_type = 'wifi' self.type = current_con_type options.update(self.connection_options(detect_change=True))