[elbe-devel] [PATCH v2 10/24] run virtapt in a forked process

Torben Hohn torben.hohn at linutronix.de
Thu Feb 8 15:26:22 CET 2018


On Thu, Feb 08, 2018 at 02:16:56PM +0100, Manuel Traut wrote:
> 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>

Reviewed-by: Torben Hohn <torben.hohn 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 5ba1fb16..e062396e 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 8577abed..7a90e838 100644
> --- a/elbepack/rpcaptcache.py
> +++ b/elbepack/rpcaptcache.py
> @@ -287,3 +287,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
> 

-- 
Mit freundlichen Grüßen
Torben Hohn

Linutronix GmbH

Standort: Bremen

Phone: +49 7556 25 999 18; Fax.: +49 7556 25 999 99

Firmensitz / Registered Office: D-88690 Uhldingen, Bahnhofstr. 3
Registergericht / Local District Court: Amtsgericht Freiburg i. Br.; HRB
Nr. / Trade register no.: 700 806

Geschäftsführer / Managing Directors: Heinz Egger, Thomas Gleixner

Eine Bitte von uns: Sollten Sie diese E-Mail irrtümlich erhalten haben,
benachrichtigen Sie uns in diesem Falle bitte sobald wie es Ihnen
möglich ist, durch Antwort-Mail. Vielen Dank!
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://lists.linutronix.de/pipermail/elbe-devel/attachments/20180208/60af141e/attachment-0001.sig>


More information about the elbe-devel mailing list