summaryrefslogtreecommitdiff
path: root/scripts/lib
diff options
context:
space:
mode:
authorTom Zanussi <tom.zanussi@linux.intel.com>2014-08-03 18:25:52 -0500
committerRichard Purdie <richard.purdie@linuxfoundation.org>2014-08-11 10:52:15 +0100
commita49b39ddf18b1b058c0a892e1a7450239eea66ce (patch)
tree13da3563ea7bbc687fdb9f680c3035d8b02012bb /scripts/lib
parent041f9e2ca52681cd6f5c2fb804dd45f05358c9f9 (diff)
downloadopenembedded-core-a49b39ddf18b1b058c0a892e1a7450239eea66ce.tar.gz
openembedded-core-a49b39ddf18b1b058c0a892e1a7450239eea66ce.tar.bz2
openembedded-core-a49b39ddf18b1b058c0a892e1a7450239eea66ce.zip
wic: Remove rpmmisc
wic doesn't use it, so remove it. Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com>
Diffstat (limited to 'scripts/lib')
-rw-r--r--scripts/lib/mic/utils/rpmmisc.py600
1 files changed, 0 insertions, 600 deletions
diff --git a/scripts/lib/mic/utils/rpmmisc.py b/scripts/lib/mic/utils/rpmmisc.py
deleted file mode 100644
index af15763e18..0000000000
--- a/scripts/lib/mic/utils/rpmmisc.py
+++ /dev/null
@@ -1,600 +0,0 @@
-#!/usr/bin/python -tt
-#
-# Copyright (c) 2008, 2009, 2010, 2011 Intel, Inc.
-#
-# This program is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the Free
-# Software Foundation; version 2 of the License
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
-# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc., 59
-# Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-import os
-import sys
-import re
-import rpm
-
-from mic import msger
-from mic.utils.errors import CreatorError
-from mic.utils.proxy import get_proxy_for
-from mic.utils import runner
-
-
-class RPMInstallCallback:
- """ Command line callback class for callbacks from the RPM library.
- """
-
- def __init__(self, ts, output=1):
- self.output = output
- self.callbackfilehandles = {}
- self.total_actions = 0
- self.total_installed = 0
- self.installed_pkg_names = []
- self.total_removed = 0
- self.mark = "+"
- self.marks = 40
- self.lastmsg = None
- self.tsInfo = None # this needs to be set for anything else to work
- self.ts = ts
- self.filelog = False
- self.logString = []
- self.headmsg = "Installing"
-
- def _dopkgtup(self, hdr):
- tmpepoch = hdr['epoch']
- if tmpepoch is None: epoch = '0'
- else: epoch = str(tmpepoch)
-
- return (hdr['name'], hdr['arch'], epoch, hdr['version'], hdr['release'])
-
- def _makeHandle(self, hdr):
- handle = '%s:%s.%s-%s-%s' % (hdr['epoch'], hdr['name'], hdr['version'],
- hdr['release'], hdr['arch'])
-
- return handle
-
- def _localprint(self, msg):
- if self.output:
- msger.info(msg)
-
- def _makefmt(self, percent, progress = True):
- l = len(str(self.total_actions))
- size = "%s.%s" % (l, l)
- fmt_done = "[%" + size + "s/%" + size + "s]"
- done = fmt_done % (self.total_installed + self.total_removed,
- self.total_actions)
- marks = self.marks - (2 * l)
- width = "%s.%s" % (marks, marks)
- fmt_bar = "%-" + width + "s"
- if progress:
- bar = fmt_bar % (self.mark * int(marks * (percent / 100.0)), )
- fmt = "\r %-10.10s: %-20.20s " + bar + " " + done
- else:
- bar = fmt_bar % (self.mark * marks, )
- fmt = " %-10.10s: %-20.20s " + bar + " " + done
- return fmt
-
- def _logPkgString(self, hdr):
- """return nice representation of the package for the log"""
- (n,a,e,v,r) = self._dopkgtup(hdr)
- if e == '0':
- pkg = '%s.%s %s-%s' % (n, a, v, r)
- else:
- pkg = '%s.%s %s:%s-%s' % (n, a, e, v, r)
-
- return pkg
-
- def callback(self, what, bytes, total, h, user):
- if what == rpm.RPMCALLBACK_TRANS_START:
- if bytes == 6:
- self.total_actions = total
-
- elif what == rpm.RPMCALLBACK_TRANS_PROGRESS:
- pass
-
- elif what == rpm.RPMCALLBACK_TRANS_STOP:
- pass
-
- elif what == rpm.RPMCALLBACK_INST_OPEN_FILE:
- self.lastmsg = None
- hdr = None
- if h is not None:
- try:
- hdr, rpmloc = h
- except:
- rpmloc = h
- hdr = readRpmHeader(self.ts, h)
-
- handle = self._makeHandle(hdr)
- fd = os.open(rpmloc, os.O_RDONLY)
- self.callbackfilehandles[handle]=fd
- if hdr['name'] not in self.installed_pkg_names:
- self.installed_pkg_names.append(hdr['name'])
- self.total_installed += 1
- return fd
- else:
- self._localprint("No header - huh?")
-
- elif what == rpm.RPMCALLBACK_INST_CLOSE_FILE:
- hdr = None
- if h is not None:
- try:
- hdr, rpmloc = h
- except:
- rpmloc = h
- hdr = readRpmHeader(self.ts, h)
-
- handle = self._makeHandle(hdr)
- os.close(self.callbackfilehandles[handle])
- fd = 0
-
- # log stuff
- #pkgtup = self._dopkgtup(hdr)
- self.logString.append(self._logPkgString(hdr))
-
- elif what == rpm.RPMCALLBACK_INST_PROGRESS:
- if h is not None:
- percent = (self.total_installed*100L)/self.total_actions
- if total > 0:
- try:
- hdr, rpmloc = h
- except:
- rpmloc = h
-
- m = re.match("(.*)-(\d+.*)-(\d+\.\d+)\.(.+)\.rpm", os.path.basename(rpmloc))
- if m:
- pkgname = m.group(1)
- else:
- pkgname = os.path.basename(rpmloc)
- if self.output:
- fmt = self._makefmt(percent)
- msg = fmt % (self.headmsg, pkgname)
- if msg != self.lastmsg:
- self.lastmsg = msg
-
- msger.info(msg)
-
- if self.total_installed == self.total_actions:
- msger.raw('')
- msger.verbose('\n'.join(self.logString))
-
- elif what == rpm.RPMCALLBACK_UNINST_START:
- pass
-
- elif what == rpm.RPMCALLBACK_UNINST_PROGRESS:
- pass
-
- elif what == rpm.RPMCALLBACK_UNINST_STOP:
- self.total_removed += 1
-
- elif what == rpm.RPMCALLBACK_REPACKAGE_START:
- pass
-
- elif what == rpm.RPMCALLBACK_REPACKAGE_STOP:
- pass
-
- elif what == rpm.RPMCALLBACK_REPACKAGE_PROGRESS:
- pass
-
-def readRpmHeader(ts, filename):
- """ Read an rpm header. """
-
- fd = os.open(filename, os.O_RDONLY)
- h = ts.hdrFromFdno(fd)
- os.close(fd)
- return h
-
-def splitFilename(filename):
- """ Pass in a standard style rpm fullname
-
- Return a name, version, release, epoch, arch, e.g.::
- foo-1.0-1.i386.rpm returns foo, 1.0, 1, i386
- 1:bar-9-123a.ia64.rpm returns bar, 9, 123a, 1, ia64
- """
-
- if filename[-4:] == '.rpm':
- filename = filename[:-4]
-
- archIndex = filename.rfind('.')
- arch = filename[archIndex+1:]
-
- relIndex = filename[:archIndex].rfind('-')
- rel = filename[relIndex+1:archIndex]
-
- verIndex = filename[:relIndex].rfind('-')
- ver = filename[verIndex+1:relIndex]
-
- epochIndex = filename.find(':')
- if epochIndex == -1:
- epoch = ''
- else:
- epoch = filename[:epochIndex]
-
- name = filename[epochIndex + 1:verIndex]
- return name, ver, rel, epoch, arch
-
-def getCanonX86Arch(arch):
- #
- if arch == "i586":
- f = open("/proc/cpuinfo", "r")
- lines = f.readlines()
- f.close()
- for line in lines:
- if line.startswith("model name") and line.find("Geode(TM)") != -1:
- return "geode"
- return arch
- # only athlon vs i686 isn't handled with uname currently
- if arch != "i686":
- return arch
-
- # if we're i686 and AuthenticAMD, then we should be an athlon
- f = open("/proc/cpuinfo", "r")
- lines = f.readlines()
- f.close()
- for line in lines:
- if line.startswith("vendor") and line.find("AuthenticAMD") != -1:
- return "athlon"
- # i686 doesn't guarantee cmov, but we depend on it
- elif line.startswith("flags") and line.find("cmov") == -1:
- return "i586"
-
- return arch
-
-def getCanonX86_64Arch(arch):
- if arch != "x86_64":
- return arch
-
- vendor = None
- f = open("/proc/cpuinfo", "r")
- lines = f.readlines()
- f.close()
- for line in lines:
- if line.startswith("vendor_id"):
- vendor = line.split(':')[1]
- break
- if vendor is None:
- return arch
-
- if vendor.find("Authentic AMD") != -1 or vendor.find("AuthenticAMD") != -1:
- return "amd64"
- if vendor.find("GenuineIntel") != -1:
- return "ia32e"
- return arch
-
-def getCanonArch():
- arch = os.uname()[4]
-
- if (len(arch) == 4 and arch[0] == "i" and arch[2:4] == "86"):
- return getCanonX86Arch(arch)
-
- if arch == "x86_64":
- return getCanonX86_64Arch(arch)
-
- return arch
-
-# Copy from libsatsolver:poolarch.c, with cleanup
-archPolicies = {
- "x86_64": "x86_64:i686:i586:i486:i386",
- "i686": "i686:i586:i486:i386",
- "i586": "i586:i486:i386",
- "ia64": "ia64:i686:i586:i486:i386",
- "armv7tnhl": "armv7tnhl:armv7thl:armv7nhl:armv7hl",
- "armv7thl": "armv7thl:armv7hl",
- "armv7nhl": "armv7nhl:armv7hl",
- "armv7hl": "armv7hl",
- "armv7l": "armv7l:armv6l:armv5tejl:armv5tel:armv5l:armv4tl:armv4l:armv3l",
- "armv6l": "armv6l:armv5tejl:armv5tel:armv5l:armv4tl:armv4l:armv3l",
- "armv5tejl": "armv5tejl:armv5tel:armv5l:armv4tl:armv4l:armv3l",
- "armv5tel": "armv5tel:armv5l:armv4tl:armv4l:armv3l",
- "armv5l": "armv5l:armv4tl:armv4l:armv3l",
-}
-
-# dict mapping arch -> ( multicompat, best personality, biarch personality )
-multilibArches = {
- "x86_64": ( "athlon", "x86_64", "athlon" ),
-}
-
-# from yumUtils.py
-arches = {
- # ia32
- "athlon": "i686",
- "i686": "i586",
- "geode": "i586",
- "i586": "i486",
- "i486": "i386",
- "i386": "noarch",
-
- # amd64
- "x86_64": "athlon",
- "amd64": "x86_64",
- "ia32e": "x86_64",
-
- # arm
- "armv7tnhl": "armv7nhl",
- "armv7nhl": "armv7hl",
- "armv7hl": "noarch",
- "armv7l": "armv6l",
- "armv6l": "armv5tejl",
- "armv5tejl": "armv5tel",
- "armv5tel": "noarch",
-
- #itanium
- "ia64": "noarch",
-}
-
-def isMultiLibArch(arch=None):
- """returns true if arch is a multilib arch, false if not"""
- if arch is None:
- arch = getCanonArch()
-
- if not arches.has_key(arch): # or we could check if it is noarch
- return False
-
- if multilibArches.has_key(arch):
- return True
-
- if multilibArches.has_key(arches[arch]):
- return True
-
- return False
-
-def getBaseArch():
- myarch = getCanonArch()
- if not arches.has_key(myarch):
- return myarch
-
- if isMultiLibArch(arch=myarch):
- if multilibArches.has_key(myarch):
- return myarch
- else:
- return arches[myarch]
-
- if arches.has_key(myarch):
- basearch = myarch
- value = arches[basearch]
- while value != 'noarch':
- basearch = value
- value = arches[basearch]
-
- return basearch
-
-def checkRpmIntegrity(bin_rpm, package):
- return runner.quiet([bin_rpm, "-K", "--nosignature", package])
-
-def checkSig(ts, package):
- """ Takes a transaction set and a package, check it's sigs,
- return 0 if they are all fine
- return 1 if the gpg key can't be found
- return 2 if the header is in someway damaged
- return 3 if the key is not trusted
- return 4 if the pkg is not gpg or pgp signed
- """
-
- value = 0
- currentflags = ts.setVSFlags(0)
- fdno = os.open(package, os.O_RDONLY)
- try:
- hdr = ts.hdrFromFdno(fdno)
-
- except rpm.error, e:
- if str(e) == "public key not availaiable":
- value = 1
- if str(e) == "public key not available":
- value = 1
- if str(e) == "public key not trusted":
- value = 3
- if str(e) == "error reading package header":
- value = 2
- else:
- error, siginfo = getSigInfo(hdr)
- if error == 101:
- os.close(fdno)
- del hdr
- value = 4
- else:
- del hdr
-
- try:
- os.close(fdno)
- except OSError:
- pass
-
- ts.setVSFlags(currentflags) # put things back like they were before
- return value
-
-def getSigInfo(hdr):
- """ checks signature from an hdr hand back signature information and/or
- an error code
- """
-
- import locale
- locale.setlocale(locale.LC_ALL, 'C')
-
- string = '%|DSAHEADER?{%{DSAHEADER:pgpsig}}:{%|RSAHEADER?{%{RSAHEADER:pgpsig}}:{%|SIGGPG?{%{SIGGPG:pgpsig}}:{%|SIGPGP?{%{SIGPGP:pgpsig}}:{(none)}|}|}|}|'
- siginfo = hdr.sprintf(string)
- if siginfo != '(none)':
- error = 0
- sigtype, sigdate, sigid = siginfo.split(',')
- else:
- error = 101
- sigtype = 'MD5'
- sigdate = 'None'
- sigid = 'None'
-
- infotuple = (sigtype, sigdate, sigid)
- return error, infotuple
-
-def checkRepositoryEULA(name, repo):
- """ This function is to check the EULA file if provided.
- return True: no EULA or accepted
- return False: user declined the EULA
- """
-
- import tempfile
- import shutil
- import urlparse
- import urllib2 as u2
- import httplib
- from mic.utils.errors import CreatorError
-
- def _check_and_download_url(u2opener, url, savepath):
- try:
- if u2opener:
- f = u2opener.open(url)
- else:
- f = u2.urlopen(url)
- except u2.HTTPError, httperror:
- if httperror.code in (404, 503):
- return None
- else:
- raise CreatorError(httperror)
- except OSError, oserr:
- if oserr.errno == 2:
- return None
- else:
- raise CreatorError(oserr)
- except IOError, oserr:
- if hasattr(oserr, "reason") and oserr.reason.errno == 2:
- return None
- else:
- raise CreatorError(oserr)
- except u2.URLError, err:
- raise CreatorError(err)
- except httplib.HTTPException, e:
- raise CreatorError(e)
-
- # save to file
- licf = open(savepath, "w")
- licf.write(f.read())
- licf.close()
- f.close()
-
- return savepath
-
- def _pager_file(savepath):
-
- if os.path.splitext(savepath)[1].upper() in ('.HTM', '.HTML'):
- pagers = ('w3m', 'links', 'lynx', 'less', 'more')
- else:
- pagers = ('less', 'more')
-
- file_showed = False
- for pager in pagers:
- cmd = "%s %s" % (pager, savepath)
- try:
- os.system(cmd)
- except OSError:
- continue
- else:
- file_showed = True
- break
-
- if not file_showed:
- f = open(savepath)
- msger.raw(f.read())
- f.close()
- msger.pause()
-
- # when proxy needed, make urllib2 follow it
- proxy = repo.proxy
- proxy_username = repo.proxy_username
- proxy_password = repo.proxy_password
-
- if not proxy:
- proxy = get_proxy_for(repo.baseurl[0])
-
- handlers = []
- auth_handler = u2.HTTPBasicAuthHandler(u2.HTTPPasswordMgrWithDefaultRealm())
- u2opener = None
- if proxy:
- if proxy_username:
- proxy_netloc = urlparse.urlsplit(proxy).netloc
- if proxy_password:
- proxy_url = 'http://%s:%s@%s' % (proxy_username, proxy_password, proxy_netloc)
- else:
- proxy_url = 'http://%s@%s' % (proxy_username, proxy_netloc)
- else:
- proxy_url = proxy
-
- proxy_support = u2.ProxyHandler({'http': proxy_url,
- 'https': proxy_url,
- 'ftp': proxy_url})
- handlers.append(proxy_support)
-
- # download all remote files to one temp dir
- baseurl = None
- repo_lic_dir = tempfile.mkdtemp(prefix = 'repolic')
-
- for url in repo.baseurl:
- tmphandlers = handlers[:]
-
- (scheme, host, path, parm, query, frag) = urlparse.urlparse(url.rstrip('/') + '/')
- if scheme not in ("http", "https", "ftp", "ftps", "file"):
- raise CreatorError("Error: invalid url %s" % url)
-
- if '@' in host:
- try:
- user_pass, host = host.split('@', 1)
- if ':' in user_pass:
- user, password = user_pass.split(':', 1)
- except ValueError, e:
- raise CreatorError('Bad URL: %s' % url)
-
- msger.verbose("adding HTTP auth: %s, XXXXXXXX" %(user))
- auth_handler.add_password(None, host, user, password)
- tmphandlers.append(auth_handler)
- url = scheme + "://" + host + path + parm + query + frag
-
- if tmphandlers:
- u2opener = u2.build_opener(*tmphandlers)
-
- # try to download
- repo_eula_url = urlparse.urljoin(url, "LICENSE.txt")
- repo_eula_path = _check_and_download_url(
- u2opener,
- repo_eula_url,
- os.path.join(repo_lic_dir, repo.id + '_LICENSE.txt'))
- if repo_eula_path:
- # found
- baseurl = url
- break
-
- if not baseurl:
- shutil.rmtree(repo_lic_dir) #cleanup
- return True
-
- # show the license file
- msger.info('For the software packages in this yum repo:')
- msger.info(' %s: %s' % (name, baseurl))
- msger.info('There is an "End User License Agreement" file that need to be checked.')
- msger.info('Please read the terms and conditions outlined in it and answer the followed qustions.')
- msger.pause()
-
- _pager_file(repo_eula_path)
-
- # Asking for the "Accept/Decline"
- if not msger.ask('Would you agree to the terms and conditions outlined in the above End User License Agreement?'):
- msger.warning('Will not install pkgs from this repo.')
- shutil.rmtree(repo_lic_dir) #cleanup
- return False
-
- # try to find support_info.html for extra infomation
- repo_info_url = urlparse.urljoin(baseurl, "support_info.html")
- repo_info_path = _check_and_download_url(
- u2opener,
- repo_info_url,
- os.path.join(repo_lic_dir, repo.id + '_support_info.html'))
- if repo_info_path:
- msger.info('There is one more file in the repo for additional support information, please read it')
- msger.pause()
- _pager_file(repo_info_path)
-
- #cleanup
- shutil.rmtree(repo_lic_dir)
- return True