|
30 | 30 | import os
|
31 | 31 | try:
|
32 | 32 | from urllib.request import urlopen
|
| 33 | + from urllib.error import HTTPError |
33 | 34 | except ImportError:
|
34 |
| - from urllib2 import urlopen |
35 |
| -import subprocess |
| 35 | + from urllib2 import urlopen, HTTPError |
36 | 36 | import shutil
|
| 37 | +import string |
| 38 | +import subprocess |
37 | 39 | import sys
|
38 | 40 | import tarfile
|
39 | 41 |
|
|
163 | 165 |
|
164 | 166 | class AbstractBuilder(object):
|
165 | 167 | library = None
|
166 |
| - url_template = None |
| 168 | + url_templates = None |
167 | 169 | src_template = None
|
168 | 170 | build_template = None
|
169 | 171 | install_target = 'install'
|
@@ -202,6 +204,11 @@ def __eq__(self, other):
|
202 | 204 | def __hash__(self):
|
203 | 205 | return hash((self.library, self.version))
|
204 | 206 |
|
| 207 | + @property |
| 208 | + def short_version(self): |
| 209 | + """Short version for OpenSSL download URL""" |
| 210 | + return None |
| 211 | + |
205 | 212 | @property
|
206 | 213 | def openssl_cli(self):
|
207 | 214 | """openssl CLI binary"""
|
@@ -255,11 +262,23 @@ def _download_src(self):
|
255 | 262 | src_dir = os.path.dirname(self.src_file)
|
256 | 263 | if not os.path.isdir(src_dir):
|
257 | 264 | os.makedirs(src_dir)
|
258 |
| - url = self.url_template.format(self.version) |
259 |
| - log.info("Downloading from {}".format(url)) |
260 |
| - req = urlopen(url) |
261 |
| - # KISS, read all, write all |
262 |
| - data = req.read() |
| 265 | + data = None |
| 266 | + for url_template in self.url_templates: |
| 267 | + url = url_template.format(v=self.version, s=self.short_version) |
| 268 | + log.info("Downloading from {}".format(url)) |
| 269 | + try: |
| 270 | + req = urlopen(url) |
| 271 | + # KISS, read all, write all |
| 272 | + data = req.read() |
| 273 | + except HTTPError as e: |
| 274 | + log.error( |
| 275 | + "Download from {} has from failed: {}".format(url, e) |
| 276 | + ) |
| 277 | + else: |
| 278 | + log.info("Successfully downloaded from {}".format(url)) |
| 279 | + break |
| 280 | + if data is None: |
| 281 | + raise ValueError("All download URLs have failed") |
263 | 282 | log.info("Storing {}".format(self.src_file))
|
264 | 283 | with open(self.src_file, "wb") as f:
|
265 | 284 | f.write(data)
|
@@ -380,7 +399,10 @@ def run_python_tests(self, tests, network=True):
|
380 | 399 |
|
381 | 400 | class BuildOpenSSL(AbstractBuilder):
|
382 | 401 | library = "OpenSSL"
|
383 |
| - url_template = "https://www.openssl.org/source/openssl-{}.tar.gz" |
| 402 | + url_templates = ( |
| 403 | + "https://www.openssl.org/source/openssl-{v}.tar.gz", |
| 404 | + "https://www.openssl.org/source/old/{s}/openssl-{v}.tar.gz" |
| 405 | + ) |
384 | 406 | src_template = "openssl-{}.tar.gz"
|
385 | 407 | build_template = "openssl-{}"
|
386 | 408 | # only install software, skip docs
|
@@ -419,12 +441,20 @@ def _post_install_300(self):
|
419 | 441 | )
|
420 | 442 | with open(openssl_fips_cnf, "w") as f:
|
421 | 443 | f.write(OPENSSL_FIPS_CNF.format(self=self))
|
| 444 | + @property |
| 445 | + def short_version(self): |
| 446 | + """Short version for OpenSSL download URL""" |
| 447 | + short_version = self.version.rstrip(string.ascii_letters) |
| 448 | + if short_version.startswith("0.9"): |
| 449 | + short_version = "0.9.x" |
| 450 | + return short_version |
422 | 451 |
|
423 | 452 |
|
424 | 453 | class BuildLibreSSL(AbstractBuilder):
|
425 | 454 | library = "LibreSSL"
|
426 |
| - url_template = ( |
427 |
| - "https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-{}.tar.gz") |
| 455 | + url_templates = ( |
| 456 | + "https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-{v}.tar.gz", |
| 457 | + ) |
428 | 458 | src_template = "libressl-{}.tar.gz"
|
429 | 459 | build_template = "libressl-{}"
|
430 | 460 |
|
|
0 commit comments