tools/python/pkglint/userland.py
author Norm Jacobs <Norm.Jacobs@Oracle.COM>
Wed, 23 Feb 2011 10:37:11 -0800
changeset 99 c15c9099bb44
parent 84 b80cfd4e0a16
child 117 8f634eb6f66b
permissions -rw-r--r--
6841644 OpenSolaris Python should support gdbm 6991811 Migrate Mercurial (Hg) to Python 2.6 7009592 PyOpenSSL should be updated from 0.8 to 0.11 7016735 move mercurial from sfw to userland 7018363 Userland LD_OPTIONS should include non-executable data mapfiles as well 7019410 python 2.6 should move to userland 7020772 userland build should provide more macros for common flags 7021204 userland runpath checking should relax slightly.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
45
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
     1
#!/usr/bin/python
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
     2
#
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
     3
# CDDL HEADER START
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
     4
#
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
     5
# The contents of this file are subject to the terms of the
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
     6
# Common Development and Distribution License (the "License").
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
     7
# You may not use this file except in compliance with the License.
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
     8
#
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
     9
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    10
# or http://www.opensolaris.org/os/licensing.
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    11
# See the License for the specific language governing permissions
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    12
# and limitations under the License.
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    13
#
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    14
# When distributing Covered Code, include this CDDL HEADER in each
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    15
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    16
# If applicable, add the following below this CDDL HEADER, with the
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    17
# fields enclosed by brackets "[]" replaced with your own identifying
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    18
# information: Portions Copyright [yyyy] [name of copyright owner]
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    19
#
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    20
# CDDL HEADER END
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    21
#
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    22
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    23
#
84
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    24
# Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
45
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    25
#
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    26
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    27
# Some userland consolidation specific lint checks
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    28
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    29
import pkg.lint.base as base
84
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    30
import pkg.elf as elf
45
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    31
import re
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    32
import os.path
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    33
84
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    34
45
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    35
class UserlandActionChecker(base.ActionChecker):
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    36
        """An opensolaris.org-specific class to check actions."""
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    37
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    38
        name = "userland.action"
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    39
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    40
        def __init__(self, config):
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    41
                self.description = _(
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    42
                    "checks Userland packages for common content errors")
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    43
		self.prototype = os.getenv('PROTO_DIR')
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    44
		self.runpath_re = [
99
c15c9099bb44 6841644 OpenSolaris Python should support gdbm
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 84
diff changeset
    45
			re.compile('^/lib(/.*)?$'),
45
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    46
			re.compile('^/usr/'),
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    47
			re.compile('^\$ORIGIN/')
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    48
		]
84
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    49
		self.initscript_re = re.compile("^etc/(rc.|init)\.d")
45
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    50
                super(UserlandActionChecker, self).__init__(config)
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    51
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    52
	def startup(self, engine):
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    53
		if self.prototype != None:
84
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    54
			engine.info(_("including prototype checks: %s") %
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    55
					self.prototype, msgid=self.name)
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    56
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    57
        def __realpath(self, path, target):
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    58
		"""Combine path and target to get the real path."""
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    59
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    60
		result = os.path.dirname(path)
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    61
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    62
		for frag in target.split(os.sep):
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    63
			if frag == '..':
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    64
				result = os.path.dirname(result)
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    65
			elif frag == '.':
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    66
				pass
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    67
			else:
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    68
				result = os.path.join(result, frag)
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    69
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    70
		return result
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    71
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    72
	def __elf_runpath_check(self, path):
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    73
		result = None
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    74
		list = []
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    75
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    76
		ed = elf.get_dynamic(path)
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    77
		for dir in ed.get("runpath", "").split(":"):
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    78
			if dir == None or dir == '':
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    79
				continue
45
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    80
84
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    81
			match = False
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    82
			for expr in self.runpath_re:
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    83
				if expr.match(dir):
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    84
					match = True
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    85
					break
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    86
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    87
			if match == False:
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    88
				list.append(dir)
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    89
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    90
		if len(list) > 0:
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    91
			result = _("bad RUNPATH, '%%s' includes '%s'" %
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    92
				   ":".join(list))
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    93
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    94
		return result
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    95
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    96
	def __elf_wrong_location_check(self, path):
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    97
		result = None
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    98
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
    99
		ei = elf.get_info(path)
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   100
		bits = ei.get("bits")
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   101
		frag = os.path.basename(os.path.dirname(path))
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   102
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   103
		if bits == 32 and frag in ["sparcv9", "amd64", "64"]:
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   104
			result = _("32-bit object '%s' in 64-bit path")
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   105
		elif bits == 64 and frag not in ["sparcv9", "amd64", "64"]:
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   106
			result = _("64-bit object '%s' in 32-bit path")
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   107
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   108
		return result
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   109
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   110
	def file_action(self, action, manifest, engine, pkglint_id="001"):
45
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   111
		"""Checks for existence in the proto area."""
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   112
84
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   113
		if action.name not in ["file"]:
45
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   114
			return
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   115
84
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   116
		path = action.attrs["path"]
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   117
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   118
		# check for writable files without a preserve attribute
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   119
		if 'mode' in action.attrs:
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   120
			mode = action.attrs["mode"]
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   121
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   122
			if (int(mode, 8) & 0222) != 0 and "preserve" not in action.attrs:
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   123
				engine.error(
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   124
				_("%(path)s is writable (%(mode)s), but missing a preserve"
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   125
				  " attribute") %  {"path": path, "mode": mode},
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   126
				msgid="%s%s.0" % (self.name, pkglint_id))
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   127
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   128
		# checks that require a physical file to look at
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   129
		if self.prototype is not None:
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   130
			fullpath = self.prototype + "/" + path
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   131
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   132
			if not os.path.exists(fullpath):
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   133
				engine.info(
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   134
					_("%s missing from proto area, skipping"
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   135
					  " content checks") % path, 
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   136
					msgid="%s%s.1" % (self.name, pkglint_id))
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   137
			elif elf.is_elf_object(fullpath):
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   138
				# 32/64 bit in wrong place
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   139
				result = self.__elf_wrong_location_check(fullpath)
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   140
				if result != None:
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   141
					engine.error(result % path, 
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   142
						msgid="%s%s.2" % (self.name, pkglint_id))
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   143
				result = self.__elf_runpath_check(fullpath)
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   144
				if result != None:
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   145
					engine.error(result % path, 
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   146
						msgid="%s%s.3" % (self.name, pkglint_id))
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   147
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   148
	file_action.pkglint_desc = _("Paths should exist in the proto area.")
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   149
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   150
	def link_resolves(self, action, manifest, engine, pkglint_id="002"):
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   151
		"""Checks for link resolution."""
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   152
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   153
		if action.name not in ["link", "hardlink"]:
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   154
			return
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   155
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   156
		path = action.attrs["path"]
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   157
		target = action.attrs["target"]
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   158
		realtarget = self.__realpath(path, target)
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   159
		
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   160
		resolved = False
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   161
		for maction in manifest.gen_actions():
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   162
			mpath = None
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   163
			if maction.name in ["dir", "file", "link",
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   164
						"hardlink"]:
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   165
				mpath = maction.attrs["path"]
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   166
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   167
			if mpath and mpath == realtarget:
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   168
				resolved = True
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   169
				break
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   170
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   171
		if resolved != True:
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   172
			engine.error(
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   173
				_("%s %s has unresolvable target '%s'") %
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   174
					(action.name, path, target),
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   175
				msgid="%s%s.0" % (self.name, pkglint_id))
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   176
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   177
	link_resolves.pkglint_desc = _("links should resolve.")
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   178
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   179
	def init_script(self, action, manifest, engine, pkglint_id="003"):
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   180
		"""Checks for SVR4 startup scripts."""
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   181
45
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   182
		if action.name not in ["file", "dir", "link", "hardlink"]:
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   183
			return
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   184
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   185
		path = action.attrs["path"]
84
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   186
		if self.initscript_re.match(path):
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   187
			engine.warning(
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   188
				_("SVR4 startup '%s', deliver SMF"
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   189
				  " service instead") % path,
45
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   190
				msgid="%s%s.0" % (self.name, pkglint_id))
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   191
84
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   192
	init_script.pkglint_desc = _(
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   193
		"SVR4 startup scripts should not be delivered.")
45
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   194
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   195
class UserlandManifestChecker(base.ManifestChecker):
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   196
        """An opensolaris.org-specific class to check manifests."""
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   197
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   198
        name = "userland.manifest"
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   199
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   200
	def __init__(self, config):
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   201
		self.prototype = os.getenv('PROTO_DIR')
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   202
		super(UserlandManifestChecker, self).__init__(config)
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   203
84
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   204
	def license_check(self, manifest, engine, pkglint_id="001"):
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   205
		manifest_paths = []
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   206
		files = False
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   207
		license = False
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   208
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   209
		for action in manifest.gen_actions_by_type("file"):
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   210
			files = True
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   211
			break
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   212
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   213
		if files == False:
45
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   214
			return
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   215
84
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   216
		for action in manifest.gen_actions_by_type("license"):
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   217
			return
45
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   218
84
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   219
		engine.error( _("missing license action"),
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   220
			msgid="%s%s.0" % (self.name, pkglint_id))
45
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   221
84
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   222
	license_check.pkglint_dest = _(
b80cfd4e0a16 7000952 Userland package validation needs some love
Norm Jacobs <Norm.Jacobs@Oracle.COM>
parents: 45
diff changeset
   223
		"license actions are required if you deliver files.")