tools/python/pkglint/userland.py
author Norm Jacobs <Norm.Jacobs@Sun.COM>
Tue, 09 Nov 2010 10:32:06 -0600
changeset 45 536ea324b223
child 84 b80cfd4e0a16
permissions -rw-r--r--
initial content validation check extension for pkglint
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
#
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    24
# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
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
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    30
import re
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    31
import os.path
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    32
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    33
class UserlandActionChecker(base.ActionChecker):
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    34
        """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
    35
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    36
        name = "userland.action"
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
        def __init__(self, config):
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    39
                self.description = _(
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    40
                    "checks Userland packages for common content errors")
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    41
		self.prototype = os.getenv('PROTO_DIR')
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    42
		self.runpath_re = [
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    43
			re.compile('^/lib/'),
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    44
			re.compile('^/usr/'),
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    45
			re.compile('^\$ORIGIN/')
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    46
		]
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    47
                super(UserlandActionChecker, self).__init__(config)
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    48
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    49
	def startup(self, engine):
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    50
		if self.prototype != None:
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    51
			engine.info(_("including prototype checks: %s") % self.prototype, msgid=self.name)
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    52
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    53
	def file_exists(self, action, manifest, engine, pkglint_id="001"):
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    54
		"""Checks for existence in the proto area."""
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    55
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    56
		if self.prototype is None:
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    57
			return
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    58
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    59
		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
    60
			return
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    61
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    62
		path = action.attrs["path"]
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    63
		fullpath = self.prototype + "/" + path
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    64
		if not os.path.exists(fullpath):
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    65
			engine.error(
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    66
				_("packaged path '%s' missing from proto area") % path, 
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    67
				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
    68
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    69
	file_exists.pkglint_desc = _("Paths should exist in the proto area.")
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    70
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    71
	def file_content(self, action, manifest, engine, pkglint_id="002"):
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    72
		"""Checks for file content issues."""
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    73
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    74
		if self.prototype is None:
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    75
			return
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    76
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    77
		if action.name is not "file":
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    78
			return
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    79
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    80
		import pkg.elf as elf
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    81
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    82
		path = action.attrs["path"]
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    83
		fullpath = self.prototype + "/" + path
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    84
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    85
		if elf.is_elf_object(fullpath):
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    86
			ed = elf.get_dynamic(fullpath)
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    87
			for dir in ed.get("runpath", "").split(":"):
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    88
				if dir == None or dir == '':
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    89
					continue
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    90
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    91
				match = False
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    92
				for expr in self.runpath_re:
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    93
					if expr.match(dir):
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    94
						match = True
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    95
						break
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    96
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    97
				if match == False:
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    98
					engine.error(
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
    99
						_("%s has bad RUNPATH, "
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   100
					  	"includes: %s") % (path, dir),
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   101
						msgid="%s%s.1" % (self.name, pkglint_id))
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   102
		# additional checks for different content types should go here
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   103
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   104
	file_content.pkglint_desc = _("Paths should not deliver common mistakes.")
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   105
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   106
class UserlandManifestChecker(base.ManifestChecker):
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   107
        """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
   108
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   109
        name = "userland.manifest"
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   110
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   111
	def __init__(self, config):
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   112
		self.prototype = os.getenv('PROTO_DIR')
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   113
		super(UserlandManifestChecker, self).__init__(config)
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   114
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   115
	def unpackaged_files(self, manifest, engine, pkglint_id="001"):
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   116
		if self.prototype == None:
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   117
			return
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   118
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   119
		return	# skip this check for now.  It needs more work
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   120
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   121
		manifest_paths = []
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   122
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   123
		for action in manifest.gen_actions():
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   124
			if action.name in ["file", "dir", "link", "hardlink"]:
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   125
				manifest_paths.append(action.attrs.get("path"))
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   126
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   127
		for dirname, dirnames, filenames in os.walk(self.prototype):
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   128
			dir = dirname[len(self.prototype):]
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   129
			for name in filenames + dirnames:
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   130
				path = dir + '/' + name
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   131
				if path not in manifest_paths:
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   132
					engine.error(
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   133
						_("unpackaged path '%s' missing from manifest") % path, 
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   134
					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
   135
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   136
	unpackaged_files.pkglint_dest = _(
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   137
		"Prototype paths should be present.")
536ea324b223 initial content validation check extension for pkglint
Norm Jacobs <Norm.Jacobs@Sun.COM>
parents:
diff changeset
   138