ansible-core 2.16.10__py3-none-any.whl → 2.16.11rc1__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.

@@ -32,7 +32,7 @@ from ansible.utils.listify import listify_lookup_plugin_terms
32
32
  from ansible.utils.unsafe_proxy import to_unsafe_text, wrap_var
33
33
  from ansible.vars.clean import namespace_facts, clean_facts
34
34
  from ansible.utils.display import Display
35
- from ansible.utils.vars import combine_vars, isidentifier
35
+ from ansible.utils.vars import combine_vars
36
36
 
37
37
  display = Display()
38
38
 
@@ -333,6 +333,13 @@ class TaskExecutor:
333
333
  (self._task, tmp_task) = (tmp_task, self._task)
334
334
  (self._play_context, tmp_play_context) = (tmp_play_context, self._play_context)
335
335
  res = self._execute(variables=task_vars)
336
+
337
+ if self._task.register:
338
+ # Ensure per loop iteration results are registered in case `_execute()`
339
+ # returns early (when conditional, failure, ...).
340
+ # This is needed in case the registered variable is used in the loop label template.
341
+ task_vars[self._task.register] = res
342
+
336
343
  task_fields = self._task.dump_attrs()
337
344
  (self._task, tmp_task) = (tmp_task, self._task)
338
345
  (self._play_context, tmp_play_context) = (tmp_play_context, self._play_context)
@@ -658,9 +665,6 @@ class TaskExecutor:
658
665
  # update the local copy of vars with the registered value, if specified,
659
666
  # or any facts which may have been generated by the module execution
660
667
  if self._task.register:
661
- if not isidentifier(self._task.register):
662
- raise AnsibleError("Invalid variable name in 'register' specified: '%s'" % self._task.register)
663
-
664
668
  vars_copy[self._task.register] = result
665
669
 
666
670
  if self._task.async_val > 0:
@@ -1049,7 +1053,7 @@ class TaskExecutor:
1049
1053
  # add extras if plugin supports them
1050
1054
  if getattr(self._connection, 'allow_extras', False):
1051
1055
  for k in variables:
1052
- if k.startswith('ansible_%s_' % self._connection._load_name) and k not in options:
1056
+ if k.startswith('ansible_%s_' % self._connection.extras_prefix) and k not in options:
1053
1057
  options['_extras'][k] = templar.template(variables[k])
1054
1058
 
1055
1059
  task_keys = self._task.dump_attrs()
@@ -19,6 +19,6 @@
19
19
  from __future__ import (absolute_import, division, print_function)
20
20
  __metaclass__ = type
21
21
 
22
- __version__ = '2.16.10'
22
+ __version__ = '2.16.11rc1'
23
23
  __author__ = 'Ansible, Inc.'
24
24
  __codename__ = "All My Love"
@@ -1759,8 +1759,12 @@ class AnsibleModule(object):
1759
1759
  umask = os.umask(0)
1760
1760
  os.umask(umask)
1761
1761
  os.chmod(b_dest, DEFAULT_PERM & ~umask)
1762
+ dest_dir_stat = os.stat(os.path.dirname(b_dest))
1762
1763
  try:
1763
- os.chown(b_dest, os.geteuid(), os.getegid())
1764
+ if dest_dir_stat.st_mode & stat.S_ISGID:
1765
+ os.chown(b_dest, os.geteuid(), dest_dir_stat.st_gid)
1766
+ else:
1767
+ os.chown(b_dest, os.geteuid(), os.getegid())
1764
1768
  except OSError:
1765
1769
  # We're okay with trying our best here. If the user is not
1766
1770
  # root (or old Unices) they won't be able to chown.
@@ -92,6 +92,6 @@ if __name__ == '__main__':
92
92
  runpy.run_module(module_fqn, init_globals=dict(_respawned=True), run_name='__main__', alter_sys=True)
93
93
  '''
94
94
 
95
- respawn_code = respawn_code_template.format(module_fqn=module_fqn, modlib_path=modlib_path, smuggled_args=smuggled_args.strip())
95
+ respawn_code = respawn_code_template.format(module_fqn=module_fqn, modlib_path=modlib_path, smuggled_args=to_bytes(smuggled_args).strip())
96
96
 
97
97
  return respawn_code
@@ -318,11 +318,10 @@ class DataLoader:
318
318
  if (is_role or self._is_role(path)) and b_pb_base_dir.endswith(b'/tasks'):
319
319
  search.append(os.path.join(os.path.dirname(b_pb_base_dir), b_dirname, b_source))
320
320
  search.append(os.path.join(b_pb_base_dir, b_source))
321
- else:
322
- # don't add dirname if user already is using it in source
323
- if b_source.split(b'/')[0] != dirname:
324
- search.append(os.path.join(b_upath, b_dirname, b_source))
325
- search.append(os.path.join(b_upath, b_source))
321
+ # don't add dirname if user already is using it in source
322
+ if b_source.split(b'/')[0] != dirname:
323
+ search.append(os.path.join(b_upath, b_dirname, b_source))
324
+ search.append(os.path.join(b_upath, b_source))
326
325
 
327
326
  # always append basedir as last resort
328
327
  # don't add dirname if user already is using it in source
ansible/playbook/task.py CHANGED
@@ -39,6 +39,7 @@ from ansible.playbook.taggable import Taggable
39
39
  from ansible.utils.collection_loader import AnsibleCollectionConfig
40
40
  from ansible.utils.display import Display
41
41
  from ansible.utils.sentinel import Sentinel
42
+ from ansible.utils.vars import isidentifier
42
43
 
43
44
  __all__ = ['Task']
44
45
 
@@ -276,6 +277,10 @@ class Task(Base, Conditional, Taggable, CollectionSearch, Notifiable, Delegatabl
276
277
  if not isinstance(value, list):
277
278
  setattr(self, name, [value])
278
279
 
280
+ def _validate_register(self, attr, name, value):
281
+ if value is not None and not isidentifier(value):
282
+ raise AnsibleParserError(f"Invalid variable name in 'register' specified: '{value}'")
283
+
279
284
  def post_validate(self, templar):
280
285
  '''
281
286
  Override of base class post_validate, to also do final validation on
@@ -76,7 +76,7 @@ class TaskInclude(Task):
76
76
  if not task.args.get('_raw_params'):
77
77
  task.args['_raw_params'] = task.args.pop('file', None)
78
78
  if not task.args['_raw_params']:
79
- raise AnsibleParserError('No file specified for %s' % task.action)
79
+ raise AnsibleParserError('No file specified for %s' % task.action, obj=data)
80
80
 
81
81
  apply_attrs = task.args.get('apply', {})
82
82
  if apply_attrs and task.action not in C._ACTION_INCLUDE_TASKS:
@@ -52,16 +52,23 @@ def get_plugin_class(obj):
52
52
 
53
53
  class AnsiblePlugin(ABC):
54
54
 
55
- # allow extra passthrough parameters
56
- allow_extras = False
57
-
58
55
  # Set by plugin loader
59
56
  _load_name: str
60
57
 
58
+ # allow extra passthrough parameters
59
+ allow_extras: bool = False
60
+ _extras_prefix: str | None = None
61
+
61
62
  def __init__(self):
62
63
  self._options = {}
63
64
  self._defs = None
64
65
 
66
+ @property
67
+ def extras_prefix(self):
68
+ if not self._extras_prefix:
69
+ self._extras_prefix = self._load_name.split('.')[-1]
70
+ return self._extras_prefix
71
+
65
72
  def matches_name(self, possible_names):
66
73
  possible_fqcns = set()
67
74
  for name in possible_names:
@@ -633,39 +633,41 @@ end {
633
633
  buffer_size = max_b64_size - (max_b64_size % 1024)
634
634
 
635
635
  # setup the file stream with read only mode
636
- setup_script = '''$ErrorActionPreference = "Stop"
637
- $path = '%s'
636
+ setup_script = '''param([string]$Path)
637
+ $ErrorActionPreference = "Stop"
638
638
 
639
- if (Test-Path -Path $path -PathType Leaf) {
639
+ if (Test-Path -LiteralPath $path -PathType Leaf) {
640
640
  $fs = New-Object -TypeName System.IO.FileStream -ArgumentList @(
641
641
  $path,
642
642
  [System.IO.FileMode]::Open,
643
643
  [System.IO.FileAccess]::Read,
644
644
  [System.IO.FileShare]::Read
645
645
  )
646
- $buffer_size = %d
647
646
  } elseif (Test-Path -Path $path -PathType Container) {
648
647
  Write-Output -InputObject "[DIR]"
649
648
  } else {
650
649
  Write-Error -Message "$path does not exist"
651
650
  $host.SetShouldExit(1)
652
- }''' % (self._shell._escape(in_path), buffer_size)
651
+ }'''
653
652
 
654
653
  # read the file stream at the offset and return the b64 string
655
- read_script = '''$ErrorActionPreference = "Stop"
656
- $fs.Seek(%d, [System.IO.SeekOrigin]::Begin) > $null
657
- $buffer = New-Object -TypeName byte[] -ArgumentList $buffer_size
658
- $bytes_read = $fs.Read($buffer, 0, $buffer_size)
659
-
660
- if ($bytes_read -gt 0) {
661
- $bytes = $buffer[0..($bytes_read - 1)]
662
- Write-Output -InputObject ([System.Convert]::ToBase64String($bytes))
654
+ read_script = '''param([int64]$Offset, [int]$BufferSize)
655
+ $ErrorActionPreference = "Stop"
656
+ $fs.Seek($Offset, [System.IO.SeekOrigin]::Begin) > $null
657
+ $buffer = New-Object -TypeName byte[] -ArgumentList $BufferSize
658
+ $read = $fs.Read($buffer, 0, $buffer.Length)
659
+
660
+ if ($read -gt 0) {
661
+ [System.Convert]::ToBase64String($buffer, 0, $read)
663
662
  }'''
664
663
 
665
664
  # need to run the setup script outside of the local scope so the
666
665
  # file stream stays active between fetch operations
667
- rc, stdout, stderr = self._exec_psrp_script(setup_script,
668
- use_local_scope=False)
666
+ rc, stdout, stderr = self._exec_psrp_script(
667
+ setup_script,
668
+ use_local_scope=False,
669
+ arguments=[in_path],
670
+ )
669
671
  if rc != 0:
670
672
  raise AnsibleError("failed to setup file stream for fetch '%s': %s"
671
673
  % (out_path, to_native(stderr)))
@@ -680,7 +682,10 @@ if ($bytes_read -gt 0) {
680
682
  while True:
681
683
  display.vvvvv("PSRP FETCH %s to %s (offset=%d" %
682
684
  (in_path, out_path, offset), host=self._psrp_host)
683
- rc, stdout, stderr = self._exec_psrp_script(read_script % offset)
685
+ rc, stdout, stderr = self._exec_psrp_script(
686
+ read_script,
687
+ arguments=[offset, buffer_size],
688
+ )
684
689
  if rc != 0:
685
690
  raise AnsibleError("failed to transfer file to '%s': %s"
686
691
  % (out_path, to_native(stderr)))
@@ -814,7 +819,7 @@ if ($bytes_read -gt 0) {
814
819
  script: str,
815
820
  input_data: bytes | str | t.Iterable | None = None,
816
821
  use_local_scope: bool = True,
817
- arguments: t.Iterable[str] | None = None,
822
+ arguments: t.Iterable[t.Any] | None = None,
818
823
  ) -> tuple[int, bytes, bytes]:
819
824
  # Check if there's a command on the current pipeline that still needs to be closed.
820
825
  if self._last_pipeline:
@@ -1286,7 +1286,7 @@ class Connection(ConnectionBase):
1286
1286
  if sftp_action == 'get':
1287
1287
  # we pass sudoable=False to disable pty allocation, which
1288
1288
  # would end up mixing stdout/stderr and screwing with newlines
1289
- (returncode, stdout, stderr) = self.exec_command('dd if=%s bs=%s' % (in_path, BUFSIZE), sudoable=False)
1289
+ (returncode, stdout, stderr) = self.exec_command('dd if=%s bs=%s' % (self._shell.quote(in_path), BUFSIZE), sudoable=False)
1290
1290
  with open(to_bytes(out_path, errors='surrogate_or_strict'), 'wb+') as out_file:
1291
1291
  out_file.write(stdout)
1292
1292
  else:
@@ -13,6 +13,7 @@ DOCUMENTATION = r"""
13
13
  - The csvfile lookup reads the contents of a file in CSV (comma-separated value) format.
14
14
  The lookup looks for the row where the first column matches keyname (which can be multiple words)
15
15
  and returns the value in the O(col) column (default 1, which indexed from 0 means the second column in the file).
16
+ - At least one keyname is required, provided as a positional argument(s) to the lookup.
16
17
  options:
17
18
  col:
18
19
  description: column to return (0 indexed).
@@ -59,6 +60,22 @@ EXAMPLES = """
59
60
  vars:
60
61
  csvline: "{{ lookup('ansible.builtin.csvfile', bgp_neighbor_ip, file='bgp_neighbors.csv', delimiter=',') }}"
61
62
  delegate_to: localhost
63
+
64
+ # Contents of debug.csv
65
+ # test1 ret1.1 ret2.1
66
+ # test2 ret1.2 ret2.2
67
+ # test3 ret1.3 ret2.3
68
+
69
+ - name: "Lookup multiple keynames in the first column (index 0), returning the values from the second column (index 1)"
70
+ debug:
71
+ msg: "{{ lookup('csvfile', 'test1', 'test2', file='debug.csv', delimiter=' ') }}"
72
+
73
+ - name: Lookup multiple keynames using old style syntax
74
+ debug:
75
+ msg: "{{ lookup('csvfile', term1, term2) }}"
76
+ vars:
77
+ term1: "test1 file=debug.csv delimiter=' '"
78
+ term2: "test2 file=debug.csv delimiter=' '"
62
79
  """
63
80
 
64
81
  RETURN = """
@@ -146,6 +163,9 @@ class LookupModule(LookupBase):
146
163
  # populate options
147
164
  paramvals = self.get_options()
148
165
 
166
+ if not terms:
167
+ raise AnsibleError('Search key is required but was not found')
168
+
149
169
  for term in terms:
150
170
  kv = parse_kv(term)
151
171
 
@@ -26,35 +26,70 @@ import ntpath
26
26
  from ansible.module_utils.common.text.converters import to_bytes, to_text
27
27
  from ansible.plugins.shell import ShellBase
28
28
 
29
+ # This is weird, we are matching on byte sequences that match the utf-16-be
30
+ # matches for '_x(a-fA-F0-9){4}_'. The \x00 and {8} will match the hex sequence
31
+ # when it is encoded as utf-16-be.
32
+ _STRING_DESERIAL_FIND = re.compile(rb"\x00_\x00x([\x00(a-fA-F0-9)]{8})\x00_")
29
33
 
30
34
  _common_args = ['PowerShell', '-NoProfile', '-NonInteractive', '-ExecutionPolicy', 'Unrestricted']
31
35
 
32
36
 
33
- def _parse_clixml(data, stream="Error"):
37
+ def _parse_clixml(data: bytes, stream: str = "Error") -> bytes:
34
38
  """
35
39
  Takes a byte string like '#< CLIXML\r\n<Objs...' and extracts the stream
36
40
  message encoded in the XML data. CLIXML is used by PowerShell to encode
37
41
  multiple objects in stderr.
38
42
  """
39
- lines = []
43
+ lines: list[str] = []
44
+
45
+ # A serialized string will serialize control chars and surrogate pairs as
46
+ # _xDDDD_ values where DDDD is the hex representation of a big endian
47
+ # UTF-16 code unit. As a surrogate pair uses 2 UTF-16 code units, we need
48
+ # to operate our text replacement on the utf-16-be byte encoding of the raw
49
+ # text. This allows us to replace the _xDDDD_ values with the actual byte
50
+ # values and then decode that back to a string from the utf-16-be bytes.
51
+ def rplcr(matchobj: re.Match) -> bytes:
52
+ match_hex = matchobj.group(1)
53
+ hex_string = match_hex.decode("utf-16-be")
54
+ return base64.b16decode(hex_string.upper())
40
55
 
41
56
  # There are some scenarios where the stderr contains a nested CLIXML element like
42
57
  # '<# CLIXML\r\n<# CLIXML\r\n<Objs>...</Objs><Objs>...</Objs>'.
43
58
  # Parse each individual <Objs> element and add the error strings to our stderr list.
44
59
  # https://github.com/ansible/ansible/issues/69550
45
60
  while data:
46
- end_idx = data.find(b"</Objs>") + 7
47
- current_element = data[data.find(b"<Objs "):end_idx]
61
+ start_idx = data.find(b"<Objs ")
62
+ end_idx = data.find(b"</Objs>")
63
+ if start_idx == -1 or end_idx == -1:
64
+ break
65
+
66
+ end_idx += 7
67
+ current_element = data[start_idx:end_idx]
48
68
  data = data[end_idx:]
49
69
 
50
70
  clixml = ET.fromstring(current_element)
51
71
  namespace_match = re.match(r'{(.*)}', clixml.tag)
52
- namespace = "{%s}" % namespace_match.group(1) if namespace_match else ""
72
+ namespace = f"{{{namespace_match.group(1)}}}" if namespace_match else ""
73
+
74
+ entries = clixml.findall("./%sS" % namespace)
75
+ if not entries:
76
+ continue
77
+
78
+ # If this is a new CLIXML element, add a newline to separate the messages.
79
+ if lines:
80
+ lines.append("\r\n")
81
+
82
+ for string_entry in entries:
83
+ actual_stream = string_entry.attrib.get('S', None)
84
+ if actual_stream != stream:
85
+ continue
86
+
87
+ b_line = (string_entry.text or "").encode("utf-16-be")
88
+ b_escaped = re.sub(_STRING_DESERIAL_FIND, rplcr, b_line)
53
89
 
54
- strings = clixml.findall("./%sS" % namespace)
55
- lines.extend([e.text.replace('_x000D__x000A_', '') for e in strings if e.attrib.get('S') == stream])
90
+ lines.append(b_escaped.decode("utf-16-be", errors="surrogatepass"))
56
91
 
57
- return to_bytes('\r\n'.join(lines))
92
+ return to_bytes(''.join(lines), errors="surrogatepass")
58
93
 
59
94
 
60
95
  class ShellModule(ShellBase):
@@ -56,7 +56,7 @@ from ansible.utils.display import Display
56
56
  from ansible.utils.fqcn import add_internal_fqcns
57
57
  from ansible.utils.unsafe_proxy import wrap_var
58
58
  from ansible.utils.sentinel import Sentinel
59
- from ansible.utils.vars import combine_vars, isidentifier
59
+ from ansible.utils.vars import combine_vars
60
60
  from ansible.vars.clean import strip_internal_keys, module_response_deepcopy
61
61
 
62
62
  display = Display()
@@ -775,10 +775,6 @@ class StrategyBase:
775
775
 
776
776
  # register final results
777
777
  if original_task.register:
778
-
779
- if not isidentifier(original_task.register):
780
- raise AnsibleError("Invalid variable name in 'register' specified: '%s'" % original_task.register)
781
-
782
778
  host_list = self.get_task_hosts(iterator, original_host, original_task)
783
779
 
784
780
  clean_copy = strip_internal_keys(module_response_deepcopy(task_result._result))
@@ -97,6 +97,7 @@ class StrategyModule(StrategyBase):
97
97
 
98
98
  # try and find an unblocked host with a task to run
99
99
  host_results = []
100
+ meta_task_dummy_results_count = 0
100
101
  while True:
101
102
  host = hosts_left[last_host]
102
103
  display.debug("next free host: %s" % host)
@@ -183,6 +184,9 @@ class StrategyModule(StrategyBase):
183
184
  continue
184
185
 
185
186
  if task.action in C._ACTION_META:
187
+ if self._host_pinned:
188
+ meta_task_dummy_results_count += 1
189
+ workers_free -= 1
186
190
  self._execute_meta(task, play_context, iterator, target_host=host)
187
191
  self._blocked_hosts[host_name] = False
188
192
  else:
@@ -222,7 +226,7 @@ class StrategyModule(StrategyBase):
222
226
  host_results.extend(results)
223
227
 
224
228
  # each result is counted as a worker being free again
225
- workers_free += len(results)
229
+ workers_free += len(results) + meta_task_dummy_results_count
226
230
 
227
231
  self.update_active_connections(results)
228
232
 
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.16.10'
22
+ __version__ = '2.16.11rc1'
23
23
  __author__ = 'Ansible, Inc.'
24
24
  __codename__ = "All My Love"
ansible/utils/version.py CHANGED
@@ -192,6 +192,7 @@ class SemanticVersion(Version):
192
192
  raise ValueError("invalid semantic version '%s'" % vstring)
193
193
 
194
194
  (major, minor, patch, prerelease, buildmetadata) = match.group(1, 2, 3, 4, 5)
195
+ self.vstring = vstring
195
196
  self.major = int(major)
196
197
  self.minor = int(minor)
197
198
  self.patch = int(patch)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ansible-core
3
- Version: 2.16.10
3
+ Version: 2.16.11rc1
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=FvX7PDG0GWV91Vszb5-DFKvkR8O2OTpBmIbQk-d51sc,9193
4
4
  ansible/context.py,sha256=OzSlaA_GgGRyyf5I209sy19_eGOX6HXn441W9w_FcvU,2018
5
5
  ansible/keyword_desc.yml,sha256=vE9joFgSeHR4Djl7Bd-HHVCrGByRCrTUmWYZ8LKPZKk,7412
6
- ansible/release.py,sha256=VdxCMTKPkJzB4M33M-WGB5d-RFnwlAAYRyWiE7w747k,916
6
+ ansible/release.py,sha256=SRauj8emW8ieiG25tyR76jSXBr8LDP_jUBxDTIYihO4,919
7
7
  ansible/_vendor/__init__.py,sha256=wJRKH7kI9OzYVY9hgSchOsTNTmTnugpPLGYj9Y5akX0,2086
8
8
  ansible/cli/__init__.py,sha256=6jaX6SS-UBM7pjiUlDsC0y07k3klUjxTR5ZEnDiCmP8,28706
9
9
  ansible/cli/adhoc.py,sha256=suzo4QnsaMjJBk5JlAUd-cpQLs8Ckj6A55CiG9Y8Gns,8247
@@ -37,7 +37,7 @@ ansible/executor/module_common.py,sha256=GjRWM0L9Y4iDPa3ffhxjpy07i9e6ozpvvPnSLxZ
37
37
  ansible/executor/play_iterator.py,sha256=7Lk3Zxh3gAzLR8cyHmmFbbbT0C-JyeCK-vquKZyPBY0,30511
38
38
  ansible/executor/playbook_executor.py,sha256=RYYgI82wviDOE1o8zrIB5WWsSEg13KdxEVMXLGPKK7A,15098
39
39
  ansible/executor/stats.py,sha256=757UK8wDzLCXq4ltI9PqpoMNAdtRsd9D9-GS-5Al_Hs,3264
40
- ansible/executor/task_executor.py,sha256=uarhaFNWGboyKO2AegjEp-KQSr9BMlF2PnmOdYwkmD0,60445
40
+ ansible/executor/task_executor.py,sha256=Pl2oXRQH6T9ux9X-EaDFMs3UDXn1A-jplJxzKVgs3x4,60605
41
41
  ansible/executor/task_queue_manager.py,sha256=DUWwK8RZuUJPY66to8kplFBFcUPAJwLB3kW8vfl1IOM,18724
42
42
  ansible/executor/task_result.py,sha256=DvshMci5i9-qCXs0m_vScSa6BJMbPwwNQBV7L2DTCzE,5748
43
43
  ansible/executor/discovery/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -140,9 +140,9 @@ ansible/inventory/host.py,sha256=7RZjLiB7M74bejFRflOTa8XPHxMC334qhSo_5VmZrKI,512
140
140
  ansible/inventory/manager.py,sha256=ZwmEF3E2BKOJi9SMVQNz83A2f3raQn6Nyo-rfSNMn2k,29507
141
141
  ansible/module_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
142
142
  ansible/module_utils/_text.py,sha256=F_YfeaxhwmTI16HICAzQS9ZmlKgBDdQ4mqR-Kh--okg,597
143
- ansible/module_utils/ansible_release.py,sha256=VdxCMTKPkJzB4M33M-WGB5d-RFnwlAAYRyWiE7w747k,916
143
+ ansible/module_utils/ansible_release.py,sha256=SRauj8emW8ieiG25tyR76jSXBr8LDP_jUBxDTIYihO4,919
144
144
  ansible/module_utils/api.py,sha256=BTo7stVOANbtd-ngZslaqx70r9t5gfvo44cKyu5SFjU,5837
145
- ansible/module_utils/basic.py,sha256=7xL3IsZK68gyyYm2x8yB2s1V7Sx77-vK3rkXmp2mlCM,87489
145
+ ansible/module_utils/basic.py,sha256=i_lL7YrkhtBewM21t4uIfAgqrGqStyCWwjYiUyqRBi0,87706
146
146
  ansible/module_utils/connection.py,sha256=9Us-d-y1bhC3zNnziQxvYNT4umIaN0OYv8zPaUSdEf0,8447
147
147
  ansible/module_utils/errors.py,sha256=LYv9EWkvBRAmYW6qQY4Vz2hMULqkAGkMG2Opf86Ep4M,3396
148
148
  ansible/module_utils/json_utils.py,sha256=IR_bSwrYK1Ie36dCQSHyN4mahkrZkzIIkH3DdwtIi6Q,3456
@@ -164,7 +164,7 @@ ansible/module_utils/common/locale.py,sha256=2M82y05BjDP38Rz_vpMCoZNx2cjF9P8wPez
164
164
  ansible/module_utils/common/network.py,sha256=PMSOzC8zzq5ZwAFNOtJuPvKcw6cptlskvqPEqGFEepg,4278
165
165
  ansible/module_utils/common/parameters.py,sha256=zn7G8ihk38YHSh7INiYsmuZxt9UqBjAH_lXLQ4Qyrh4,37201
166
166
  ansible/module_utils/common/process.py,sha256=AMjgRaJVcaE1gBuAkrV8ZYLFlTJQkTnpwFJ21W0erwA,1870
167
- ansible/module_utils/common/respawn.py,sha256=ozsN6amHd4QzgksqagQC0sUMeNv86FBgs8nqdYWaaOo,3828
167
+ ansible/module_utils/common/respawn.py,sha256=3BKO1QBwWL_kLEXY58PrOoUXfh4ygTKyqkFDY-MUsRo,3838
168
168
  ansible/module_utils/common/sys_info.py,sha256=k5gQ1gV541JteH_KpeyqvPmWEQOPDEsQZicgowmsef4,5487
169
169
  ansible/module_utils/common/validation.py,sha256=i_AZ8wRLYnoIwtRzSzC1npaVcv5QTtBWtQcAhPDb3mM,19143
170
170
  ansible/module_utils/common/warnings.py,sha256=adpOS7elfs518cpjd5x467V8YbVfBKnPLVxaO4QHnTs,1416
@@ -350,7 +350,7 @@ ansible/modules/yum.py,sha256=ss7Ikm2R0hfXoIcPsIF5atwbhsKnCpvqS4drU_mLLmQ,74057
350
350
  ansible/modules/yum_repository.py,sha256=36uZERU09bfvTTsmr3Qx4p1TWZ8V4fQ64LLLOlxL1gs,24957
351
351
  ansible/parsing/__init__.py,sha256=fPEa2N1Z4mjQHwps752TC-vhKA1CkCoEcAjh0YkfM5Y,826
352
352
  ansible/parsing/ajson.py,sha256=CZ3s2arKLvMWz5rzRIhzutRGSx73aS6fDg4C94HAHVA,1338
353
- ansible/parsing/dataloader.py,sha256=1T_DGy16iZoQzoIdv57HCGLv9AuPB_W2oJ_T1UlJQE0,20466
353
+ ansible/parsing/dataloader.py,sha256=sQg0YJDBoSlE8idZQjs3ict7tKys1crodf_E7rT1WUQ,20428
354
354
  ansible/parsing/mod_args.py,sha256=b72Oj7iW8JJiRRznEyOKZM_asu1hryn_Q7fbyCYHQ7E,14462
355
355
  ansible/parsing/plugin_docs.py,sha256=JdK4OiFa7lSu9_-ztKQ7RPJs2FrmZejhE3YLESe-41Y,8714
356
356
  ansible/parsing/quoting.py,sha256=OsrBXkTzgn8PHH7VGA0kqnz6jBejdoQymDqsOYxTF-M,1141
@@ -383,14 +383,14 @@ ansible/playbook/play_context.py,sha256=vocmas7gJXDlJB8Hm5CLdCSEbE6eCRhor4sskA1l
383
383
  ansible/playbook/playbook_include.py,sha256=M0CZ7nGCvCNQuZQXwNHSXi9IhKXJLV74Bd9YvcarrZ4,7577
384
384
  ansible/playbook/role_include.py,sha256=9IsYSolvScuzBREoDh2lg-S6mN7_WAF-usQMZvVX2dQ,7968
385
385
  ansible/playbook/taggable.py,sha256=QpIS7BXQ9N48Vu1HW96OdSMyrQHckYtCgsVL9-mv-Ts,3249
386
- ansible/playbook/task.py,sha256=OeoBa1ZU1rd3QZZrrrgQhPJ5B3OAi4tWnZasrFG2jfQ,21584
387
- ansible/playbook/task_include.py,sha256=C3x_tTzbRLTMsXCGonzp3SAzE7VuslvcAlwN4WqF-KM,5318
386
+ ansible/playbook/task.py,sha256=MU7Mz38zvgxwGvKGlLsXMUF7Js6g3_8VChIcnrWJNXE,21838
387
+ ansible/playbook/task_include.py,sha256=b1_XpsiYQYMuTttjGwWNb0NgsABcJ2TKJfSMSu6xG0s,5328
388
388
  ansible/playbook/role/__init__.py,sha256=ZPASFccReB6DaJtZZ5UT_0IXtZjLTzdEQoP9ebiIom0,29781
389
389
  ansible/playbook/role/definition.py,sha256=MGvEmAsOUYj2geHD5H7JG4N5O3wCxQwmtlH7IpgZqfk,9634
390
390
  ansible/playbook/role/include.py,sha256=Vq5ywSkMeIAHYgEH0M9B-HOOTSq2AkyU5tksmHyKc9k,2426
391
391
  ansible/playbook/role/metadata.py,sha256=5rWZ3ET9-xUCxHL2371o8nRS2aYTn4Ni8fU5_T09Evg,5158
392
392
  ansible/playbook/role/requirement.py,sha256=T_PljD0hgVstV325iALyCUKkAZxzLLlcQjpp-yuWBXg,4257
393
- ansible/plugins/__init__.py,sha256=OsNLvhmwNm7W9JFwLUmr3vAW5lby-Jp2wC2sDbZjzik,5371
393
+ ansible/plugins/__init__.py,sha256=WrYYCde_H0lbf8sPV7zCtNUXy4R6Zw-KQYhdIqPxn64,5595
394
394
  ansible/plugins/list.py,sha256=r_ai9G1ERwTigM2ZyhLtJK8BYRh4_hUNvAuqDlVS5ZI,8979
395
395
  ansible/plugins/loader.py,sha256=A_8sGZYgDLY-7fq4PjLC-dfcZrrdG5Xj290mTLy5htk,75723
396
396
  ansible/plugins/action/__init__.py,sha256=G6IVJe6hA6oJyOLN-0pCPc1A1GtRQ6WMBrqg-BflDdo,68697
@@ -441,8 +441,8 @@ ansible/plugins/cliconf/__init__.py,sha256=hjwVXkBPenYCSCF5-7HmylUFFO1L2itrvwpKX
441
441
  ansible/plugins/connection/__init__.py,sha256=87RA8bIaaS0LGZCZQpdJJEgAjDd2DPJgXebCMjYrTxE,18011
442
442
  ansible/plugins/connection/local.py,sha256=RFIZEyZjXQ_AcynPiYfmgZbHDNpgV6GiKb9qeXGxwoA,8437
443
443
  ansible/plugins/connection/paramiko_ssh.py,sha256=gMaVa1GqhymC7EHdtvp_rBN7MilHGDLYAgxs-l1_AAc,30111
444
- ansible/plugins/connection/psrp.py,sha256=di5R8Ijc0CHeCmWGXUdqf8kR2CaCFmmMzveS1VYKJY4,36806
445
- ansible/plugins/connection/ssh.py,sha256=ISeEuEPTxkgZEChz562155tDNk6A3d9kUnbvrzZITWU,64393
444
+ ansible/plugins/connection/psrp.py,sha256=6E0zZ56JjrPDcPdLg3AcmD892RyyNa7qaXp_geIqcYw,36828
445
+ ansible/plugins/connection/ssh.py,sha256=RAvdE7PGlUk8IbwjdhOdvt0W_X1ChXxVNUForWqZFnM,64412
446
446
  ansible/plugins/connection/winrm.py,sha256=xk7IGA9rnhlg8gwiUI7FK19UFut_KzqKS6glRPJJFFA,40666
447
447
  ansible/plugins/doc_fragments/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
448
448
  ansible/plugins/doc_fragments/action_common_attributes.py,sha256=ouV8CMIP0TkfkxN4p_pLbPvRSC5wu6w0Y6ScONOg-c4,2449
@@ -551,7 +551,7 @@ ansible/plugins/inventory/toml.py,sha256=-x-PFHoqKrBFqjp0ZP3kZ9xQYm5hjG4b--_rjoK
551
551
  ansible/plugins/inventory/yaml.py,sha256=uAUIGNLLJ8V56RbS5IQwH9FpcAcf9N-iT631p-P_biY,7468
552
552
  ansible/plugins/lookup/__init__.py,sha256=b6ZrYYaYa4M7h09WtRl5QcspqRF17tvHdnhaOiT46A0,4764
553
553
  ansible/plugins/lookup/config.py,sha256=wTreKdYRLEOcjRbAs-E-bBT1vVSncqKHgG7wJcEq4ck,6413
554
- ansible/plugins/lookup/csvfile.py,sha256=aCyNy9yAo-gNoOY2OkLxkuf0PNxTHBxHheF71etFg8M,6424
554
+ ansible/plugins/lookup/csvfile.py,sha256=4YbDjHi40k-lDRBzjrEieKEn5wH4tyZ8Mgu_2byGj4I,7142
555
555
  ansible/plugins/lookup/dict.py,sha256=44P9TxDwzxd5yTFP1VRf8KINCzikw6VmSEPGmpdSQwo,2250
556
556
  ansible/plugins/lookup/env.py,sha256=OB5bMBZb7qsCAYfm_TDO-RYL628nNjQTbQZf8_t7rtk,2731
557
557
  ansible/plugins/lookup/file.py,sha256=r-1xyg9B4nf3zOzvlzCyxN4plgd_UU-KTCa2tIjeex8,3324
@@ -578,11 +578,11 @@ ansible/plugins/lookup/vars.py,sha256=3YJ6wGXkOa4Of_0ngL-2_ZMOG7lG_f0ozpkgFs57WI
578
578
  ansible/plugins/netconf/__init__.py,sha256=yNiWM9PZHi2h2jJ0oV4QD6GuUvz-60_rcqsfefZEz7k,17147
579
579
  ansible/plugins/shell/__init__.py,sha256=207VqtEpJsvwHGG2HkCtvA9JpeAWscUnwEM-ohJxWck,9575
580
580
  ansible/plugins/shell/cmd.py,sha256=vQcWC8CGmnSEyUVmX0X1QSObBbkmqePmLRLvv7Mj_5s,2223
581
- ansible/plugins/shell/powershell.py,sha256=y0cBJeaNplF8sqwu2YxhWcUHR7eeZAeEODBeDG3zspM,11393
581
+ ansible/plugins/shell/powershell.py,sha256=hXAfwfOa_vEGz_gH4lypadIMRcVBXUdQrV29sVNSRhY,12933
582
582
  ansible/plugins/shell/sh.py,sha256=1nhiMv0_c8zu2MaDHvOCr--dG8b-iUVEPPnpMh_Hx8I,3952
583
- ansible/plugins/strategy/__init__.py,sha256=eS8JSyb3zFrTK8qm0-tK-bk8fNtG_tmbmUZ10bJsyZk,57101
583
+ ansible/plugins/strategy/__init__.py,sha256=LqNlxylwsr4NlJTr-jG9bnqwzeYNhvwSI-CMTkM7xQQ,56905
584
584
  ansible/plugins/strategy/debug.py,sha256=GxUS0bSiaWInIK8zgB7rMREEqvgrZhVlFUzOCJtnjFo,1258
585
- ansible/plugins/strategy/free.py,sha256=BAz89LpU2_uP4mFizdG7Lt5GmxsDGOmR9bS_M4RKCQk,15897
585
+ ansible/plugins/strategy/free.py,sha256=mPhduX1-EnfCVoHRV8C5LU0QG1O31sgtVJdjYvFyHJ8,16142
586
586
  ansible/plugins/strategy/host_pinned.py,sha256=3-q5l-tpheMlU-BXGm6ZQNgHvQv5IMvOCDZBLibl1L4,1959
587
587
  ansible/plugins/strategy/linear.py,sha256=odF0fAYcG4JbfYoJOEy_obx1FsMhbk64nkTmX4ezmZU,18772
588
588
  ansible/plugins/terminal/__init__.py,sha256=Pgzb8SsOGE2irgrv4f--4rfTDNxDFURzToWOatDg8J4,4472
@@ -670,7 +670,7 @@ ansible/utils/ssh_functions.py,sha256=GWySu84yXZR_L8DkZWPZBpWoRiojVCEtpyD_DeYKez
670
670
  ansible/utils/unicode.py,sha256=5NoXNgXD4zP1cRJKoaN0h-qoX03yt8sfsAF1x9CGl5Y,1184
671
671
  ansible/utils/unsafe_proxy.py,sha256=bpeNRwWfcxLkVoMc4fpUMWuOrHM1k41ik_V_kEDPh0c,12750
672
672
  ansible/utils/vars.py,sha256=UCxzbkjeXkZM27QAfUDd78K0c3W-r2Q5J4ostcTdws0,9952
673
- ansible/utils/version.py,sha256=LHBI8I_ifkG2Pp4Y_NALEOlumNpp1ruG3LPS9h8Ny5k,7789
673
+ ansible/utils/version.py,sha256=w-HTErqE6TnGPnnrif-G2KNSlvsLWEN8bQfrDK148Kg,7820
674
674
  ansible/utils/collection_loader/__init__.py,sha256=l6gUbk5MzfUXlySWrj4xi4IF9UBIrOrEpRQ52-xfGsA,1118
675
675
  ansible/utils/collection_loader/_collection_config.py,sha256=aQRueIQj0XzpFuooDjYNvUaxGDtoN0Kf3u26pu636bg,3147
676
676
  ansible/utils/collection_loader/_collection_finder.py,sha256=RMsbsNE1y2QgxH-4pZCZi-fOjT2d5KczsXLlCMdwEyM,56637
@@ -682,7 +682,7 @@ ansible/vars/hostvars.py,sha256=xd9TRpqvqMoZxrzQpbBHV_EAii_CdzSBzCg5Y5kpJr8,5202
682
682
  ansible/vars/manager.py,sha256=lIfISTPyRcNfJVWJhhNof36Zmk6xSMUkf9sFxrzCzcI,38180
683
683
  ansible/vars/plugins.py,sha256=RsRU9fiLcJwPIAyTYnmVZglsiEOMCIgQskflavE-XnE,4546
684
684
  ansible/vars/reserved.py,sha256=FBD7n2dnA0CW4I0J1LtWwk2hQqvGW0KTRPcxaRtMKWo,2615
685
- ansible_core-2.16.10.data/scripts/ansible-test,sha256=CYIYL99IxWdVTtDIj3avilIJXhGAmtjuKPPWNuLWuc8,1690
685
+ ansible_core-2.16.11rc1.data/scripts/ansible-test,sha256=CYIYL99IxWdVTtDIj3avilIJXhGAmtjuKPPWNuLWuc8,1690
686
686
  ansible_test/__init__.py,sha256=6e721yAyyyocRKzbCKtQXloAfFP7Aqv0L3zG70uh-4A,190
687
687
  ansible_test/_data/ansible.cfg,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
688
688
  ansible_test/_data/coveragerc,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -926,7 +926,7 @@ ansible_test/_util/controller/sanity/code-smell/no-unicode-literals.py,sha256=-5
926
926
  ansible_test/_util/controller/sanity/code-smell/replace-urlopen.json,sha256=w9--s9c-2F26o7JBJbTJjVGPnvlwGNfSu7KNDSmL9Qw,179
927
927
  ansible_test/_util/controller/sanity/code-smell/replace-urlopen.py,sha256=PSLEuYW5SBrcC7YIt8jdvJ3arxLL7SK7Mxbsvz1UfXc,624
928
928
  ansible_test/_util/controller/sanity/code-smell/runtime-metadata.json,sha256=H2E2-01YXLlSWjvLJT5Vtj3Gn4zB6xhPXsDJh4a7EH0,225
929
- ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py,sha256=Hjf8KqEgEa-K2pZ8E0hKQ80BMTX1slCz0Hp2P1CZWn8,12183
929
+ ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py,sha256=ozoaAQCTZM-0Hnl--jSUwbZS0mBrs6FGWbP6_esODzk,12233
930
930
  ansible_test/_util/controller/sanity/code-smell/shebang.json,sha256=3vtNzoowM53gi2KZi9peIKVIU79ulQY3FE0jYcSP77M,63
931
931
  ansible_test/_util/controller/sanity/code-smell/shebang.py,sha256=AKCti3RCgZy0GWB3bXgimr_OhqfVPOp_I7345UN_DV8,4672
932
932
  ansible_test/_util/controller/sanity/code-smell/symlinks.json,sha256=JkalgX52aKGUKqjKG5P-68F0tXmUMgldPrNAknMN2Fk,96
@@ -1001,9 +1001,9 @@ ansible_test/config/cloud-config-vultr.ini.template,sha256=XLKHk3lg_8ReQMdWfZzhh
1001
1001
  ansible_test/config/config.yml,sha256=wb3knoBmZewG3GWOMnRHoVPQWW4vPixKLPMNS6vJmTc,2620
1002
1002
  ansible_test/config/inventory.networking.template,sha256=bFNSk8zNQOaZ_twaflrY0XZ9mLwUbRLuNT0BdIFwvn4,1335
1003
1003
  ansible_test/config/inventory.winrm.template,sha256=1QU8W-GFLnYEw8yY9bVIvUAVvJYPM3hyoijf6-M7T00,1098
1004
- ansible_core-2.16.10.dist-info/COPYING,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
1005
- ansible_core-2.16.10.dist-info/METADATA,sha256=KVJq3H_BN0jM95kphyHF__p0oVeHFoPS6jlwFtQb5DA,6906
1006
- ansible_core-2.16.10.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
1007
- ansible_core-2.16.10.dist-info/entry_points.txt,sha256=0mpmsrIhODChxKl3eS-NcVQCaMetBn8KdPLtVxQgR64,453
1008
- ansible_core-2.16.10.dist-info/top_level.txt,sha256=IFbRLjAvih1DYzJWg3_F6t4sCzEMxRO7TOMNs6GkYHo,21
1009
- ansible_core-2.16.10.dist-info/RECORD,,
1004
+ ansible_core-2.16.11rc1.dist-info/COPYING,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
1005
+ ansible_core-2.16.11rc1.dist-info/METADATA,sha256=BNJI_uPD_6b89qsIVwUvvtzc9WYpF488ya5oKmUyLrw,6909
1006
+ ansible_core-2.16.11rc1.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
1007
+ ansible_core-2.16.11rc1.dist-info/entry_points.txt,sha256=0mpmsrIhODChxKl3eS-NcVQCaMetBn8KdPLtVxQgR64,453
1008
+ ansible_core-2.16.11rc1.dist-info/top_level.txt,sha256=IFbRLjAvih1DYzJWg3_F6t4sCzEMxRO7TOMNs6GkYHo,21
1009
+ ansible_core-2.16.11rc1.dist-info/RECORD,,
@@ -123,7 +123,9 @@ def get_collection_version():
123
123
  # noinspection PyBroadException
124
124
  try:
125
125
  result = collection_detail.read_manifest_json('.') or collection_detail.read_galaxy_yml('.')
126
- return SemanticVersion(result['version'])
126
+ version = SemanticVersion()
127
+ version.parse(result['version'])
128
+ return version
127
129
  except Exception: # pylint: disable=broad-except
128
130
  # We do not care why it fails, in case we cannot get the version
129
131
  # just return None to indicate "we don't know".