From 159544610e5a925d589198febaa5198778ea51c0 Mon Sep 17 00:00:00 2001 From: Abhijeet Kasurde Date: Tue, 1 Sep 2020 19:25:08 +0530 Subject: [PATCH] get_url: Handle same SHA sum for downloaded files (#71435) Fixes: #71420 Signed-off-by: Abhijeet Kasurde --- changelogs/fragments/71420_get_url.yml | 2 + lib/ansible/modules/get_url.py | 6 +- .../targets/get_url/tasks/main.yml | 60 +++++++++++++++++++ 3 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 changelogs/fragments/71420_get_url.yml diff --git a/changelogs/fragments/71420_get_url.yml b/changelogs/fragments/71420_get_url.yml new file mode 100644 index 00000000000..3083f66a417 --- /dev/null +++ b/changelogs/fragments/71420_get_url.yml @@ -0,0 +1,2 @@ +minor_changes: +- get_url - handle same SHA sum for checksum file (https://github.com/ansible/ansible/issues/71420). diff --git a/lib/ansible/modules/get_url.py b/lib/ansible/modules/get_url.py index b031a43b552..00a2aa1c7f9 100644 --- a/lib/ansible/modules/get_url.py +++ b/lib/ansible/modules/get_url.py @@ -502,16 +502,16 @@ def main(): with open(checksum_tmpsrc) as f: lines = [line.rstrip('\n') for line in f] os.remove(checksum_tmpsrc) - checksum_map = {} + checksum_map = [] for line in lines: parts = line.split(None, 1) if len(parts) == 2: - checksum_map[parts[0]] = parts[1] + checksum_map.append((parts[0], parts[1])) filename = url_filename(url) # Look through each line in the checksum file for a hash corresponding to # the filename in the url, returning the first hash that is found. - for cksum in (s for (s, f) in checksum_map.items() if f.strip('./') == filename): + for cksum in (s for (s, f) in checksum_map if f.strip('./') == filename): checksum = cksum break else: diff --git a/test/integration/targets/get_url/tasks/main.yml b/test/integration/targets/get_url/tasks/main.yml index 6adb3db74c7..f0a868dd147 100644 --- a/test/integration/targets/get_url/tasks/main.yml +++ b/test/integration/targets/get_url/tasks/main.yml @@ -335,11 +335,17 @@ dest: '{{ files_dir }}/27617.txt' content: "ptux" +- name: create duplicate src file + copy: + dest: '{{ files_dir }}/71420.txt' + content: "ptux" + - name: create sha1 checksum file of src copy: dest: '{{ files_dir }}/sha1sum.txt' content: | a97e6837f60cec6da4491bab387296bbcd72bdba 27617.txt + a97e6837f60cec6da4491bab387296bbcd72bdba 71420.txt 3911340502960ca33aece01129234460bfeb2791 not_target1.txt 1b4b6adf30992cedb0f6edefd6478ff0a593b2e4 not_target2.txt @@ -348,6 +354,7 @@ dest: '{{ files_dir }}/sha256sum.txt' content: | b1b6ce5073c8fac263a8fc5edfffdbd5dec1980c784e09c5bc69f8fb6056f006. 27617.txt + b1b6ce5073c8fac263a8fc5edfffdbd5dec1980c784e09c5bc69f8fb6056f006. 71420.txt 30949cc401e30ac494d695ab8764a9f76aae17c5d73c67f65e9b558f47eff892 not_target1.txt d0dbfc1945bc83bf6606b770e442035f2c4e15c886ee0c22fb3901ba19900b5b not_target2.txt @@ -356,6 +363,7 @@ dest: '{{ files_dir }}/sha256sum_with_dot.txt' content: | b1b6ce5073c8fac263a8fc5edfffdbd5dec1980c784e09c5bc69f8fb6056f006. ./27617.txt + b1b6ce5073c8fac263a8fc5edfffdbd5dec1980c784e09c5bc69f8fb6056f006. ./71420.txt 30949cc401e30ac494d695ab8764a9f76aae17c5d73c67f65e9b558f47eff892 ./not_target1.txt d0dbfc1945bc83bf6606b770e442035f2c4e15c886ee0c22fb3901ba19900b5b ./not_target2.txt @@ -418,6 +426,50 @@ path: "{{ remote_tmp_dir }}/27617sha256_with_dot.txt" register: stat_result_sha256_with_file_scheme +- name: download 71420.txt with sha1 checksum url + get_url: + url: 'http://localhost:{{ http_port }}/71420.txt' + dest: '{{ remote_tmp_dir }}' + checksum: 'sha1:http://localhost:{{ http_port }}/sha1sum.txt' + register: result_sha1_71420 + +- stat: + path: "{{ remote_tmp_dir }}/71420.txt" + register: stat_result_sha1_71420 + +- name: download 71420.txt with sha256 checksum url + get_url: + url: 'http://localhost:{{ http_port }}/71420.txt' + dest: '{{ remote_tmp_dir }}/71420sha256.txt' + checksum: 'sha256:http://localhost:{{ http_port }}/sha256sum.txt' + register: result_sha256_71420 + +- stat: + path: "{{ remote_tmp_dir }}/71420.txt" + register: stat_result_sha256_71420 + +- name: download 71420.txt with sha256 checksum url with dot leading paths + get_url: + url: 'http://localhost:{{ http_port }}/71420.txt' + dest: '{{ remote_tmp_dir }}/71420sha256_with_dot.txt' + checksum: 'sha256:http://localhost:{{ http_port }}/sha256sum_with_dot.txt' + register: result_sha256_with_dot_71420 + +- stat: + path: "{{ remote_tmp_dir }}/71420sha256_with_dot.txt" + register: stat_result_sha256_with_dot_71420 + +- name: download 71420.txt with sha256 checksum url with file scheme + get_url: + url: 'http://localhost:{{ http_port }}/71420.txt' + dest: '{{ remote_tmp_dir }}/71420sha256_with_file_scheme.txt' + checksum: 'sha256:file://{{ files_dir }}/sha256sum.txt' + register: result_sha256_with_file_scheme_71420 + +- stat: + path: "{{ remote_tmp_dir }}/71420sha256_with_dot.txt" + register: stat_result_sha256_with_file_scheme_71420 + - name: Assert that the file was downloaded assert: that: @@ -429,6 +481,14 @@ - "stat_result_sha256.stat.exists == true" - "stat_result_sha256_with_dot.stat.exists == true" - "stat_result_sha256_with_file_scheme.stat.exists == true" + - result_sha1_71420 is changed + - result_sha256_71420 is changed + - result_sha256_with_dot_71420 is changed + - result_sha256_with_file_scheme_71420 is changed + - "stat_result_sha1_71420.stat.exists == true" + - "stat_result_sha256_71420.stat.exists == true" + - "stat_result_sha256_with_dot_71420.stat.exists == true" + - "stat_result_sha256_with_file_scheme_71420.stat.exists == true" #https://github.com/ansible/ansible/issues/16191 - name: Test url split with no filename