ansible-core 2.14.13__py3-none-any.whl → 2.14.14__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of ansible-core might be problematic. Click here for more details.

ansible/galaxy/role.py CHANGED
@@ -42,6 +42,7 @@ from ansible.module_utils.compat.version import LooseVersion
42
42
  from ansible.module_utils.urls import open_url
43
43
  from ansible.playbook.role.requirement import RoleRequirement
44
44
  from ansible.utils.display import Display
45
+ from ansible.utils.path import is_subpath, unfrackpath
45
46
 
46
47
  display = Display()
47
48
 
@@ -393,43 +394,41 @@ class GalaxyRole(object):
393
394
  # we only extract files, and remove any relative path
394
395
  # bits that might be in the file for security purposes
395
396
  # and drop any containing directory, as mentioned above
396
- if member.isreg() or member.issym():
397
- for attr in ('name', 'linkname'):
398
- attr_value = getattr(member, attr, None)
399
- if not attr_value:
400
- continue
401
- n_attr_value = to_native(attr_value)
402
- n_archive_parent_dir = to_native(archive_parent_dir)
403
- n_parts = n_attr_value.replace(n_archive_parent_dir, "", 1).split(os.sep)
404
- n_final_parts = []
405
- for n_part in n_parts:
406
- # TODO if the condition triggers it produces a broken installation.
407
- # It will create the parent directory as an empty file and will
408
- # explode if the directory contains valid files.
409
- # Leaving this as is since the whole module needs a rewrite.
410
- #
411
- # Check if we have any files with illegal names,
412
- # and display a warning if so. This could help users
413
- # to debug a broken installation.
414
- if not n_part:
415
- continue
416
- if n_part == '..':
417
- display.warning(f"Illegal filename '{n_part}': '..' is not allowed")
418
- continue
419
- if n_part.startswith('~'):
420
- display.warning(f"Illegal filename '{n_part}': names cannot start with '~'")
421
- continue
422
- if '$' in n_part:
423
- display.warning(f"Illegal filename '{n_part}': names cannot contain '$'")
424
- continue
425
- n_final_parts.append(n_part)
426
- setattr(member, attr, os.path.join(*n_final_parts))
427
-
428
- if _check_working_data_filter():
429
- # deprecated: description='extract fallback without filter' python_version='3.11'
430
- role_tar_file.extract(member, to_native(self.path), filter='data') # type: ignore[call-arg]
397
+ if not (member.isreg() or member.issym()):
398
+ continue
399
+
400
+ for attr in ('name', 'linkname'):
401
+ if not (attr_value := getattr(member, attr, None)):
402
+ continue
403
+
404
+ if attr_value.startswith(os.sep) and not is_subpath(attr_value, archive_parent_dir):
405
+ err = f"Invalid {attr} for tarfile member: path {attr_value} is not a subpath of the role {archive_parent_dir}"
406
+ raise AnsibleError(err)
407
+
408
+ if attr == 'linkname':
409
+ # Symlinks are relative to the link
410
+ relative_to_archive_dir = os.path.dirname(getattr(member, 'name', ''))
411
+ archive_dir_path = os.path.join(archive_parent_dir, relative_to_archive_dir, attr_value)
431
412
  else:
432
- role_tar_file.extract(member, to_native(self.path))
413
+ # Normalize paths that start with the archive dir
414
+ attr_value = attr_value.replace(archive_parent_dir, "", 1)
415
+ attr_value = os.path.join(*attr_value.split(os.sep)) # remove leading os.sep
416
+ archive_dir_path = os.path.join(archive_parent_dir, attr_value)
417
+
418
+ resolved_archive = unfrackpath(archive_parent_dir)
419
+ resolved_path = unfrackpath(archive_dir_path)
420
+ if not is_subpath(resolved_path, resolved_archive):
421
+ err = f"Invalid {attr} for tarfile member: path {resolved_path} is not a subpath of the role {resolved_archive}"
422
+ raise AnsibleError(err)
423
+
424
+ relative_path = os.path.join(*resolved_path.replace(resolved_archive, "", 1).split(os.sep)) or '.'
425
+ setattr(member, attr, relative_path)
426
+
427
+ if _check_working_data_filter():
428
+ # deprecated: description='extract fallback without filter' python_version='3.11'
429
+ role_tar_file.extract(member, to_native(self.path), filter='data') # type: ignore[call-arg]
430
+ else:
431
+ role_tar_file.extract(member, to_native(self.path))
433
432
 
434
433
  # write out the install info file for later use
435
434
  self._write_galaxy_install_info()
@@ -19,6 +19,6 @@
19
19
  from __future__ import (absolute_import, division, print_function)
20
20
  __metaclass__ = type
21
21
 
22
- __version__ = '2.14.13'
22
+ __version__ = '2.14.14'
23
23
  __author__ = 'Ansible, Inc.'
24
24
  __codename__ = "C'mon Everybody"
@@ -41,7 +41,7 @@ seealso:
41
41
  - module: ansible.builtin.import_tasks
42
42
  - module: ansible.builtin.include_role
43
43
  - module: ansible.builtin.include_tasks
44
- - ref: playbooks_reuse_includes
44
+ - ref: playbooks_reuse
45
45
  description: More information related to including and importing playbooks, roles and tasks.
46
46
  '''
47
47
 
@@ -78,7 +78,7 @@ seealso:
78
78
  - module: ansible.builtin.import_tasks
79
79
  - module: ansible.builtin.include_role
80
80
  - module: ansible.builtin.include_tasks
81
- - ref: playbooks_reuse_includes
81
+ - ref: playbooks_reuse
82
82
  description: More information related to including and importing playbooks, roles and tasks.
83
83
  '''
84
84
 
@@ -45,7 +45,7 @@ seealso:
45
45
  - module: ansible.builtin.import_role
46
46
  - module: ansible.builtin.include_role
47
47
  - module: ansible.builtin.include_tasks
48
- - ref: playbooks_reuse_includes
48
+ - ref: playbooks_reuse
49
49
  description: More information related to including and importing playbooks, roles and tasks.
50
50
  '''
51
51
 
@@ -91,7 +91,7 @@ seealso:
91
91
  - module: ansible.builtin.import_role
92
92
  - module: ansible.builtin.import_tasks
93
93
  - module: ansible.builtin.include_tasks
94
- - ref: playbooks_reuse_includes
94
+ - ref: playbooks_reuse
95
95
  description: More information related to including and importing playbooks, roles and tasks.
96
96
  '''
97
97
 
@@ -49,7 +49,7 @@ seealso:
49
49
  - module: ansible.builtin.import_role
50
50
  - module: ansible.builtin.import_tasks
51
51
  - module: ansible.builtin.include_role
52
- - ref: playbooks_reuse_includes
52
+ - ref: playbooks_reuse
53
53
  description: More information related to including and importing playbooks, roles and tasks.
54
54
  '''
55
55
 
ansible/playbook/base.py CHANGED
@@ -722,7 +722,7 @@ class Base(FieldAttributeBase):
722
722
 
723
723
  # flags and misc. settings
724
724
  environment = FieldAttribute(isa='list', extend=True, prepend=True)
725
- no_log = FieldAttribute(isa='bool')
725
+ no_log = FieldAttribute(isa='bool', default=C.DEFAULT_NO_LOG)
726
726
  run_once = FieldAttribute(isa='bool')
727
727
  ignore_errors = FieldAttribute(isa='bool')
728
728
  ignore_unreachable = FieldAttribute(isa='bool')
@@ -320,10 +320,6 @@ class PlayContext(Base):
320
320
  display.warning('The "%s" connection plugin has an improperly configured remote target value, '
321
321
  'forcing "inventory_hostname" templated value instead of the string' % new_info.connection)
322
322
 
323
- # set no_log to default if it was not previously set
324
- if new_info.no_log is None:
325
- new_info.no_log = C.DEFAULT_NO_LOG
326
-
327
323
  if task.check_mode is not None:
328
324
  new_info.check_mode = task.check_mode
329
325
 
ansible/release.py CHANGED
@@ -19,6 +19,6 @@
19
19
  from __future__ import (absolute_import, division, print_function)
20
20
  __metaclass__ = type
21
21
 
22
- __version__ = '2.14.13'
22
+ __version__ = '2.14.14'
23
23
  __author__ = 'Ansible, Inc.'
24
24
  __codename__ = "C'mon Everybody"
@@ -53,6 +53,10 @@
53
53
  from __future__ import (absolute_import, division, print_function)
54
54
  __metaclass__ = type
55
55
 
56
+ import sys
57
+ import types
58
+ import warnings
59
+ from sys import intern as _sys_intern
56
60
  from collections.abc import Mapping, Set
57
61
 
58
62
  from ansible.module_utils._text import to_bytes, to_text
@@ -369,3 +373,20 @@ def to_unsafe_text(*args, **kwargs):
369
373
 
370
374
  def _is_unsafe(obj):
371
375
  return getattr(obj, '__UNSAFE__', False) is True
376
+
377
+
378
+ def _intern(string):
379
+ """This is a monkey patch for ``sys.intern`` that will strip
380
+ the unsafe wrapper prior to interning the string.
381
+
382
+ This will not exist in future versions.
383
+ """
384
+ if isinstance(string, AnsibleUnsafeText):
385
+ string = string._strip_unsafe()
386
+ return _sys_intern(string)
387
+
388
+
389
+ if isinstance(sys.intern, types.BuiltinFunctionType):
390
+ sys.intern = _intern
391
+ else:
392
+ warnings.warn("skipped sys.intern patch; appears to have already been patched", RuntimeWarning)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ansible-core
3
- Version: 2.14.13
3
+ Version: 2.14.14
4
4
  Summary: Radically simple IT automation
5
5
  Home-page: https://ansible.com/
6
6
  Author: Ansible, Inc.
@@ -3,7 +3,7 @@ ansible/__main__.py,sha256=IvyRvY64pT0on94qCLibxgDJ0-7_2CRoaZ5kfGOl54Q,1395
3
3
  ansible/constants.py,sha256=JLIDnuSz3_PbtXWsL4vnvVBbxlh3lSrJREd7T73atEI,8293
4
4
  ansible/context.py,sha256=OzSlaA_GgGRyyf5I209sy19_eGOX6HXn441W9w_FcvU,2018
5
5
  ansible/keyword_desc.yml,sha256=FYY0Ld1Xc3AxJ_Tefz78kRSYzIKGS8qcPtVk370J118,7367
6
- ansible/release.py,sha256=clCalbjvkJZVocBO0ImaFu7Iy0o1810uCUMbf8KhlHU,920
6
+ ansible/release.py,sha256=eCLw_ZAHW8derz7BhfelrnhXKKU3VLP06buBoteirg8,920
7
7
  ansible/_vendor/__init__.py,sha256=wJRKH7kI9OzYVY9hgSchOsTNTmTnugpPLGYj9Y5akX0,2086
8
8
  ansible/cli/__init__.py,sha256=yDt8_ny7HauC9Aj-MMHQr3Y6gDQADfdEU0O1BfzkSwA,27957
9
9
  ansible/cli/adhoc.py,sha256=pGW6eysaireovp4sVsUuntg-l1o7DSujuhxVhVC2zsM,8230
@@ -56,7 +56,7 @@ ansible/executor/process/__init__.py,sha256=1lMXN1i2fFqslda4BmeI5tpYMFP95D5Wpr1A
56
56
  ansible/executor/process/worker.py,sha256=mO9-GR7bDVxgDh65ROBhEBNg8qb9FWkkaP1vb_sklxY,8843
57
57
  ansible/galaxy/__init__.py,sha256=_ccTedn8dUGGtkmHcQLIkeje_YD0TYSXlvCl1AOY5fE,2533
58
58
  ansible/galaxy/api.py,sha256=deSYsFinaJodT2Y9-XnOerWIwYY8V2AWQ_9kZI0pWCE,39872
59
- ansible/galaxy/role.py,sha256=6pK3to7HhD4z2KfRfxklIGVLIK3p5ld8zuIFFKRGfSo,21623
59
+ ansible/galaxy/role.py,sha256=g7vPiT4IWpsXHP3Z5g9L4Y0lxfRbrRXixewAIN-XgRk,21379
60
60
  ansible/galaxy/token.py,sha256=K0dAwD3Fjkn3Zs2N9sG98UesSWfAukie47QGyYpIf0M,6167
61
61
  ansible/galaxy/user_agent.py,sha256=x7cJzzpnTngHcwqSUd2hg0i28Dv0tbAyBdke5CSiNhM,813
62
62
  ansible/galaxy/collection/__init__.py,sha256=GnhmFRCktOQK3p6lFr-pupxeEMOG09HPJLujyruIx-I,75744
@@ -139,7 +139,7 @@ ansible/inventory/host.py,sha256=wXJp6kpSaZtDr4JNsgdAuhi5MzQ9LTQzaAH10zoVbIA,505
139
139
  ansible/inventory/manager.py,sha256=tGwhBR6poLuG_i4jZ5RGOG-rH4gu4DBfT0-4iLLZZMs,29490
140
140
  ansible/module_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
141
141
  ansible/module_utils/_text.py,sha256=VCjTJovTxGfLahnzyrvOehpwTXLpRzMUug6wheirt4A,565
142
- ansible/module_utils/ansible_release.py,sha256=clCalbjvkJZVocBO0ImaFu7Iy0o1810uCUMbf8KhlHU,920
142
+ ansible/module_utils/ansible_release.py,sha256=eCLw_ZAHW8derz7BhfelrnhXKKU3VLP06buBoteirg8,920
143
143
  ansible/module_utils/api.py,sha256=BTo7stVOANbtd-ngZslaqx70r9t5gfvo44cKyu5SFjU,5837
144
144
  ansible/module_utils/basic.py,sha256=dGTJD-84x2a0hqKgoqB6PNhjmOEqYuuf2EgWyX5zVC8,86621
145
145
  ansible/module_utils/connection.py,sha256=XHxMlyAdwLiXDSo8jBMkV61-lz_0FDJUYH1B152UGJU,8430
@@ -303,11 +303,11 @@ ansible/modules/git.py,sha256=Da1dyZazvethGEfDO61mly1gJhwlak678B5d-V5hZ2I,56545
303
303
  ansible/modules/group.py,sha256=Q3Psaq4aS8tbdL2XvrFivaFp5jVmaLYg3GZzNwPL0Cg,20040
304
304
  ansible/modules/group_by.py,sha256=moe6dJFQ9c9Q39kQkAgq3fpq61kzKpWOM33tljrFqM0,2467
305
305
  ansible/modules/hostname.py,sha256=BW47SL8_oTH9eZz8dX6-jA7sBMQr_n0D8LHCHSQD94I,28795
306
- ansible/modules/import_playbook.py,sha256=xDtdGpAdCah-0mfnDDoFxMMmR2oTx01P6ua6QFztkBQ,2116
307
- ansible/modules/import_role.py,sha256=JT9Vp1Tm5KgwyFXYF_g7Eae2LyNkMisQuVJ_wHBfP0o,3354
308
- ansible/modules/import_tasks.py,sha256=6HGZ_g9VWSTU01qhLC7F3Y0hZIIOJ5ZUBDOoXf_jv2M,2197
309
- ansible/modules/include_role.py,sha256=lSMVbXRlVBEPXr23cyAiJOXaMrxx_lqFPEIi0MV1knc,4260
310
- ansible/modules/include_tasks.py,sha256=H6hryVC1sYayj6UuXWluyVzEbd7O0qT8Vps4SKwz8n4,2712
306
+ ansible/modules/import_playbook.py,sha256=2Ekq8SsYeIOyrwIpt6822xv2ZHRBqe4QNToLOACRDYU,2107
307
+ ansible/modules/import_role.py,sha256=ybsJfXKKxW-Gncs_gIAE32JP2FfZxrbavqp6-lrGg-k,3345
308
+ ansible/modules/import_tasks.py,sha256=K28dgE-ENrPYCkfhwHX92nMFrGZ92RPv6zBKv4u16l8,2188
309
+ ansible/modules/include_role.py,sha256=FIe2GRhrChllGXMnDj3ffY7TFUH-YSrczjdC5MVGt5M,4251
310
+ ansible/modules/include_tasks.py,sha256=E6h6QHoBVVud_4-z5n_mOqs04988dccQWs4Isk8jkP8,2703
311
311
  ansible/modules/include_vars.py,sha256=pDM_E0L3VMPh-MB69SzyoykAKG7C22DXzVTlvPYunh4,6609
312
312
  ansible/modules/iptables.py,sha256=YcLC8tfoRmVdhzEaUUBBJ5IZI9THqwdKI2ypppNFBK8,33048
313
313
  ansible/modules/known_hosts.py,sha256=i1SA88gqAIb_fSrMT0MB4W1tkk4rRVHt9ohXlYFCMKE,13819
@@ -364,7 +364,7 @@ ansible/parsing/yaml/loader.py,sha256=mYJ5c8WgwKlc5a8dv8mcPwMMifOY0cJrKiAqaRIWPu
364
364
  ansible/parsing/yaml/objects.py,sha256=BNu1ZwbTBKklyCuAz_KCaidMgbL5Qw6IBTwH4NNNP5k,10561
365
365
  ansible/playbook/__init__.py,sha256=Q_R_9VslOm6SKFnj42CwaBPTtd4y2aQm2ExCKGHnQtE,4807
366
366
  ansible/playbook/attribute.py,sha256=4z2_otPvKiacjd049sF4d7I2KowK6l7BakXGzSr6L0s,7766
367
- ansible/playbook/base.py,sha256=4RTDVbskJ6ghnsrtYtqf7uJ4VinGkU-ExJdDPkD8G2s,33534
367
+ ansible/playbook/base.py,sha256=6oE0Qt4Wch3M-x972U7KugIZYWjXynQapZs4yi0vo5o,33560
368
368
  ansible/playbook/block.py,sha256=8lv2qNsSiIBm6HlIH5P3j16Q7aKCRN0wSrtggoq4DHs,16787
369
369
  ansible/playbook/collectionsearch.py,sha256=dfTz79Af_3iurr0YZDcNWsAffaRlbrffXz_KZ3xZlpQ,2654
370
370
  ansible/playbook/conditional.py,sha256=qX5WvYFDGjXtsiWoN_VC4oVuEh97_5kbKdoJvPLwsuU,10128
@@ -374,7 +374,7 @@ ansible/playbook/helpers.py,sha256=jotNlRQmN4SoHpbuMv0Mx_pfVjIjAGpf3TYwc9Iw7xQ,1
374
374
  ansible/playbook/included_file.py,sha256=r3A19Iy_9BtUBfIMeZL_Ep755MfkzVJAYE3uSvHc4KA,11591
375
375
  ansible/playbook/loop_control.py,sha256=BJv5j6jFNo_M5nK6HaXCsNdaM-JClMcCv9D21TCRku4,1764
376
376
  ansible/playbook/play.py,sha256=CI6pJarF19Mcc7vAeGsgBSPXRH4x2jzXF3kPXTF7pOE,15717
377
- ansible/playbook/play_context.py,sha256=1YK_3nV5OPY8vnqiuC1JWb640KitWZaATSMEAUpylcs,14710
377
+ ansible/playbook/play_context.py,sha256=i5VD5tzL_w5CC47L0oLc1Eearf_Xx12PFzGHqHnXZYU,14565
378
378
  ansible/playbook/playbook_include.py,sha256=QK6rccZUtKra60_VvF0Cd4LZ9yaH_t4Sq9evmald6jA,7565
379
379
  ansible/playbook/role_include.py,sha256=F5gpKxdkJunyuxLTRUxMbiRujZUTlaFl02WnSvU8lEE,7904
380
380
  ansible/playbook/taggable.py,sha256=7pCyNHhAs2TBTV6h4LT9gd9v2syY_gJZqg5x6p0w9C4,3169
@@ -660,7 +660,7 @@ ansible/utils/shlex.py,sha256=OMoMe9Kd5Ck3LLiiL87OixmYt4Qf3hpiphseg6rwX1Q,1279
660
660
  ansible/utils/singleton.py,sha256=fzXOd2ql_zrjCmnWR8Qx2WF_lmO5A8r46U81v7tePSo,949
661
661
  ansible/utils/ssh_functions.py,sha256=GpLSJC-vDj5YyTHN48QaSUpuwAsaDb1oS4tbyVTRKgU,2282
662
662
  ansible/utils/unicode.py,sha256=aJoGG4GCriSxk6mD8pHLgHrnmbU9C5aIyAVyucwWaFk,1167
663
- ansible/utils/unsafe_proxy.py,sha256=3bvsVCfqbxr1aJW3cYO3f8JL2G0qB5lgT9SQG4ioUvE,12156
663
+ ansible/utils/unsafe_proxy.py,sha256=-3GKHvmPvW-EHF1Df212rHnp4HUD7rb4D_ysJhbuo30,12733
664
664
  ansible/utils/vars.py,sha256=uNLgZKzkxKvw_fNVB0H4mHZR3mUPFBTJGAC3HnBFKqA,10140
665
665
  ansible/utils/version.py,sha256=RSC0jNO2r16Nr8TnjVkfngouPb1Xc_7j8U0WvDIK1XA,7837
666
666
  ansible/utils/collection_loader/__init__.py,sha256=l6gUbk5MzfUXlySWrj4xi4IF9UBIrOrEpRQ52-xfGsA,1118
@@ -674,13 +674,13 @@ ansible/vars/hostvars.py,sha256=dg3jpVmNwSg8EJ4SIvYGT80uxMgRtrOW6vvtDfrQzDU,5152
674
674
  ansible/vars/manager.py,sha256=9d-9uD9x1X35QgLOZRyJtAxg3b1j4sp8Ivc5C78viOk,36178
675
675
  ansible/vars/plugins.py,sha256=B7L3fXoSOoBZSXqJ2ulk0adx1g5SpAb8BxyLGPNA7d4,4695
676
676
  ansible/vars/reserved.py,sha256=FBD7n2dnA0CW4I0J1LtWwk2hQqvGW0KTRPcxaRtMKWo,2615
677
- ansible_core-2.14.13.data/scripts/ansible-test,sha256=CYIYL99IxWdVTtDIj3avilIJXhGAmtjuKPPWNuLWuc8,1690
677
+ ansible_core-2.14.14.data/scripts/ansible-test,sha256=CYIYL99IxWdVTtDIj3avilIJXhGAmtjuKPPWNuLWuc8,1690
678
678
  ansible_test/__init__.py,sha256=6e721yAyyyocRKzbCKtQXloAfFP7Aqv0L3zG70uh-4A,190
679
679
  ansible_test/_data/ansible.cfg,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
680
680
  ansible_test/_data/coveragerc,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
681
681
  ansible_test/_data/completion/docker.txt,sha256=q47NhD2sEadcFZ_eOi33MqUh_nJNUsnyUmCnkszIhuM,822
682
682
  ansible_test/_data/completion/network.txt,sha256=_-mi013-JeufshKMUmykkOmZPw1cVbakIMaAuweHet8,198
683
- ansible_test/_data/completion/remote.txt,sha256=si9PgS7p05AFFfzTV5l7C5nx1XjS8Mj_G3-wevUGTa8,1044
683
+ ansible_test/_data/completion/remote.txt,sha256=NmxcuGAfR0oH2ON8DOnKpXikaflJVe2WFTJR-t5e2Zw,954
684
684
  ansible_test/_data/completion/windows.txt,sha256=7xcstRugKOY6lnvJd1nzLE7I5awR-uQfmPtRoyPAg7g,230
685
685
  ansible_test/_data/playbooks/posix_coverage_setup.yml,sha256=PgQNVzVTsNmfnu0sT2SAYiWtkMSOppfmh0oVmAsb7TQ,594
686
686
  ansible_test/_data/playbooks/posix_coverage_teardown.yml,sha256=xHci5QllwJymFtig-hsOXm-Wdrxz063JH14aIyRXhyc,212
@@ -919,7 +919,7 @@ ansible_test/_util/controller/sanity/code-smell/no-unicode-literals.py,sha256=-5
919
919
  ansible_test/_util/controller/sanity/code-smell/replace-urlopen.json,sha256=SsCZ1ULl6HPGBcMpXeCTH5-nNVU9jR-ZSeNy4fotpNY,111
920
920
  ansible_test/_util/controller/sanity/code-smell/replace-urlopen.py,sha256=PSLEuYW5SBrcC7YIt8jdvJ3arxLL7SK7Mxbsvz1UfXc,624
921
921
  ansible_test/_util/controller/sanity/code-smell/runtime-metadata.json,sha256=H2E2-01YXLlSWjvLJT5Vtj3Gn4zB6xhPXsDJh4a7EH0,225
922
- ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py,sha256=QXdI1e66RxtJ1pO0j3hjfEM2q8DKDFYNrbUEQo1kiIc,11094
922
+ ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py,sha256=14n1CpI9OzjZGgOLUpWg1a38DWZp5gTpkYf5sL4vj5c,12136
923
923
  ansible_test/_util/controller/sanity/code-smell/shebang.json,sha256=3vtNzoowM53gi2KZi9peIKVIU79ulQY3FE0jYcSP77M,63
924
924
  ansible_test/_util/controller/sanity/code-smell/shebang.py,sha256=AKCti3RCgZy0GWB3bXgimr_OhqfVPOp_I7345UN_DV8,4672
925
925
  ansible_test/_util/controller/sanity/code-smell/symlinks.json,sha256=JkalgX52aKGUKqjKG5P-68F0tXmUMgldPrNAknMN2Fk,96
@@ -969,7 +969,7 @@ ansible_test/_util/target/injector/virtualenv.sh,sha256=OhiPVykh_qhPMlcE4vozBF5B
969
969
  ansible_test/_util/target/pytest/plugins/ansible_pytest_collections.py,sha256=ANmNUgiYN4nw-VZijG1gk9-F-id3w0cBDEHTNXbCFT4,2970
970
970
  ansible_test/_util/target/pytest/plugins/ansible_pytest_coverage.py,sha256=Nr52YbVP7BwI4u6mZZptZIYGAfmqzzytdbC98lTr5Ks,1599
971
971
  ansible_test/_util/target/sanity/compile/compile.py,sha256=X1WHH2iLT4K8kyYJKlr-6AL6EAzKisL_hYrjvGrHCZ8,1637
972
- ansible_test/_util/target/sanity/import/importer.py,sha256=FNNKz2lSpxTNdfjLdvadzP3KryI4ut7gT03050gzDN8,25932
972
+ ansible_test/_util/target/sanity/import/importer.py,sha256=Q2cmqi-dFOfXYFzPybbWKgqMYUnjmXz7WFiYb9ysEO4,26208
973
973
  ansible_test/_util/target/setup/ConfigureRemotingForAnsible.ps1,sha256=pW9YaaSNvhc_0ijjMfSMdoQkrmZNJ-Rb4xCL8m8t7yU,16693
974
974
  ansible_test/_util/target/setup/bootstrap.sh,sha256=CPZvtpT8H7l2F2Th9kc85EseMm6evxsWPLCgfirBNSA,12994
975
975
  ansible_test/_util/target/setup/check_systemd_cgroup_v1.sh,sha256=Aq0T62x_KLtkGaWzYqWjvhchTqYFflrTbQET3h6xrT0,395
@@ -992,9 +992,9 @@ ansible_test/config/cloud-config-vultr.ini.template,sha256=yO2Xz76Ay3kbG54jX7y8-
992
992
  ansible_test/config/config.yml,sha256=wb3knoBmZewG3GWOMnRHoVPQWW4vPixKLPMNS6vJmTc,2620
993
993
  ansible_test/config/inventory.networking.template,sha256=vQ7x1-u5Q4Y5CqZU-7eMSEJOSCzAbPOL1rmK_AQOQuY,1262
994
994
  ansible_test/config/inventory.winrm.template,sha256=_M2i1B9RYfwSjwvgf3M-H_5Br5FO_kney_kMRPmoggk,1025
995
- ansible_core-2.14.13.dist-info/COPYING,sha256=CuBIWlvTemPmNgNZZBfk6w5lMzT6bH-TLKOg6F1K8ic,35148
996
- ansible_core-2.14.13.dist-info/METADATA,sha256=yi7nrgOx1fujvGDujjKdpTMKxNA5k-Vl-W1NoSye-pc,6904
997
- ansible_core-2.14.13.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
998
- ansible_core-2.14.13.dist-info/entry_points.txt,sha256=0mpmsrIhODChxKl3eS-NcVQCaMetBn8KdPLtVxQgR64,453
999
- ansible_core-2.14.13.dist-info/top_level.txt,sha256=IFbRLjAvih1DYzJWg3_F6t4sCzEMxRO7TOMNs6GkYHo,21
1000
- ansible_core-2.14.13.dist-info/RECORD,,
995
+ ansible_core-2.14.14.dist-info/COPYING,sha256=CuBIWlvTemPmNgNZZBfk6w5lMzT6bH-TLKOg6F1K8ic,35148
996
+ ansible_core-2.14.14.dist-info/METADATA,sha256=VkKvwUekf59jhBdMbVRlzQdQ6lXEbArpOJ81PN7mTxI,6904
997
+ ansible_core-2.14.14.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
998
+ ansible_core-2.14.14.dist-info/entry_points.txt,sha256=0mpmsrIhODChxKl3eS-NcVQCaMetBn8KdPLtVxQgR64,453
999
+ ansible_core-2.14.14.dist-info/top_level.txt,sha256=IFbRLjAvih1DYzJWg3_F6t4sCzEMxRO7TOMNs6GkYHo,21
1000
+ ansible_core-2.14.14.dist-info/RECORD,,
@@ -2,7 +2,6 @@ alpine/3.16 python=3.10 become=doas_sudo provider=aws arch=x86_64
2
2
  alpine become=doas_sudo provider=aws arch=x86_64
3
3
  fedora/36 python=3.10 become=sudo provider=aws arch=x86_64
4
4
  fedora become=sudo provider=aws arch=x86_64
5
- freebsd/12.4 python=3.9 python_dir=/usr/local/bin become=su_sudo provider=aws arch=x86_64
6
5
  freebsd/13.2 python=3.8,3.7,3.9,3.10 python_dir=/usr/local/bin become=su_sudo provider=aws arch=x86_64
7
6
  freebsd python_dir=/usr/local/bin become=su_sudo provider=aws arch=x86_64
8
7
  macos/12.0 python=3.10 python_dir=/usr/local/bin become=sudo provider=parallels arch=x86_64
@@ -16,9 +16,19 @@ from voluptuous.humanize import humanize_error
16
16
 
17
17
  from ansible.module_utils.compat.version import StrictVersion, LooseVersion
18
18
  from ansible.module_utils.six import string_types
19
+ from ansible.utils.collection_loader import AnsibleCollectionRef
19
20
  from ansible.utils.version import SemanticVersion
20
21
 
21
22
 
23
+ def fqcr(value):
24
+ """Validate a FQCR."""
25
+ if not isinstance(value, string_types):
26
+ raise Invalid('Must be a string that is a FQCR')
27
+ if not AnsibleCollectionRef.is_valid_fqcr(value):
28
+ raise Invalid('Must be a FQCR')
29
+ return value
30
+
31
+
22
32
  def isodate(value, check_deprecation_date=False, is_tombstone=False):
23
33
  """Validate a datetime.date or ISO 8601 date string."""
24
34
  # datetime.date objects come from YAML dates, these are ok
@@ -184,17 +194,37 @@ def validate_metadata_file(path, is_ansible, check_deprecation_dates=False):
184
194
  avoid_additional_data
185
195
  )
186
196
 
187
- plugin_routing_schema = Any(
188
- Schema({
189
- ('deprecation'): Any(deprecation_schema),
190
- ('tombstone'): Any(tombstoning_schema),
191
- ('redirect'): Any(*string_types),
192
- }, extra=PREVENT_EXTRA),
197
+ plugins_routing_common_schema = Schema({
198
+ ('deprecation'): Any(deprecation_schema),
199
+ ('tombstone'): Any(tombstoning_schema),
200
+ ('redirect'): fqcr,
201
+ }, extra=PREVENT_EXTRA)
202
+
203
+ plugin_routing_schema = Any(plugins_routing_common_schema)
204
+
205
+ # Adjusted schema for modules only
206
+ plugin_routing_schema_modules = Any(
207
+ plugins_routing_common_schema.extend({
208
+ ('action_plugin'): fqcr}
209
+ )
210
+ )
211
+
212
+ # Adjusted schema for module_utils
213
+ plugin_routing_schema_mu = Any(
214
+ plugins_routing_common_schema.extend({
215
+ ('redirect'): Any(*string_types)}
216
+ ),
193
217
  )
194
218
 
195
219
  list_dict_plugin_routing_schema = [{str_type: plugin_routing_schema}
196
220
  for str_type in string_types]
197
221
 
222
+ list_dict_plugin_routing_schema_mu = [{str_type: plugin_routing_schema_mu}
223
+ for str_type in string_types]
224
+
225
+ list_dict_plugin_routing_schema_modules = [{str_type: plugin_routing_schema_modules}
226
+ for str_type in string_types]
227
+
198
228
  plugin_schema = Schema({
199
229
  ('action'): Any(None, *list_dict_plugin_routing_schema),
200
230
  ('become'): Any(None, *list_dict_plugin_routing_schema),
@@ -207,8 +237,8 @@ def validate_metadata_file(path, is_ansible, check_deprecation_dates=False):
207
237
  ('httpapi'): Any(None, *list_dict_plugin_routing_schema),
208
238
  ('inventory'): Any(None, *list_dict_plugin_routing_schema),
209
239
  ('lookup'): Any(None, *list_dict_plugin_routing_schema),
210
- ('module_utils'): Any(None, *list_dict_plugin_routing_schema),
211
- ('modules'): Any(None, *list_dict_plugin_routing_schema),
240
+ ('module_utils'): Any(None, *list_dict_plugin_routing_schema_mu),
241
+ ('modules'): Any(None, *list_dict_plugin_routing_schema_modules),
212
242
  ('netconf'): Any(None, *list_dict_plugin_routing_schema),
213
243
  ('shell'): Any(None, *list_dict_plugin_routing_schema),
214
244
  ('strategy'): Any(None, *list_dict_plugin_routing_schema),
@@ -560,6 +560,12 @@ def main():
560
560
  "ignore",
561
561
  "Python 3.5 support will be dropped in the next release of cryptography. Please upgrade your Python.")
562
562
 
563
+ # ansible.utils.unsafe_proxy attempts patching sys.intern generating a warning if it was already patched
564
+ warnings.filterwarnings(
565
+ "ignore",
566
+ "skipped sys.intern patch; appears to have already been patched"
567
+ )
568
+
563
569
  try:
564
570
  yield
565
571
  finally: