author | Danek Duvall <danek.duvall@sun.com> |
Thu, 15 Nov 2007 11:32:55 -0800 | |
changeset 201 | 63e78f600aa7 |
parent 195 | b23d0425f0f7 |
child 204 | 8f650d596aec |
permissions | -rw-r--r-- |
19 | 1 |
#!/usr/bin/python |
2 |
# |
|
3 |
# CDDL HEADER START |
|
4 |
# |
|
5 |
# The contents of this file are subject to the terms of the |
|
6 |
# Common Development and Distribution License (the "License"). |
|
7 |
# You may not use this file except in compliance with the License. |
|
8 |
# |
|
9 |
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE |
|
10 |
# or http://www.opensolaris.org/os/licensing. |
|
11 |
# See the License for the specific language governing permissions |
|
12 |
# and limitations under the License. |
|
13 |
# |
|
14 |
# When distributing Covered Code, include this CDDL HEADER in each |
|
15 |
# file and include the License file at usr/src/OPENSOLARIS.LICENSE. |
|
16 |
# If applicable, add the following below this CDDL HEADER, with the |
|
17 |
# fields enclosed by brackets "[]" replaced with your own identifying |
|
18 |
# information: Portions Copyright [yyyy] [name of copyright owner] |
|
19 |
# |
|
20 |
# CDDL HEADER END |
|
21 |
# |
|
22 |
||
23 |
# Copyright 2007 Sun Microsystems, Inc. All rights reserved. |
|
24 |
# Use is subject to license terms. |
|
25 |
||
104
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
26 |
import ConfigParser |
144
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
27 |
import cPickle |
161
e0322fe7842c
Simplify and correct the package matching code.
Danek Duvall <danek.duvall@sun.com>
parents:
157
diff
changeset
|
28 |
import errno |
59
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
29 |
import getopt |
26 | 30 |
import os |
173
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
31 |
import grp |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
32 |
import pwd |
45
8a3f00dea14f
catalog refresh; basic catalog listing; precise manifest pulls
Stephen Hahn <sch@sun.com>
parents:
39
diff
changeset
|
33 |
import urllib |
201
63e78f600aa7
185 traceback on pkg refresh when hostname lookup fails
Danek Duvall <danek.duvall@sun.com>
parents:
195
diff
changeset
|
34 |
import urllib2 |
116
9c9942a52984
(image flag day) remove pkg catalog, improve pkg status, localize pkg(1), use
Stephen Hahn <sch@Sun.COM>
parents:
111
diff
changeset
|
35 |
import urlparse |
104
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
36 |
# import uuid # XXX interesting 2.5 module |
34
8b9613402116
refactor catalog and package to be common; improve bump-server
Stephen Hahn <sch@sun.com>
parents:
33
diff
changeset
|
37 |
|
8b9613402116
refactor catalog and package to be common; improve bump-server
Stephen Hahn <sch@sun.com>
parents:
33
diff
changeset
|
38 |
import pkg.catalog as catalog |
59
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
39 |
import pkg.fmri as fmri |
50 | 40 |
import pkg.manifest as manifest |
175
8d591677690b
22 Specifying a version on the "pkg install" commandline makes no difference
Danek Duvall <danek.duvall@sun.com>
parents:
173
diff
changeset
|
41 |
import pkg.version as version |
104
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
42 |
import pkg.client.imageconfig as imageconfig |
172 | 43 |
import pkg.client.imageplan as imageplan |
161
e0322fe7842c
Simplify and correct the package matching code.
Danek Duvall <danek.duvall@sun.com>
parents:
157
diff
changeset
|
44 |
import pkg.client.retrieve as retrieve |
104
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
45 |
|
145
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
144
diff
changeset
|
46 |
from pkg.misc import versioned_urlopen |
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
144
diff
changeset
|
47 |
|
19 | 48 |
IMG_ENTIRE = 0 |
49 |
IMG_PARTIAL = 1 |
|
50 |
IMG_USER = 2 |
|
51 |
||
26 | 52 |
img_user_prefix = ".org.opensolaris,pkg" |
30 | 53 |
img_root_prefix = "var/pkg" |
26 | 54 |
|
19 | 55 |
class Image(object): |
56 |
"""An Image object is a directory tree containing the laid-down contents |
|
57 |
of a self-consistent graph of Packages. |
|
58 |
||
59 |
An Image has a root path. |
|
60 |
||
61 |
An Image of type IMG_ENTIRE does not have a parent Image. Other Image |
|
62 |
types must have a parent Image. The external state of the parent Image |
|
63 |
must be accessible from the Image's context, or duplicated within the |
|
64 |
Image (IMG_PARTIAL for zones, for instance). |
|
65 |
||
66 |
The parent of a user Image can be a partial Image. The parent of a |
|
67 |
partial Image must be an entire Image. |
|
68 |
||
69 |
An Image of type IMG_USER stores its external state at self.root + |
|
26 | 70 |
".org.opensolaris,pkg". |
19 | 71 |
|
72 |
An Image of type IMG_ENTIRE or IMG_PARTIAL stores its external state at |
|
73 |
self.root + "/var/pkg". |
|
74 |
||
26 | 75 |
An Image needs to be able to have a different repository set than the |
76 |
system's root Image. |
|
77 |
||
29
f621f1df0849
fix install target; correct imports for module renames
"Stephen Hahn <sch@sun.com>"
parents:
26
diff
changeset
|
78 |
Directory layout |
f621f1df0849
fix install target; correct imports for module renames
"Stephen Hahn <sch@sun.com>"
parents:
26
diff
changeset
|
79 |
|
f621f1df0849
fix install target; correct imports for module renames
"Stephen Hahn <sch@sun.com>"
parents:
26
diff
changeset
|
80 |
$IROOT/catalog |
f621f1df0849
fix install target; correct imports for module renames
"Stephen Hahn <sch@sun.com>"
parents:
26
diff
changeset
|
81 |
Directory containing catalogs for URIs of interest. Filename is |
f621f1df0849
fix install target; correct imports for module renames
"Stephen Hahn <sch@sun.com>"
parents:
26
diff
changeset
|
82 |
the escaped URI of the catalog. |
f621f1df0849
fix install target; correct imports for module renames
"Stephen Hahn <sch@sun.com>"
parents:
26
diff
changeset
|
83 |
|
30 | 84 |
$IROOT/file |
85 |
Directory containing file hashes of installed packages. |
|
86 |
||
87 |
$IROOT/pkg |
|
88 |
Directory containing manifests and states of installed packages. |
|
89 |
||
60
6bd5cd83cfb1
Reverse index database and searching support.
Danek Duvall <danek.duvall@sun.com>
parents:
59
diff
changeset
|
90 |
$IROOT/index |
6bd5cd83cfb1
Reverse index database and searching support.
Danek Duvall <danek.duvall@sun.com>
parents:
59
diff
changeset
|
91 |
Directory containing reverse-index databases. |
6bd5cd83cfb1
Reverse index database and searching support.
Danek Duvall <danek.duvall@sun.com>
parents:
59
diff
changeset
|
92 |
|
104
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
93 |
$IROOT/cfg_cache |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
94 |
File containing image's cached configuration. |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
95 |
|
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
96 |
$IROOT/state |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
97 |
File containing image's opaque state. |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
98 |
|
19 | 99 |
XXX Root path probably can't be absolute, so that we can combine or |
30 | 100 |
reuse Image contents. |
26 | 101 |
|
102 |
XXX Image file format? Image file manipulation API?""" |
|
103 |
||
104 |
def __init__(self): |
|
104
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
105 |
self.cfg_cache = None |
26 | 106 |
self.type = None |
107 |
self.root = None |
|
30 | 108 |
self.imgdir = None |
26 | 109 |
self.repo_uris = [] |
110 |
self.filter_tags = {} |
|
111 |
||
173
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
112 |
self.users = {} |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
113 |
self.users_lastupdate = 0 |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
114 |
self.groups = {} |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
115 |
self.groups_lastupdate = 0 |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
116 |
|
32
c26788b7217c
begin client install; sequences are now timestamps; skeleton ELF module
Stephen Hahn <sch@sun.com>
parents:
30
diff
changeset
|
117 |
self.catalogs = {} |
c26788b7217c
begin client install; sequences are now timestamps; skeleton ELF module
Stephen Hahn <sch@sun.com>
parents:
30
diff
changeset
|
118 |
|
50 | 119 |
self.attrs = {} |
120 |
||
121 |
self.attrs["Policy-Require-Optional"] = False |
|
122 |
self.attrs["Policy-Pursue-Latest"] = True |
|
123 |
||
104
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
124 |
def find_root(self, d): |
26 | 125 |
# Ascend from current working directory to find first |
126 |
# encountered image. |
|
127 |
while True: |
|
128 |
if os.path.isdir("%s/%s" % (d, img_user_prefix)): |
|
129 |
# XXX Look at image file to determine filter |
|
130 |
# tags and repo URIs. |
|
131 |
self.type = IMG_USER |
|
132 |
self.root = d |
|
30 | 133 |
self.imgdir = "%s/%s" % (d, img_user_prefix) |
59
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
134 |
self.attrs["Build-Release"] = "5.11" |
26 | 135 |
return |
136 |
elif os.path.isdir("%s/%s" % (d, img_root_prefix)): |
|
137 |
# XXX Look at image file to determine filter |
|
138 |
# tags and repo URIs. |
|
139 |
# XXX Look at image file to determine if this |
|
140 |
# image is a partial image. |
|
141 |
self.type = IMG_ENTIRE |
|
142 |
self.root = d |
|
30 | 143 |
self.imgdir = "%s/%s" % (d, img_root_prefix) |
59
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
144 |
self.attrs["Build-Release"] = "5.11" |
26 | 145 |
return |
146 |
||
147 |
assert d != "/" |
|
148 |
||
63
ba3a4af65479
add -R/$PKG_IMAGE to pkg, and -n and -v to install
Danek Duvall <danek.duvall@sun.com>
parents:
60
diff
changeset
|
149 |
# XXX follow symlinks or not? |
ba3a4af65479
add -R/$PKG_IMAGE to pkg, and -n and -v to install
Danek Duvall <danek.duvall@sun.com>
parents:
60
diff
changeset
|
150 |
d = os.path.normpath(os.path.join(d, os.path.pardir)) |
26 | 151 |
|
104
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
152 |
def load_config(self): |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
153 |
"""Load this image's cached configuration from the default |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
154 |
location.""" |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
155 |
|
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
156 |
# XXX Incomplete with respect to doc/image.txt description of |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
157 |
# configuration. |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
158 |
|
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
159 |
if self.root == None: |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
160 |
raise RuntimeError, "self.root must be set" |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
161 |
|
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
162 |
ic = imageconfig.ImageConfig() |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
163 |
|
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
164 |
if os.path.isfile("%s/cfg_cache" % self.imgdir): |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
165 |
ic.read("%s/cfg_cache" % self.imgdir) |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
166 |
|
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
167 |
self.cfg_cache = ic |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
168 |
|
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
169 |
# XXX mkdirs and set_attrs() need to be combined into a create |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
170 |
# operation. |
29
f621f1df0849
fix install target; correct imports for module renames
"Stephen Hahn <sch@sun.com>"
parents:
26
diff
changeset
|
171 |
def mkdirs(self): |
30 | 172 |
if not os.path.isdir(self.imgdir + "/catalog"): |
173 |
os.makedirs(self.imgdir + "/catalog") |
|
174 |
if not os.path.isdir(self.imgdir + "/file"): |
|
175 |
os.makedirs(self.imgdir + "/file") |
|
176 |
if not os.path.isdir(self.imgdir + "/pkg"): |
|
177 |
os.makedirs(self.imgdir + "/pkg") |
|
60
6bd5cd83cfb1
Reverse index database and searching support.
Danek Duvall <danek.duvall@sun.com>
parents:
59
diff
changeset
|
178 |
if not os.path.isdir(self.imgdir + "/index"): |
6bd5cd83cfb1
Reverse index database and searching support.
Danek Duvall <danek.duvall@sun.com>
parents:
59
diff
changeset
|
179 |
os.makedirs(self.imgdir + "/index") |
29
f621f1df0849
fix install target; correct imports for module renames
"Stephen Hahn <sch@sun.com>"
parents:
26
diff
changeset
|
180 |
|
104
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
181 |
def set_attrs(self, type, root, is_zone, auth_name, auth_url): |
19 | 182 |
self.type = type |
22
379f0f6809ff
pkgsend open, pkgsend add file, pkgsend close; Transaction object
"Stephen Hahn <sch@sun.com>"
parents:
19
diff
changeset
|
183 |
self.root = root |
379f0f6809ff
pkgsend open, pkgsend add file, pkgsend close; Transaction object
"Stephen Hahn <sch@sun.com>"
parents:
19
diff
changeset
|
184 |
if self.type == IMG_USER: |
30 | 185 |
self.imgdir = self.root + "/" + img_user_prefix |
22
379f0f6809ff
pkgsend open, pkgsend add file, pkgsend close; Transaction object
"Stephen Hahn <sch@sun.com>"
parents:
19
diff
changeset
|
186 |
else: |
30 | 187 |
self.imgdir = self.root + "/" + img_root_prefix |
19 | 188 |
|
104
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
189 |
self.mkdirs() |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
190 |
|
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
191 |
self.cfg_cache = imageconfig.ImageConfig() |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
192 |
|
111 | 193 |
if is_zone: |
194 |
self.cfg_cache.filters["opensolaris.zone"] = "nonglobal" |
|
104
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
195 |
|
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
196 |
self.cfg_cache.authorities[auth_name] = {} |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
197 |
self.cfg_cache.authorities[auth_name]["prefix"] = auth_name |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
198 |
self.cfg_cache.authorities[auth_name]["origin"] = auth_url |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
199 |
self.cfg_cache.authorities[auth_name]["mirrors"] = None |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
200 |
|
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
201 |
self.cfg_cache.preferred_authority = auth_name |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
202 |
|
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
203 |
self.cfg_cache.write("%s/cfg_cache" % self.imgdir) |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
204 |
|
29
f621f1df0849
fix install target; correct imports for module renames
"Stephen Hahn <sch@sun.com>"
parents:
26
diff
changeset
|
205 |
def get_root(self): |
f621f1df0849
fix install target; correct imports for module renames
"Stephen Hahn <sch@sun.com>"
parents:
26
diff
changeset
|
206 |
return self.root |
f621f1df0849
fix install target; correct imports for module renames
"Stephen Hahn <sch@sun.com>"
parents:
26
diff
changeset
|
207 |
|
104
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
208 |
def gen_authorities(self): |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
209 |
if not self.cfg_cache: |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
210 |
raise RuntimeError, "empty ImageConfig" |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
211 |
if not self.cfg_cache.authorities: |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
212 |
raise RuntimeError, "no defined authorities" |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
213 |
for a in self.cfg_cache.authorities: |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
214 |
yield self.cfg_cache.authorities[a] |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
215 |
|
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
216 |
def get_url_by_authority(self, authority = None): |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
217 |
"""Return the URL prefix associated with the given authority. |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
218 |
For the undefined case, represented by None, return the |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
219 |
preferred authority.""" |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
220 |
|
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
221 |
# XXX This function is a possible location to insert one or more |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
222 |
# policies regarding use of mirror responses, etc. |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
223 |
|
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
224 |
if authority == None: |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
225 |
authority = self.cfg_cache.preferred_authority |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
226 |
|
106
ed11fcd45545
pkg status -a; allow trailing / in URL; don't write 404 into manifest;
"Stephen Hahn <sch@sun.com>"
parents:
104
diff
changeset
|
227 |
o = self.cfg_cache.authorities[authority]["origin"] |
ed11fcd45545
pkg status -a; allow trailing / in URL; don't write 404 into manifest;
"Stephen Hahn <sch@sun.com>"
parents:
104
diff
changeset
|
228 |
|
146
9b9fcd56b8b2
Reduce use of the re module, for performance.
Danek Duvall <danek.duvall@sun.com>
parents:
145
diff
changeset
|
229 |
return o.rstrip("/") |
104
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
230 |
|
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
231 |
def get_default_authority(self): |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
232 |
return self.cfg_cache.preferred_authority |
19 | 233 |
|
161
e0322fe7842c
Simplify and correct the package matching code.
Danek Duvall <danek.duvall@sun.com>
parents:
157
diff
changeset
|
234 |
def get_matching_fmris(self, patterns, matcher = None, |
e0322fe7842c
Simplify and correct the package matching code.
Danek Duvall <danek.duvall@sun.com>
parents:
157
diff
changeset
|
235 |
constraint = None, counthash = None): |
e0322fe7842c
Simplify and correct the package matching code.
Danek Duvall <danek.duvall@sun.com>
parents:
157
diff
changeset
|
236 |
"""Iterate through all catalogs, looking for packages matching |
e0322fe7842c
Simplify and correct the package matching code.
Danek Duvall <danek.duvall@sun.com>
parents:
157
diff
changeset
|
237 |
'pattern', based on the function in 'matcher' and the versioning |
e0322fe7842c
Simplify and correct the package matching code.
Danek Duvall <danek.duvall@sun.com>
parents:
157
diff
changeset
|
238 |
constraint described by 'constraint'. If 'matcher' is None, |
e0322fe7842c
Simplify and correct the package matching code.
Danek Duvall <danek.duvall@sun.com>
parents:
157
diff
changeset
|
239 |
uses fmri subset matching as the default. Returns a list of |
e0322fe7842c
Simplify and correct the package matching code.
Danek Duvall <danek.duvall@sun.com>
parents:
157
diff
changeset
|
240 |
(catalog, fmri) pairs. If 'counthash' is a dictionary, instead |
e0322fe7842c
Simplify and correct the package matching code.
Danek Duvall <danek.duvall@sun.com>
parents:
157
diff
changeset
|
241 |
store the number of matched fmris for each package name which |
e0322fe7842c
Simplify and correct the package matching code.
Danek Duvall <danek.duvall@sun.com>
parents:
157
diff
changeset
|
242 |
was matched.""" |
e0322fe7842c
Simplify and correct the package matching code.
Danek Duvall <danek.duvall@sun.com>
parents:
157
diff
changeset
|
243 |
|
e0322fe7842c
Simplify and correct the package matching code.
Danek Duvall <danek.duvall@sun.com>
parents:
157
diff
changeset
|
244 |
# XXX Do we want to recognize regex (some) metacharacters and |
e0322fe7842c
Simplify and correct the package matching code.
Danek Duvall <danek.duvall@sun.com>
parents:
157
diff
changeset
|
245 |
# switch automatically to the regex matcher? |
195
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
246 |
|
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
247 |
# XXX If the patterns contain an authority, we could reduce the |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
248 |
# number of catalogs searched by only looking at catalogs whose |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
249 |
# authorities match FMRIs in the pattern. |
34
8b9613402116
refactor catalog and package to be common; improve bump-server
Stephen Hahn <sch@sun.com>
parents:
33
diff
changeset
|
250 |
|
195
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
251 |
# Check preferred authority first, if package isn't found here, |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
252 |
# then check all authorities. |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
253 |
|
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
254 |
cat = self.catalogs[self.cfg_cache.preferred_authority] |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
255 |
|
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
256 |
m = cat.get_matching_fmris(patterns, matcher, |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
257 |
constraint, counthash) |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
258 |
|
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
259 |
for k, c in self.catalogs.items(): |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
260 |
if k == self.cfg_cache.preferred_authority: |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
261 |
continue |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
262 |
m.extend(c.get_matching_fmris(patterns, matcher, |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
263 |
constraint, counthash)) |
69
9eeb33eab728
Gracefully exit when trying to install packages on an image without a catalog.
Danek Duvall <danek.duvall@sun.com>
parents:
67
diff
changeset
|
264 |
|
9eeb33eab728
Gracefully exit when trying to install packages on an image without a catalog.
Danek Duvall <danek.duvall@sun.com>
parents:
67
diff
changeset
|
265 |
if not m: |
161
e0322fe7842c
Simplify and correct the package matching code.
Danek Duvall <danek.duvall@sun.com>
parents:
157
diff
changeset
|
266 |
raise KeyError, "packages matching '%s' not found in catalog" \ |
e0322fe7842c
Simplify and correct the package matching code.
Danek Duvall <danek.duvall@sun.com>
parents:
157
diff
changeset
|
267 |
% patterns |
45
8a3f00dea14f
catalog refresh; basic catalog listing; precise manifest pulls
Stephen Hahn <sch@sun.com>
parents:
39
diff
changeset
|
268 |
|
50 | 269 |
return m |
45
8a3f00dea14f
catalog refresh; basic catalog listing; precise manifest pulls
Stephen Hahn <sch@sun.com>
parents:
39
diff
changeset
|
270 |
|
50 | 271 |
def has_manifest(self, fmri): |
45
8a3f00dea14f
catalog refresh; basic catalog listing; precise manifest pulls
Stephen Hahn <sch@sun.com>
parents:
39
diff
changeset
|
272 |
mpath = fmri.get_dir_path() |
8a3f00dea14f
catalog refresh; basic catalog listing; precise manifest pulls
Stephen Hahn <sch@sun.com>
parents:
39
diff
changeset
|
273 |
|
8a3f00dea14f
catalog refresh; basic catalog listing; precise manifest pulls
Stephen Hahn <sch@sun.com>
parents:
39
diff
changeset
|
274 |
local_mpath = "%s/pkg/%s/manifest" % (self.imgdir, mpath) |
8a3f00dea14f
catalog refresh; basic catalog listing; precise manifest pulls
Stephen Hahn <sch@sun.com>
parents:
39
diff
changeset
|
275 |
|
8a3f00dea14f
catalog refresh; basic catalog listing; precise manifest pulls
Stephen Hahn <sch@sun.com>
parents:
39
diff
changeset
|
276 |
if (os.path.exists(local_mpath)): |
50 | 277 |
return True |
278 |
||
279 |
return False |
|
45
8a3f00dea14f
catalog refresh; basic catalog listing; precise manifest pulls
Stephen Hahn <sch@sun.com>
parents:
39
diff
changeset
|
280 |
|
177
ded132a484ec
43 pkg info should spit out total package size
Danek Duvall <danek.duvall@sun.com>
parents:
175
diff
changeset
|
281 |
def get_manifest(self, fmri, filtered = False): |
50 | 282 |
m = manifest.Manifest() |
72
9deed41412b3
Support for proper package upgrade.
Danek Duvall <danek.duvall@sun.com>
parents:
69
diff
changeset
|
283 |
|
144
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
284 |
fmri_dir_path = os.path.join(self.imgdir, "pkg", |
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
285 |
fmri.get_dir_path()) |
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
286 |
mpath = os.path.join(fmri_dir_path, "manifest") |
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
287 |
|
72
9deed41412b3
Support for proper package upgrade.
Danek Duvall <danek.duvall@sun.com>
parents:
69
diff
changeset
|
288 |
# If the manifest isn't there, download and retry. |
9deed41412b3
Support for proper package upgrade.
Danek Duvall <danek.duvall@sun.com>
parents:
69
diff
changeset
|
289 |
try: |
144
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
290 |
mcontent = file(mpath).read() |
72
9deed41412b3
Support for proper package upgrade.
Danek Duvall <danek.duvall@sun.com>
parents:
69
diff
changeset
|
291 |
except IOError, e: |
9deed41412b3
Support for proper package upgrade.
Danek Duvall <danek.duvall@sun.com>
parents:
69
diff
changeset
|
292 |
if e.errno != errno.ENOENT: |
9deed41412b3
Support for proper package upgrade.
Danek Duvall <danek.duvall@sun.com>
parents:
69
diff
changeset
|
293 |
raise |
9deed41412b3
Support for proper package upgrade.
Danek Duvall <danek.duvall@sun.com>
parents:
69
diff
changeset
|
294 |
retrieve.get_manifest(self, fmri) |
144
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
295 |
mcontent = file(mpath).read() |
72
9deed41412b3
Support for proper package upgrade.
Danek Duvall <danek.duvall@sun.com>
parents:
69
diff
changeset
|
296 |
|
104
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
297 |
m.set_fmri(self, fmri) |
50 | 298 |
m.set_content(mcontent) |
144
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
299 |
|
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
300 |
# Pickle the manifest's indices, for searching |
163
eeacdf67f937
search only installed packages, and don't complain about unwriteable indices
Danek Duvall <danek.duvall@sun.com>
parents:
161
diff
changeset
|
301 |
try: |
eeacdf67f937
search only installed packages, and don't complain about unwriteable indices
Danek Duvall <danek.duvall@sun.com>
parents:
161
diff
changeset
|
302 |
pfile = file(os.path.join(fmri_dir_path, "index"), "wb") |
eeacdf67f937
search only installed packages, and don't complain about unwriteable indices
Danek Duvall <danek.duvall@sun.com>
parents:
161
diff
changeset
|
303 |
m.pickle(pfile) |
eeacdf67f937
search only installed packages, and don't complain about unwriteable indices
Danek Duvall <danek.duvall@sun.com>
parents:
161
diff
changeset
|
304 |
pfile.close() |
eeacdf67f937
search only installed packages, and don't complain about unwriteable indices
Danek Duvall <danek.duvall@sun.com>
parents:
161
diff
changeset
|
305 |
except IOError, e: |
eeacdf67f937
search only installed packages, and don't complain about unwriteable indices
Danek Duvall <danek.duvall@sun.com>
parents:
161
diff
changeset
|
306 |
pass |
144
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
307 |
|
177
ded132a484ec
43 pkg info should spit out total package size
Danek Duvall <danek.duvall@sun.com>
parents:
175
diff
changeset
|
308 |
if filtered: |
ded132a484ec
43 pkg info should spit out total package size
Danek Duvall <danek.duvall@sun.com>
parents:
175
diff
changeset
|
309 |
filters = [] |
ded132a484ec
43 pkg info should spit out total package size
Danek Duvall <danek.duvall@sun.com>
parents:
175
diff
changeset
|
310 |
try: |
ded132a484ec
43 pkg info should spit out total package size
Danek Duvall <danek.duvall@sun.com>
parents:
175
diff
changeset
|
311 |
f = file("%s/filters" % fmri_dir_path, "r") |
ded132a484ec
43 pkg info should spit out total package size
Danek Duvall <danek.duvall@sun.com>
parents:
175
diff
changeset
|
312 |
except IOError, e: |
ded132a484ec
43 pkg info should spit out total package size
Danek Duvall <danek.duvall@sun.com>
parents:
175
diff
changeset
|
313 |
print e |
ded132a484ec
43 pkg info should spit out total package size
Danek Duvall <danek.duvall@sun.com>
parents:
175
diff
changeset
|
314 |
if e.errno != errno.ENOENT: |
ded132a484ec
43 pkg info should spit out total package size
Danek Duvall <danek.duvall@sun.com>
parents:
175
diff
changeset
|
315 |
raise |
ded132a484ec
43 pkg info should spit out total package size
Danek Duvall <danek.duvall@sun.com>
parents:
175
diff
changeset
|
316 |
else: |
ded132a484ec
43 pkg info should spit out total package size
Danek Duvall <danek.duvall@sun.com>
parents:
175
diff
changeset
|
317 |
filters = [ |
ded132a484ec
43 pkg info should spit out total package size
Danek Duvall <danek.duvall@sun.com>
parents:
175
diff
changeset
|
318 |
(l.strip(), compile( |
ded132a484ec
43 pkg info should spit out total package size
Danek Duvall <danek.duvall@sun.com>
parents:
175
diff
changeset
|
319 |
l.strip(), "<filter string>", "eval")) |
ded132a484ec
43 pkg info should spit out total package size
Danek Duvall <danek.duvall@sun.com>
parents:
175
diff
changeset
|
320 |
for l in f.readlines() |
ded132a484ec
43 pkg info should spit out total package size
Danek Duvall <danek.duvall@sun.com>
parents:
175
diff
changeset
|
321 |
] |
ded132a484ec
43 pkg info should spit out total package size
Danek Duvall <danek.duvall@sun.com>
parents:
175
diff
changeset
|
322 |
|
ded132a484ec
43 pkg info should spit out total package size
Danek Duvall <danek.duvall@sun.com>
parents:
175
diff
changeset
|
323 |
m.filter(filters) |
ded132a484ec
43 pkg info should spit out total package size
Danek Duvall <danek.duvall@sun.com>
parents:
175
diff
changeset
|
324 |
|
50 | 325 |
return m |
45
8a3f00dea14f
catalog refresh; basic catalog listing; precise manifest pulls
Stephen Hahn <sch@sun.com>
parents:
39
diff
changeset
|
326 |
|
195
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
327 |
@staticmethod |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
328 |
def installed_file_authority(filepath): |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
329 |
"""Find the pkg's installed file named by filepath. |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
330 |
Return the authority that installed this package.""" |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
331 |
|
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
332 |
f = file(filepath, "r") |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
333 |
auth = f.readline() |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
334 |
f.close() |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
335 |
|
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
336 |
return auth |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
337 |
|
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
338 |
def install_file_present(self, fmri): |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
339 |
"""Returns true if the package named by the fmri is installed |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
340 |
on the system. Otherwise, returns false.""" |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
341 |
|
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
342 |
return os.path.exists("%s/pkg/%s/installed" % (self.imgdir, |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
343 |
fmri.get_dir_path())) |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
344 |
|
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
345 |
def add_install_file(self, fmri): |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
346 |
"""Take an image and fmri. Write a file to disk that |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
347 |
indicates that the package named by the fmri has been |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
348 |
installed.""" |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
349 |
|
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
350 |
f = file("%s/pkg/%s/installed" % (self.imgdir, |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
351 |
fmri.get_dir_path()), "w") |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
352 |
|
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
353 |
f.write(fmri.authority) |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
354 |
f.close() |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
355 |
|
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
356 |
def remove_install_file(self, fmri): |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
357 |
"""Take an image and a fmri. Remove the file from disk |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
358 |
that indicates that the package named by the fmri has been |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
359 |
installed.""" |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
360 |
|
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
361 |
os.unlink("%s/pkg/%s/installed" % (self.imgdir, |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
362 |
fmri.get_dir_path())) |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
363 |
|
59
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
364 |
def get_version_installed(self, pfmri): |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
365 |
pd = pfmri.get_pkg_stem() |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
366 |
pdir = "%s/pkg/%s" % (self.imgdir, |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
367 |
pfmri.get_dir_path(stemonly = True)) |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
368 |
|
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
369 |
try: |
195
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
370 |
pkgs_inst = [ (urllib.unquote("%s@%s" % (pd, vd)), |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
371 |
"%s/%s/installed" % (pdir, vd)) |
59
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
372 |
for vd in os.listdir(pdir) |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
373 |
if os.path.exists("%s/%s/installed" % (pdir, vd)) ] |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
374 |
except OSError: |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
375 |
raise LookupError, "no packages ever installed" |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
376 |
|
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
377 |
if len(pkgs_inst) == 0: |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
378 |
raise LookupError, "no packages installed" |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
379 |
|
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
380 |
assert len(pkgs_inst) <= 1 |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
381 |
|
195
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
382 |
auth = self.installed_file_authority(pkgs_inst[0][1]) |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
383 |
|
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
384 |
return fmri.PkgFmri(pkgs_inst[0][0], authority = auth) |
59
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
385 |
|
172 | 386 |
def gen_installed_pkgs(self): |
387 |
idir = "%s/pkg" % self.imgdir |
|
388 |
||
389 |
for pd in os.listdir(idir): |
|
390 |
for vd in os.listdir("%s/%s" % (idir, pd)): |
|
391 |
if os.path.exists("%s/%s/%s/installed" % |
|
392 |
(idir, pd, vd)): |
|
393 |
yield fmri.PkgFmri(urllib.unquote( |
|
394 |
"%s@%s" % (pd, vd))) |
|
395 |
||
104
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
396 |
def get_pkg_state_by_fmri(self, pfmri): |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
397 |
"""Given pfmri, determine the local state of the package.""" |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
398 |
|
195
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
399 |
if self.install_file_present(pfmri): |
104
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
400 |
return "installed" |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
401 |
|
106
ed11fcd45545
pkg status -a; allow trailing / in URL; don't write 404 into manifest;
"Stephen Hahn <sch@sun.com>"
parents:
104
diff
changeset
|
402 |
return "known" |
104
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
403 |
|
195
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
404 |
def fmri_set_default_authority(self, fmri): |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
405 |
"""If the FMRI supplied as an argument does not have |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
406 |
an authority, set it to the image's preferred authority.""" |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
407 |
|
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
408 |
if fmri.authority: |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
409 |
return |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
410 |
|
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
411 |
adict = self.cfg_cache.authorities |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
412 |
da = adict[self.get_default_authority()] |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
413 |
fmri.set_authority(da["prefix"]) |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
414 |
|
135
a1e20e9a9845
add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents:
116
diff
changeset
|
415 |
def has_version_installed(self, fmri): |
59
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
416 |
"""Check that the version given in the FMRI or a successor is |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
417 |
installed in the current image.""" |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
418 |
|
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
419 |
try: |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
420 |
v = self.get_version_installed(fmri) |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
421 |
except LookupError: |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
422 |
return False |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
423 |
|
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
424 |
if v.is_successor(fmri): |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
425 |
return True |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
426 |
|
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
427 |
return False |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
428 |
|
135
a1e20e9a9845
add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents:
116
diff
changeset
|
429 |
def is_installed(self, fmri): |
a1e20e9a9845
add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents:
116
diff
changeset
|
430 |
"""Check that the exact version given in the FMRI is installed |
a1e20e9a9845
add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents:
116
diff
changeset
|
431 |
in the current image.""" |
a1e20e9a9845
add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents:
116
diff
changeset
|
432 |
|
195
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
433 |
# All FMRIs passed to is_installed shall have an authority |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
434 |
assert fmri.authority |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
435 |
|
135
a1e20e9a9845
add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents:
116
diff
changeset
|
436 |
try: |
a1e20e9a9845
add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents:
116
diff
changeset
|
437 |
v = self.get_version_installed(fmri) |
a1e20e9a9845
add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents:
116
diff
changeset
|
438 |
except LookupError: |
a1e20e9a9845
add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents:
116
diff
changeset
|
439 |
return False |
a1e20e9a9845
add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents:
116
diff
changeset
|
440 |
|
a1e20e9a9845
add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents:
116
diff
changeset
|
441 |
return v == fmri |
a1e20e9a9845
add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents:
116
diff
changeset
|
442 |
|
67
62c897652bbc
Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents:
63
diff
changeset
|
443 |
def get_dependents(self, pfmri): |
104
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
444 |
"""Return a list of the packages directly dependent on the given |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
445 |
FMRI.""" |
67
62c897652bbc
Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents:
63
diff
changeset
|
446 |
|
62c897652bbc
Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents:
63
diff
changeset
|
447 |
thedir = os.path.join(self.imgdir, "index", "depend", |
62c897652bbc
Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents:
63
diff
changeset
|
448 |
urllib.quote(str(pfmri.get_pkg_stem())[5:], "")) |
62c897652bbc
Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents:
63
diff
changeset
|
449 |
|
62c897652bbc
Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents:
63
diff
changeset
|
450 |
if not os.path.isdir(thedir): |
62c897652bbc
Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents:
63
diff
changeset
|
451 |
return [] |
62c897652bbc
Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents:
63
diff
changeset
|
452 |
|
62c897652bbc
Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents:
63
diff
changeset
|
453 |
for v in os.listdir(thedir): |
62c897652bbc
Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents:
63
diff
changeset
|
454 |
f = fmri.PkgFmri(pfmri.get_pkg_stem() + "@" + v, |
62c897652bbc
Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents:
63
diff
changeset
|
455 |
self.attrs["Build-Release"]) |
62c897652bbc
Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents:
63
diff
changeset
|
456 |
if pfmri.is_successor(f): |
62c897652bbc
Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents:
63
diff
changeset
|
457 |
dependents = [ |
62c897652bbc
Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents:
63
diff
changeset
|
458 |
urllib.unquote(d) |
62c897652bbc
Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents:
63
diff
changeset
|
459 |
for d in os.listdir(os.path.join(thedir, v)) |
139
1861fdf62519
on uninstall, don't complain about uninstalled dependents
Danek Duvall <danek.duvall@sun.com>
parents:
135
diff
changeset
|
460 |
if os.path.exists( |
1861fdf62519
on uninstall, don't complain about uninstalled dependents
Danek Duvall <danek.duvall@sun.com>
parents:
135
diff
changeset
|
461 |
os.path.join(thedir, v, d, "installed")) |
67
62c897652bbc
Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents:
63
diff
changeset
|
462 |
] |
62c897652bbc
Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents:
63
diff
changeset
|
463 |
|
62c897652bbc
Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents:
63
diff
changeset
|
464 |
return dependents |
62c897652bbc
Handle dependencies when removing a package.
Danek Duvall <danek.duvall@sun.com>
parents:
63
diff
changeset
|
465 |
|
116
9c9942a52984
(image flag day) remove pkg catalog, improve pkg status, localize pkg(1), use
Stephen Hahn <sch@Sun.COM>
parents:
111
diff
changeset
|
466 |
def retrieve_catalogs(self): |
201
63e78f600aa7
185 traceback on pkg refresh when hostname lookup fails
Danek Duvall <danek.duvall@sun.com>
parents:
195
diff
changeset
|
467 |
failed = [] |
63e78f600aa7
185 traceback on pkg refresh when hostname lookup fails
Danek Duvall <danek.duvall@sun.com>
parents:
195
diff
changeset
|
468 |
total = 0 |
63e78f600aa7
185 traceback on pkg refresh when hostname lookup fails
Danek Duvall <danek.duvall@sun.com>
parents:
195
diff
changeset
|
469 |
succeeded = 0 |
63e78f600aa7
185 traceback on pkg refresh when hostname lookup fails
Danek Duvall <danek.duvall@sun.com>
parents:
195
diff
changeset
|
470 |
|
116
9c9942a52984
(image flag day) remove pkg catalog, improve pkg status, localize pkg(1), use
Stephen Hahn <sch@Sun.COM>
parents:
111
diff
changeset
|
471 |
for auth in self.gen_authorities(): |
201
63e78f600aa7
185 traceback on pkg refresh when hostname lookup fails
Danek Duvall <danek.duvall@sun.com>
parents:
195
diff
changeset
|
472 |
total += 1 |
116
9c9942a52984
(image flag day) remove pkg catalog, improve pkg status, localize pkg(1), use
Stephen Hahn <sch@Sun.COM>
parents:
111
diff
changeset
|
473 |
# XXX Mirror selection and retrieval policy? |
9c9942a52984
(image flag day) remove pkg catalog, improve pkg status, localize pkg(1), use
Stephen Hahn <sch@Sun.COM>
parents:
111
diff
changeset
|
474 |
|
201
63e78f600aa7
185 traceback on pkg refresh when hostname lookup fails
Danek Duvall <danek.duvall@sun.com>
parents:
195
diff
changeset
|
475 |
try: |
63e78f600aa7
185 traceback on pkg refresh when hostname lookup fails
Danek Duvall <danek.duvall@sun.com>
parents:
195
diff
changeset
|
476 |
c, v = versioned_urlopen(auth["origin"], |
63e78f600aa7
185 traceback on pkg refresh when hostname lookup fails
Danek Duvall <danek.duvall@sun.com>
parents:
195
diff
changeset
|
477 |
"catalog", [0]) |
63e78f600aa7
185 traceback on pkg refresh when hostname lookup fails
Danek Duvall <danek.duvall@sun.com>
parents:
195
diff
changeset
|
478 |
except urllib2.URLError, e: |
63e78f600aa7
185 traceback on pkg refresh when hostname lookup fails
Danek Duvall <danek.duvall@sun.com>
parents:
195
diff
changeset
|
479 |
failed.append((auth, e)) |
63e78f600aa7
185 traceback on pkg refresh when hostname lookup fails
Danek Duvall <danek.duvall@sun.com>
parents:
195
diff
changeset
|
480 |
continue |
116
9c9942a52984
(image flag day) remove pkg catalog, improve pkg status, localize pkg(1), use
Stephen Hahn <sch@Sun.COM>
parents:
111
diff
changeset
|
481 |
|
157
504b9e6d213c
Catalog should be on-disk instead of in memory
johansen <johansen@sun.com>
parents:
146
diff
changeset
|
482 |
# root for this catalog |
504b9e6d213c
Catalog should be on-disk instead of in memory
johansen <johansen@sun.com>
parents:
146
diff
changeset
|
483 |
croot = "%s/catalog/%s" % (self.imgdir, auth["prefix"]) |
504b9e6d213c
Catalog should be on-disk instead of in memory
johansen <johansen@sun.com>
parents:
146
diff
changeset
|
484 |
|
201
63e78f600aa7
185 traceback on pkg refresh when hostname lookup fails
Danek Duvall <danek.duvall@sun.com>
parents:
195
diff
changeset
|
485 |
try: |
63e78f600aa7
185 traceback on pkg refresh when hostname lookup fails
Danek Duvall <danek.duvall@sun.com>
parents:
195
diff
changeset
|
486 |
catalog.recv(c, croot) |
63e78f600aa7
185 traceback on pkg refresh when hostname lookup fails
Danek Duvall <danek.duvall@sun.com>
parents:
195
diff
changeset
|
487 |
except IOError, e: |
63e78f600aa7
185 traceback on pkg refresh when hostname lookup fails
Danek Duvall <danek.duvall@sun.com>
parents:
195
diff
changeset
|
488 |
failed.append((auth, e)) |
63e78f600aa7
185 traceback on pkg refresh when hostname lookup fails
Danek Duvall <danek.duvall@sun.com>
parents:
195
diff
changeset
|
489 |
else: |
63e78f600aa7
185 traceback on pkg refresh when hostname lookup fails
Danek Duvall <danek.duvall@sun.com>
parents:
195
diff
changeset
|
490 |
succeeded += 1 |
63e78f600aa7
185 traceback on pkg refresh when hostname lookup fails
Danek Duvall <danek.duvall@sun.com>
parents:
195
diff
changeset
|
491 |
|
63e78f600aa7
185 traceback on pkg refresh when hostname lookup fails
Danek Duvall <danek.duvall@sun.com>
parents:
195
diff
changeset
|
492 |
if failed: |
63e78f600aa7
185 traceback on pkg refresh when hostname lookup fails
Danek Duvall <danek.duvall@sun.com>
parents:
195
diff
changeset
|
493 |
raise RuntimeError, (failed, total, succeeded) |
116
9c9942a52984
(image flag day) remove pkg catalog, improve pkg status, localize pkg(1), use
Stephen Hahn <sch@Sun.COM>
parents:
111
diff
changeset
|
494 |
|
157
504b9e6d213c
Catalog should be on-disk instead of in memory
johansen <johansen@sun.com>
parents:
146
diff
changeset
|
495 |
def load_catalogs(self): |
504b9e6d213c
Catalog should be on-disk instead of in memory
johansen <johansen@sun.com>
parents:
146
diff
changeset
|
496 |
for auth in self.gen_authorities(): |
504b9e6d213c
Catalog should be on-disk instead of in memory
johansen <johansen@sun.com>
parents:
146
diff
changeset
|
497 |
croot = "%s/catalog/%s" % (self.imgdir, auth["prefix"]) |
116
9c9942a52984
(image flag day) remove pkg catalog, improve pkg status, localize pkg(1), use
Stephen Hahn <sch@Sun.COM>
parents:
111
diff
changeset
|
498 |
|
195
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
499 |
c = catalog.Catalog(croot, authority = auth["prefix"]) |
116
9c9942a52984
(image flag day) remove pkg catalog, improve pkg status, localize pkg(1), use
Stephen Hahn <sch@Sun.COM>
parents:
111
diff
changeset
|
500 |
self.catalogs[auth["prefix"]] = c |
59
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
501 |
|
157
504b9e6d213c
Catalog should be on-disk instead of in memory
johansen <johansen@sun.com>
parents:
146
diff
changeset
|
502 |
def gen_known_package_fmris(self): |
59
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
503 |
for c in self.catalogs.values(): |
157
504b9e6d213c
Catalog should be on-disk instead of in memory
johansen <johansen@sun.com>
parents:
146
diff
changeset
|
504 |
for pf in c.fmris(): |
106
ed11fcd45545
pkg status -a; allow trailing / in URL; don't write 404 into manifest;
"Stephen Hahn <sch@sun.com>"
parents:
104
diff
changeset
|
505 |
yield pf |
59
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
506 |
|
195
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
507 |
def list_installed_pkgs(self): |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
508 |
proot = "%s/pkg" % self.imgdir |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
509 |
ret = [] |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
510 |
|
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
511 |
for pd in sorted(os.listdir(proot)): |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
512 |
for vd in sorted(os.listdir("%s/%s" % (proot, pd))): |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
513 |
path = "%s/%s/%s/installed" % (proot, pd, vd) |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
514 |
if not os.path.exists(path): |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
515 |
continue |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
516 |
fp = file(path, "r") |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
517 |
auth = fp.readline() |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
518 |
fp.close() |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
519 |
fmristr = urllib.unquote("%s@%s" % (pd, vd)) |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
520 |
ret.append(fmri.PkgFmri(fmristr, |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
521 |
authority = auth)) |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
522 |
|
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
523 |
return ret |
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
524 |
|
173
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
525 |
def getpwnam(self, name): |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
526 |
"""Do a name lookup in the image's password database. |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
527 |
|
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
528 |
Keep a cached copy in memory for fast lookups, and fall back to |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
529 |
the current environment if the password database isn't |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
530 |
available. |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
531 |
""" |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
532 |
|
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
533 |
# XXX What to do about IMG_PARTIAL? |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
534 |
if self.type == IMG_USER: |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
535 |
return pwd.getpwnam(name) |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
536 |
|
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
537 |
# See if we've cached the name, first. |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
538 |
try: |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
539 |
return self.users[name] |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
540 |
except KeyError: |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
541 |
pass |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
542 |
|
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
543 |
# If not cached, try parsing the image's passwd file for the |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
544 |
# name. |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
545 |
passwd_file = os.path.join(self.root, "etc/passwd") |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
546 |
|
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
547 |
try: |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
548 |
passwd_stamp = os.stat(passwd_file).st_mtime |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
549 |
except OSError, e: |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
550 |
if e.errno != errno.ENOENT: |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
551 |
raise |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
552 |
# If the password file doesn't exist, bootstrap |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
553 |
# ourselves from the current environment. |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
554 |
return pwd.getpwnam(name) |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
555 |
|
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
556 |
# If the timestamp on the file isn't newer than the last time we |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
557 |
# checked, all its entries will already be in our cache, so we |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
558 |
# won't find the name. |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
559 |
if passwd_stamp <= self.users_lastupdate: |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
560 |
raise KeyError, "getpwnam(): name not found: %s" % name |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
561 |
|
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
562 |
f = file(passwd_file) |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
563 |
|
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
564 |
found = False |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
565 |
for line in f: |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
566 |
arr = line.rstrip().split(":") |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
567 |
arr[2] = int(arr[2]) |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
568 |
arr[3] = int(arr[3]) |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
569 |
pw_entry = pwd.struct_passwd(arr) |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
570 |
if pw_entry.pw_name == name: |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
571 |
found = True |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
572 |
|
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
573 |
self.users[pw_entry.pw_name] = pw_entry |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
574 |
|
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
575 |
self.users_lastupdate = passwd_stamp |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
576 |
|
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
577 |
f.close() |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
578 |
|
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
579 |
if not found: |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
580 |
raise KeyError, "getpwnam(): name not found: %s" % name |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
581 |
|
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
582 |
return self.users[name] |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
583 |
|
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
584 |
def getgrnam(self, name): |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
585 |
"""Do a name lookup in the image's group database. |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
586 |
|
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
587 |
Keep a cached copy in memory for fast lookups, and fall back to |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
588 |
the current environment if the group database isn't available. |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
589 |
""" |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
590 |
|
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
591 |
# XXX What to do about IMG_PARTIAL? |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
592 |
if self.type == IMG_USER: |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
593 |
return grp.getgrnam(name) |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
594 |
|
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
595 |
# See if we've cached the name, first. |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
596 |
try: |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
597 |
return self.groups[name] |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
598 |
except KeyError: |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
599 |
pass |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
600 |
|
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
601 |
# If not cached, try parsing the image's group file for the |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
602 |
# name. |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
603 |
group_file = os.path.join(self.root, "etc/group") |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
604 |
|
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
605 |
try: |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
606 |
group_stamp = os.stat(group_file).st_mtime |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
607 |
except OSError, e: |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
608 |
if e.errno != errno.ENOENT: |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
609 |
raise |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
610 |
# If the group file doesn't exist, bootstrap ourselves |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
611 |
# from the current environment. |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
612 |
return grp.getgrnam(name) |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
613 |
|
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
614 |
# If the timestamp on the file isn't newer than the last time we |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
615 |
# checked, all its entries will already be in our cache, so we |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
616 |
# won't find the name. |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
617 |
if group_stamp <= self.groups_lastupdate: |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
618 |
raise KeyError, "getgrnam(): name not found: %s" % name |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
619 |
|
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
620 |
f = file(group_file) |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
621 |
|
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
622 |
found = False |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
623 |
for line in f: |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
624 |
arr = line.rstrip().split(":") |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
625 |
arr[2] = int(arr[2]) |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
626 |
gr_entry = grp.struct_group(arr) |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
627 |
if gr_entry.gr_name == name: |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
628 |
found = True |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
629 |
|
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
630 |
self.groups[gr_entry.gr_name] = gr_entry |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
631 |
|
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
632 |
self.group_lastupdate = group_stamp |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
633 |
|
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
634 |
f.close() |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
635 |
|
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
636 |
if not found: |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
637 |
raise KeyError, "getgrnam(): name not found: %s" % name |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
638 |
|
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
639 |
return self.groups[name] |
da329417a206
18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents:
172
diff
changeset
|
640 |
|
59
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
641 |
def display_inventory(self, args): |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
642 |
"""XXX Reimplement if we carve out the inventory as a has-a |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
643 |
object from image.""" |
45
8a3f00dea14f
catalog refresh; basic catalog listing; precise manifest pulls
Stephen Hahn <sch@sun.com>
parents:
39
diff
changeset
|
644 |
|
104
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
645 |
all_known = False |
59
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
646 |
verbose = False |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
647 |
upgradable_only = False |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
648 |
|
192
0c6f1066777b
58 getopt handling needs cleanup
Dan Price <dp@eng.sun.com>
parents:
190
diff
changeset
|
649 |
opts, pargs = getopt.getopt(args, "auv") |
59
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
650 |
|
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
651 |
for opt, arg in opts: |
104
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
652 |
if opt == "-a": |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
653 |
all_known = True |
59
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
654 |
if opt == "-u": |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
655 |
upgradable_only = True |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
656 |
if opt == "-v": |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
657 |
verbose = True |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
658 |
|
104
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
659 |
if verbose: |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
660 |
fmt_str = "%-64s %-10s %c%c%c%c" |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
661 |
else: |
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
662 |
fmt_str = "%-50s %-10s %c%c%c%c" |
59
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
663 |
|
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
664 |
proot = "%s/pkg" % self.imgdir |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
665 |
|
116
9c9942a52984
(image flag day) remove pkg catalog, improve pkg status, localize pkg(1), use
Stephen Hahn <sch@Sun.COM>
parents:
111
diff
changeset
|
666 |
if len(pargs): |
195
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
667 |
pkgs_known = [ m |
116
9c9942a52984
(image flag day) remove pkg catalog, improve pkg status, localize pkg(1), use
Stephen Hahn <sch@Sun.COM>
parents:
111
diff
changeset
|
668 |
for p in pargs |
161
e0322fe7842c
Simplify and correct the package matching code.
Danek Duvall <danek.duvall@sun.com>
parents:
157
diff
changeset
|
669 |
for m in self.get_matching_fmris(p) ] |
104
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
670 |
|
116
9c9942a52984
(image flag day) remove pkg catalog, improve pkg status, localize pkg(1), use
Stephen Hahn <sch@Sun.COM>
parents:
111
diff
changeset
|
671 |
elif all_known: |
9c9942a52984
(image flag day) remove pkg catalog, improve pkg status, localize pkg(1), use
Stephen Hahn <sch@Sun.COM>
parents:
111
diff
changeset
|
672 |
pkgs_known = [ pf for pf in |
157
504b9e6d213c
Catalog should be on-disk instead of in memory
johansen <johansen@sun.com>
parents:
146
diff
changeset
|
673 |
sorted(self.gen_known_package_fmris()) ] |
50 | 674 |
|
104
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
675 |
else: |
195
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
676 |
pkgs_known = self.list_installed_pkgs() |
104
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
677 |
|
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
678 |
if len(pkgs_known) == 0: |
116
9c9942a52984
(image flag day) remove pkg catalog, improve pkg status, localize pkg(1), use
Stephen Hahn <sch@Sun.COM>
parents:
111
diff
changeset
|
679 |
if len(pargs): |
9c9942a52984
(image flag day) remove pkg catalog, improve pkg status, localize pkg(1), use
Stephen Hahn <sch@Sun.COM>
parents:
111
diff
changeset
|
680 |
print "pkg: no matching packages installed" |
9c9942a52984
(image flag day) remove pkg catalog, improve pkg status, localize pkg(1), use
Stephen Hahn <sch@Sun.COM>
parents:
111
diff
changeset
|
681 |
else: |
9c9942a52984
(image flag day) remove pkg catalog, improve pkg status, localize pkg(1), use
Stephen Hahn <sch@Sun.COM>
parents:
111
diff
changeset
|
682 |
print "pkg: no packages installed" |
59
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
683 |
return |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
684 |
|
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
685 |
print fmt_str % ("FMRI", "STATE", "U", "F", "I", "X") |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
686 |
|
161
e0322fe7842c
Simplify and correct the package matching code.
Danek Duvall <danek.duvall@sun.com>
parents:
157
diff
changeset
|
687 |
counthash = {} |
e0322fe7842c
Simplify and correct the package matching code.
Danek Duvall <danek.duvall@sun.com>
parents:
157
diff
changeset
|
688 |
self.get_matching_fmris(pkgs_known, counthash = counthash) |
e0322fe7842c
Simplify and correct the package matching code.
Danek Duvall <danek.duvall@sun.com>
parents:
157
diff
changeset
|
689 |
|
104
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
690 |
for p in pkgs_known: |
59
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
691 |
upgradable = "-" |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
692 |
frozen = "-" |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
693 |
incorporated = "-" |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
694 |
excludes = "-" |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
695 |
|
161
e0322fe7842c
Simplify and correct the package matching code.
Danek Duvall <danek.duvall@sun.com>
parents:
157
diff
changeset
|
696 |
if counthash[p] > 1: |
59
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
697 |
upgradable = "u" |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
698 |
elif upgradable_only: |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
699 |
continue |
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
700 |
|
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
701 |
if not verbose: |
116
9c9942a52984
(image flag day) remove pkg catalog, improve pkg status, localize pkg(1), use
Stephen Hahn <sch@Sun.COM>
parents:
111
diff
changeset
|
702 |
pf = p.get_short_fmri() |
59
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
703 |
else: |
116
9c9942a52984
(image flag day) remove pkg catalog, improve pkg status, localize pkg(1), use
Stephen Hahn <sch@Sun.COM>
parents:
111
diff
changeset
|
704 |
pf = p.get_fmri(self.get_default_authority()) |
59
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
705 |
|
116
9c9942a52984
(image flag day) remove pkg catalog, improve pkg status, localize pkg(1), use
Stephen Hahn <sch@Sun.COM>
parents:
111
diff
changeset
|
706 |
print fmt_str % (pf, self.get_pkg_state_by_fmri(p), |
104
ecfc64baf22e
add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents:
87
diff
changeset
|
707 |
upgradable, frozen, incorporated, excludes) |
59
eef94b0c0694
require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents:
51
diff
changeset
|
708 |
|
144
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
709 |
def search(self, args): |
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
710 |
"""Search the image for the token in args[0].""" |
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
711 |
|
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
712 |
idxdir = os.path.join(self.imgdir, "pkg") |
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
713 |
|
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
714 |
# Convert a full directory path to the FMRI it represents. |
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
715 |
def idx_to_fmri(index): |
190
ca8aa1e0e90d
53 pkg search separates package name from version with "/", not "@"
Danek Duvall <danek.duvall@sun.com>
parents:
183
diff
changeset
|
716 |
return fmri.PkgFmri(urllib.unquote(os.path.dirname( |
ca8aa1e0e90d
53 pkg search separates package name from version with "/", not "@"
Danek Duvall <danek.duvall@sun.com>
parents:
183
diff
changeset
|
717 |
index[len(idxdir) + 1:]).replace("/", "@")), None) |
144
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
718 |
|
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
719 |
indices = ( |
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
720 |
(os.path.join(dir, "index"), os.path.join(dir, "manifest")) |
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
721 |
for dir, dirnames, filenames in os.walk(idxdir) |
163
eeacdf67f937
search only installed packages, and don't complain about unwriteable indices
Danek Duvall <danek.duvall@sun.com>
parents:
161
diff
changeset
|
722 |
if "manifest" in filenames and "installed" in filenames |
144
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
723 |
) |
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
724 |
|
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
725 |
for index, mfst in indices: |
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
726 |
# Try loading the index; if that fails, try parsing the |
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
727 |
# manifest. |
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
728 |
try: |
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
729 |
d = cPickle.load(file(index)) |
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
730 |
except: |
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
731 |
m = manifest.Manifest() |
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
732 |
try: |
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
733 |
mcontent = file(mfst).read() |
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
734 |
except: |
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
735 |
# XXX log something? |
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
736 |
continue |
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
737 |
m.set_content(mcontent) |
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
738 |
try: |
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
739 |
m.pickle(file(index, "wb")) |
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
740 |
except: |
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
741 |
pass |
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
742 |
d = m.search_dict() |
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
743 |
|
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
744 |
for k, v in d.items(): |
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
745 |
if args[0] in v: |
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
746 |
yield k, idx_to_fmri(index) |
ce619e0b453f
Fix unscalable search indexing
Danek Duvall <danek.duvall@sun.com>
parents:
139
diff
changeset
|
747 |
|
172 | 748 |
def list_install(self, pkg_list, filters = [], verbose = False, |
749 |
noexecute = False): |
|
750 |
error = 0 |
|
751 |
ip = imageplan.ImagePlan(self, filters = filters) |
|
752 |
||
753 |
for p in pkg_list: |
|
754 |
try: |
|
175
8d591677690b
22 Specifying a version on the "pkg install" commandline makes no difference
Danek Duvall <danek.duvall@sun.com>
parents:
173
diff
changeset
|
755 |
matches = self.get_matching_fmris(p, |
8d591677690b
22 Specifying a version on the "pkg install" commandline makes no difference
Danek Duvall <danek.duvall@sun.com>
parents:
173
diff
changeset
|
756 |
constraint = version.CONSTRAINT_AUTO) |
172 | 757 |
except KeyError: |
758 |
# XXX Module directly printing. |
|
759 |
print _("""\ |
|
760 |
pkg: no package matching '%s' could be found in current catalog |
|
175
8d591677690b
22 Specifying a version on the "pkg install" commandline makes no difference
Danek Duvall <danek.duvall@sun.com>
parents:
173
diff
changeset
|
761 |
suggest relaxing pattern, refreshing and/or examining catalogs""") % p |
172 | 762 |
error = 1 |
763 |
continue |
|
764 |
||
765 |
pnames = {} |
|
766 |
for m in matches: |
|
195
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
767 |
pnames[m.get_pkg_stem()] = 1 |
172 | 768 |
|
769 |
if len(pnames.keys()) > 1: |
|
770 |
# XXX Module directly printing. |
|
771 |
print \ |
|
175
8d591677690b
22 Specifying a version on the "pkg install" commandline makes no difference
Danek Duvall <danek.duvall@sun.com>
parents:
173
diff
changeset
|
772 |
_("pkg: '%s' matches multiple packages") % p |
172 | 773 |
for k in pnames.keys(): |
774 |
print "\t%s" % k |
|
775 |
error = 1 |
|
776 |
continue |
|
777 |
||
778 |
# matches is a list reverse sorted by version, so take |
|
779 |
# the first; i.e., the latest. |
|
195
b23d0425f0f7
11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents:
192
diff
changeset
|
780 |
ip.propose_fmri(matches[0]) |
172 | 781 |
|
782 |
if error != 0: |
|
783 |
raise RuntimeError, "Unable to assemble image plan" |
|
784 |
||
785 |
if verbose: |
|
786 |
print _("Before evaluation:") |
|
787 |
print ip |
|
788 |
||
789 |
ip.evaluate() |
|
790 |
||
791 |
if verbose: |
|
792 |
print _("After evaluation:") |
|
793 |
print ip |
|
794 |
||
795 |
if not noexecute: |
|
796 |
ip.execute() |
|
45
8a3f00dea14f
catalog refresh; basic catalog listing; precise manifest pulls
Stephen Hahn <sch@sun.com>
parents:
39
diff
changeset
|
797 |
|
50 | 798 |
if __name__ == "__main__": |
799 |
# XXX Need to construct a trivial image and catalog. |
|
800 |
pass |