src/modules/lint/pkglint_action.py
author Tim Foster <tim.s.foster@oracle.com>
Wed, 29 Sep 2010 11:55:47 +1300
changeset 2090 d84a7b3cafa3
parent 2085 10a27146ebc2
child 2091 824491c11ff3
permissions -rw-r--r--
17061 pkglint -L output could be improved 17072 pkglint print_fmri check is insufficient for debugging 17086 pkglint -c has different behavior with relative and absolute paths
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
     1
#!/usr/bin/python
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
#
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    24
# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
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
2081
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
    27
from pkg.lint.engine import lint_fmri_successor
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
    28
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
    29
import collections
2046
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.fmri
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.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
    32
import stat
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    33
import string
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    34
2081
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
    35
ObsoleteFmri = collections.namedtuple("ObsoleteFmri", "is_obsolete, fmri")
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
    36
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    37
class PkgDupActionChecker(base.ActionChecker):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    38
        """A class to check duplicate actions/attributes."""
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    39
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    40
        name = "pkglint.dupaction"
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    41
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    42
        def __init__(self, config):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    43
                # dictionaries mapping path names to a list of tuples that are
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    44
                # installing to that path name. Each tuple represents a single
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    45
                # action and the fmri that delivers that action, to allow for a
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    46
                # given fmri delivering multiple copies of actions that install
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    47
                # to that path.
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    48
                # eg. pathdb[path] = [(fmri, action), (fmri, action) ... ]
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    49
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    50
                # The paths dictionaries for large repositories are rather
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    51
                # memory hungry and may well be useful services for other
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    52
                # checkers, so could be rolled into the engine itself (at the
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    53
                # cost of all checker classes paying the toll on engine
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    54
                # startup time.
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    55
                # We maintain similar dictionaries for other attributes that
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    56
                # should not be duplicated across (and within) manifests.
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    57
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    58
                self.description = _("Checks for duplicate IPS actions.")
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    59
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    60
                self.ref_paths = {}
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    61
                self.lint_paths = {}
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    62
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    63
                # similar dictionaries for drivers
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    64
                self.ref_drivers = {}
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    65
                self.lint_drivers = {}
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    66
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    67
                # and users / groups
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    68
                self.ref_usernames = {}
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    69
                self.ref_uids = {}
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    70
                self.lint_usernames = {}
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    71
                self.lint_uids = {}
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    72
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    73
                self.ref_groupnames = {}
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    74
                self.lint_groupnames = {}
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    75
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    76
                self.ref_gids = {}
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    77
                self.lint_gids = {}
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    78
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    79
                self.processed_paths = {}
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    80
                self.processed_drivers = {}
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    81
                self.processed_paths = {}
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    82
                self.processed_usernames = {}
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    83
                self.processed_uids = {}
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    84
                self.processed_groupnames = {}
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    85
                self.processed_gids = {}
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    86
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    87
                self.processed_refcount_paths = {}
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    88
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    89
                # mark which paths we've done duplicate-type checking on
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    90
                self.seen_dup_types = {}
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    91
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    92
                self.refcounted_actions = [ "dir", "hardlink", "link" ]
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    93
                super(PkgDupActionChecker, self).__init__(config)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    94
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    95
        def startup(self, engine):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    96
                """Called to initialise a given checker using the supplied
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    97
                    engine."""
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    98
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    99
                def seed_dict(mf, attr, dic, atype=None, verbose=False):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   100
                        """Updates a dictionary of { attr: [(fmri, action), ..]}
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   101
                        where attr is the value of that attribute from
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   102
                        actions of a given type atype, in the given
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   103
                        manifest."""
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   104
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   105
                        pkg_vars = mf.get_all_variants()
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   106
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   107
                        def mf_gen(atype):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   108
                                if atype:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   109
                                        for a in mf.gen_actions_by_type(atype):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   110
                                                yield a
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   111
                                else:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   112
                                        for a in mf.gen_actions():
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   113
                                                yield a
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   114
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   115
                        for action in mf_gen(atype):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   116
                                if atype and action.name != atype:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   117
                                        continue
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   118
                                if attr not in action.attrs:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   119
                                        continue
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   120
                                if "pkg.linted" in action.attrs and \
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   121
                                    action.attrs["pkg.linted"].lower() == "true":
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   122
                                        continue
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   123
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   124
                                variants = action.get_variants()
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   125
                                variants.merge_unknown(pkg_vars)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   126
                                for v in variants:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   127
                                        # we're only interested in variants with
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   128
                                        # 1 value, so using pop() is safe.
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   129
                                        if len(variants[v]) == 1:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   130
                                                action.attrs[v] = \
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   131
                                                    variants[v].pop()
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   132
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   133
                                p = action.attrs[attr]
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   134
                                if p not in dic:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   135
                                        dic[p] = [(mf.fmri, action)]
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   136
                                else:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   137
                                        dic[p].append((mf.fmri, action))
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   138
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   139
                engine.logger.debug(
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   140
                    _("Seeding reference action duplicates dictionaries."))
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   141
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   142
                for manifest in engine.gen_manifests(engine.ref_api_inst,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   143
                    release=engine.release):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   144
                        seed_dict(manifest, "path", self.ref_paths)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   145
                        seed_dict(manifest, "name", self.ref_drivers,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   146
                            atype="driver")
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   147
                        seed_dict(manifest, "username", self.ref_usernames,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   148
                            atype="user")
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   149
                        seed_dict(manifest, "uid", self.ref_uids,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   150
                            atype="user")
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   151
                        seed_dict(manifest, "groupname", self.ref_groupnames,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   152
                            atype="group")
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   153
                        seed_dict(manifest, "gid", self.ref_gids, atype="group")
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   154
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   155
                engine.logger.debug(
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   156
                    _("Seeding lint action duplicates dictionaries."))
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   157
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   158
                # we provide a search pattern, to allow users to lint a
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   159
                # subset of the packages in the lint_repository
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   160
                for manifest in engine.gen_manifests(engine.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
   161
                    release=engine.release, pattern=engine.pattern):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   162
                        seed_dict(manifest, "path", self.lint_paths)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   163
                        seed_dict(manifest, "name", self.lint_drivers,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   164
                            atype="driver")
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   165
                        seed_dict(manifest, "username", self.lint_usernames,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   166
                            atype="user")
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   167
                        seed_dict(manifest, "uid", self.lint_uids, atype="user")
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   168
                        seed_dict(manifest, "groupname", self.lint_groupnames,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   169
                            atype="group")
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   170
                        seed_dict(manifest, "gid", self.lint_gids,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   171
                            atype="group")
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   172
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   173
                engine.logger.debug(
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   174
                    _("Seeding local action duplicates dictionaries."))
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   175
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   176
                for manifest in engine.lint_manifests:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   177
                        seed_dict(manifest, "path", self.lint_paths)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   178
                        seed_dict(manifest, "name", self.lint_drivers,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   179
                            atype="driver")
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   180
                        seed_dict(manifest, "username", self.lint_usernames,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   181
                            atype="user")
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   182
                        seed_dict(manifest, "uid", self.lint_uids, atype="user")
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   183
                        seed_dict(manifest, "groupname", self.lint_groupnames,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   184
                            atype="group")
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   185
                        seed_dict(manifest, "gid", self.lint_gids,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   186
                            atype="group")
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   187
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   188
                self._merge_dict(self.lint_paths, self.ref_paths)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   189
                self._merge_dict(self.lint_drivers, self.ref_drivers)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   190
                self._merge_dict(self.lint_usernames, self.ref_usernames)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   191
                self._merge_dict(self.lint_uids, self.ref_uids)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   192
                self._merge_dict(self.lint_groupnames, self.ref_groupnames)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   193
                self._merge_dict(self.lint_gids, self.ref_gids)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   194
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   195
                self.lint_paths = {}
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   196
                self.lint_drivers = {}
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   197
                self.lint_usernames = {}
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   198
                self.lint_uids = {}
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   199
                self.lint_groupnames = {}
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   200
                self.lint_gids = {}
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   201
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   202
        def duplicate_paths(self, action, manifest, engine, pkglint_id="001"):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   203
                """Checks for duplicate paths on non-ref-counted actions."""
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   204
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   205
                self.dup_attr_check(["file", "license"], "path", self.ref_paths,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   206
                    self.processed_paths, action, engine, msgid=pkglint_id)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   207
2090
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
diff changeset
   208
        duplicate_paths.pkglint_desc = _(
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
diff changeset
   209
            "Paths should be unique.")
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
diff changeset
   210
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   211
        def duplicate_drivers(self, action, manifest, engine, pkglint_id="002"):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   212
                """Checks for duplicate driver names."""
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   213
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   214
                self.dup_attr_check(["driver"], "name", self.ref_drivers,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   215
                    self.processed_drivers, action, engine, msgid=pkglint_id)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   216
2090
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
diff changeset
   217
        duplicate_drivers.pkglint_desc = _("Driver names should be unique.")
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
diff changeset
   218
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   219
        def duplicate_usernames(self, action, manifest, engine,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   220
            pkglint_id="003"):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   221
                """Checks for duplicate user names."""
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
                self.dup_attr_check(["user"], "username", self.ref_usernames,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   224
                    self.processed_usernames, action, engine, msgid=pkglint_id)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   225
2090
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
diff changeset
   226
        duplicate_usernames.pkglint_desc = _("User names should be unique.")
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
diff changeset
   227
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   228
        def duplicate_uids(self, action, manifest, engine, pkglint_id="004"):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   229
                """Checks for duplicate uids."""
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   230
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   231
                self.dup_attr_check(["user"], "uid", self.ref_uids,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   232
                    self.processed_uids, action, engine, msgid=pkglint_id)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   233
2090
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
diff changeset
   234
        duplicate_uids.pkglint_desc = _("UIDs should be unique.")
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
diff changeset
   235
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   236
        def duplicate_groupnames(self, action, manifest, engine,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   237
            pkglint_id="005"):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   238
                """Checks for duplicate group names."""
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   239
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   240
                self.dup_attr_check(["group"], "groupname", self.ref_groupnames,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   241
                    self.processed_groupnames, action, engine, msgid=pkglint_id)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   242
2090
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
diff changeset
   243
        duplicate_groupnames.pkglint_desc = _(
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
diff changeset
   244
            "Group names should be unique.")
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
diff changeset
   245
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   246
        def duplicate_gids(self, action, manifest, engine, pkglint_id="006"):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   247
                """Checks for duplicate gids."""
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
                self.dup_attr_check(["group"], "name", self.ref_gids,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   250
                    self.processed_gids, action, engine, msgid=pkglint_id)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   251
2090
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
diff changeset
   252
        duplicate_gids.pkglint_desc = _("GIDs should be unique.")
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
diff changeset
   253
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   254
        def duplicate_refcount_path_attrs(self, action, manifest, engine,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   255
            pkglint_id="007"):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   256
                """Checks that for duplicated reference-counted actions,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   257
                all attributes in those duplicates are the same."""
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
                if "path" not in action.attrs:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   260
                        return
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   261
                if action.name not in self.refcounted_actions:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   262
                        return
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   263
                p = action.attrs["path"]
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   264
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   265
                if p in self.ref_paths and len(self.ref_paths[p]) == 1:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   266
                        return
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   267
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   268
                if p in self.processed_refcount_paths:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   269
                        return
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   270
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   271
                fmris = set()
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   272
                target = action
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   273
                differences = set()
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   274
                for (pfmri, a) in self.ref_paths[p]:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   275
                        fmris.add(pfmri)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   276
                        for key in a.differences(target):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   277
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   278
                                conflicting_vars, variants = \
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   279
                                    self.conflicting_variants([a, target])
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   280
                                if not conflicting_vars:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   281
                                        continue
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
                                if (key.startswith("variant") or \
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   284
                                    key.startswith("facet")):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   285
                                        pass
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   286
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   287
                                # target, used in link actions often differs
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   288
                                # between variants of those actions.
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   289
                                elif not key.startswith("target"):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   290
                                        differences.add(key)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   291
                suspects = []
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   292
                if differences:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   293
                        for key in differences:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   294
                                # a dictionary to map unique values for this key
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   295
                                # the fmris that deliver them
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   296
                                attr = {}
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   297
                                for (pfmri, a) in self.ref_paths[p]:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   298
                                        if key in a.attrs:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   299
                                                val = a.attrs[key]
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   300
                                                if val in attr:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   301
                                                        attr[val].append(pfmri)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   302
                                                else:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   303
                                                        attr[val] = [pfmri]
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   304
                                for val in attr:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   305
                                        suspects.append("%s: %s -> %s" %
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   306
                                            (key, val,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   307
                                            " ".join([pfmri.get_name()
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   308
                                            for pfmri in attr[val]])))
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   309
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   310
                        engine.error(_("path %(path)s is reference-counted "
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   311
                            "but has different attributes across %(count)s "
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   312
                            "duplicates: %(suspects)s") %
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   313
                            {"path": p,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   314
                            "count": len(fmris) + 1,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   315
                            "suspects": " ".join([key for key in suspects])},
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   316
                            msgid="%s%s" % (self.name, pkglint_id))
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   317
                self.processed_refcount_paths[p] = True
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   318
2090
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
diff changeset
   319
        duplicate_refcount_path_attrs.pkglint_desc = _(
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
diff changeset
   320
            "Duplicated reference counted actions should have the same attrs.")
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
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
        def dup_attr_check(self, action_names, attr_name, ref_dic,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   323
            processed_dic, action, engine, msgid=""):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   324
                """This method does generic duplicate action checking where
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   325
                we know the type of action and name of an action attributes
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   326
                across actions/manifests that should not be duplicated.
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   327
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   328
                'action_names' A list of the type of actions to check
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   329
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   330
                'attr_name' The attribute name we're checking
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   331
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   332
                'ref_dic' Built in setup() this dictionary maps attr_name values
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   333
                to a list of all (fmri, action) tuples that deliver that
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   334
                attr_name value.
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   335
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   336
                'processed_dic' Records whether we've already called this method
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   337
                for a given attr_name value
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   338
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   339
                'action' The current action we're checking
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   340
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   341
                'engine' The LintEngine calling this method
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   342
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   343
                'id' The pkglint_id to use when logging messages."""
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   344
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   345
                if attr_name not in action.attrs:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   346
                        return
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   347
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   348
                if action.name not in action_names:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   349
                        return
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   350
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   351
                name = action.attrs[attr_name]
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   352
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   353
                if name in processed_dic:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   354
                        return
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   355
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   356
                if name in ref_dic and len(ref_dic[name]) == 1:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   357
                        return
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   358
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   359
                fmris = set()
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   360
                actions = set()
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   361
                for (pfmri, a) in ref_dic[name]:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   362
                        actions.add(a)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   363
                        fmris.add(pfmri)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   364
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   365
                has_conflict, conflict_vars = self.conflicting_variants(actions)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   366
                if has_conflict:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   367
                        if not conflict_vars:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   368
                                engine.error(_("%(attr_name)s %(name)s is "
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   369
                                    "a duplicate delivered by %(pkgs)s "
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   370
                                    "declaring no variants") %
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   371
                                    {"attr_name": attr_name,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   372
                                    "name": name,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   373
                                    "pkgs":
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   374
                                    " ".join([f.get_fmri() for f in fmris])},
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   375
                                    msgid="%s%s.1" % (self.name, msgid))
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   376
                        else:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   377
                                engine.error(_("%(attr_name)s %(name)s is "
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   378
                                    "a duplicate delivered by %(pkgs)s "
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   379
                                    "declaring overlapping variants %(vars)s") %
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   380
                                    {"attr_name": attr_name,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   381
                                    "name": name,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   382
                                    "pkgs":
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   383
                                    " ".join([f.get_fmri() for f in fmris]),
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   384
                                    "vars":
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   385
                                    " ".join([v for v in conflict_vars])},
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   386
                                    msgid="%s%s.2" % (self.name, msgid))
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   387
                processed_dic[name] = True
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   388
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   389
        def duplicate_path_types(self, action, manifest, engine,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   390
            pkglint_id="008"):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   391
                """Checks to see if the action containing a path attribute
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   392
                has that action delivered by multiple action types."""
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   393
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   394
                if "path" not in action.attrs:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   395
                        return
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   396
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   397
                p = action.attrs["path"]
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   398
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   399
                if p in self.seen_dup_types:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   400
                        return
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
                types = set()
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   403
                fmris = set()
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   404
                actions = set()
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   405
                for (pfmri, a) in self.ref_paths[p]:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   406
                        actions.add(a)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   407
                        types.add(a.name)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   408
                        fmris.add(pfmri)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   409
                if len(types) > 1:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   410
                        has_conflict, conflict_vars = \
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   411
                            self.conflicting_variants(actions)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   412
                        if has_conflict:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   413
                                engine.error(
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   414
                                    _("path %(path)s is delivered by multiple "
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   415
                                    "action types across %(pkgs)s") %
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   416
                                    {"path": p,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   417
                                    "pkgs":
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   418
                                    " ".join([f.get_fmri() for f in fmris])},
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   419
                                    msgid="%s%s" % (self.name, pkglint_id))
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   420
                self.seen_dup_types[p] = True
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   421
2090
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
diff changeset
   422
        duplicate_path_types.pkglint_desc = _(
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
diff changeset
   423
            "Paths should be delivered by one action type only.")
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
diff changeset
   424
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   425
        def _merge_dict(self, src, target):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   426
                """Merges the given src dictionary into the target
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   427
                dictionary, giving us the target content as it would appear,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   428
                were the packages in src to get published to the
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   429
                repositories that made up target.
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   430
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   431
                We need to only merge packages at the same or successive
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   432
                version from the src dictionary into the target dictionary.
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   433
                If the src dictionary contains a package with no version
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   434
                information, it is assumed to be more recent than the same
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   435
                package with no version in the target."""
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   436
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   437
                for p in src:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   438
                        if p not in target:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   439
                                target[p] = src[p]
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   440
                                continue
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   441
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   442
                        def build_dic(arr):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   443
                                """Builds a dictionary of fmri:action entries"""
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   444
                                dic = {}
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   445
                                for (pfmri, action) in arr:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   446
                                        if pfmri in dic:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   447
                                                dic[pfmri].append(action)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   448
                                        else:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   449
                                                dic[pfmri] = [action]
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   450
                                return dic
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   451
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   452
                        src_dic = build_dic(src[p])
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   453
                        targ_dic = build_dic(target[p])
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   454
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   455
                        for src_pfmri in src_dic:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   456
                                # we want to remove entries deemed older than
2081
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   457
                                # src_pfmri from targ_dic.
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   458
                                for targ_pfmri in targ_dic.copy():
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   459
                                        sname = src_pfmri.get_name()
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   460
                                        tname = targ_pfmri.get_name()
2081
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   461
                                        if lint_fmri_successor(src_pfmri, targ_pfmri):
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   462
                                                targ_dic.pop(targ_pfmri)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   463
                        targ_dic.update(src_dic)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   464
                        l = []
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   465
                        for pfmri in targ_dic:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   466
                                for action in targ_dic[pfmri]:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   467
                                        l.append((pfmri, action))
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   468
                        target[p] = l
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
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   471
class PkgActionChecker(base.ActionChecker):
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
        name = "pkglint.action"
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
        def __init__(self, config):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   476
                self.description = _("Various checks on actions")
2081
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   477
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   478
                # a list of fmris which were declared as dependencies, but
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   479
                # which we weren't able to locate a manifest for.
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   480
                self.missing_deps = []
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   481
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   482
                # maps package names to tuples of (obsolete, fmri) values where
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   483
                # 'obsolete' is a boolean, True if the package is obsolete
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   484
                self.obsolete_pkgs = {}
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   485
                super(PkgActionChecker, self).__init__(config)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   486
2081
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   487
        def startup(self, engine):
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   488
                """Cache all manifest FMRIs, tracking whether they're
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   489
                obsolete or not."""
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   490
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   491
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   492
                def seed_obsolete_dict(mf, dic):
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   493
                        """Updates a dictionary of { pkg_name: ObsoleteFmri }
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   494
                        items, tracking which were marked as obsolete."""
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   495
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   496
                        name = mf.fmri.get_name()
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   497
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   498
                        if "pkg.obsolete" in mf and \
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   499
                            mf["pkg.obsolete"].lower() == "true":
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   500
                                dic[name] = ObsoleteFmri(True, mf.fmri)
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   501
                        else:
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   502
                                dic[name] = ObsoleteFmri(False, mf.fmri)
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   503
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   504
                engine.logger.debug(_("Seeding reference action dictionaries."))
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   505
                for manifest in engine.gen_manifests(engine.ref_api_inst,
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   506
                    release=engine.release):
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   507
                        seed_obsolete_dict(manifest, self.obsolete_pkgs)
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   508
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   509
                engine.logger.debug(_("Seeding lint action dictionaries."))
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   510
                # we provide a search pattern, to allow users to lint a
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   511
                # subset of the packages in the lint_repository
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   512
                for manifest in engine.gen_manifests(engine.lint_api_inst,
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   513
                    release=engine.release, pattern=engine.pattern):
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   514
                        seed_obsolete_dict(manifest, self.obsolete_pkgs)
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   515
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   516
                engine.logger.debug(_("Seeding local action dictionaries."))
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   517
                for manifest in engine.lint_manifests:
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   518
                        seed_obsolete_dict(manifest, self.obsolete_pkgs)
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   519
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   520
        def underscores(self, action, manifest, engine, pkglint_id="001"):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   521
                """In general, pkg(5) discourages the use of underscores in
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   522
                attributes."""
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   523
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   524
                for key in action.attrs.keys():
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   525
                        if "_" in key:
2085
10a27146ebc2 16802 pkglint should check the value of info.classification in manifests
Tim Foster <tim.s.foster@oracle.com>
parents: 2081
diff changeset
   526
                                if key in ["original_name", "refresh_fmri",
10a27146ebc2 16802 pkglint should check the value of info.classification in manifests
Tim Foster <tim.s.foster@oracle.com>
parents: 2081
diff changeset
   527
                                    "restart_fmri", "suspend_fmri",
10a27146ebc2 16802 pkglint should check the value of info.classification in manifests
Tim Foster <tim.s.foster@oracle.com>
parents: 2081
diff changeset
   528
                                    "disable_fmri", "clone_perms"]:
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   529
                                        continue
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   530
                                engine.warning(
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   531
                                    _("underscore in attribute name %(key)s in "
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   532
                                    "%(fmri)s") %
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   533
                                    {"key": key,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   534
                                    "fmri": manifest.fmri},
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   535
                                    msgid="%s%s" % (self.name, pkglint_id))
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   536
2090
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
diff changeset
   537
        underscores.pkglint_desc = _(
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
diff changeset
   538
            "Underscores are discouraged in action attributes.")
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
diff changeset
   539
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   540
        def unusual_perms(self, action, manifest, engine, pkglint_id="002"):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   541
                """Checks that the permissions in this action look sane."""
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   542
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   543
                if "mode" in action.attrs:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   544
                        mode = action.attrs["mode"]
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   545
                        unusual = False
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   546
                        filemodes = ["0644", "0755", "0555", "4755", "0664",
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   547
                                    "0444", "4555", "0600", "2555" ]
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   548
                        if action.name == "file":
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   549
                                if mode not in filemodes:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   550
                                        unusual = True
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   551
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   552
                        elif action.name == "dir":
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   553
                                if mode not in ["0700", "0755", "0744", "0555",
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   554
                                    "2555", "6555"]:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   555
                                        unusual = True
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   556
                                # check it's executable
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   557
                                st = None
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   558
                                broken = False
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   559
                                try:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   560
                                        st = stat.S_IMODE(string.atoi(mode, 8))
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   561
                                except ValueError:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   562
                                        broken = True
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   563
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   564
                                if not broken and \
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   565
                                    (stat.S_IXUSR & st or stat.S_IXGRP & st
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   566
                                    or stat.S_IXOTH & st):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   567
                                        pass
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   568
                                else:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   569
                                        engine.warning(_("directory action for "
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   570
                                            "%(dir)s delivered in %(pkg)s with "
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   571
                                            "mode=%(mode)s "
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   572
                                            "that has no executable bits") %
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   573
                                            {"dir": action.attrs["path"],
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   574
                                            "pkg": manifest.fmri,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   575
                                            "mode": mode},
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   576
                                            msgid="%s%s.1" %
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   577
                                            (self.name, pkglint_id))
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   578
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   579
                        elif mode not in ["0644", "0755", "0700", "0444"]:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   580
                                unusual = True
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 unusual:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   583
                                engine.warning(
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   584
                                    _("unusual mode %(mode)s in %(path)s "
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   585
                                    "delivered by %(pkg)s") %
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   586
                                    {"mode": mode,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   587
                                    "path": action.attrs["path"],
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   588
                                    "pkg": manifest.fmri},
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   589
                                    msgid="%s%s.2" % (self.name, pkglint_id))
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   590
2090
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
diff changeset
   591
        unusual_perms.pkglint_desc = _(
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
diff changeset
   592
            "UNIX file modes should be sensible.")
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
diff changeset
   593
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   594
        def legacy(self, action, manifest, engine, pkglint_id="003"):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   595
                """Cross-check that the 'pkg' attribute points to a package
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   596
                that depends on the package containing this legacy action.
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   597
                Also check that all the required tags are present on this
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   598
                legacy action."""
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   599
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   600
                if action.name != "legacy":
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   601
                        return
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   602
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   603
                name = manifest.fmri.get_name()
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   604
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   605
                for required in [ "category", "desc", "hotline", "name",
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   606
                    "pkg", "vendor", "version" ]:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   607
                            if required not in action.attrs:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   608
                                    engine.error(
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   609
                                        _("%(attr)s missing from legacy "
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   610
                                        "action in %(pkg)s") %
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   611
                                        {"attr": required,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   612
                                        "pkg": manifest.fmri},
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   613
                                        msgid="%s%s.1" %
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   614
                                        (self.name, pkglint_id))
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   615
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   616
                if "pkg" in action.attrs:
2081
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   617
                        mf = None
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   618
                        try:
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   619
                                mf = engine.get_manifest(action.attrs["pkg"],
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   620
                                    search_type=engine.LATEST_SUCCESSOR)
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   621
                        except base.LintException:
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   622
                                # it's common to find a legacy package that
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   623
                                # simply never existed as an IPS package eg.
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   624
                                # arch-specific SVR4 packages combined into a
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   625
                                # single IPS package.
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   626
                                # We don't care about these.
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   627
                                pass
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   628
                        if mf:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   629
                                found_depend = False
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   630
                                # check that the manifest we found depends on
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   631
                                # the package containing this legacy action
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   632
                                for depend in mf.gen_actions_by_type("depend"):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   633
                                        if depend.attrs["type"] != "require":
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   634
                                                continue
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   635
                                        fmri = depend.attrs["fmri"]
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   636
                                        dep_name = \
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   637
                                            pkg.fmri.extract_pkg_name(fmri)
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   638
                                        if dep_name == name:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   639
                                                found_depend = True
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   640
                                if not found_depend:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   641
                                        engine.error(
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   642
                                        _("ancestor %(ancestor)s did not "
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   643
                                        "declare a dependency on %(pkg)s") %
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   644
                                        {"ancestor": mf.fmri,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   645
                                        "pkg": manifest.fmri},
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   646
                                        msgid="%s%s.2" %
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   647
                                        (self.name, pkglint_id))
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 "version" in action.attrs:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   650
                        # this could be refined
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   651
                        if "REV=" not in action.attrs["version"]:
2081
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   652
                                engine.warning(
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   653
                                    _("legacy action in %s does not "
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   654
                                    "contain a REV= string") % manifest.fmri,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   655
                                    msgid="%s%s.3" % (self.name, pkglint_id))
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   656
2090
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
diff changeset
   657
        legacy.pkglint_desc = _(
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
diff changeset
   658
            "'legacy' actions should have valid attributes.")
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
diff changeset
   659
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   660
        def unknown(self, action, manifest, engine, pkglint_id="004"):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   661
                """We should never have actions called 'unknown'."""
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   662
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   663
                if action.name is "unknown":
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   664
                        engine.error(_("unknown action found in %s") %
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   665
                            manifest.fmri,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   666
                            msgid="%s%s" % (self.name, pkglint_id))
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   667
2090
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
diff changeset
   668
        unknown.pkglint_desc = _("'unknown' actions should never occur.")
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
diff changeset
   669
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   670
        def license(self, action, manifest, engine, pkglint_id="005"):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   671
                """License actions should not have path attributes."""
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   672
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   673
                if action.name is "license" and "path" in action.attrs:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   674
                        engine.error(
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   675
                            _("license action in %(pkg)s has a path attribute, "
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   676
                            "%(path)s") %
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   677
                            {"pkg": manifest.fmri,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   678
                            "path": action.attrs["path"]},
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   679
                            msgid="%s%s" % (self.name, pkglint_id))
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   680
2090
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
diff changeset
   681
        license.pkglint_desc = _("'license' actions should not have paths.")
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
diff changeset
   682
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   683
        def dep_obsolete(self, action, manifest, engine, pkglint_id="005"):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   684
                """We should not have a require dependency on a package that has
2081
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   685
                been marked as obsolete.
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   686
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   687
                This check also produces warnings when it is unable to find
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   688
                manifests marked as dependencies for a given package in order
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   689
                to check for their obsoletion.  This can help to detect errors
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   690
                in the fmri attribute field of the depend action, though can be
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   691
                noisy if all dependencies are intentionally not present in the
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   692
                repository being linted or referenced."""
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   693
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   694
                msg = _("dependency in %(pkg)s on obsolete pkg %(obs)s")
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   695
2081
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   696
                if action.name != "depend":
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   697
                        return
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   698
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   699
                if action.attrs["type"] != "require":
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   700
                        return
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   701
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   702
                # There's a good chance that dependencies can be satisfied from
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   703
                # the manifests we cached during startup() Check there before
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   704
                # doing the more expensive engine.get_manifest() call.
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   705
                name = None
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   706
                declared_fmri = None
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   707
                dep_fmri = action.attrs["fmri"]
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   708
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   709
                # normalize the fmri
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   710
                if not dep_fmri.startswith("pkg:/"):
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   711
                        dep_fmri = "pkg:/%s" % dep_fmri
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   712
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   713
                try:
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   714
                        declared_fmri = pkg.fmri.PkgFmri(dep_fmri)
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   715
                        name = declared_fmri.get_name()
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   716
                except pkg.fmri.IllegalFmri:
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   717
                        try:
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   718
                                declared_fmri = pkg.fmri.PkgFmri(dep_fmri,
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   719
                                    build_release="5.11")
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   720
                                name = declared_fmri.get_name()
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   721
                        except:
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   722
                                # A very broken fmri value - we'll give up now.
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   723
                                # valid_fmri() will pick up the trail from here.
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   724
                                return
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   725
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   726
                # if we've been unable to find a dependency for a given
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   727
                # fmri in the past, no need to keep complaining about it
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   728
                if dep_fmri in self.missing_deps:
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   729
                        return
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   730
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   731
                if name and name in self.obsolete_pkgs:
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   732
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   733
                        if not self.obsolete_pkgs[name].is_obsolete:
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   734
                                # the cached package is not obsolete, but we'll
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   735
                                # verify the version is valid
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   736
                                found_fmri = self.obsolete_pkgs[name].fmri
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   737
                                if not declared_fmri.has_version():
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   738
                                        return
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   739
                                elif lint_fmri_successor(found_fmri,
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   740
                                    declared_fmri):
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   741
                                        return
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   742
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   743
                # A non-obsolete dependency wasn't found in the local cache,
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   744
                # or the one in the cache was found not to be a successor of
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   745
                # the fmri in the depend action.
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   746
                lint_id = "%s%s" % (self.name, pkglint_id)
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   747
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   748
                mf = engine.get_manifest(dep_fmri,
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   749
                    search_type=engine.LATEST_SUCCESSOR)
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   750
                if mf and "pkg.obsolete" in mf:
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   751
                        engine.error(msg %  {"pkg": manifest.fmri,
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   752
                            "obs": mf["pkg.fmri"]}, msgid=lint_id)
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   753
                elif not mf:
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   754
                        self.missing_deps.append(dep_fmri)
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   755
                        engine.warning(_("obsolete dependency check "
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   756
                            "skipped: unable to find dependency %(dep)s"
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   757
                            " for %(pkg)s") %
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   758
                            {"dep": dep_fmri,
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   759
                            "pkg": manifest.fmri},
f2189c4a03c4 16824 pkglint should remove its workaround for 16811
Tim Foster <tim.s.foster@oracle.com>
parents: 2046
diff changeset
   760
                            msgid="%s.1" % lint_id)
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   761
2090
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
diff changeset
   762
        dep_obsolete.pkglint_desc = _(
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
diff changeset
   763
            "Packages should not have dependencies on obsolete packages.")
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
diff changeset
   764
2046
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   765
        def valid_fmri(self, action, manifest, engine, pkglint_id="006"):
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   766
                """We should be given a valid FMRI as a dependency, allowing
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   767
                for a potentially missing component value"""
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   768
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   769
                if "fmri" not in action.attrs:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   770
                        return
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   771
                try:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   772
                        pfmri = pkg.fmri.PkgFmri(action.attrs["fmri"])
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   773
                except pkg.fmri.IllegalFmri:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   774
                        # we also need to just verify that the fmri isn't
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   775
                        # just missing a build_release value
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   776
                        try:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   777
                                pfmri = pkg.fmri.PkgFmri(action.attrs["fmri"],
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   778
                                    build_release="5.11")
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   779
                        except pkg.fmri.IllegalFmri:
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   780
                                engine.error("invalid FMRI in action %(action)s"
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   781
                                    " in %(pkg)s" %
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   782
                                    {"pkg": manifest.fmri,
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   783
                                    "action": action},
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   784
                                    msgid="%s%s" % (self.name, pkglint_id))
2522cde7adc2 13536 We need a way to audit one or more packages
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   785
2090
d84a7b3cafa3 17061 pkglint -L output could be improved
Tim Foster <tim.s.foster@oracle.com>
parents: 2085
diff changeset
   786
        valid_fmri.pkglint_desc = _("pkg(5) FMRIs should be valid.")