summaryrefslogtreecommitdiffstats
path: root/external/meta-openembedded/meta-python/recipes-extended/python-pykickstart
diff options
context:
space:
mode:
authorToshikazuOhiwa <toshikazu_ohiwa@mail.toyota.co.jp>2020-03-30 09:24:26 +0900
committerToshikazuOhiwa <toshikazu_ohiwa@mail.toyota.co.jp>2020-03-30 09:24:26 +0900
commit5b80bfd7bffd4c20d80b7c70a7130529e9a755dd (patch)
treeb4bb18dcd1487dbf1ea8127e5671b7bb2eded033 /external/meta-openembedded/meta-python/recipes-extended/python-pykickstart
parent706ad73eb02caf8532deaf5d38995bd258725cb8 (diff)
agl-basesystem
Diffstat (limited to 'external/meta-openembedded/meta-python/recipes-extended/python-pykickstart')
-rw-r--r--external/meta-openembedded/meta-python/recipes-extended/python-pykickstart/files/0001-support-authentication-for-kickstart.patch148
-rw-r--r--external/meta-openembedded/meta-python/recipes-extended/python-pykickstart/files/0002-pykickstart-parser.py-add-lock-for-readKickstart-and.patch68
-rw-r--r--external/meta-openembedded/meta-python/recipes-extended/python-pykickstart/files/0003-comment-out-sections-shutdown-and-environment-in-gen.patch48
-rw-r--r--external/meta-openembedded/meta-python/recipes-extended/python-pykickstart/files/0004-load.py-retry-to-invoke-request-with-timeout.patch83
-rw-r--r--external/meta-openembedded/meta-python/recipes-extended/python-pykickstart/python3-pykickstart_3.15.bb25
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