src/modules/lint/engine.py
author Danek Duvall <danek.duvall@oracle.com>
Thu, 04 Aug 2011 13:17:33 -0700
changeset 2493 5db1603f0c3f
parent 2488 010931d9cabe
child 2500 a63fead21404
permissions -rw-r--r--
18609 support for a human-readable version string
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
     1
#!/usr/bin/python
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
     2
#
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
     3
# CDDL HEADER START
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
     4
#
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
     5
# The contents of this file are subject to the terms of the
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
     6
# Common Development and Distribution License (the "License").
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
     7
# You may not use this file except in compliance with the License.
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
     8
#
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
     9
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    10
# or http://www.opensolaris.org/os/licensing.
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    11
# See the License for the specific language governing permissions
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    12
# and limitations under the License.
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    13
#
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    14
# When distributing Covered Code, include this CDDL HEADER in each
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    15
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    16
# If applicable, add the following below this CDDL HEADER, with the
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    17
# fields enclosed by brackets "[]" replaced with your own identifying
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    18
# information: Portions Copyright [yyyy] [name of copyright owner]
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    19
#
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    20
# CDDL HEADER END
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    21
#
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    22
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    23
#
2339
aa5954c06b9d 16148 need linked image support for zones, phase 1
Edward Pilatowicz <edward.pilatowicz@oracle.com>
parents: 2319
diff changeset
    24
# Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    25
#
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    26
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    27
import pkg.client.api
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    28
import pkg.client.progress as progress
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    29
import pkg.lint.base as base
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    30
import pkg.lint.config
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    31
import pkg.fmri
2434
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
    32
from pkg.client.api_errors import ApiException
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    33
from pkg.version import DotSequence, Version
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    34
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    35
import ConfigParser
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    36
import logging
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    37
import os
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    38
import shutil
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    39
import sys
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    40
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    41
PKG_CLIENT_NAME = "pkglint"
2493
5db1603f0c3f 18609 support for a human-readable version string
Danek Duvall <danek.duvall@oracle.com>
parents: 2488
diff changeset
    42
CLIENT_API_VERSION = 65
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    43
pkg.client.global_settings.client_name = PKG_CLIENT_NAME
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    44
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    45
class LintEngineException(Exception):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    46
        """An exception thrown when something fatal goes wrong with the engine.
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    47
            """
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    48
        def __unicode__(self):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    49
                # To workaround python issues 6108 and 2517, this provides a
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    50
                # a standard wrapper for this class' exceptions so that they
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    51
                # have a chance of being stringified correctly.
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    52
                return str(self)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    53
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    54
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    55
class LintEngineCache():
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    56
        """This class provides two caches for the LintEngine.  A cache of the
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    57
        latest packages for one or more ImageInterface objects intended to be
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    58
        seeded at startup, and a generic manifest cache"""
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    59
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    60
        def __init__(self, version_pattern, release=None):
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    61
                self.latest_cache = {}
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    62
                self.misc_cache = {}
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    63
                self.logger = logging.getLogger("pkglint")
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    64
                self.seeded = False
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    65
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    66
                # release is a build number, eg. 150
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    67
                # version_pattern used by the engine is a regexp, intended
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    68
                # to be used when searching for images, combined with the
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    69
                # release - eg. "*,5.11-0."
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    70
                #
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    71
                self.version_pattern = version_pattern
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    72
                self.release = release
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    73
                if self.release:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    74
                        combined = "%s%s" % \
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    75
                            (version_pattern.split(",")[1], release)
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    76
                        try:
2434
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
    77
                                self.branch = DotSequence(
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
    78
                                    combined.split("-")[1])
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    79
                        except pkg.version.IllegalDotSequence:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    80
                                raise LintEngineException(
2434
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
    81
                                    _("Invalid release string: %s") %
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
    82
                                    self.release)
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    83
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    84
        def seed_latest(self, api_inst, tracker, phase):
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    85
                """Builds a cache of latest manifests for this api_inst, using
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    86
                the provided progress tracker, phase and release.
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    87
                """
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    88
                search_type = pkg.client.api.ImageInterface.LIST_NEWEST
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    89
                pattern_list = ["*"]
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    90
                self.seeded = True
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    91
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    92
                # a dictionary of PkgFmri objects which we'll use to retrieve
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    93
                # manifests
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    94
                packages = {}
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    95
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    96
                # a dictionary of the latest packages for a given release
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    97
                self.latest_cache[api_inst] = {}
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    98
                # a dictionary of packages at other versions
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
    99
                self.misc_cache[api_inst] = {}
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   100
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   101
                if not self.release:
2434
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   102
                        for item in api_inst.get_pkg_list(
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   103
                            search_type, patterns=pattern_list, variants=True):
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   104
                                pub_name, name, version = item[0]
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   105
                                pub = api_inst.get_publisher(prefix=pub_name)
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   106
                                fmri ="pkg://%s/%s@%s" % (pub, name, version)
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   107
                                pfmri = pkg.fmri.PkgFmri(fmri)
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   108
                                # index with just the pkg name, allowing us to
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   109
                                # use this cache when searching for dependencies
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   110
                                packages["pkg:/%s" % name] = pfmri
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   111
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   112
                else:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   113
                        # take a bit more time building up the latest version
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   114
                        # of all packages not greater than build_release
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   115
                        search_type = pkg.client.api.ImageInterface.LIST_ALL
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   116
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   117
                        for item in api_inst.get_pkg_list(
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   118
                            search_type, variants=True):
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   119
                                pub_name, name, version = item[0]
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   120
                                pub = api_inst.get_publisher(prefix=pub_name)
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   121
                                fmri ="pkg://%s/%s@%s" % (pub, name, version)
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   122
                                # obtain just the build branch, e.g. from
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   123
                                # 0.5.11,5.11-0.111:20090508T235707Z, return
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   124
                                # 0.111
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   125
                                branch = Version(version, None).branch
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   126
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   127
                                pfmri = pkg.fmri.PkgFmri(fmri)
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   128
                                key = "pkg:/%s" % name
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   129
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   130
                                if key not in packages and \
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   131
                                    branch <= self.branch:
2183
21ae45e8dfcf 17581 There should be a way of removing a package as part of upgrade
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2158
diff changeset
   132
                                        packages[key] = pfmri
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   133
                                # get_pkg_list returns results sorted by
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   134
                                # publisher, then sorted by version. We may find
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   135
                                # another publisher that has a more recent
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   136
                                # package available, so we need to respect
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   137
                                # timestamps in that case.
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   138
                                elif key in packages:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   139
                                        prev = packages[key]
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   140
                                        if lint_fmri_successor(pfmri, prev,
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   141
                                            ignore_timestamps=False) and \
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   142
                                            branch <= self.branch:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   143
                                                packages[key] = pfmri
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   144
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   145
                # now get the manifests
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   146
                tracker.index_set_goal(phase, len(packages))
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   147
                for item in packages:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   148
                        self.latest_cache[api_inst][item] = \
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   149
                            api_inst.get_manifest(packages[item])
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   150
                        tracker.index_add_progress()
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   151
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   152
        def gen_latest(self, api_inst, tracker, pattern):
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   153
                """ A generator function to return the latest version of the
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   154
                packages matching the supplied pattern from the publishers set
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   155
                for api_inst"""
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   156
                if not self.seeded:
2434
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   157
                        raise LintEngineException("Cache has not been seeded")
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   158
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   159
                if api_inst in self.latest_cache:
2383
cfc3e2182a1d 18400 pkglint output is still not deterministic
Tim Foster <tim.s.foster@oracle.com>
parents: 2382
diff changeset
   160
                        for item in sorted(self.latest_cache[api_inst]):
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   161
                                mf = self.latest_cache[api_inst][item]
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   162
                                if pattern and pkg.fmri.glob_match(
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   163
                                    str(mf.fmri), pattern):
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   164
                                        tracker.index_add_progress()
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   165
                                        yield mf
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   166
                                elif not pattern:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   167
                                        tracker.index_add_progress()
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   168
                                        yield mf
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   169
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   170
        def get_latest(self, api_inst, pkg_name):
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   171
                """ Return the package matching pkg_name from the publishers set
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   172
                for api_inst """
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   173
                if not self.seeded:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   174
                        raise LintEngineException("Cache has not been seeded")
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   175
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   176
                if api_inst in self.latest_cache:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   177
                        if pkg_name in self.latest_cache[api_inst]:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   178
                                return self.latest_cache[api_inst][pkg_name]
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   179
                return None
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   180
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   181
        def count_latest(self, api_inst, pattern):
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   182
                """Returns the number of manifests in the given api_inst cache
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   183
                that match the provided pattern. If pattern is None,
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   184
                we return the length of the api_inst cache."""
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   185
                if not self.seeded:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   186
                        raise LintEngineException("Cache has not been seeded")
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   187
                if not pattern:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   188
                        return len(self.latest_cache[api_inst])
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   189
                count = 0
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   190
                for item in self.latest_cache[api_inst]:
2183
21ae45e8dfcf 17581 There should be a way of removing a package as part of upgrade
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2158
diff changeset
   191
                        mf = self.latest_cache[api_inst][item]
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   192
                        if pkg.fmri.glob_match(str(mf.fmri), pattern):
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   193
                                count = count + 1
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   194
                return count
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   195
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   196
        def add(self, api_inst, pkg_name, manifest):
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   197
                """Adds a given manifest to the cache for a given api_inst"""
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   198
                # we don't update latest_cache, since that should have been
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   199
                # pre-seeded on startup.
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   200
                self.misc_cache[api_inst][pkg_name] = manifest
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   201
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   202
        def get(self, api_inst, pkg_name):
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   203
                """Retrieves a given pkg_name entry from the cache.
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   204
                Can raise KeyError if the package isn't in the cache."""
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   205
                if not self.seeded:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   206
                        raise LintEngineException("Cache has not been seeded")
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   207
                if pkg_name in self.latest_cache[api_inst]:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   208
                        return self.latest_cache[api_inst][pkg_name]
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   209
                else:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   210
                        return self.misc_cache[api_inst][pkg_name]
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   211
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   212
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   213
class LintEngine(object):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   214
        """LintEngine is the main object used by pkglint to discover lint
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   215
        plugins, and execute lint checks on package manifests, retrieved
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   216
        from a repository or from local objects.
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   217
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   218
        Lint plugins are written as subclasses of pkg.lint.base.Checker
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   219
        and are discovered once the module containing them has been listed
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   220
        in either the shipped pkglintrc file, a user-supplied version, or
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   221
        the pkg.lint.config.PkglintConfig defaults.
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   222
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   223
        User-supplied manifests for linting are read directly as files
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   224
        provided on the command line.  For cross-checking against a
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   225
        reference repository, or linting the manifests in a repository, we
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   226
        create a reference or lint user-images in a provided cache location,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   227
        used to obtain manifests from those repositories.
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   228
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   229
        Multiple repositories can be provided, however each must
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   230
        use a different publisher.prefix (as they are added as publishers
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   231
        to a single user image)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   232
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   233
        Our reference image is stored in
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   234
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   235
        <cache>/ref_image/
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   236
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   237
        The image for linting is stored in
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   238
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   239
        <cache>/lint_image/
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   240
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   241
        We can also lint pkg.manifest.Manifest objects, passed as the
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   242
        lint_manifests list to the setup(..) method.
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   243
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   244
        The config object for the engine has the following keys:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   245
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   246
        'log_level' The minimum level at which to emit lint messages. Lint
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   247
        messages lower than this level are discarded.
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   248
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   249
        By default, this is set to INFO. Log levels in order of least to most
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   250
        severe are: DEBUG, INFO, WARNING, ERROR, CRITICAL
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   251
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   252
        'do_pub_checks' Whether to perform checks which may  only  make  sense
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   253
        for published packages. Set to True by default.
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   254
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   255
        'pkglint.ext.*' Multiple keys, specifying modules to load which contain
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   256
        subclasses of pkg.lint.base.Checker.  The value of this property should
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   257
        be fully specified python module name, assumed to be in $PYTHONPATH
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   258
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   259
        'pkglint.exclude' A space-separated list of fully-specified Python
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   260
        modules, classes or function names which should be omitted from the set
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   261
        of checks performed. eg.
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   262
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   263
        'pkg.lint.opensolaris.ActionChecker' or
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   264
        'my.lint.module' or
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   265
        'my.lint.module.ManifestChecker.crosscheck_paths'
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   266
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   267
        'version.pattern' A version pattern, used when specifying a build number
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   268
        to lint against (-b). If not specified in the rcfile, this pattern is
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   269
        "*,5.11-0.", matching all components of the '5.11' build, with a branch
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   270
        prefix of '0.'
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   271
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   272
        'info_classification_path' A path the file used to check the values
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   273
        of info.classification attributes in manifests.
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   274
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   275
        'use_progress_tracker' Whether to use progress tracking.
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   276
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   277
        'ignore_different_publishers' Whether to ignore differences in publisher
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   278
        when comparing package FMRIs.
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   279
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   280
        The engine has support for a "/* LINTED */"-like functionality,
2434
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   281
        see the comment for <LintEngine>.execute()"""
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   282
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   283
        def __init__(self, formatter, verbose=False, config_file=None,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   284
            use_tracker=None):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   285
                """Creates a lint engine a given pkg.lint.log.LogFormatter.
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   286
                'verbose' overrides any log_level settings in the config file
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   287
                to DEBUG
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   288
                'config_file' specifies a path to a pkglintrc configuration file
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   289
                'use_tracker' overrides any pkglintrc settings to either
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   290
                explicitly enable or disable the use of a tracker, set to None,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   291
                we don't override the config file setting."""
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   292
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   293
                # the directory used to store our user-images.
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   294
                self.basedir = None
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   295
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   296
                # a pattern used to narrow searches in the lint image
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   297
                self.pattern = None
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   298
                self.release = None
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   299
                # a prefix for the pattern used to search for given releases
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   300
                self.version_pattern = "*,5.11-0."
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   301
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   302
                # lists of checker functions and excluded checker functions
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   303
                self.checkers = []
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   304
                self.excluded_checkers = []
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   305
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   306
                # A progress tracker, used during the lint run
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   307
                self.tracker = None
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   308
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   309
                # set up our python logger
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   310
                self.logger = logging.getLogger("pkglint")
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   311
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   312
                # the pkglint LogFormatters we are configured with
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   313
                self.logs = [formatter]
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   314
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   315
                # whether to run checks that may only be valid for published
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   316
                # manifests
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   317
                self.do_pub_checks = True
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   318
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   319
                # whether to ignore publisher differences when comparing vers
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   320
                self.ignore_pubs = True
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   321
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   322
                self.conf = self.load_config(config_file, verbose=verbose)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   323
                # overrides config_file entry
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   324
                if use_tracker is not None:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   325
                        self.use_tracker = use_tracker
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   326
2081
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   327
                self.tracker_phase = 0
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   328
                self.in_setup = False
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   329
                formatter.tracker = self.get_tracker()
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   330
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   331
                self.ref_image = None
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   332
                self.lint_image = None
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   333
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   334
                self.lint_uris = []
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   335
                self.ref_uris = []
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   336
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   337
                # a reference to the pkg.client.api for our reference and lint
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   338
                # images
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   339
                self.ref_api_inst = None
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   340
                self.lint_api_inst = None
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   341
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   342
                # manifests presented to us for parsing on the command line
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   343
                self.lint_manifests = []
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   344
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   345
                self.mf_cache = None
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   346
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   347
        def _load_checker_module(self, name, config):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   348
                """Dynamically loads a given checker module, returning new
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   349
                instances of the checker classes the module declares,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   350
                assuming they haven't been excluded by the config object."""
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   351
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   352
                try:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   353
                        self.logger.debug("Loading module %s" % name)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   354
                        __import__(name, None, None, [], -1)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   355
                        (checkers, excluded) = \
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   356
                            base.get_checkers(sys.modules[name], config)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   357
                        return (checkers, excluded)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   358
                except (KeyError, ImportError), err:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   359
                        raise base.LintException(err)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   360
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   361
        def _unique_checkers(self):
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   362
                """Ensure that the engine has unique names for all of the loaded
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   363
                checks."""
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   364
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   365
                unique_names = set()
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   366
                for checker in self.checkers:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   367
                        if checker.name in unique_names:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   368
                                raise LintEngineException(
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   369
                                    _("loading extensions: "
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   370
                                    "duplicate checker name %(name)s: "
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   371
                                    "%(class)s") %
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   372
                                    {"name": checker.name,
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   373
                                    "class": checker})
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   374
                        unique_names.add(checker.name)
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   375
                        unique_methods = set()
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   376
2434
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   377
                        for method, pkglint_id in checker.included_checks + \
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   378
                            checker.excluded_checks:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   379
2434
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   380
                                if pkglint_id in unique_methods:
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   381
                                        raise LintEngineException(_(
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   382
                                            "loading extension "
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   383
                                            "%(checker)s: duplicate pkglint_id "
2434
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   384
                                            "%(pkglint_id)s in %(method)s") %
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   385
                                            {"checker": checker.name,
2434
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   386
                                            "pkglint_id": pkglint_id,
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   387
                                            "method": method})
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   388
                                unique_methods.add(pkglint_id)
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   389
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   390
        def load_config(self, config, verbose=False):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   391
                """Loads configuration from supplied config file, allowing
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   392
                a verbosity override."""
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   393
2434
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   394
                try:
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   395
                        conf = pkg.lint.config.PkglintConfig(
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   396
                            config_file=config).config
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   397
                except (pkg.lint.config.PkglintConfigException), err:
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   398
                        raise LintEngineException(err)
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   399
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   400
                excl = []
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   401
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   402
                try:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   403
                        excl = conf.get("pkglint", "pkglint.exclude").split()
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   404
                except ConfigParser.NoOptionError:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   405
                        pass
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   406
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   407
                try:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   408
                        self.version_pattern = conf.get("pkglint",
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   409
                            "version.pattern")
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   410
                except ConfigParser.NoOptionError:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   411
                        pass
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   412
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   413
                for key, value in conf.items("pkglint"):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   414
                        if "pkglint.ext" in key:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   415
                                if value in excl:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   416
                                        # want to exclude everything from here
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   417
                                        (checkers, exclude) = \
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   418
                                            self._load_checker_module(value,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   419
                                            conf)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   420
                                        self.excluded_checkers.extend(checkers)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   421
                                        self.excluded_checkers.extend(exclude)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   422
                                        continue
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   423
                                try:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   424
                                        (checkers, exclude) = \
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   425
                                            self._load_checker_module(value,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   426
                                            conf)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   427
                                        self.checkers.extend(checkers)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   428
                                        self.excluded_checkers.extend(exclude)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   429
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   430
                                except base.LintException, err:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   431
                                        raise LintEngineException(
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   432
                                            _("Error parsing config value for "
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   433
                                            "%(key)s: %(err)s") % locals())
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   434
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   435
                self._unique_checkers()
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   436
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   437
                if verbose:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   438
                        for lint_log in self.logs:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   439
                                lint_log.level = "DEBUG"
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   440
                else:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   441
                        for lint_log in self.logs:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   442
                                lint_log.level = conf.get("pkglint",
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   443
                                    "log_level")
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   444
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   445
                try:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   446
                        self.do_pub_checks = conf.getboolean("pkglint",
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   447
                            "do_pub_checks")
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   448
                except ConfigParser.NoOptionError:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   449
                        pass
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   450
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   451
                try:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   452
                        self.use_tracker = conf.get("pkglint",
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   453
                            "use_progress_tracker").lower() == "true"
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   454
                except ConfigParser.NoOptionError:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   455
                        pass
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   456
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   457
                try:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   458
                        self.ignore_pubs = conf.get("pkglint",
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   459
                            "ignore_different_publishers").lower() == "true"
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   460
                except ConfigParser.NoOptionError:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   461
                        pass
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   462
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   463
                return conf
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   464
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   465
        def setup(self, lint_manifests=[], ref_uris=[], lint_uris=[],
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   466
            cache=None, pattern=None, release=None):
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   467
                """Starts a pkglint session, creates our image, pulls manifests,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   468
                etc. from servers if necessary.
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   469
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   470
                'cache' An area where we create images to access repos for both
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   471
                reference and linting purposes
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   472
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   473
                'lint_manifests' An array of paths to manifests for linting
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   474
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   475
                'ref_uris' A list of repositories which will be added to the
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   476
                image used as a reference for linting
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   477
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   478
                'lint_uris' A list of repositories which will be added to th
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   479
                image we want to lint
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   480
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   481
                'pattern' A regexp to match the packages we want to lint, if
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   482
                empty, we match everything.  Note that this is only applied when
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   483
                searching for packages to lint: we lint against all packages for
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   484
                a given release in the reference repository (if configured)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   485
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   486
                'release' A release value that narrows the set of packages we
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   487
                lint with.  This affects both the packages presented for linting
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   488
                as well as the packages in the repository we are linting
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   489
                against. If release if set to None, we lint with and against the
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   490
                latest available packages in the repositories."""
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   491
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   492
                self.ref_uris = ref_uris
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   493
                self.lint_uris = lint_uris
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   494
                self.lint_manifests = lint_manifests
2383
cfc3e2182a1d 18400 pkglint output is still not deterministic
Tim Foster <tim.s.foster@oracle.com>
parents: 2382
diff changeset
   495
                self.lint_manifests.sort(key=_manifest_sort_key)
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   496
                self.pattern = pattern
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   497
                self.release = release
2081
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   498
                self.in_setup = True
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   499
                self.mf_cache = LintEngineCache(self.version_pattern,
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   500
                    release=release)
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   501
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   502
                if not cache and not lint_manifests:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   503
                        raise LintEngineException(
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   504
                            _("Either a cache directory, or some local "
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   505
                            "manifest files must be provided."))
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   506
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   507
                if not cache and (ref_uris or lint_uris):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   508
                        raise LintEngineException(
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   509
                            _("A cache directory must be provided if using "
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   510
                            "reference or lint repositories."))
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   511
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   512
                if cache:
2090
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2089
diff changeset
   513
                        self.basedir = os.path.abspath(cache)
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   514
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   515
                        try:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   516
                                self.lint_image = os.path.join(self.basedir,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   517
                                    "lint_image")
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   518
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   519
                                if os.path.exists(self.lint_image):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   520
                                        self.lint_api_inst = self._get_image(
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   521
                                            self.lint_image)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   522
                                        if self.lint_api_inst and lint_uris:
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   523
                                                self.tracker.flush()
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   524
                                                self.logger.info(
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   525
                                                    _("Ignoring -l option, "
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   526
                                                    "existing image found."))
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   527
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   528
                                # only create a new image if we've not been
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   529
                                # able to load one, and we have been given a uri
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   530
                                if not self.lint_api_inst and lint_uris:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   531
                                        self.lint_api_inst = self._create_image(
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   532
                                            self.lint_image, self.lint_uris)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   533
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   534
                                if self.lint_api_inst:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   535
                                        self.tracker_phase = \
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   536
                                            self.tracker_phase + 1
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   537
                                        self.mf_cache.seed_latest(
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   538
                                            self.lint_api_inst,
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   539
                                            self.get_tracker(),
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   540
                                            self.tracker_phase)
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   541
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   542
                        except LintEngineException, err:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   543
                                raise LintEngineException(
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   544
                                    _("Unable to create lint image: %s") %
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   545
                                    str(err))
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   546
                        try:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   547
                                self.ref_image = os.path.join(self.basedir,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   548
                                    "ref_image")
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   549
                                if os.path.exists(self.ref_image):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   550
                                        self.ref_api_inst = self._get_image(
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   551
                                            self.ref_image)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   552
                                        if self.ref_api_inst and ref_uris:
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   553
                                                self.tracker.flush()
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   554
                                                self.logger.info(
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   555
                                                    _("Ignoring -r option, "
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   556
                                                    "existing image found."))
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   557
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   558
                                # only create a new image if we've not been
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   559
                                # able to load one, and we have been given a uri
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   560
                                if not self.ref_api_inst and ref_uris:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   561
                                        if not (self.lint_api_inst or \
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   562
                                            lint_manifests):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   563
                                                raise LintEngineException(
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   564
                                                    "No lint image or manifests"
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   565
                                                    " provided.")
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   566
                                        self.ref_api_inst = self._create_image(
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   567
                                            self.ref_image, self.ref_uris)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   568
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   569
                                if self.ref_api_inst:
2434
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   570
                                        self.tracker_phase = \
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   571
                                            self.tracker_phase + 1
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   572
                                        self.mf_cache.seed_latest(
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   573
                                            self.ref_api_inst,
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   574
                                            self.get_tracker(),
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   575
                                            self.tracker_phase)
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   576
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   577
                        except LintEngineException, err:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   578
                                raise LintEngineException(
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   579
                                    _("Unable to create reference image: %s") %
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   580
                                    str(err))
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   581
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   582
                        if not (self.ref_api_inst or self.lint_api_inst):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   583
                                raise LintEngineException(
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   584
                                    _("Unable to access any pkglint images "
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   585
                                   "under %s") % cache)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   586
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   587
                for checker in self.checkers:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   588
                        checker.startup(self)
2081
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   589
                self.get_tracker().index_done()
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   590
                self.in_setup = False
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   591
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   592
        def execute(self):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   593
                """Run the checks that have been configured for this engine.
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   594
                We run checks on all lint_manifests as well as all manifests
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   595
                in a configured lint repository that match both our pattern
2434
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   596
                and release (if they have been configured).
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   597
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   598
                We allow for pkg.linted=True and pkg.linted.<name>=True, where
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   599
                <name> is a substring of a pkglint id to skip logging errors
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   600
                for that action or manifest.
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   601
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   602
                As much of the pkg.linted functionality as possible is handled
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   603
                by the logging system, in combination with the engine calling
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   604
                advise_loggers() as appropriate, however some ManifestChecker
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   605
                methods may still need to use engine.linted() or
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   606
                <LintEngine>.advise_loggers() manually when iterating over
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   607
                manifest actions in order to properly respect pkg.linted
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   608
                attributes."""
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   609
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   610
                manifest_checks = []
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   611
                action_checks = []
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   612
                count = 0
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   613
                for checker in self.checkers:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   614
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   615
                        count = count + len(checker.included_checks)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   616
                        if isinstance(checker, base.ManifestChecker):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   617
                                manifest_checks.append(checker)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   618
                        elif isinstance(checker, base.ActionChecker):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   619
                                action_checks.append(checker)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   620
                        else:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   621
                                raise LintEngineException(
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   622
                                    _("%s does not subclass a known "
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   623
                                    "Checker subclass intended for use by "
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   624
                                    "pkglint extensions") % str(checker))
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   625
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   626
                self.tracker.flush()
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   627
                self.logger.debug(_("Total number of checks found: %s") % count)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   628
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   629
                for mf in self.lint_manifests:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   630
                        self._check_manifest(mf, manifest_checks,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   631
                            action_checks)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   632
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   633
                for manifest in self.gen_manifests(self.lint_api_inst,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   634
                    pattern=self.pattern, release=self.release):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   635
                        self._check_manifest(manifest, manifest_checks,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   636
                            action_checks)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   637
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   638
        def gen_manifests(self, api_inst, pattern=None, release=None):
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   639
                """A generator to return package manifests for a given image.
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   640
                With a given pattern, it narrows the set of manifests
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   641
                returned to match that pattern.
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   642
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   643
                With the given 'release' number, it searches for manifests for
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   644
                that release using "<pattern>@<version.pattern><release>"
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   645
                where <version.pattern> is set in pkglintrc and
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   646
                <pattern> and <release> are the keyword arguments to this
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   647
                method. """
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   648
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   649
                if not api_inst:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   650
                        return
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   651
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   652
                tracker = self.get_tracker()
2081
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   653
                if self.in_setup:
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   654
                        self.tracker_phase = \
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   655
                            self.tracker_phase + 1
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   656
                tracker.index_set_goal(self.tracker_phase,
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   657
                    self.mf_cache.count_latest(api_inst, pattern))
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   658
                for m in self.mf_cache.gen_latest(api_inst,
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   659
                    tracker, pattern):
2183
21ae45e8dfcf 17581 There should be a way of removing a package as part of upgrade
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2158
diff changeset
   660
                        yield m
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   661
                return
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   662
2081
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   663
        EXACT = 0
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   664
        LATEST_SUCCESSOR = 1
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   665
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   666
        def get_manifest(self, pkg_name, search_type=EXACT):
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   667
                """Returns the first available manifest for a given package
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   668
                name, searching hierarchically in the lint manifests,
2081
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   669
                the lint_repo or the ref_repo for that single package.
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   670
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   671
                By default, we search for an exact match on the provided
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   672
                pkg_name, throwing a LintEngineException if we get more than
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   673
                one match for the supplied pkg_name.
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   674
                When search_type is LintEngine.LATEST_SUCCESSOR, we return the
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   675
                most recent successor of the provided package, using the
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   676
                lint_fmri_successor() method defined in this module.
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   677
                """
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   678
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   679
                if not pkg_name.startswith("pkg:/"):
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   680
                        pkg_name = "pkg:/%s" % pkg_name
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   681
2081
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   682
                def build_fmri(pkg_name):
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   683
                        """builds a pkg.fmri.PkgFmri from a string."""
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   684
                        try:
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   685
                                fmri = pkg.fmri.PkgFmri(pkg_name)
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   686
                                return fmri
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   687
                        except pkg.fmri.IllegalFmri:
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   688
                                try:
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   689
                                        # FMRIs listed as dependencies often
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   690
                                        # omit build_release, use a dummy one
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   691
                                        # for now
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   692
                                        fmri = pkg.fmri.PkgFmri(pkg_name,
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   693
                                            build_release="5.11")
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   694
                                        return fmri
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   695
                                except:
2434
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   696
                                        msg = _("unable to construct fmri from "
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   697
                                            "%s") %  pkg_name
2081
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   698
                                        raise base.LintException(msg)
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   699
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   700
                def get_fmri(api_inst, pkg_name):
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   701
                        """Retrieve an fmri string that matches pkg_name."""
2081
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   702
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   703
                        if "*" in pkg_name or "?" in pkg_name:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   704
                                raise base.LintException(
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   705
                                    _("invalid pkg name %s") % pkg_name)
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   706
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   707
                        if "@" not in pkg_name and self.release:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   708
                                pkg_name = "%s@%s%s" % \
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   709
                                    (pkg_name, self.version_pattern,
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   710
                                    self.release)
2081
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   711
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   712
                        fmris = []
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   713
                        for item in api_inst.get_pkg_list(
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   714
                            pkg.client.api.ImageInterface.LIST_ALL,
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   715
                            patterns=[pkg_name], variants=True,
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   716
                            return_fmris=True):
2081
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   717
                                fmris.append(item[0])
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   718
2081
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   719
                        fmri_list = []
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   720
                        for item in fmris:
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   721
                                fmri_list.append(item.get_fmri())
2081
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   722
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   723
                        if len(fmri_list) == 1:
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   724
                                return fmri_list[0]
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   725
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   726
                        elif len(fmri_list) == 0:
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   727
                                return None
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   728
                        else:
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   729
                                # we expected to get only 1 hit, so
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   730
                                # something has gone wrong
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   731
                                raise LintEngineException(
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   732
                                    _("get_fmri(pattern) %(pattern)s "
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   733
                                    "matched %(count)s packages: "
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   734
                                    "%(pkgs)s") %
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   735
                                    {"pattern": pkg_name,
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   736
                                    "count": len(fmri_list),
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   737
                                    "pkgs": " ".join(fmri_list)
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   738
                                    })
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   739
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   740
                def mf_from_image(api_inst, pkg_name, search_type):
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   741
                        """Fetch a manifest for the given package name using
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   742
                        the ImageInterface provided."""
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   743
                        if not api_inst:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   744
                                return None
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   745
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   746
                        search_fmri = build_fmri(pkg_name)
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   747
                        if search_type == self.LATEST_SUCCESSOR:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   748
                                # we want to normalize the pkg_name, removing
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   749
                                # the publisher, if any.
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   750
                                name = "pkg:/%s" % search_fmri.get_name()
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   751
                                mf = self.mf_cache.get_latest(api_inst, name)
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   752
                                if not mf:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   753
                                        return
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   754
                                # double-check the publishers match, since we
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   755
                                # searched for just a package name
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   756
                                if search_fmri.publisher:
2434
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   757
                                        if search_fmri.publisher == \
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   758
                                            mf.fmri.publisher:
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   759
                                                return mf
2081
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   760
                                else:
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   761
                                        return mf
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   762
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   763
                        # We've either not found a matching publisher, or we're
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   764
                        # doing an exact search.
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   765
                        try:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   766
                                mf = self.mf_cache.get(api_inst, pkg_name)
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   767
                                return mf
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   768
                        except KeyError:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   769
                                mf = None
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   770
                                fmri = get_fmri(api_inst, pkg_name)
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   771
                                if fmri:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   772
                                        mf = api_inst.get_manifest(
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   773
                                            pkg.fmri.PkgFmri(fmri))
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   774
                                self.mf_cache.add(api_inst, pkg_name, mf)
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   775
                                return mf
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   776
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   777
                # search hierarchically for the given package name in our
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   778
                # local manifests, our lint image, or our reference image
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   779
                # and return a manifest for that package.
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   780
                for mf in self.lint_manifests:
2081
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   781
                        search_fmri = build_fmri(pkg_name)
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   782
                        if search_type == self.LATEST_SUCCESSOR and \
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   783
                            lint_fmri_successor(mf.fmri, search_fmri,
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   784
                                ignore_pubs=self.ignore_pubs):
2081
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   785
                                return mf
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   786
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   787
                        if str(mf.fmri) == pkg_name:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   788
                                return mf
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   789
                        if mf.fmri.get_name() == pkg_name:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   790
                                return mf
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   791
                mf = mf_from_image(self.lint_api_inst, pkg_name, search_type)
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   792
                if mf:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   793
                        return mf
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   794
                # fallback to our reference api, returning None if that's
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   795
                # what we were given.
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   796
                return mf_from_image(self.ref_api_inst, pkg_name, search_type)
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   797
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   798
        def _get_image(self, image_dir):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   799
                """Return a pkg.client.api.ImageInterface for the provided
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   800
                image directory."""
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   801
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   802
                cdir = os.getcwd()
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   803
                tracker = self.get_tracker()
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   804
                api_inst = None
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   805
                try:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   806
                        api_inst = pkg.client.api.ImageInterface(
2081
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   807
                            image_dir, CLIENT_API_VERSION,
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   808
                            tracker, None, PKG_CLIENT_NAME)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   809
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   810
                        if api_inst.root != image_dir:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   811
                                api_inst = None
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   812
                        else:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   813
                                # given that pkglint is expected to be used
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   814
                                # during manifest development, we always want
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   815
                                # to refresh now, rather than waiting for some
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   816
                                # update interval
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   817
                                api_inst.refresh(immediate=True)
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   818
                except Exception, err:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   819
                        raise LintEngineException(
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   820
                            _("Unable to get image at %(dir)s: %(reason)s") %
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   821
                            {"dir": image_dir,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   822
                            "reason": str(err)})
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   823
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   824
                # restore the current directory, which ImageInterace had changed
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   825
                os.chdir(cdir)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   826
                return api_inst
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   827
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   828
        def _create_image(self,  image_dir, repo_uris):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   829
                """Create image in the given image directory. For now, only
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   830
                a single publisher is supported per image."""
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   831
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   832
                if len(repo_uris) != 1:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   833
                        raise LintEngineException(
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   834
                            _("pkglint only supports a single publisher "
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   835
                            "per image."))
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   836
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   837
                tracker = self.get_tracker()
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   838
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   839
                is_zone = False
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   840
                refresh_allowed = True
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   841
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   842
                self.tracker.flush()
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   843
                self.logger.debug(_("Creating image at %s") % image_dir)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   844
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   845
                try:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   846
                        api_inst = pkg.client.api.image_create(
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   847
                            PKG_CLIENT_NAME, CLIENT_API_VERSION, image_dir,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   848
                            pkg.client.api.IMG_TYPE_USER, is_zone,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   849
                            facets=pkg.facet.Facets(), force=False,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   850
                            progtrack=tracker, refresh_allowed=refresh_allowed,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   851
                            repo_uri=repo_uris[0])
2434
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   852
                except (ApiException, OSError, IOError), err:
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   853
                        raise LintEngineException(err)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   854
                return api_inst
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   855
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   856
        def _check_manifest(self, manifest, manifest_checks, action_checks):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   857
                """Check a given manifest."""
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   858
2090
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2089
diff changeset
   859
                self.debug(_("Checking %s") % manifest.fmri, "pkglint001.3")
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2089
diff changeset
   860
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   861
                for checker in manifest_checks:
2434
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   862
                        checker.check(manifest, self)
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   863
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   864
                if action_checks:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   865
                        for action in manifest.gen_actions():
2434
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   866
                                self._check_action(action, manifest,
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   867
                                    action_checks)
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   868
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   869
        def _check_action(self, action, manifest, action_checks):
2434
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   870
                """Check a given action."""
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   871
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   872
                for checker in action_checks:
2434
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   873
                        checker.check(action, manifest, self)
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   874
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   875
        def advise_loggers(self, action=None, manifest=None):
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   876
                """Called to advise any loggers we have set that we're about
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   877
                to perform lint checks on the given action or manifest.
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   878
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   879
                In particular, this is used to let the logger objects access
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   880
                the manifest or action being linted without needing to pass
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   881
                those objects each time we log a message.
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   882
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   883
                Care must be taken in base.ManifestChecker methods to call
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   884
                this any time they're iterating over actions and are likely to
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   885
                report lint errors that may be related to that action.  When
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   886
                finished iterating, they should re-call this method with only
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   887
                the manifest keyword argument, to clear the last action used.
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   888
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   889
                Between each Checker method invocation, the Checker subclass
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   890
                calls this automatically to clear any state set by those method
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   891
                calls.
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   892
                """
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   893
                for log in self.logs:
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   894
                        log.advise(action=action, manifest=manifest)
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   895
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   896
        # convenience methods to log lint messages to all loggers
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   897
        # configured for this engine
2434
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   898
        def debug(self, message, msgid=None, ignore_linted=False):
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   899
                """Log a debug message to all loggers."""
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   900
                for log in self.logs:
2434
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   901
                        log.debug(message, msgid=msgid,
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   902
                            ignore_linted=ignore_linted)
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   903
2434
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   904
        def info(self, message, msgid=None, ignore_linted=False):
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   905
                """Log an info message to all loggers."""
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   906
                for log in self.logs:
2434
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   907
                        log.info(message, msgid=msgid,
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   908
                            ignore_linted=ignore_linted)
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   909
2434
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   910
        def warning(self, message, msgid=None, ignore_linted=False):
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   911
                """Log a warning message to all loggers."""
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   912
                for log in self.logs:
2434
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   913
                        log.warning(message, msgid=msgid,
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   914
                            ignore_linted=ignore_linted)
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   915
2434
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   916
        def error(self, message, msgid=None, ignore_linted=False):
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   917
                """Log an error message to all loggers."""
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   918
                for log in self.logs:
2434
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   919
                        log.error(message, msgid=msgid,
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   920
                            ignore_linted=ignore_linted)
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   921
2434
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   922
        def critical(self, message, msgid=None, ignore_linted=False):
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   923
                """Log a critical message to all loggers."""
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   924
                for log in self.logs:
2434
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   925
                        log.critical(message, msgid=msgid,
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   926
                            ignore_linted=ignore_linted)
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   927
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   928
        def skip_check_msg(self, action, msgid):
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   929
                """Log a message saying we're skipping a particular check."""
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   930
                self.info(_("Not running %(check)s checks on linted action "
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   931
                    "%(action)s") % {"check": msgid, "action": str(action)},
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   932
                    msgid="pkglint001.4", ignore_linted=True)
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   933
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   934
        def teardown(self, clear_cache=False):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   935
                """Ends a pkglint session.
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   936
                clear_cache    False by default, True causes the cache to be
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   937
                               destroyed."""
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   938
                for checker in self.checkers:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   939
                        try:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   940
                                checker.shutdown(self)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   941
                        except base.LintException, err:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   942
                                self.error(err)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   943
                self.checkers = []
2205
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2184
diff changeset
   944
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2184
diff changeset
   945
                # Reset the API object before destroying it; because it does a
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2184
diff changeset
   946
                # chdir(), we need to save and restore our cwd.
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2184
diff changeset
   947
                cwd = os.getcwd()
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2184
diff changeset
   948
                if self.lint_api_inst:
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2184
diff changeset
   949
                        self.lint_api_inst.reset()
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2184
diff changeset
   950
                os.chdir(cwd)
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2184
diff changeset
   951
                self.lint_api_inst = None
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2184
diff changeset
   952
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   953
                if clear_cache:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   954
                        shutil.rmtree(self.basedir)
2434
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   955
                self.advise_loggers()
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   956
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   957
        def get_tracker(self):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   958
                """Creates a ProgressTracker if we don't already have one,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   959
                otherwise resetting our current tracker and returning it"""
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   960
2081
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   961
                if self.tracker and self.in_setup:
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   962
                        return self.tracker
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   963
                if self.tracker:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   964
                        self.tracker.reset()
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   965
                        return self.tracker
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   966
                if not self.use_tracker:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   967
                        self.tracker = progress.QuietProgressTracker()
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   968
                else:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   969
                        try:
2434
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   970
                                self.tracker = \
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   971
                                    progress.FancyUNIXProgressTracker()
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   972
                        except progress.ProgressTrackerException:
2434
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   973
                                self.tracker = \
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
   974
                                    progress.CommandLineProgressTracker()
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   975
                return self.tracker
2081
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
   976
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   977
        def follow_renames(self, pkg_name, target=None, old_mfs=[],
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   978
            warn_on_obsolete=False):
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   979
                """Given a package name, and an optional target pfmri that we
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   980
                expect to be ultimately renamed to, follow package renames from
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   981
                pkg_name, looking for the package we expect to be at the end of
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   982
                the chain.
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   983
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   984
                If there was a break in the renaming chain, we return None.
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   985
                old_mfs, if passed, should be a list of manifests that were
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   986
                sources of this rename.
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   987
                """
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   988
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   989
                mf = self.get_manifest(pkg_name,
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   990
                    search_type=self.LATEST_SUCCESSOR)
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   991
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   992
                if not mf:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   993
                        return None
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   994
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   995
                if warn_on_obsolete and "pkg.obsolete" in mf:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   996
                        raise base.LintException(
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   997
                            _("obsolete package: %s") % mf.fmri)
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   998
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
   999
                # if we're trying to rename to a package in our history,
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1000
                # we should complain
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1001
                for old_mf in old_mfs:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1002
                        if old_mf.fmri.get_name() == mf.fmri.get_name():
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1003
                                old_mfs.append(mf)
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1004
                                raise base.LintException(
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1005
                                    _("loop detected in rename: %s") %
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1006
                                    " -> ".join(str(s.fmri) for s in old_mfs))
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1007
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1008
                if "pkg.renamed" in mf and \
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1009
                    mf["pkg.renamed"].lower() == "true":
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1010
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1011
                        old_mfs.append(mf)
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1012
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1013
                        for dep in mf.gen_actions_by_type("depend"):
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1014
                                # disregard dependencies on incorporations
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1015
                                if "incorporation" in dep.attrs["fmri"]:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1016
                                        continue
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1017
                                follow = dep.attrs["fmri"]
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1018
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1019
                                # the engine's cache lookup doesn't include
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1020
                                # versions, so remove those and lookup the
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1021
                                # latest available version of this dependency
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1022
                                if "@" in follow:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1023
                                        follow = follow.split("@")[0]
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1024
                                mf = self.follow_renames(follow,
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1025
                                    target=target, old_mfs=old_mfs,
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1026
                                    warn_on_obsolete=warn_on_obsolete)
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1027
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1028
                                # we can stop looking if we've found a package
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1029
                                # of which our target is a successor
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1030
                                if target and mf and \
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1031
                                    lint_fmri_successor(target, mf.fmri,
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1032
                                        ignore_pubs=self.ignore_pubs):
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1033
                                        return mf
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1034
                return mf
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1035
2434
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1036
        def get_param(self, key, action=None, manifest=None):
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1037
                """Returns a string value of a given pkglint parameter,
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1038
                intended for use by pkglint Checker objects to provide hints as
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1039
                to how particular checks should be run.
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1040
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1041
                Keys are searched for first in the action, if provided, then as
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1042
                manifest attributes, finally falling back to the pkglintrc
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1043
                config file.
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1044
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1045
                The return value is a space-separated string of parameters.
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1046
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1047
                When searching for keys in the manifest or action, we prepend
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1048
                "pkg.lint" to the key name to ensure that we play in our own
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1049
                namespace and don't clash with other manifest or action attrs.
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1050
                """
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1051
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1052
                param_key = "pkg.lint.%s" % key
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1053
                val = None
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1054
                if action and param_key in action.attrs:
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1055
                        val = action.attrs[param_key]
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1056
                if manifest and param_key in manifest:
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1057
                        val = manifest[param_key]
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1058
                if val:
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1059
                        if isinstance(val, basestring):
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1060
                                return val
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1061
                        else:
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1062
                                return " ".join(val)
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1063
                try:
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1064
                        val = self.conf.get("pkglint", key)
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1065
                        if val:
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1066
                                return val.replace("\n", " ")
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1067
                except ConfigParser.NoOptionError:
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1068
                        return None
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1069
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1070
        def get_attr_action(self, attr, manifest):
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1071
                """Return the AttributeAction that sets a given attribute in a
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1072
                manifest.
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1073
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1074
                This is available for clients, particularly ManifestCheckers
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1075
                that need to see whether a lint flag has been set on a given
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1076
                'set' action.
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1077
                """
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1078
                if attr not in manifest:
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1079
                        raise KeyError(_("%s is not set in manifest") % attr)
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1080
                for action in manifest.gen_actions_by_type("set"):
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1081
                        if action.attrs.get("name", "") == attr:
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1082
                                return action
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1083
                return None
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1084
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1085
        def linted(self, action=None, manifest=None, lint_id=None):
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1086
                """Determine whether pkg.linted.* flags are present on the
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1087
                action and/or manifest passed as arguments.  If lint_id is set,
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1088
                we look for pkg.linted.<lint_id> attributes as well."""
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1089
                ret = False
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1090
                try:
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1091
                        ret = base.linted(action=action, manifest=manifest,
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1092
                            lint_id=lint_id)
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1093
                except base.DuplicateLintedAttrException, err:
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1094
                        self.error(err, msgid="pkglint001.6")
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1095
                return ret
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1096
e82acfe2f46e 17777 it would be nice if pkglint could suppress specific messages for specific actions
Tim Foster <tim.s.foster@oracle.com>
parents: 2383
diff changeset
  1097
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1098
def lint_fmri_successor(new, old, ignore_pubs=True, ignore_timestamps=True):
2081
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
  1099
        """Given two FMRIs, determine if new_fmri is a successor of old_fmri.
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
  1100
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
  1101
        This differs from pkg.fmri.is_successor() in that it treats un-versioned
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
  1102
        FMRIs as being newer than versioned FMRIs of the same package name,
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
  1103
        and un-timestamped packages as being newer than versioned FMRIs of the
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
  1104
        same package name and version.
2183
21ae45e8dfcf 17581 There should be a way of removing a package as part of upgrade
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2158
diff changeset
  1105
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1106
        For published packages, where the version and pkg names are identical,
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1107
        but the publisher differs, it also treats the new package as being a
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1108
        successor of the old.
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1109
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1110
        If ignore_pubs is set, any differences in publishers between the
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1111
        provided FMRIs are ignored.
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1112
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1113
        if ignore_timestamps is set, timestamps are not used as a basis for
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1114
        comparison between new and old FMRIs.
2081
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
  1115
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
  1116
        We use this when looking for dependencies, or when comparing
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
  1117
        FMRIs presented in manifests for linting against those present in an
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
  1118
        existing repository (where, eg. a new timestamp would be supplied to a
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
  1119
        package during the import process and the timestamp would not
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
  1120
        necessarily be in the manifest file presented for linting)
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
  1121
        """
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1122
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1123
        if not ignore_pubs and new.publisher != old.publisher:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1124
                return False
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1125
2081
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
  1126
        new_name = new.get_name()
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2073
diff changeset
  1127
        old_name = old.get_name()
2147
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1128
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1129
        if new_name != old_name:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1130
                return False
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1131
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1132
        if not new.has_version():
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1133
                return True
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1134
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1135
        # compare everything except the timestamp
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1136
        if new.has_version() and old.has_version():
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1137
                if new.version.release > old.version.release:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1138
                        return True
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1139
                if new.version.release < old.version.release:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1140
                        return False
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1141
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1142
                if new.version.branch > old.version.branch:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1143
                        return True
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1144
                if new.version.branch < old.version.branch:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1145
                        return False
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1146
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1147
                if new.version.build_release > old.version.build_release:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1148
                        return True
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1149
                if new.version.build_release < old.version.build_release:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1150
                        return False
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1151
                if not ignore_timestamps:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1152
                        new_ts = new.version.get_timestamp()
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1153
                        old_ts = old.version.get_timestamp()
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1154
                        if new_ts > old_ts:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1155
                                return True
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1156
                        if new_ts < old_ts:
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1157
                                return False
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1158
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1159
        # everything is equal, or old has no version and we'll favour new
d035de6cab14 17002 pkglint unusual_perms check needs to get out more
Tim Foster <tim.s.foster@oracle.com>
parents: 2144
diff changeset
  1160
        return True
2383
cfc3e2182a1d 18400 pkglint output is still not deterministic
Tim Foster <tim.s.foster@oracle.com>
parents: 2382
diff changeset
  1161
cfc3e2182a1d 18400 pkglint output is still not deterministic
Tim Foster <tim.s.foster@oracle.com>
parents: 2382
diff changeset
  1162
def _manifest_sort_key(mf):
cfc3e2182a1d 18400 pkglint output is still not deterministic
Tim Foster <tim.s.foster@oracle.com>
parents: 2382
diff changeset
  1163
        """The lint engine uses the FMRI of a package to deterine the order in
cfc3e2182a1d 18400 pkglint output is still not deterministic
Tim Foster <tim.s.foster@oracle.com>
parents: 2382
diff changeset
  1164
        which to iterate over manifests.  This is done using the 'key' attribute
cfc3e2182a1d 18400 pkglint output is still not deterministic
Tim Foster <tim.s.foster@oracle.com>
parents: 2382
diff changeset
  1165
        to the Python sort() and sorted() methods."""
cfc3e2182a1d 18400 pkglint output is still not deterministic
Tim Foster <tim.s.foster@oracle.com>
parents: 2382
diff changeset
  1166
        if mf.fmri:
cfc3e2182a1d 18400 pkglint output is still not deterministic
Tim Foster <tim.s.foster@oracle.com>
parents: 2382
diff changeset
  1167
                return mf.fmri
cfc3e2182a1d 18400 pkglint output is still not deterministic
Tim Foster <tim.s.foster@oracle.com>
parents: 2382
diff changeset
  1168
        return mf.get("pkg.fmri")