diff options
author | 2020-03-30 09:24:26 +0900 | |
---|---|---|
committer | 2020-03-30 09:24:26 +0900 | |
commit | 5b80bfd7bffd4c20d80b7c70a7130529e9a755dd (patch) | |
tree | b4bb18dcd1487dbf1ea8127e5671b7bb2eded033 /external/meta-openembedded/meta-python/recipes-extended/python-pykickstart | |
parent | 706ad73eb02caf8532deaf5d38995bd258725cb8 (diff) |
agl-basesystem
Diffstat (limited to 'external/meta-openembedded/meta-python/recipes-extended/python-pykickstart')
5 files changed, 372 insertions, 0 deletions
diff --git a/external/meta-openembedded/meta-python/recipes-extended/python-pykickstart/files/0001-support-authentication-for-kickstart.patch b/external/meta-openembedded/meta-python/recipes-extended/python-pykickstart/files/0001-support-authentication-for-kickstart.patch new file mode 100644 index 00000000..e7533f47 --- /dev/null +++ b/external/meta-openembedded/meta-python/recipes-extended/python-pykickstart/files/0001-support-authentication-for-kickstart.patch @@ -0,0 +1,148 @@ +From f05f5fc363e2510f6943532f3e14a6423f6a2cf1 Mon Sep 17 00:00:00 2001 +From: Hongxu Jia <hongxu.jia@windriver.com> +Date: Tue, 31 Jul 2018 17:24:47 +0800 +Subject: [PATCH 1/4] support authentication for kickstart + +While download kickstart file from web server, +we support basic/digest authentication. + +Add KickstartAuthError to report authentication failure, +which the invoker could parse this specific error. + +Upstream-Status: inappropriate [oe specific] + +Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> +--- + pykickstart/errors.py | 17 +++++++++++++++++ + pykickstart/load.py | 34 ++++++++++++++++++++++++++++------ + pykickstart/parser.py | 4 ++-- + 3 files changed, 47 insertions(+), 8 deletions(-) + +diff --git a/pykickstart/errors.py b/pykickstart/errors.py +index bf08ac5..aada7aa 100644 +--- a/pykickstart/errors.py ++++ b/pykickstart/errors.py +@@ -32,6 +32,9 @@ This module exports several exception classes: + KickstartVersionError - An exception for errors relating to unsupported + syntax versions. + ++ KickstartAuthError - An exception for errors relating to authentication ++ failed while downloading kickstart from web server ++ + And some warning classes: + + KickstartWarning - A generic warning class. +@@ -131,3 +134,17 @@ class KickstartDeprecationWarning(KickstartParseWarning, DeprecationWarning): + commands and options. + """ + pass ++ ++class KickstartAuthError(KickstartError): ++ """An exception for errors relating to authentication failed while ++ downloading kickstart from web server ++ """ ++ def __init__(self, msg): ++ """Create a new KickstartAuthError exception instance with the ++ descriptive message val. val should be the return value of ++ formatErrorMsg. ++ """ ++ KickstartError.__init__(self, msg) ++ ++ def __str__(self): ++ return self.value +diff --git a/pykickstart/load.py b/pykickstart/load.py +index fb935f2..41a2e9e 100644 +--- a/pykickstart/load.py ++++ b/pykickstart/load.py +@@ -18,10 +18,13 @@ + # with the express permission of Red Hat, Inc. + # + import requests ++from requests.auth import HTTPDigestAuth ++from requests.auth import HTTPBasicAuth ++ + import shutil + import six + +-from pykickstart.errors import KickstartError ++from pykickstart.errors import KickstartError, KickstartAuthError + from pykickstart.i18n import _ + from requests.exceptions import SSLError, RequestException + +@@ -29,7 +32,7 @@ _is_url = lambda location: '://' in location # RFC 3986 + + SSL_VERIFY = True + +-def load_to_str(location): ++def load_to_str(location, user=None, passwd=None): + '''Load a destination URL or file into a string. + Type of input is inferred automatically. + +@@ -40,7 +43,7 @@ def load_to_str(location): + Raises: KickstartError on error reading''' + + if _is_url(location): +- return _load_url(location) ++ return _load_url(location, user=user, passwd=passwd) + else: + return _load_file(location) + +@@ -70,11 +73,30 @@ def load_to_file(location, destination): + _copy_file(location, destination) + return destination + +-def _load_url(location): +- '''Load a location (URL or filename) and return contents as string''' ++def _get_auth(location, user=None, passwd=None): ++ ++ auth = None ++ request = requests.get(location, verify=SSL_VERIFY) ++ if request.status_code == requests.codes.unauthorized: ++ if user is None or passwd is None: ++ log.info("Require Authentication") ++ raise KickstartAuthError("Require Authentication.\nAppend 'ksuser=<username> kspasswd=<password>' to boot command") + ++ reasons = request.headers.get("WWW-Authenticate", "").split() ++ if reasons: ++ auth_type = reasons[0] ++ if auth_type == "Basic": ++ auth = HTTPBasicAuth(user, passwd) ++ elif auth_type == "Digest": ++ auth=HTTPDigestAuth(user, passwd) ++ ++ return auth ++ ++def _load_url(location, user=None, passwd=None): ++ '''Load a location (URL or filename) and return contents as string''' ++ auth = _get_auth(location, user=user, passwd=passwd) + try: +- request = requests.get(location, verify=SSL_VERIFY) ++ request = requests.get(location, verify=SSL_VERIFY, auth=auth) + except SSLError as e: + raise KickstartError(_('Error securely accessing URL "%s"') % location + ': {e}'.format(e=str(e))) + except RequestException as e: +diff --git a/pykickstart/parser.py b/pykickstart/parser.py +index d8880eb..22d14cb 100644 +--- a/pykickstart/parser.py ++++ b/pykickstart/parser.py +@@ -787,7 +787,7 @@ class KickstartParser(object): + i = PutBackIterator(s.splitlines(True) + [""]) + self._stateMachine(i) + +- def readKickstart(self, f, reset=True): ++ def readKickstart(self, f, reset=True, username=None, password=None): + """Process a kickstart file, given by the filename f.""" + if reset: + self._reset() +@@ -808,7 +808,7 @@ class KickstartParser(object): + self.currentdir[self._includeDepth] = cd + + try: +- s = load_to_str(f) ++ s = load_to_str(f, user=username, passwd=password) + except KickstartError as e: + raise KickstartError(_("Unable to open input kickstart file: %s") % str(e), lineno=0) + +-- +2.7.4 + diff --git a/external/meta-openembedded/meta-python/recipes-extended/python-pykickstart/files/0002-pykickstart-parser.py-add-lock-for-readKickstart-and.patch b/external/meta-openembedded/meta-python/recipes-extended/python-pykickstart/files/0002-pykickstart-parser.py-add-lock-for-readKickstart-and.patch new file mode 100644 index 00000000..4a001f33 --- /dev/null +++ b/external/meta-openembedded/meta-python/recipes-extended/python-pykickstart/files/0002-pykickstart-parser.py-add-lock-for-readKickstart-and.patch @@ -0,0 +1,68 @@ +From 62fdead139edb0f29b2f222efcb8f39be15b057e Mon Sep 17 00:00:00 2001 +From: Hongxu Jia <hongxu.jia@windriver.com> +Date: Mon, 30 Jul 2018 15:47:13 +0800 +Subject: [PATCH 2/4] pykickstart/parser.py: add lock for readKickstart and + support https without certification + +- Add lock for readKickstart to fix race issue + +- Support to download kickstart file through https without certification + +Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> +--- + pykickstart/load.py | 2 +- + pykickstart/parser.py | 18 ++++++++++++++++++ + 2 files changed, 19 insertions(+), 1 deletion(-) + +diff --git a/pykickstart/load.py b/pykickstart/load.py +index c6f013f..7adb751 100644 +--- a/pykickstart/load.py ++++ b/pykickstart/load.py +@@ -30,7 +30,7 @@ from requests.exceptions import SSLError, RequestException + + _is_url = lambda location: '://' in location # RFC 3986 + +-SSL_VERIFY = True ++SSL_VERIFY = False + + def load_to_str(location, user=None, passwd=None): + '''Load a destination URL or file into a string. +diff --git a/pykickstart/parser.py b/pykickstart/parser.py +index e44099b..e68174d 100644 +--- a/pykickstart/parser.py ++++ b/pykickstart/parser.py +@@ -55,6 +55,20 @@ from pykickstart.i18n import _ + STATE_END = "end" + STATE_COMMANDS = "commands" + ++import threading ++_private_ks_lock = threading.RLock() ++ ++class KsLock(object): ++ def __enter__(self): ++ _private_ks_lock.acquire() ++ return _private_ks_lock ++ ++ def __exit__(self, exc_type, exc_val, exc_tb): ++ _private_ks_lock.release() ++ ++ ++_ks_lock = KsLock() ++ + def _preprocessStateMachine(lineIter): + l = None + lineno = 0 +@@ -788,6 +802,10 @@ class KickstartParser(object): + self._stateMachine(i) + + def readKickstart(self, f, reset=True, username=None, password=None): ++ with _ks_lock: ++ self._readKickstart(f, reset=reset, username=username, password=password) ++ ++ def _readKickstart(self, f, reset=True, username=None, password=None): + """Process a kickstart file, given by the filename f.""" + if reset: + self._reset() +-- +2.7.4 + diff --git a/external/meta-openembedded/meta-python/recipes-extended/python-pykickstart/files/0003-comment-out-sections-shutdown-and-environment-in-gen.patch b/external/meta-openembedded/meta-python/recipes-extended/python-pykickstart/files/0003-comment-out-sections-shutdown-and-environment-in-gen.patch new file mode 100644 index 00000000..81e351b1 --- /dev/null +++ b/external/meta-openembedded/meta-python/recipes-extended/python-pykickstart/files/0003-comment-out-sections-shutdown-and-environment-in-gen.patch @@ -0,0 +1,48 @@ +From 44226393812399c61de9ca9281efa002ad4f4c01 Mon Sep 17 00:00:00 2001 +From: Hongxu Jia <hongxu.jia@windriver.com> +Date: Thu, 1 Jun 2017 15:15:15 +0800 +Subject: [PATCH 3/4] comment out sections shutdown and environment in + generated kickstart file + +Both of them is disabled by default. + +Upstream-Status: Inappropriate[oe specific] + +Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> + +fixup! add comments of shutdown for user +--- + pykickstart/commands/reboot.py | 3 +++ + pykickstart/parser.py | 2 +- + 2 files changed, 4 insertions(+), 1 deletion(-) + +diff --git a/pykickstart/commands/reboot.py b/pykickstart/commands/reboot.py +index 2c1b1c0..b3ec717 100644 +--- a/pykickstart/commands/reboot.py ++++ b/pykickstart/commands/reboot.py +@@ -43,6 +43,9 @@ class FC3_Reboot(KickstartCommand): + elif self.action == KS_SHUTDOWN: + retval += "# Shutdown after installation\nshutdown" + retval += self._getArgsAsStr() + "\n" ++ else: ++ retval += "# Shutdown after installation\n#shutdown" ++ retval += self._getArgsAsStr() + "\n" + + return retval + +diff --git a/pykickstart/parser.py b/pykickstart/parser.py +index e68174d..efd78a6 100644 +--- a/pykickstart/parser.py ++++ b/pykickstart/parser.py +@@ -385,7 +385,7 @@ class Packages(KickstartObject): + + if not self.default: + if self.environment: +- pkgs += "@^%s\n" % self.environment ++ pkgs += "#@^%s\n" % self.environment + + grps = self.groupList + grps.sort() +-- +2.7.4 + diff --git a/external/meta-openembedded/meta-python/recipes-extended/python-pykickstart/files/0004-load.py-retry-to-invoke-request-with-timeout.patch b/external/meta-openembedded/meta-python/recipes-extended/python-pykickstart/files/0004-load.py-retry-to-invoke-request-with-timeout.patch new file mode 100644 index 00000000..6ed15ab0 --- /dev/null +++ b/external/meta-openembedded/meta-python/recipes-extended/python-pykickstart/files/0004-load.py-retry-to-invoke-request-with-timeout.patch @@ -0,0 +1,83 @@ +From ffe06c6dd812b604d6482e4353d5564fad78bc90 Mon Sep 17 00:00:00 2001 +From: Hongxu Jia <hongxu.jia@windriver.com> +Date: Mon, 30 Jul 2018 15:52:21 +0800 +Subject: [PATCH 4/4] load.py: retry to invoke request with timeout + +While networkless, use request to fetch kickstart file from +network, it failed and wait 300s to break, we should retry +to invoke request with timeout explicitly. So if it the +network is up, the fetch works. + +Upstream-Status: inappropriate [oe specific] + +Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> +--- + pykickstart/load.py | 31 +++++++++++++++++++++++++++++++ + 1 file changed, 31 insertions(+) + +diff --git a/pykickstart/load.py b/pykickstart/load.py +index ad3bad1..a5cbbc5 100644 +--- a/pykickstart/load.py ++++ b/pykickstart/load.py +@@ -21,6 +21,7 @@ import requests + from requests.auth import HTTPDigestAuth + from requests.auth import HTTPBasicAuth + ++import time + import shutil + import six + +@@ -28,6 +29,9 @@ from pykickstart.errors import KickstartError, KickstartAuthError + from pykickstart.i18n import _ + from requests.exceptions import SSLError, RequestException + ++import logging ++log = logging.getLogger("anaconda.main") ++ + _is_url = lambda location: '://' in location # RFC 3986 + + SSL_VERIFY = False +@@ -73,6 +77,29 @@ def load_to_file(location, destination): + _copy_file(location, destination) + return destination + ++def _access_url(location): ++ status = False ++ ++ # Retry 45 times, wait 45s~135s ++ i = 0 ++ while i < 45: ++ ++ try: ++ request = requests.get(location, verify=SSL_VERIFY, timeout=2) ++ except RequestException as e: ++ log.info("Try '%s' %d times, %s" % (location, i, str(e))) ++ status = False ++ i += 1 ++ time.sleep(1) ++ continue ++ ++ else: ++ status = True ++ return status ++ ++ return status ++ ++ + def _get_auth(location, user=None, passwd=None): + + auth = None +@@ -94,6 +121,10 @@ def _get_auth(location, user=None, passwd=None): + + def _load_url(location, user=None, passwd=None): + '''Load a location (URL or filename) and return contents as string''' ++ ++ if not _access_url(location): ++ raise KickstartError(_("Connection %s failed" % location)) ++ + auth = _get_auth(location, user=user, passwd=passwd) + try: + request = requests.get(location, verify=SSL_VERIFY, auth=auth) +-- +2.7.4 + diff --git a/external/meta-openembedded/meta-python/recipes-extended/python-pykickstart/python3-pykickstart_3.15.bb b/external/meta-openembedded/meta-python/recipes-extended/python-pykickstart/python3-pykickstart_3.15.bb new file mode 100644 index 00000000..07876a98 --- /dev/null +++ b/external/meta-openembedded/meta-python/recipes-extended/python-pykickstart/python3-pykickstart_3.15.bb @@ -0,0 +1,25 @@ +DESCRIPTION = "A python library for manipulating kickstart files" +HOMEPAGE = "http://fedoraproject.org/wiki/pykickstart" +LICENSE = "GPLv2+" + +LIC_FILES_CHKSUM = "file://COPYING;md5=8ca43cbc842c2336e835926c2166c28b" +FILESEXTRAPATHS_prepend := "${THISDIR}/files:" + +DEPENDS = "python3" +RDEPENDS_${PN} = "python3 \ + python3-requests \ + python3-six \ +" + +S = "${WORKDIR}/git" +SRC_URI = "git://github.com/rhinstaller/pykickstart.git;protocol=https;branch=master \ + file://0001-support-authentication-for-kickstart.patch \ + file://0002-pykickstart-parser.py-add-lock-for-readKickstart-and.patch \ + file://0003-comment-out-sections-shutdown-and-environment-in-gen.patch \ + file://0004-load.py-retry-to-invoke-request-with-timeout.patch \ + " +SRCREV = "07c4d89129fa6b460acc86daf58eb5ff64cdc832" + +UPSTREAM_CHECK_GITTAGREGEX = "r(?P<pver>\d+(\.\d+)+(-\d+)*)" + +inherit setuptools3 |