From 5775bb2a4e6a779f474b76d0fe43ae0a3f633dd9 Mon Sep 17 00:00:00 2001 From: Kevin Brebanov Date: Thu, 2 Feb 2017 19:51:36 -0500 Subject: [PATCH] apk: Fix regex search patterns Regex patterns were not being escaped properly so package names containing characters that could be interpreted as regex symbols were causing failures. Fixes: #19714 --- lib/ansible/modules/packaging/os/apk.py | 6 ++-- test/units/modules/packaging/os/test_apk.py | 31 +++++++++++++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 test/units/modules/packaging/os/test_apk.py diff --git a/lib/ansible/modules/packaging/os/apk.py b/lib/ansible/modules/packaging/os/apk.py index 2e1084d5373..09ec641694f 100644 --- a/lib/ansible/modules/packaging/os/apk.py +++ b/lib/ansible/modules/packaging/os/apk.py @@ -136,7 +136,7 @@ def query_package(module, name): def query_latest(module, name): cmd = "%s version %s" % (APK_PATH, name) rc, stdout, stderr = module.run_command(cmd, check_rc=False) - search_pattern = "(%s)-[\d\.\w]+-[\d\w]+\s+(.)\s+[\d\.\w]+-[\d\w]+\s+" % (name) + search_pattern = r"(%s)-[\d\.\w]+-[\d\w]+\s+(.)\s+[\d\.\w]+-[\d\w]+\s+" % (re.escape(name)) match = re.search(search_pattern, stdout) if match and match.group(2) == "<": return False @@ -145,7 +145,7 @@ def query_latest(module, name): def query_virtual(module, name): cmd = "%s -v info --description %s" % (APK_PATH, name) rc, stdout, stderr = module.run_command(cmd, check_rc=False) - search_pattern = "^%s: virtual meta package" % (name) + search_pattern = r"^%s: virtual meta package" % (re.escape(name)) if re.search(search_pattern, stdout): return True return False @@ -167,7 +167,7 @@ def upgrade_packages(module): rc, stdout, stderr = module.run_command(cmd, check_rc=False) if rc != 0: module.fail_json(msg="failed to upgrade packages") - if re.search('^OK', stdout): + if re.search(r'^OK', stdout): module.exit_json(changed=False, msg="packages already upgraded") module.exit_json(changed=True, msg="upgraded packages") diff --git a/test/units/modules/packaging/os/test_apk.py b/test/units/modules/packaging/os/test_apk.py new file mode 100644 index 00000000000..20dcd47ff9b --- /dev/null +++ b/test/units/modules/packaging/os/test_apk.py @@ -0,0 +1,31 @@ +from ansible.compat.tests import mock +from ansible.compat.tests import unittest + +from ansible.modules.packaging.os import apk + + +class TestApkQueryLatest(unittest.TestCase): + + def setUp(self): + self.module_names = [ + 'bash', + 'g++', + ] + + @mock.patch('ansible.modules.packaging.os.apk.AnsibleModule') + def test_not_latest(self, mock_module): + apk.APK_PATH = "" + for module_name in self.module_names: + command_output = module_name + '-2.0.0-r1 < 3.0.0-r2 ' + mock_module.run_command.return_value = (0, command_output, None) + command_result = apk.query_latest(mock_module, module_name) + self.assertFalse(command_result) + + @mock.patch('ansible.modules.packaging.os.apk.AnsibleModule') + def test_latest(self, mock_module): + apk.APK_PATH = "" + for module_name in self.module_names: + command_output = module_name + '-2.0.0-r1 = 2.0.0-r1 ' + mock_module.run_command.return_value = (0, command_output, None) + command_result = apk.query_latest(mock_module, module_name) + self.assertTrue(command_result)