示例#1
0
from itertools import chain
from collections import Counter

try:
    from lxml import etree
    from lxml.etree import ParserError
except (SystemExit, KeyboardInterrupt):
    raise
except (ImportError, SystemError, RuntimeError, Exception):
    # broken or missing xml support
    # https://bugs.python.org/issue14988
    msg = ["Please emerge dev-python/lxml in order to use repoman."]
    from portage.output import EOutput
    out = EOutput()
    for line in msg:
        out.eerror(line)
    sys.exit(1)

# import our initialized portage instance
from repoman._portage import portage
from repoman.metadata import metadata_dtd_uri
from repoman.modules.scan.scanbase import ScanBase

from portage.exception import InvalidAtom
from portage import os
from portage.dep import Atom
from portage.xml.metadata import parse_metadata_use

from .use_flags import USEFlagChecks

metadata_xml_encoding = 'UTF-8'
示例#2
0
文件: git.py 项目: hugbubby/portage
    def verify_head(self):
        if (self.repo.module_specific_options.get(
                'sync-git-verify-commit-signature', 'false') != 'true'):
            return True

        if self.repo.sync_openpgp_key_path is not None:
            if gemato is None:
                writemsg_level(
                    "!!! Verifying against specified key requires gemato-11.0+ installed\n",
                    level=logging.ERROR,
                    noiselevel=-1)
                return False
            openpgp_env = gemato.openpgp.OpenPGPEnvironment()
        else:
            openpgp_env = None

        try:
            out = EOutput()
            env = None
            if openpgp_env is not None:
                try:
                    out.einfo('Using keys from %s' %
                              (self.repo.sync_openpgp_key_path, ))
                    with io.open(self.repo.sync_openpgp_key_path, 'rb') as f:
                        openpgp_env.import_key(f)
                    out.ebegin('Refreshing keys from keyserver')
                    openpgp_env.refresh_keys()
                    out.eend(0)
                except GematoException as e:
                    writemsg_level(
                        "!!! Verification impossible due to keyring problem:\n%s\n"
                        % (e, ),
                        level=logging.ERROR,
                        noiselevel=-1)
                    return (1, False)

                env = os.environ.copy()
                env['GNUPGHOME'] = openpgp_env.home

            rev_cmd = [self.bin_command, "log", "--pretty=format:%G?", "-1"]
            try:
                status = (portage._unicode_decode(
                    subprocess.check_output(rev_cmd,
                                            cwd=portage._unicode_encode(
                                                self.repo.location),
                                            env=env)).strip())
            except subprocess.CalledProcessError:
                return False

            if status == 'G':  # good signature is good
                out.einfo('Trusted signature found on top commit')
                return True
            elif status == 'U':  # untrusted
                out.ewarn('Top commit signature is valid but not trusted')
                return True
            else:
                if status == 'B':
                    expl = 'bad signature'
                elif status == 'X':
                    expl = 'expired signature'
                elif status == 'Y':
                    expl = 'expired key'
                elif status == 'R':
                    expl = 'revoked key'
                elif status == 'E':
                    expl = 'unable to verify signature (missing key?)'
                elif status == 'N':
                    expl = 'no signature'
                else:
                    expl = 'unknown issue'
                out.eerror('No valid signature found: %s' % (expl, ))
                return False
        finally:
            if openpgp_env is not None:
                openpgp_env.close()
示例#3
0
from itertools import chain

try:
	from lxml import etree
	from lxml.etree import ParserError
except (SystemExit, KeyboardInterrupt):
	raise
except (ImportError, SystemError, RuntimeError, Exception):
	# broken or missing xml support
	# https://bugs.python.org/issue14988
	msg = ["Please emerge dev-python/lxml in order to use repoman."]
	from portage.output import EOutput
	out = EOutput()
	for line in msg:
		out.eerror(line)
	sys.exit(1)

# import our initialized portage instance
from repoman._portage import portage
from repoman.metadata import metadata_dtd_uri
from repoman.modules.scan.scanbase import ScanBase

from portage.exception import InvalidAtom
from portage import os
from portage.dep import Atom
from portage.xml.metadata import parse_metadata_use

from .use_flags import USEFlagChecks

metadata_xml_encoding = 'UTF-8'
示例#4
0
class pkgsys_portage(package_system):
    pkgsysname = 'portage'

    def __init__(self):
        package_system.__init__(self)
        self.eout = EOutput()

    def begin(self, msg):
        self.eout.ebegin(msg)

    def end(self, success_ornot):
        if success_ornot: self.eout.eend(0)
        else: self.eout.eend(1)

    def info(self, msg):
        self.eout.einfo(msg)

    def error(self, msg):
        self.eout.eerror(msg)

    def init_options(self, options):
        options['--portage-distfiles'] = portage.settings['DISTDIR']
        options['--portage-dir'] = os.path.join('/usr/local/portage', pypi_dir)

    def finalize_options(self, options):
        map(lambda diropt: ensure_dir(options[diropt]),
            ['--portage-distfiles', '--portage-dir'])

    def setup_args(self, args):
        if args['license'] != None and args['license'] != '':
            args['license'] = LicenseConvert(args['name'], args['license'])
        elif 'classifiers' in args and args['classifiers'] is not None:
            for cfline in args['classifiers']:
                cflist = map(lambda cf: cf.strip(), cfline.split('::'))
                if len(cflist) == 3 and \
                        cflist[0] == 'License' and cflist[1] == 'OSI Approved':
                    args['license'] = LicenseConvert(args['name'], cflist[2])
        if args['license'] == '': args['license'] = 'UNKNOWN'

        iuse_arr = ['doc'] + args['extras_require'].keys()
        args['iuse'] = string.join(iuse_arr)

        rdepend = map(lambda dep: DepConvert(dep), args['install_requires'])
        args['rdepend'] = string.join(rdepend, '\n\t')

        ereq = {}
        for k in args['extras_require']:
            if args['extras_require'][k] == []: continue
            ereq[k] = args['extras_require'][k]
        depend = []
        if args['name'] != 'setuptools':
            depend.append('dev-python/setuptools')
        depend.append('doc? ( dev-python/pudge dev-python/buildutils )')
        depend.extend(map(lambda extra: '%s? ( %s )' % \
                              (extra, string.join(map(lambda edep:
                                                          DepConvert(edep),
                                                      ereq[extra]))),
                          ereq.keys()))
        args['depend'] = string.join(depend, '\n\t')
        args['patchlist'] = \
            string.join(map(lambda p: 'epatch "${FILESDIR}/%s"' % p,
                            args['patches']), '\n\t')

        # Setup ebuild.
        fullname = MakeFullname(args['name'], args['version'])
        if 'rev' not in args:
            ebuild_fn = '%s.ebuild' % fullname
        else:
            ebuild_fn = '%s-r%s.ebuild' % (fullname, args['rev'])
        ebuild_dir = os.path.join(args['--portage-dir'],
                                  NameConvert(args['name']))
        ebuild_path = os.path.join(ebuild_dir, ebuild_fn)
        for pkgtype in ['setup.py', 'single.py']:
            if args['pkgtype'] == pkgtype:
                args['template'] = os.path.join('portage', '%s.tmpl' % pkgtype)
                break
        if 'template' not in args:
            raise RuntimeError, 'Unsupported package type %s' % args['pkgtype']
        args['output'] = ebuild_path
        args['filedir'] = args['--portage-distfiles']
        args['patchdir'] = os.path.join(ebuild_dir, 'files')

    def process(self, args):
        # Call ebuild ... digest
        try:
            portage._doebuild_manifest_exempt_depend += 1
            pkgdir = os.path.dirname(args['output'])
            fetchlist_dict = portage.FetchlistDict(pkgdir, portage.settings,
                                                   portage.portdb)
            mf = Manifest(pkgdir,
                          args['--portage-distfiles'],
                          fetchlist_dict=fetchlist_dict,
                          manifest1_compat=False)
            mf.create(requiredDistfiles=None,
                      assumeDistHashesSometimes=True,
                      assumeDistHashesAlways=True)
            mf.write()
        finally:
            portage._doebuild_manifest_exempt_depend -= 1
示例#5
0
    def verify_head(self, revision="-1"):
        if self.repo.module_specific_options.get(
                "sync-git-verify-commit-signature",
                "false").lower() not in ("true", "yes"):
            return True

        if self.repo.sync_openpgp_key_path is not None and gemato is None:
            writemsg_level(
                "!!! Verifying against specified key requires gemato-14.5+ installed\n",
                level=logging.ERROR,
                noiselevel=-1,
            )
            return False

        openpgp_env = self._get_openpgp_env(self.repo.sync_openpgp_key_path)

        try:
            out = EOutput()
            env = None
            if openpgp_env is not None and self.repo.sync_openpgp_key_path is not None:
                try:
                    out.einfo("Using keys from %s" %
                              (self.repo.sync_openpgp_key_path, ))
                    with io.open(self.repo.sync_openpgp_key_path, "rb") as f:
                        openpgp_env.import_key(f)
                    self._refresh_keys(openpgp_env)
                except (GematoException, asyncio.TimeoutError) as e:
                    writemsg_level(
                        "!!! Verification impossible due to keyring problem:\n%s\n"
                        % (e, ),
                        level=logging.ERROR,
                        noiselevel=-1,
                    )
                    return False

                env = os.environ.copy()
                env["GNUPGHOME"] = openpgp_env.home

            rev_cmd = [
                self.bin_command, "log", "-n1", "--pretty=format:%G?", revision
            ]
            try:
                status = portage._unicode_decode(
                    subprocess.check_output(
                        rev_cmd,
                        cwd=portage._unicode_encode(self.repo.location),
                        env=env,
                    )).strip()
            except subprocess.CalledProcessError:
                return False

            if status == "G":  # good signature is good
                out.einfo("Trusted signature found on top commit")
                return True
            if status == "U":  # untrusted
                out.ewarn("Top commit signature is valid but not trusted")
                return True
            if status == "B":
                expl = "bad signature"
            elif status == "X":
                expl = "expired signature"
            elif status == "Y":
                expl = "expired key"
            elif status == "R":
                expl = "revoked key"
            elif status == "E":
                expl = "unable to verify signature (missing key?)"
            elif status == "N":
                expl = "no signature"
            else:
                expl = "unknown issue"
            out.eerror("No valid signature found: %s" % (expl, ))
            return False
        finally:
            if openpgp_env is not None:
                openpgp_env.close()
示例#6
0
文件: git.py 项目: mgorny/portage
	def verify_head(self, revision='-1'):
		if (self.repo.module_specific_options.get(
				'sync-git-verify-commit-signature', 'false') != 'true'):
			return True

		if self.repo.sync_openpgp_key_path is not None:
			if gemato is None:
				writemsg_level("!!! Verifying against specified key requires gemato-11.0+ installed\n",
					level=logging.ERROR, noiselevel=-1)
				return False
			openpgp_env = gemato.openpgp.OpenPGPEnvironment()
		else:
			openpgp_env = None

		try:
			out = EOutput()
			env = None
			if openpgp_env is not None:
				try:
					out.einfo('Using keys from %s' % (self.repo.sync_openpgp_key_path,))
					with io.open(self.repo.sync_openpgp_key_path, 'rb') as f:
						openpgp_env.import_key(f)
					out.ebegin('Refreshing keys from keyserver')
					openpgp_env.refresh_keys()
					out.eend(0)
				except GematoException as e:
					writemsg_level("!!! Verification impossible due to keyring problem:\n%s\n"
							% (e,),
							level=logging.ERROR, noiselevel=-1)
					return False

				env = os.environ.copy()
				env['GNUPGHOME'] = openpgp_env.home

			rev_cmd = [self.bin_command, "log", "-n1", "--pretty=format:%G?", revision]
			try:
				status = (portage._unicode_decode(
					subprocess.check_output(rev_cmd,
						cwd=portage._unicode_encode(self.repo.location),
						env=env))
					.strip())
			except subprocess.CalledProcessError:
				return False

			if status == 'G':  # good signature is good
				out.einfo('Trusted signature found on top commit')
				return True
			elif status == 'U':  # untrusted
				out.ewarn('Top commit signature is valid but not trusted')
				return True
			else:
				if status == 'B':
					expl = 'bad signature'
				elif status == 'X':
					expl = 'expired signature'
				elif status == 'Y':
					expl = 'expired key'
				elif status == 'R':
					expl = 'revoked key'
				elif status == 'E':
					expl = 'unable to verify signature (missing key?)'
				elif status == 'N':
					expl = 'no signature'
				else:
					expl = 'unknown issue'
				out.eerror('No valid signature found: %s' % (expl,))
				return False
		finally:
			if openpgp_env is not None:
				openpgp_env.close()