<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>The Wombelix Post - proxy</title><link href="https://dominik.wombacher.cc/" rel="alternate"/><link href="/feeds/tag_proxy.atom.xml" rel="self"/><id>https://dominik.wombacher.cc/</id><updated>2022-03-22T00:00:00+01:00</updated><entry><title>How changing '&lt;' to '&gt;=' introduced a weird and hard to track bug</title><link href="https://dominik.wombacher.cc/posts/how_changing_less-than_to_greater-equal_introduced_a_weird_and_hard_to_track_bug.html" rel="alternate"/><published>2022-03-22T00:00:00+01:00</published><updated>2022-03-22T00:00:00+01:00</updated><author><name>Dominik Wombacher</name></author><id>tag:dominik.wombacher.cc,2022-03-22:/posts/how_changing_less-than_to_greater-equal_introduced_a_weird_and_hard_to_track_bug.html</id><summary type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;After upgrading to &lt;a class="reference external" href="https://www.uyuni-project.org"&gt;Uyuni 2022.2&lt;/a&gt; I wasn't able to sync openSUSE Leap 15.3
and Oracle Linux 8 repositories anymore, the configured HTTP Proxy was ignored. Multiple people reported  ... &lt;a class="read-more" href="/posts/how_changing_less-than_to_greater-equal_introduced_a_weird_and_hard_to_track_bug.html"&gt; [read more]&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;After upgrading to &lt;a class="reference external" href="https://www.uyuni-project.org"&gt;Uyuni 2022.2&lt;/a&gt; I wasn't able to sync openSUSE Leap 15.3
and Oracle Linux 8 repositories anymore, the configured HTTP Proxy was ignored. Multiple people reported similar issues:
&lt;a class="reference external" href="https://github.com/uyuni-project/uyuni/issues/4932"&gt;#4932&lt;/a&gt;
(Archive: &lt;a class="reference external" href="https://web.archive.org/web/20220322220517/https://github.com/uyuni-project/uyuni/issues/4932"&gt;[1]&lt;/a&gt;,
&lt;a class="reference external" href="https://archive.today/2022.03.22-220522/https://github.com/uyuni-project/uyuni/issues/4932"&gt;[2]&lt;/a&gt;),
&lt;a class="reference external" href="https://github.com/uyuni-project/uyuni/issues/4850"&gt;#4850&lt;/a&gt;
(Archive: &lt;a class="reference external" href="https://web.archive.org/web/20220322220540/https://github.com/uyuni-project/uyuni/issues/4850"&gt;[1]&lt;/a&gt;,
&lt;a class="reference external" href="https://archive.today/2022.03.22-220553/https://github.com/uyuni-project/uyuni/issues/4850"&gt;[2]&lt;/a&gt;),
&lt;a class="reference external" href="https://github.com/uyuni-project/uyuni/issues/4826"&gt;#4826&lt;/a&gt;
(Archive: &lt;a class="reference external" href="https://web.archive.org/web/20220322220605/https://github.com/uyuni-project/uyuni/issues/4826"&gt;[1]&lt;/a&gt;,
&lt;a class="reference external" href="https://archive.today/2022.03.22-220613/https://github.com/uyuni-project/uyuni/issues/4826"&gt;[2]&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;During multiple troubleshooting sessions I learned a lot about
the Python Codebase and the reposync tool.&lt;/p&gt;
&lt;p&gt;It took my quite a while to track down the Issue to the &lt;code&gt;urlgrabber&lt;/code&gt; package.&lt;/p&gt;
&lt;p&gt;What happened? Method &lt;code&gt;find_proxy&lt;/code&gt; in &lt;code&gt;urlgrabber.grabber.URLGrabberOptions&lt;/code&gt;
will identify the proxy server that should be used based on the provided URL Scheme.&lt;/p&gt;
&lt;p&gt;Let's assume &lt;code&gt;server.satellite.http_proxy&lt;/code&gt; in &lt;code&gt;/etc/rhn/rhn.conf&lt;/code&gt; is set to &lt;code&gt;http://10.11.12.13:80&lt;/code&gt;.&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="pygments-o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="pygments-kn"&gt;from&lt;/span&gt; &lt;span class="pygments-nn"&gt;urlgrabber.grabber&lt;/span&gt; &lt;span class="pygments-kn"&gt;import&lt;/span&gt; &lt;span class="pygments-n"&gt;URLGrabberOptions&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="pygments-n"&gt;opts&lt;/span&gt; &lt;span class="pygments-o"&gt;=&lt;/span&gt; &lt;span class="pygments-n"&gt;URLGrabberOptions&lt;/span&gt;&lt;span class="pygments-p"&gt;(&lt;/span&gt;&lt;span class="pygments-n"&gt;proxy&lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-kc"&gt;None&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-n"&gt;proxies&lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-p"&gt;{&lt;/span&gt;&lt;span class="pygments-s1"&gt;'http'&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt; &lt;span class="pygments-s1"&gt;'http://10.11.12.13:80'&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-s1"&gt;'https'&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt; &lt;span class="pygments-s1"&gt;'http://10.11.12.13:80'&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-s1"&gt;'ftp'&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt; &lt;span class="pygments-s1"&gt;'http://10.11.12.13:80'&lt;/span&gt;&lt;span class="pygments-p"&gt;})&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="pygments-n"&gt;opts&lt;/span&gt;&lt;span class="pygments-o"&gt;.&lt;/span&gt;&lt;span class="pygments-n"&gt;find_proxy&lt;/span&gt;&lt;span class="pygments-p"&gt;(&lt;/span&gt;&lt;span class="pygments-sa"&gt;b&lt;/span&gt;&lt;span class="pygments-s1"&gt;'http://test.example.com'&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-sa"&gt;b&lt;/span&gt;&lt;span class="pygments-s1"&gt;'http'&lt;/span&gt;&lt;span class="pygments-p"&gt;)&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;That's the simplified version of the relevant Code, a Instance of &lt;code&gt;URLGrabberOptions&lt;/code&gt; contains a list of proxies,
one per URL Scheme, the method &lt;code&gt;find_proxy&lt;/code&gt; is used to choose the right proxy from &lt;code&gt;opts.proxies&lt;/code&gt;
based on two parameter, &lt;code&gt;url&lt;/code&gt; and &lt;code&gt;scheme&lt;/code&gt;, both are passed as type &lt;code&gt;bytes&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The expected result, &lt;code&gt;opts.proxy&lt;/code&gt; contains the value &lt;code&gt;http://10.11.12.13:80&lt;/code&gt; from type &lt;code&gt;str&lt;/code&gt;,
actual result, &lt;code&gt;None&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The package &lt;code&gt;urlgrabber&lt;/code&gt; is quite old and not that actively maintained.
Python 3 support was added in Version 4, the last release is from October 2019.&lt;/p&gt;
&lt;p&gt;It looks like that the above issues, that proxy is None, comes from an inconsistent bytes / string conversion.
If you pass the scheme as string instead bytes, you get the expected result:&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;
&lt;span class="pygments-o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="pygments-kn"&gt;from&lt;/span&gt; &lt;span class="pygments-nn"&gt;urlgrabber.grabber&lt;/span&gt; &lt;span class="pygments-kn"&gt;import&lt;/span&gt; &lt;span class="pygments-n"&gt;URLGrabberOptions&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="pygments-n"&gt;opts&lt;/span&gt; &lt;span class="pygments-o"&gt;=&lt;/span&gt; &lt;span class="pygments-n"&gt;URLGrabberOptions&lt;/span&gt;&lt;span class="pygments-p"&gt;(&lt;/span&gt;&lt;span class="pygments-n"&gt;proxy&lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-kc"&gt;None&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-n"&gt;proxies&lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-p"&gt;{&lt;/span&gt;&lt;span class="pygments-s1"&gt;'http'&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt; &lt;span class="pygments-s1"&gt;'http://10.11.12.13:80'&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-s1"&gt;'https'&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt; &lt;span class="pygments-s1"&gt;'http://10.11.12.13:80'&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-s1"&gt;'ftp'&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt; &lt;span class="pygments-s1"&gt;'http://10.11.12.13:80'&lt;/span&gt;&lt;span class="pygments-p"&gt;})&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="pygments-n"&gt;opts&lt;/span&gt;&lt;span class="pygments-o"&gt;.&lt;/span&gt;&lt;span class="pygments-n"&gt;find_proxy&lt;/span&gt;&lt;span class="pygments-p"&gt;(&lt;/span&gt;&lt;span class="pygments-sa"&gt;b&lt;/span&gt;&lt;span class="pygments-s1"&gt;'http://test.example.com'&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt; &lt;span class="pygments-s1"&gt;'http'&lt;/span&gt;&lt;span class="pygments-p"&gt;)&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="pygments-n"&gt;opts&lt;/span&gt;&lt;span class="pygments-o"&gt;.&lt;/span&gt;&lt;span class="pygments-n"&gt;proxy&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-s1"&gt;'http://10.11.12.13:80'&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;To get the Sync of openSUSE Leap 15.3 and Oracle Linux 8 Repositories working again
through a http proxy, a small change was already sufficient:&lt;/p&gt;
&lt;pre class="code diff literal-block"&gt;
&lt;span class="pygments-gh"&gt;diff --git a/backend/satellite_tools/download.py b/backend/satellite_tools/download.py&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gh"&gt;index 3d064e5c6ce..3b7a02d5176 100644&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;--- a/backend/satellite_tools/download.py&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+++ b/backend/satellite_tools/download.py&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -114,7 +114,7 &amp;#64;&amp;#64; def __init__(self, url, filename, opts, curl_cache, parent):&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        self.parent = parent&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        (url, parts) = opts.urlparser.parse(url, opts)&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        (scheme, host, path, parm, query, frag) = parts&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;-        opts.find_proxy(url, scheme)&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        opts.find_proxy(url, scheme.decode(&amp;quot;utf-8&amp;quot;))&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        super().__init__(url, filename, opts)&lt;span class="pygments-w"&gt;

 &lt;/span&gt;    def _do_open(self):&lt;span class="pygments-w"&gt;
&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Pull Request &lt;a class="reference external" href="https://github.com/uyuni-project/uyuni/pull/4953"&gt;#4953&lt;/a&gt;
(Archive: &lt;a class="reference external" href="https://web.archive.org/web/20220322220636/https://github.com/uyuni-project/uyuni/pull/4953"&gt;[1]&lt;/a&gt;,
&lt;a class="reference external" href="https://archive.today/2022.03.22-220654/https://github.com/uyuni-project/uyuni/pull/4953"&gt;[2]&lt;/a&gt;)
was accepted and merged, unfortunately a few user still reported issues, especially related to CentOS 7 this time.&lt;/p&gt;
&lt;p&gt;After a quick check, I had the impression that syncing EL8 based Distributions like Oracle Linux 8
share the same Code as EL7 based Distributions like CentOS 7.
More or less right, but due to things like &lt;em&gt;mirrorlist&lt;/em&gt;, there are some additional steps and further
calls of &lt;code&gt;urlgrabber&lt;/code&gt; split across the reposync code.&lt;/p&gt;
&lt;p&gt;I had to find another way to fix it without touching multiple files and methods.
So I gave some hacky &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Monkey_patch"&gt;Monkey Patching&lt;/a&gt; a try.
First I reverted the previous workaround:&lt;/p&gt;
&lt;pre class="code diff literal-block"&gt;
&lt;span class="pygments-gh"&gt;diff --git a/python/spacewalk/satellite_tools/download.py b/python/spacewalk/satellite_tools/download.py&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gh"&gt;index 3b7a02d5176..3d064e5c6ce 100644&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;--- a/python/spacewalk/satellite_tools/download.py&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+++ b/python/spacewalk/satellite_tools/download.py&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -114,7 +114,7 &amp;#64;&amp;#64; def __init__(self, url, filename, opts, curl_cache, parent):&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        self.parent = parent&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        (url, parts) = opts.urlparser.parse(url, opts)&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        (scheme, host, path, parm, query, frag) = parts&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;-        opts.find_proxy(url, scheme.decode(&amp;quot;utf-8&amp;quot;))&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+        opts.find_proxy(url, scheme)&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;        super().__init__(url, filename, opts)&lt;span class="pygments-w"&gt;

 &lt;/span&gt;    def _do_open(self):&lt;span class="pygments-w"&gt;
&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Then I created a new &lt;code&gt;find_proxy&lt;/code&gt; method, which just triggers the original one
but performs the bytes to string conversion. The magic happens in the two lines after
the method, &lt;code&gt;urlgrabber_find_proxy&lt;/code&gt; becomes the method from &lt;code&gt;urlgrabber&lt;/code&gt;
and my own version replaces the original one. That way it doesn't matter where in
&lt;code&gt;yum_src.py&lt;/code&gt; anything related to &lt;code&gt;urlgrabber&lt;/code&gt; will be triggered, scheme
will always be converted to a string a the proxy set as configured and expected.&lt;/p&gt;
&lt;pre class="code diff literal-block"&gt;
&lt;span class="pygments-gh"&gt;diff --git a/python/spacewalk/satellite_tools/repo_plugins/yum_src.py b/python/spacewalk/satellite_tools/repo_plugins/yum_src.py&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gh"&gt;index 85013cfb36a..39f36be61e5 100644&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gd"&gt;--- a/python/spacewalk/satellite_tools/repo_plugins/yum_src.py&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+++ b/python/spacewalk/satellite_tools/repo_plugins/yum_src.py&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gu"&gt;&amp;#64;&amp;#64; -80,6 +80,17 &amp;#64;&amp;#64;&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;APACHE_USER = 'wwwrun'&lt;span class="pygments-w"&gt;
 &lt;/span&gt;APACHE_GROUP = 'www'&lt;span class="pygments-w"&gt;

&lt;/span&gt;&lt;span class="pygments-gi"&gt;+&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+# Monkey Patch 'urlgrabber.grabber' method 'find_proxy' to enforce type string for variable 'scheme'&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+# Workaround due to wrong byte/string handling in 'urlgrabber' package&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+# Required by reposync to connect through http_proxy as configured&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+def find_proxy(self, url, scheme):&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+    urlgrabber_find_proxy(self, url, scheme.decode('utf-8'))&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+urlgrabber_find_proxy = urlgrabber.grabber.URLGrabberOptions.find_proxy&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+urlgrabber.grabber.URLGrabberOptions.find_proxy = find_proxy&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-gi"&gt;+&lt;/span&gt;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;class ZyppoSync:&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;span class="pygments-w"&gt;
 &lt;/span&gt;    This class prepares a environment for running Zypper inside a dedicated reposync root&lt;span class="pygments-w"&gt;
&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;There is a &lt;a class="reference external" href="https://github.com/rpm-software-management/urlgrabber/issues/33"&gt;Issue&lt;/a&gt;
(Archive: &lt;a class="reference external" href="https://web.archive.org/web/20220322220711/https://github.com/rpm-software-management/urlgrabber/issues/33"&gt;[1]&lt;/a&gt;,
&lt;a class="reference external" href="https://archive.today/2022.03.22-220733/https://github.com/rpm-software-management/urlgrabber/issues/33"&gt;[2]&lt;/a&gt;)
in the urlgrabber repository, until that's fixed, it looks like that a
workaround in the Uyuni / reposync Codebase will be required.&lt;/p&gt;
&lt;p&gt;I created a new &lt;a class="reference external" href="https://github.com/uyuni-project/uyuni/pull/5051"&gt;Pull Request&lt;/a&gt;
(Archive: &lt;a class="reference external" href="https://web.archive.org/web/20220322220814/https://github.com/uyuni-project/uyuni/pull/5051"&gt;[1]&lt;/a&gt;,
&lt;a class="reference external" href="https://archive.today/2022.03.22-220809/https://github.com/uyuni-project/uyuni/pull/5051"&gt;[2]&lt;/a&gt;)
in the Uyuni Project based on the above described fix, let's see if anyone comes
up with a more elegant solution or if the guys are happy with that one and agree to merge it.&lt;/p&gt;
&lt;p&gt;Based on my tests, by syncing &lt;em&gt;openSUSE Leap 15.3&lt;/em&gt;, &lt;em&gt;Oracle Linux 8&lt;/em&gt;, &lt;em&gt;CentOS 7&lt;/em&gt; and &lt;em&gt;Ubuntu 20.04&lt;/em&gt; repositories,
it should finally resolve all, so far known, Issues related to reposync and HTTP Proxy.&lt;/p&gt;
&lt;p&gt;And what had all this to do with a change of '&amp;lt;' to '&amp;gt;='?&lt;/p&gt;
&lt;p&gt;In PR &lt;a class="reference external" href="https://github.com/uyuni-project/uyuni/pull/4604"&gt;#4604&lt;/a&gt;
(Archive: &lt;a class="reference external" href="https://web.archive.org/web/20220322220815/https://github.com/uyuni-project/uyuni/pull/4604"&gt;[1]&lt;/a&gt;,
&lt;a class="reference external" href="https://archive.today/2022.03.22-220831/https://github.com/uyuni-project/uyuni/pull/4604"&gt;[2]&lt;/a&gt;)
the version was bumped, changing &lt;code&gt;python3-urlgrabber &amp;lt; 4&lt;/code&gt; to
&lt;code&gt;python3-urlgrabber &amp;gt;= 4&lt;/code&gt; caused all that trouble and lot of issues
where syncing repositories behind a http proxy was just not possible anymore.&lt;/p&gt;
</content><category term="Code"/><category term="Uyuni"/><category term="reposync"/><category term="urlgrabber"/><category term="bug"/><category term="proxy"/></entry></feed>