[elbe-devel] [PATCH 11/11] run virtapt in a forked process
Manuel Traut
manut at linutronix.de
Mon Jan 29 13:21:10 CET 2018
virtapt uses libapt (via python-apt). In libapt settings are stored in
global variables (path to apt cache, suite, arch, ..).
To ensure to work with well defined settings host each virtapt instance in a
seperate process.
Also improve the warnings that are printed if python-apt is missing on
the system.
Signed-off-by: Manuel Traut <manut at linutronix.de>
---
elbepack/pkgutils.py | 61 ++++++++-----------------------------------------
elbepack/rpcaptcache.py | 11 +++++++++
elbepack/virtapt.py | 54 +++++++++++++++++++++++++++++++++++++++++++
3 files changed, 75 insertions(+), 51 deletions(-)
diff --git a/elbepack/pkgutils.py b/elbepack/pkgutils.py
index 8fcd79ec..76dcc69d 100644
--- a/elbepack/pkgutils.py
+++ b/elbepack/pkgutils.py
@@ -34,10 +34,11 @@ from tempfile import mkdtemp
from elbepack.shellhelper import CommandError, system
try:
- from elbepack import virtapt
from apt_pkg import TagFile
+ from elbepack.rpcaptcache import get_virtaptcache
virtapt_imported = True
-except ImportError:
+except ImportError as e:
+ print(e)
print("WARNING - python-apt not available:")
print("If there are multiple versions of elbe-bootstrap packages on the "
"mirror(s) elbe selects the first package it has found.")
@@ -132,33 +133,6 @@ def get_uri_nonvirtapt(apt_sources, target_pkg, arch):
if pkg:
return "", pkg
-def getdeps(pkg):
- for dd in pkg.depends_list.get("Depends", []):
- for d in dd:
- yield d.target_pkg.name
-
-def lookup_uri(v, d, target_pkg):
-
- pkg = v.cache[target_pkg]
-
- c = d.get_candidate_ver(pkg)
-
- x = v.source.find_index(c.file_list[0][0])
-
- r = virtapt.apt_pkg.PackageRecords(v.cache)
- r.lookup(c.file_list[0])
- uri = x.archive_uri(r.filename)
-
- if not x.is_trusted:
- return target_pkg, uri, ""
-
- # TODO remove r.sha256_hash path as soon as initvm is stretch or later
- try:
- hashval = r.sha256_hash
- except DeprecationWarning:
- hashval = str(r.hashes.find('SHA256')).split(':')[1]
-
- return target_pkg, uri, hashval
def get_uri(prj, defs, arch, target_pkg, incl_deps=False):
if arch == "default":
@@ -170,31 +144,16 @@ def get_uri(prj, defs, arch, target_pkg, incl_deps=False):
if virtapt_imported:
try:
- v = virtapt.VirtApt(arch, suite, apt_sources, "", apt_keys)
+ if arch == "default":
+ arch = prj.text("buildimage/arch", default=defs, key="arch")
+ suite = prj.text("suite")
+ v = get_virtaptcache(arch, suite, apt_sources, "", apt_keys)
except Exception as e:
+ print("python-apt failed, using fallback code")
return get_uri_nonvirtapt(apt_sources, target_pkg, arch)
- d = virtapt.apt_pkg.DepCache(v.cache)
-
- if not incl_deps:
- return [lookup_uri(v, d, target_pkg)]
-
- if incl_deps:
- deps = [lookup_uri(v, d, target_pkg)]
- togo = [target_pkg]
- while len(togo):
- pp = togo.pop()
- pkg= v.cache[pp]
- c = d.get_candidate_ver(pkg)
- for p in getdeps(c):
- if len([y for y in deps if y[0] == p]):
- continue
- if p != target_pkg and p == pp:
- continue
- deps.append(lookup_uri(v, d, p))
- togo.append(p)
-
- return deps
+ ret = v.get_uri(suite, arch, target_pkg, incl_deps)
+ return ret
else:
return get_uri_nonvirtapt(apt_sources, target_pkg, arch)
diff --git a/elbepack/rpcaptcache.py b/elbepack/rpcaptcache.py
index d843639d..975eec0f 100644
--- a/elbepack/rpcaptcache.py
+++ b/elbepack/rpcaptcache.py
@@ -294,3 +294,14 @@ def get_rpcaptcache(
mm.start()
return mm.RPCAPTCache(rfs, log, arch, notifier, norecommend, noauth)
+
+
+from elbepack.virtapt import VirtApt
+
+MyMan.register("VirtRPCAPTCache", VirtApt)
+
+def get_virtaptcache(arch, suite, sources, prefs, keylist=[]):
+ mm = MyMan()
+ mm.start()
+
+ return mm.VirtRPCAPTCache(arch, suite, sources, prefs)
diff --git a/elbepack/virtapt.py b/elbepack/virtapt.py
index 3443e477..15827183 100644
--- a/elbepack/virtapt.py
+++ b/elbepack/virtapt.py
@@ -31,6 +31,37 @@ from elbepack.shellhelper import system
from elbepack.directories import elbe_pubkey_fname
+def getdeps(pkg):
+ for dd in pkg.depends_list.get("Depends", []):
+ for d in dd:
+ yield d.target_pkg.name
+
+
+def lookup_uri(v, d, target_pkg):
+
+ pkg = v.cache[target_pkg]
+
+ c = d.get_candidate_ver(pkg)
+
+ x = v.source.find_index(c.file_list[0][0])
+
+ r = apt_pkg.PackageRecords(v.cache)
+ r.lookup(c.file_list[0])
+ uri = x.archive_uri(r.filename)
+
+ if not x.is_trusted:
+ return target_pkg, uri, ""
+
+ # TODO remove r.sha256_hash path as soon as initvm is stretch or later
+ try:
+ hashval = r.sha256_hash
+ except DeprecationWarning:
+ hashval = str(r.hashes.find('SHA256')).split(':')[1]
+
+ return target_pkg, uri, hashval
+
+
+
class VirtApt:
def __init__(self, arch, suite, sources, prefs, keylist=[]):
@@ -183,3 +214,26 @@ class VirtApt:
file = open(filename, "w")
file.write(prefs)
file.close()
+
+ def get_uri(self, suite, arch, target_pkg, incl_deps=False):
+
+ d = apt_pkg.DepCache(self.cache)
+
+ if not incl_deps:
+ return [lookup_uri(self, d, target_pkg)]
+
+ deps = [lookup_uri(self, d, target_pkg)]
+ togo = [target_pkg]
+ while len(togo):
+ pp = togo.pop()
+ pkg= self.cache[pp]
+ c = d.get_candidate_ver(pkg)
+ for p in getdeps(c):
+ if len([y for y in deps if y[0] == p]):
+ continue
+ if p != target_pkg and p == pp:
+ continue
+ deps.append(lookup_uri(self, d, p))
+ togo.append(p)
+
+ return deps
--
2.15.1
More information about the elbe-devel
mailing list