Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package ansible-core-2.20 for
openSUSE:Factory checked in at 2026-06-19 16:37:39
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ansible-core-2.20 (Old)
and /work/SRC/openSUSE:Factory/.ansible-core-2.20.new.1956 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ansible-core-2.20"
Fri Jun 19 16:37:39 2026 rev:2 rq:1360470 version:2.20.7
Changes:
--------
--- /work/SRC/openSUSE:Factory/ansible-core-2.20/ansible-core-2.20.changes
2026-06-03 20:27:34.382030611 +0200
+++
/work/SRC/openSUSE:Factory/.ansible-core-2.20.new.1956/ansible-core-2.20.changes
2026-06-19 17:12:52.580508586 +0200
@@ -1,0 +2,15 @@
+Fri Jun 19 05:28:23 UTC 2026 - Johannes Kastl
<[email protected]>
+
+- update to 2.20.7:
+
https://github.com/ansible/ansible/blob/v2.20.7/changelogs/CHANGELOG-v2.20.rst
+ * Security Fixes
+ - ansible-galaxy install - Ensure role requirements are passed
+ as positional arguments to :command:`git clone`. Previously,
+ a malicious role author could inject arbitrary git
+ configuration in role dependencies. (CVE-2026-11332)
+ * Bugfixes
+ - module_utils sanitize_keys and remove_value functions now
+ sort their input to ensure matching subsets are always
+ obscured.
+
+-------------------------------------------------------------------
Old:
----
ansible_core-2.20.6.tar.gz
ansible_core-2.20.6.tar.gz.sha256
New:
----
ansible_core-2.20.7.tar.gz
ansible_core-2.20.7.tar.gz.sha256
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ ansible-core-2.20.spec ++++++
--- /var/tmp/diff_new_pack.ua4hKE/_old 2026-06-19 17:12:55.224598842 +0200
+++ /var/tmp/diff_new_pack.ua4hKE/_new 2026-06-19 17:12:55.232599115 +0200
@@ -43,7 +43,7 @@
%endif
Name: ansible-core-2.20
-Version: 2.20.6
+Version: 2.20.7
Release: 0
Summary: Radically simple IT automation
License: GPL-3.0-or-later
++++++ ansible_core-2.20.6.tar.gz -> ansible_core-2.20.7.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ansible_core-2.20.6/PKG-INFO
new/ansible_core-2.20.7/PKG-INFO
--- old/ansible_core-2.20.6/PKG-INFO 2026-05-18 21:15:21.000000000 +0200
+++ new/ansible_core-2.20.7/PKG-INFO 2026-06-18 21:33:04.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: ansible-core
-Version: 2.20.6
+Version: 2.20.7
Summary: Radically simple IT automation
Author: Ansible Project
Project-URL: Homepage, https://ansible.com/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ansible_core-2.20.6/ansible_core.egg-info/PKG-INFO
new/ansible_core-2.20.7/ansible_core.egg-info/PKG-INFO
--- old/ansible_core-2.20.6/ansible_core.egg-info/PKG-INFO 2026-05-18
21:15:21.000000000 +0200
+++ new/ansible_core-2.20.7/ansible_core.egg-info/PKG-INFO 2026-06-18
21:33:04.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: ansible-core
-Version: 2.20.6
+Version: 2.20.7
Summary: Radically simple IT automation
Author: Ansible Project
Project-URL: Homepage, https://ansible.com/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible_core-2.20.6/ansible_core.egg-info/SOURCES.txt
new/ansible_core-2.20.7/ansible_core.egg-info/SOURCES.txt
--- old/ansible_core-2.20.6/ansible_core.egg-info/SOURCES.txt 2026-05-18
21:15:21.000000000 +0200
+++ new/ansible_core-2.20.7/ansible_core.egg-info/SOURCES.txt 2026-06-18
21:33:04.000000000 +0200
@@ -1026,6 +1026,7 @@
test/integration/targets/ansible-galaxy-role/files/safe-symlinks/tasks/utils/suite.yml
test/integration/targets/ansible-galaxy-role/meta/main.yml
test/integration/targets/ansible-galaxy-role/tasks/dir-traversal.yml
+test/integration/targets/ansible-galaxy-role/tasks/git-config-injection.yml
test/integration/targets/ansible-galaxy-role/tasks/main.yml
test/integration/targets/ansible-galaxy-role/tasks/valid-role-symlinks.yml
test/integration/targets/ansible-galaxy/files/testserver.py
@@ -3333,6 +3334,7 @@
test/integration/targets/no_log/no_log_suboptions_invalid.yml
test/integration/targets/no_log/runme.sh
test/integration/targets/no_log/secretvars.yml
+test/integration/targets/no_log/sub_masking.yml
test/integration/targets/no_log/action_plugins/action_sets_no_log.py
test/integration/targets/no_log/library/module.py
test/integration/targets/noexec/aliases
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ansible_core-2.20.6/changelogs/CHANGELOG-v2.20.rst
new/ansible_core-2.20.7/changelogs/CHANGELOG-v2.20.rst
--- old/ansible_core-2.20.6/changelogs/CHANGELOG-v2.20.rst 2026-05-18
21:15:21.000000000 +0200
+++ new/ansible_core-2.20.7/changelogs/CHANGELOG-v2.20.rst 2026-06-18
21:33:04.000000000 +0200
@@ -4,6 +4,25 @@
.. contents:: Topics
+v2.20.7
+=======
+
+Release Summary
+---------------
+
+| Release Date: 2026-06-18
+| `Porting Guide
<https://docs.ansible.com/ansible-core/2.20/porting_guides/porting_guide_core_2.20.html>`__
+
+Security Fixes
+--------------
+
+- ansible-galaxy install - Ensure role requirements are passed as positional
arguments to :command:`git clone`. Previously, a malicious role author could
inject arbitrary git configuration in role dependencies. (CVE-2026-11332)
+
+Bugfixes
+--------
+
+- module_utils sanitize_keys and remove_value functions now sort their input
to ensure matching subsets are always obscured.
+
v2.20.6
=======
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ansible_core-2.20.6/changelogs/changelog.yaml
new/ansible_core-2.20.7/changelogs/changelog.yaml
--- old/ansible_core-2.20.6/changelogs/changelog.yaml 2026-05-18
21:15:21.000000000 +0200
+++ new/ansible_core-2.20.7/changelogs/changelog.yaml 2026-06-18
21:33:04.000000000 +0200
@@ -659,3 +659,34 @@
- core_ci_remote_alias.yml
- winrm-psrp-nolog.yml
release_date: '2026-05-11'
+ 2.20.7:
+ changes:
+ release_summary: '| Release Date: 2026-06-18
+
+ | `Porting Guide
<https://docs.ansible.com/ansible-core/2.20/porting_guides/porting_guide_core_2.20.html>`__
+
+ '
+ codename: Good Times Bad Times
+ fragments:
+ - 2.20.7_summary.yaml
+ release_date: '2026-06-18'
+ 2.20.7rc1:
+ changes:
+ bugfixes:
+ - module_utils sanitize_keys and remove_value functions now sort their
input
+ to ensure matching subsets are always obscured.
+ release_summary: '| Release Date: 2026-06-11
+
+ | `Porting Guide
<https://docs.ansible.com/ansible-core/2.20/porting_guides/porting_guide_core_2.20.html>`__
+
+ '
+ security_fixes:
+ - ansible-galaxy install - Ensure role requirements are passed as
positional
+ arguments to :command:`git clone`. Previously, a malicious role author
could
+ inject arbitrary git configuration in role dependencies.
(CVE-2026-11332)
+ codename: Good Times Bad Times
+ fragments:
+ - 2.20.7rc1_summary.yaml
+ - fix-cloning-malformed-role-requirements.yml
+ - sort_obfuscation.yml
+ release_date: '2026-06-11'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible_core-2.20.6/lib/ansible/module_utils/ansible_release.py
new/ansible_core-2.20.7/lib/ansible/module_utils/ansible_release.py
--- old/ansible_core-2.20.6/lib/ansible/module_utils/ansible_release.py
2026-05-18 21:15:21.000000000 +0200
+++ new/ansible_core-2.20.7/lib/ansible/module_utils/ansible_release.py
2026-06-18 21:33:04.000000000 +0200
@@ -17,6 +17,6 @@
from __future__ import annotations
-__version__ = '2.20.6'
+__version__ = '2.20.7'
__author__ = 'Ansible, Inc.'
__codename__ = "Good Times Bad Times"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible_core-2.20.6/lib/ansible/module_utils/common/parameters.py
new/ansible_core-2.20.7/lib/ansible/module_utils/common/parameters.py
--- old/ansible_core-2.20.6/lib/ansible/module_utils/common/parameters.py
2026-05-18 21:15:21.000000000 +0200
+++ new/ansible_core-2.20.7/lib/ansible/module_utils/common/parameters.py
2026-06-18 21:33:04.000000000 +0200
@@ -499,7 +499,7 @@
return no_log_values
-def _sanitize_keys_conditions(value, no_log_strings, ignore_keys,
deferred_removals):
+def _sanitize_keys_conditions(value, deferred_removals):
""" Helper method to :func:`sanitize_keys` to build ``deferred_removals``
and avoid deep recursion. """
if isinstance(value, (str, bytes)):
return value
@@ -867,8 +867,9 @@
deferred_removals = deque()
- no_log_strings = [to_native(s, errors='surrogate_or_strict') for s in
no_log_strings]
- new_value = _sanitize_keys_conditions(obj, no_log_strings, ignore_keys,
deferred_removals)
+ # sort ensuring we always handle longer strings vs subsets
+ no_log_strings = sorted([to_native(s, errors='surrogate_or_strict') for s
in no_log_strings], key=len, reverse=True)
+ new_value = _sanitize_keys_conditions(obj, deferred_removals)
while deferred_removals:
old_data, new_data = deferred_removals.popleft()
@@ -876,15 +877,15 @@
if isinstance(new_data, Mapping):
for old_key, old_elem in old_data.items():
if old_key in ignore_keys or old_key.startswith('_ansible'):
- new_data[old_key] = _sanitize_keys_conditions(old_elem,
no_log_strings, ignore_keys, deferred_removals)
+ new_data[old_key] = _sanitize_keys_conditions(old_elem,
deferred_removals)
else:
# Sanitize the old key. We take advantage of the
sanitizing code in
# _remove_values_conditions() rather than recreating it
here.
new_key = _remove_values_conditions(old_key,
no_log_strings, None)
- new_data[new_key] = _sanitize_keys_conditions(old_elem,
no_log_strings, ignore_keys, deferred_removals)
+ new_data[new_key] = _sanitize_keys_conditions(old_elem,
deferred_removals)
else:
for elem in old_data:
- new_elem = _sanitize_keys_conditions(elem, no_log_strings,
ignore_keys, deferred_removals)
+ new_elem = _sanitize_keys_conditions(elem, deferred_removals)
if isinstance(new_data, MutableSequence):
new_data.append(new_elem)
elif isinstance(new_data, MutableSet):
@@ -907,7 +908,8 @@
deferred_removals = deque()
- no_log_strings = [to_native(s, errors='surrogate_or_strict') for s in
no_log_strings]
+ # sort ensuring we always handle longer strings vs subsets
+ no_log_strings = sorted([to_native(s, errors='surrogate_or_strict') for s
in no_log_strings], key=len, reverse=True)
new_value = _remove_values_conditions(value, no_log_strings,
deferred_removals)
while deferred_removals:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ansible_core-2.20.6/lib/ansible/release.py
new/ansible_core-2.20.7/lib/ansible/release.py
--- old/ansible_core-2.20.6/lib/ansible/release.py 2026-05-18
21:15:21.000000000 +0200
+++ new/ansible_core-2.20.7/lib/ansible/release.py 2026-06-18
21:33:04.000000000 +0200
@@ -17,6 +17,6 @@
from __future__ import annotations
-__version__ = '2.20.6'
+__version__ = '2.20.7'
__author__ = 'Ansible, Inc.'
__codename__ = "Good Times Bad Times"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ansible_core-2.20.6/lib/ansible/utils/galaxy.py
new/ansible_core-2.20.7/lib/ansible/utils/galaxy.py
--- old/ansible_core-2.20.6/lib/ansible/utils/galaxy.py 2026-05-18
21:15:21.000000000 +0200
+++ new/ansible_core-2.20.7/lib/ansible/utils/galaxy.py 2026-06-18
21:33:04.000000000 +0200
@@ -72,7 +72,7 @@
elif scm == 'hg':
clone_cmd.append('--insecure')
- clone_cmd.extend([src, name])
+ clone_cmd.extend(['--', src, name])
run_scm_cmd(clone_cmd, tempdir)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible_core-2.20.6/test/integration/targets/ansible-galaxy-role/tasks/git-config-injection.yml
new/ansible_core-2.20.7/test/integration/targets/ansible-galaxy-role/tasks/git-config-injection.yml
---
old/ansible_core-2.20.6/test/integration/targets/ansible-galaxy-role/tasks/git-config-injection.yml
1970-01-01 01:00:00.000000000 +0100
+++
new/ansible_core-2.20.7/test/integration/targets/ansible-galaxy-role/tasks/git-config-injection.yml
2026-06-18 21:33:04.000000000 +0200
@@ -0,0 +1,52 @@
+- vars:
+ invalid_git_opts: '-ccore.sshCommand=sh -c "id > {{ remote_tmp_dir
}}/role_exe"'
+ # use SSH protocol to test core.sshCommand is not configured
+ dummy_repo: [email protected]:ansible/nosuchrepo.git
+ block:
+ - name: Ensure git is installed
+ package:
+ name: git
+ when: ansible_distribution not in ["MacOSX", "Alpine"]
+ register: git_install
+
+ - name: Create invalid requirements file
+ copy:
+ dest: "{{ remote_tmp_dir }}/invalid-requirements.yml"
+ content: |
+ - src: {{ invalid_git_opts }}
+ scm: git
+ name: {{ dummy_repo }}
+ - src: {{ dummy_repo }}
+ scm: git
+ name: {{ invalid_git_opts }}
+
+ - name: Attempt to install invalid role requirements
+ command: ansible-galaxy install -r {{ remote_tmp_dir
}}/invalid-requirements.yml --ignore-errors
+ register: result
+ environment:
+ ANSIBLE_NOCOLOR: True
+ ANSIBLE_FORCE_COLOR: False
+
+ - name: Validate git core.sshCommand did not run
+ stat:
+ path: "{{ remote_tmp_dir }}/role_exe"
+ register: stat_result
+ failed_when: stat_result.stat.exists
+
+ - name: Verify the invalid field is treated as a single positional
argument (repo or dest)
+ assert:
+ that:
+ - stderr is search(error1)
+ - stderr is search(error2)
+ - (stderr | regex_findall("git clone") | length) == (stderr |
regex_findall("git clone --") | length) == 2
+ vars:
+ stderr: "{{ result.stderr | regex_replace('\\n', ' ') }}"
+ error1: "repository '{{ invalid_git_opts }}' does not exist"
+ error2: "Cloning into '{{ invalid_git_opts }}'"
+
+ always:
+ - name: Uninstall git if it was installed
+ package:
+ name: git
+ state: absent
+ when: git_install is changed | default(false)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible_core-2.20.6/test/integration/targets/ansible-galaxy-role/tasks/main.yml
new/ansible_core-2.20.7/test/integration/targets/ansible-galaxy-role/tasks/main.yml
---
old/ansible_core-2.20.6/test/integration/targets/ansible-galaxy-role/tasks/main.yml
2026-05-18 21:15:21.000000000 +0200
+++
new/ansible_core-2.20.7/test/integration/targets/ansible-galaxy-role/tasks/main.yml
2026-06-18 21:33:04.000000000 +0200
@@ -70,3 +70,4 @@
- import_tasks: dir-traversal.yml
- import_tasks: valid-role-symlinks.yml
+- import_tasks: git-config-injection.yml
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible_core-2.20.6/test/integration/targets/no_log/library/module.py
new/ansible_core-2.20.7/test/integration/targets/no_log/library/module.py
--- old/ansible_core-2.20.6/test/integration/targets/no_log/library/module.py
2026-05-18 21:15:21.000000000 +0200
+++ new/ansible_core-2.20.7/test/integration/targets/no_log/library/module.py
2026-06-18 21:33:04.000000000 +0200
@@ -37,7 +37,7 @@
}
)
- module.exit_json(msg='done')
+ module.exit_json(msg='done', values=', '.join([str(v) for v in
module.params.values() if v]))
if __name__ == '__main__':
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible_core-2.20.6/test/integration/targets/no_log/runme.sh
new/ansible_core-2.20.7/test/integration/targets/no_log/runme.sh
--- old/ansible_core-2.20.6/test/integration/targets/no_log/runme.sh
2026-05-18 21:15:21.000000000 +0200
+++ new/ansible_core-2.20.7/test/integration/targets/no_log/runme.sh
2026-06-18 21:33:04.000000000 +0200
@@ -30,3 +30,6 @@
[ "$(ansible-playbook no_log_config.yml -i ../../inventory -vvvvv "$@" | grep
-Ec 'the output has been hidden')" = "1" ]
[ "$(ANSIBLE_NO_LOG=0 ansible-playbook no_log_config.yml -i ../../inventory
-vvvvv "$@" | grep -Ec 'the output has been hidden')" = "1" ]
[ "$(ANSIBLE_NO_LOG=1 ansible-playbook no_log_config.yml -i ../../inventory
-vvvvv "$@" | grep -Ec 'the output has been hidden')" = "5" ]
+
+# Ensure module no_log masking handles secrets that are substrings of other
secrets correctly
+ansible-playbook sub_masking.yml -i ../../inventory -vvvvv "$@"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible_core-2.20.6/test/integration/targets/no_log/secretvars.yml
new/ansible_core-2.20.7/test/integration/targets/no_log/secretvars.yml
--- old/ansible_core-2.20.6/test/integration/targets/no_log/secretvars.yml
2026-05-18 21:15:21.000000000 +0200
+++ new/ansible_core-2.20.7/test/integration/targets/no_log/secretvars.yml
2026-06-18 21:33:04.000000000 +0200
@@ -30,3 +30,6 @@
s211: SECRET211
s212: SECRET212
s213: SECRET213
+
+# substring
+sec: RET
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible_core-2.20.6/test/integration/targets/no_log/sub_masking.yml
new/ansible_core-2.20.7/test/integration/targets/no_log/sub_masking.yml
--- old/ansible_core-2.20.6/test/integration/targets/no_log/sub_masking.yml
1970-01-01 01:00:00.000000000 +0100
+++ new/ansible_core-2.20.7/test/integration/targets/no_log/sub_masking.yml
2026-06-18 21:33:04.000000000 +0200
@@ -0,0 +1,60 @@
+- name: Ensure no_log obfuscation does not mask on substrings
+ hosts: all
+ vars_files:
+ - secretvars.yml
+ gather_facts: no
+
+ tasks:
+ - name: test with option long
+ module:
+ secret: "{{ s101 }}"
+ subopt_dict:
+ str_sub_opt1: "{{ s102 }}"
+ nested_subopt:
+ n_subopt1: "{{ s103 }}"
+ subopt_list:
+ - subopt1: "{{sec}}"
+ register: long_first
+
+ - name: Task with suboptions long
+ module:
+ secret: "{{ sec }}"
+ subopt_dict:
+ str_sub_opt1: '{{ s101 }}'
+ nested_subopt:
+ n_subopt1: "{{ s102 }}"
+ subopt_list:
+ - subopt1: "{{ s103 }}"
+ register: short_first
+
+ - name: Task with suboptions long
+ module:
+ secret: "{{ s101 }}"
+ subopt_dict:
+ str_sub_opt1: '{{ sec }}'
+ nested_subopt:
+ n_subopt1: "{{ s102 }}"
+ subopt_list:
+ - subopt1: "{{ s103 }}"
+ register: middle_top
+
+ - name: Task with suboptions long
+ module:
+ secret: "{{ s102}}"
+ subopt_dict:
+ str_sub_opt1: '{{ s102 }}'
+ nested_subopt:
+ n_subopt1: "{{ sec }}"
+ subopt_list:
+ - subopt1: "{{ s103 }}"
+ register: middle_bottom
+
+ - name: check output
+ assert:
+ that:
+ - "'SEC' not in (q('vars', item)|to_json)"
+ loop:
+ - long_first
+ - short_first
+ - middle_top
+ - middle_bottom
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible_core-2.20.6/test/lib/ansible_test/_util/target/setup/bootstrap.sh
new/ansible_core-2.20.7/test/lib/ansible_test/_util/target/setup/bootstrap.sh
---
old/ansible_core-2.20.6/test/lib/ansible_test/_util/target/setup/bootstrap.sh
2026-05-18 21:15:21.000000000 +0200
+++
new/ansible_core-2.20.7/test/lib/ansible_test/_util/target/setup/bootstrap.sh
2026-06-18 21:33:04.000000000 +0200
@@ -291,9 +291,13 @@
# Instead, ansible-test will install it using pip.
# packaging and resolvelib are missing for controller supported Python
versions, so we just
# skip them and let ansible-test install them from PyPI.
+ #
+ # sqlite-libs needs to be specified currently to get sqlite3 imports
working
+ # https://redhat.atlassian.net/browse/RHEL-178008
if [ "${controller}" ]; then
packages="
${packages}
+ sqlite-libs
${py_pkg_prefix}-cryptography
${py_pkg_prefix}-pyyaml
"
++++++ ansible_core-2.20.6.tar.gz.sha256 -> ansible_core-2.20.7.tar.gz.sha256
++++++
---
/work/SRC/openSUSE:Factory/ansible-core-2.20/ansible_core-2.20.6.tar.gz.sha256
2026-06-03 20:27:35.970096489 +0200
+++
/work/SRC/openSUSE:Factory/.ansible-core-2.20.new.1956/ansible_core-2.20.7.tar.gz.sha256
2026-06-19 17:12:52.684512136 +0200
@@ -1 +1 @@
-3066c430e8cba46777bf736ebcd085c90b0d7664c3fbd8c5b85227f8579cdcbf
ansible_core-2.20.6.tar.gz
+84d4097a28e816e8bf8066307088f833837db9efdc9dc6716b43253de3b14106
ansible_core-2.20.7.tar.gz