author | Richard Lowe <richlowe@richlowe.net> |
Tue, 17 Nov 2009 20:44:03 -0500 | |
changeset 1507 | b956ea23d3a6 |
parent 1431 | 62b6033670e4 |
child 1516 | 8c950a3b4171 |
permissions | -rwxr-xr-x |
409
713e20963dc2
2314 shebang lines should use minimum python version
Shawn Walker <swalker@opensolaris.org>
parents:
375
diff
changeset
|
1 |
#!/usr/bin/python2.4 |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
2 |
# |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
3 |
# CDDL HEADER START |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
4 |
# |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
5 |
# The contents of this file are subject to the terms of the |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
6 |
# Common Development and Distribution License (the "License"). |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
7 |
# You may not use this file except in compliance with the License. |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
8 |
# |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
9 |
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
10 |
# or http://www.opensolaris.org/os/licensing. |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
11 |
# See the License for the specific language governing permissions |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
12 |
# and limitations under the License. |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
13 |
# |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
14 |
# When distributing Covered Code, include this CDDL HEADER in each |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
15 |
# file and include the License file at usr/src/OPENSOLARIS.LICENSE. |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
16 |
# If applicable, add the following below this CDDL HEADER, with the |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
17 |
# fields enclosed by brackets "[]" replaced with your own identifying |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
18 |
# information: Portions Copyright [yyyy] [name of copyright owner] |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
19 |
# |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
20 |
# CDDL HEADER END |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
21 |
# |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
22 |
|
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
23 |
# |
971
67d3507036ab
2422 error/usage message program identification is inconsistent in pkgrecv
Tom Mueller <Tom.Mueller@sun.com>
parents:
856
diff
changeset
|
24 |
# Copyright 2009 Sun Microsystems, Inc. All rights reserved. |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
25 |
# Use is subject to license terms. |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
26 |
# |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
27 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
28 |
import calendar |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
29 |
import getopt |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
30 |
import gettext |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
31 |
import os |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
32 |
import shutil |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
33 |
import sys |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
34 |
import tempfile |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
35 |
import traceback |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
36 |
import urllib |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
37 |
import urlparse |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
38 |
|
1431
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
39 |
import pkg.catalog as catalog |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
40 |
import pkg.client.progress as progress |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
41 |
import pkg.fmri |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
42 |
import pkg.manifest as manifest |
1431
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
43 |
import pkg.client.api_errors as api_errors |
1507
b956ea23d3a6
11735 pkg history data files should not be executable
Richard Lowe <richlowe@richlowe.net>
parents:
1431
diff
changeset
|
44 |
import pkg.misc as misc |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
45 |
import pkg.pkgtarfile as ptf |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
46 |
import pkg.portable as portable |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
47 |
import pkg.publish.transaction as trans |
1431
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
48 |
import pkg.search_errors as search_errors |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
49 |
import pkg.server.catalog as sc |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
50 |
import pkg.server.repository as sr |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
51 |
import pkg.server.repositoryconfig as rc |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
52 |
import pkg.version as version |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
53 |
|
696
6bbfd2dece6f
4371 user-agent string needs to be different for different client front-ends
Danek Duvall <danek.duvall@sun.com>
parents:
440
diff
changeset
|
54 |
from pkg.client import global_settings |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
55 |
from pkg.misc import (emsg, get_pkg_otw_size, gunzip_from_stream, msg, |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
56 |
versioned_urlopen, PipeError) |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
57 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
58 |
# Globals |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
59 |
complete_catalog = None |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
60 |
repo_cache = {} |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
61 |
tmpdirs = [] |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
62 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
63 |
def error(text): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
64 |
"""Emit an error message prefixed by the command name """ |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
65 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
66 |
# If we get passed something like an Exception, we can convert |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
67 |
# it down to a string. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
68 |
text = str(text) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
69 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
70 |
# If the message starts with whitespace, assume that it should come |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
71 |
# *before* the command-name prefix. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
72 |
text_nows = text.lstrip() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
73 |
ws = text[:len(text) - len(text_nows)] |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
74 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
75 |
# This has to be a constant value as we can't reliably get our actual |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
76 |
# program name on all platforms. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
77 |
emsg(ws + "pkgrecv: " + text_nows) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
78 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
79 |
def usage(usage_error=None, retcode=2): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
80 |
"""Emit a usage message and optionally prefix it with a more specific |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
81 |
error message. Causes program to exit.""" |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
82 |
|
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
83 |
if usage_error: |
971
67d3507036ab
2422 error/usage message program identification is inconsistent in pkgrecv
Tom Mueller <Tom.Mueller@sun.com>
parents:
856
diff
changeset
|
84 |
error(usage_error) |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
85 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
86 |
msg(_("""\ |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
87 |
Usage: |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
88 |
pkgrecv [-s src_repo_uri] [-d (path|dest_uri)] [-k] [-m] [-n] [-r] |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
89 |
(fmri|pattern) ... |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
90 |
pkgrecv [-s src_repo_uri] -n |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
91 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
92 |
Options: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
93 |
-d path_or_uri The path of a directory to save the retrieved package |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
94 |
to, or the URI of a repository to republish it to. If |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
95 |
not provided, the default value is the current working |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
96 |
directory. If a directory path is provided, then |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
97 |
package content will only be retrieved if it does not |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
98 |
already exist in the target directory. If a repository |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
99 |
URI is provided, a temporary directory will be created |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
100 |
and all of the package data retrieved before attempting |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
101 |
to republish it. |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
102 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
103 |
-h Display this usage message. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
104 |
-k Keep the retrieved package content compressed, ignored |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
105 |
when republishing. Should not be used with pkgsend. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
106 |
-m match Controls matching behaviour using the following values: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
107 |
all-timestamps |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
108 |
includes all matching timestamps, not just |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
109 |
latest (implies all-versions) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
110 |
all-versions |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
111 |
includes all matching versions, not just latest |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
112 |
-n List the most recent versions of the packages available |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
113 |
from the specified repository and exit (all other |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
114 |
options except -s will be ignored). |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
115 |
-r Recursively evaluates all dependencies for the provided |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
116 |
list of packages and adds them to the list. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
117 |
-s src_repo_uri A URI representing the location of a pkg(5) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
118 |
repository to retrieve package data from. |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
119 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
120 |
Environment: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
121 |
PKG_DEST Destination directory or repository URI |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
122 |
PKG_SRC Source repository URI""")) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
123 |
sys.exit(retcode) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
124 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
125 |
def cleanup(): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
126 |
"""To be called at program finish.""" |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
127 |
for d in tmpdirs: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
128 |
shutil.rmtree(d, True) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
129 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
130 |
def abort(err=None, retcode=1): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
131 |
"""To be called when a fatal error is encountered.""" |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
132 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
133 |
if err: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
134 |
# Clear any possible output first. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
135 |
msg("") |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
136 |
error(err) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
137 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
138 |
cleanup() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
139 |
sys.exit(retcode) |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
140 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
141 |
def get_tracker(quiet=False): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
142 |
if quiet: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
143 |
progresstracker = progress.QuietProgressTracker() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
144 |
else: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
145 |
try: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
146 |
progresstracker = \ |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
147 |
progress.FancyUNIXProgressTracker() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
148 |
except progress.ProgressTrackerException: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
149 |
progresstracker = progress.CommandLineProgressTracker() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
150 |
return progresstracker |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
151 |
|
1132
1abf9cf8f69c
9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents:
1118
diff
changeset
|
152 |
def get_manifest(src_uri, pfmri, basedir, contents=False): |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
153 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
154 |
m = None |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
155 |
pkgdir = os.path.join(basedir, pfmri.get_dir_path()) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
156 |
mpath = os.path.join(pkgdir, "manifest") |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
157 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
158 |
raw = None |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
159 |
overwrite = False |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
160 |
if not os.path.exists(mpath): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
161 |
raw = fetch_manifest(src_uri, pfmri) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
162 |
overwrite = True |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
163 |
else: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
164 |
try: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
165 |
raw = file(mpath, "rb").read() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
166 |
except: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
167 |
abort(err=_("Unable to load manifest '%s' for package " |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
168 |
" '%s'.") % (mpath, pfmri)) |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
169 |
|
1132
1abf9cf8f69c
9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents:
1118
diff
changeset
|
170 |
if contents: |
1abf9cf8f69c
9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents:
1118
diff
changeset
|
171 |
return raw |
1abf9cf8f69c
9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents:
1118
diff
changeset
|
172 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
173 |
try: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
174 |
m = manifest.CachedManifest(pfmri, basedir, None, |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
175 |
contents=raw) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
176 |
except: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
177 |
abort(err=_("Unable to parse manifest '%s' for package " |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
178 |
"'%s'") % (mpath, pfmri)) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
179 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
180 |
if overwrite: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
181 |
# Overwrite the manifest file so that the on-disk version will |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
182 |
# be consistent with the server (due to fmri addition). |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
183 |
try: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
184 |
f = open(mpath, "wb") |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
185 |
f.write(raw) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
186 |
f.close() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
187 |
except: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
188 |
abort(err=_("Unable to write manifest '%s' for package " |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
189 |
" '%s'.") % (mpath, pfmri)) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
190 |
return m |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
191 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
192 |
def get_repo(uri): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
193 |
if uri in repo_cache: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
194 |
return repo_cache[uri] |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
195 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
196 |
parts = urlparse.urlparse(uri, "file", allow_fragments=0) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
197 |
path = urllib.url2pathname(parts[2]) |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
198 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
199 |
try: |
1431
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
200 |
repo = sr.Repository(read_only=True, repo_root=path) |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
201 |
except EnvironmentError, _e: |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
202 |
error("an error occurred while trying to " \ |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
203 |
"initialize the repository directory " \ |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
204 |
"structures:\n%s" % _e) |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
205 |
sys.exit(1) |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
206 |
except sr.RepositoryError, _e: |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
207 |
error(_e) |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
208 |
sys.exit(1) |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
209 |
except rc.PropertyError, _e: |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
210 |
error("repository configuration error: %s" % _e) |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
211 |
sys.exit(1) |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
212 |
except (search_errors.IndexingException, |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
213 |
api_errors.PermissionsException), _e: |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
214 |
emsg(str(_e), "INDEX") |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
215 |
sys.exit(1) |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
216 |
repo_cache[uri] = repo |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
217 |
return repo |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
218 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
219 |
def fetch_manifest(src_uri, pfmri): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
220 |
"""Return the manifest data for package-fmri 'fmri' from the repository |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
221 |
at 'src_uri'.""" |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
222 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
223 |
if src_uri.startswith("file://"): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
224 |
try: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
225 |
r = get_repo(src_uri) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
226 |
m = file(r.manifest(pfmri), "rb") |
1431
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
227 |
except (EnvironmentError, sr.RepositoryError), e: |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
228 |
abort(err=e) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
229 |
else: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
230 |
# Request manifest from repository. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
231 |
try: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
232 |
m = versioned_urlopen(src_uri, "manifest", [0], |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
233 |
pfmri.get_url_path())[0] |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
234 |
except Exception, e: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
235 |
abort(err=_("Unable to retrieve manifest %s from " |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
236 |
"%s: %s") % (pfmri.get_url_path(), src_uri, e)) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
237 |
except: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
238 |
abort() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
239 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
240 |
# Read from repository, return to caller. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
241 |
try: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
242 |
mfst_str = m.read() |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
243 |
except: |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
244 |
abort(err=_("Error occurred while reading from: %s") % src_uri) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
245 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
246 |
if hasattr(m, "close"): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
247 |
m.close() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
248 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
249 |
return mfst_str |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
250 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
251 |
def expand_fmri(pfmri, constraint=version.CONSTRAINT_AUTO): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
252 |
"""Find matching fmri using CONSTRAINT_AUTO cache for performance. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
253 |
Returns None if no matching fmri is found.""" |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
254 |
if isinstance(pfmri, str): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
255 |
pfmri = pkg.fmri.PkgFmri(pfmri, "5.11") |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
256 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
257 |
for f in complete_catalog.get(pfmri.pkg_name, []): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
258 |
if not pfmri.version or \ |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
259 |
f.version.is_successor(pfmri.version, constraint): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
260 |
return f |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
261 |
return |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
262 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
263 |
def expand_matching_fmris(fmri_list, pfmri_strings): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
264 |
"""find matching fmris using pattern matching and |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
265 |
constraint auto.""" |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
266 |
counthash = {} |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
267 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
268 |
try: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
269 |
patterns = [ |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
270 |
pkg.fmri.MatchingPkgFmri(s, "5.11") |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
271 |
for s in pfmri_strings |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
272 |
] |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
273 |
except pkg.fmri.FmriError, e: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
274 |
abort(err=e) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
275 |
|
1431
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
276 |
# XXX publisher prefixes have to be stripped for catalog matching |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
277 |
# for now; awaits v1 client support, etc. |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
278 |
pattern_pubs = {} |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
279 |
for f in patterns: |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
280 |
if f.publisher: |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
281 |
pattern_pubs[f.get_fmri(anarchy=True)] = f.publisher |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
282 |
f.publisher = None |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
283 |
|
1431
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
284 |
matches, unmatched = catalog.extract_matching_fmris(fmri_list, |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
285 |
patterns=patterns, constraint=version.CONSTRAINT_AUTO, |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
286 |
matcher=pkg.fmri.glob_match) |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
287 |
|
1431
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
288 |
if unmatched: |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
289 |
match_err = api_errors.InventoryException(**unmatched) |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
290 |
emsg(match_err) |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
291 |
abort() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
292 |
|
1431
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
293 |
# XXX restore stripped publisher information. |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
294 |
for m in matches: |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
295 |
pub = pattern_pubs.pop(str(m), None) |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
296 |
if pub: |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
297 |
m.publisher = pub |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
298 |
return matches |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
299 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
300 |
def get_dependencies(src_uri, fmri_list, basedir, tracker): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
301 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
302 |
old_limit = sys.getrecursionlimit() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
303 |
# The user may be recursing 'entire' or 'redistributable'. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
304 |
sys.setrecursionlimit(3000) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
305 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
306 |
s = set() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
307 |
for f in fmri_list: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
308 |
pfmri = expand_fmri(f) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
309 |
_get_dependencies(src_uri, s, pfmri, basedir, tracker) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
310 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
311 |
# Restore the previous default. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
312 |
sys.setrecursionlimit(old_limit) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
313 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
314 |
return list(s) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
315 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
316 |
def _get_dependencies(src_uri, s, pfmri, basedir, tracker): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
317 |
"""Expand all dependencies.""" |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
318 |
tracker.evaluate_progress(fmri=pfmri) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
319 |
s.add(pfmri) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
320 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
321 |
m = get_manifest(src_uri, pfmri, basedir) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
322 |
for a in m.gen_actions_by_type("depend"): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
323 |
new_fmri = expand_fmri(a.attrs["fmri"]) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
324 |
if new_fmri and new_fmri not in s: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
325 |
_get_dependencies(src_uri, s, new_fmri, basedir, |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
326 |
tracker) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
327 |
return s |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
328 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
329 |
def get_hashes_and_sizes(m): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
330 |
"""Returns a dict of hashes and transfer sizes of actions with content |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
331 |
in a manifest.""" |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
332 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
333 |
seen_hashes = set() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
334 |
def repeated(a): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
335 |
if a in seen_hashes: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
336 |
return True |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
337 |
seen_hashes.add(a) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
338 |
return False |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
339 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
340 |
cshashes = {} |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
341 |
for atype in ("file", "license"): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
342 |
for a in m.gen_actions_by_type(atype): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
343 |
if hasattr(a, "hash") and not repeated(a.hash): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
344 |
sz = int(a.attrs.get("pkg.size", 0)) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
345 |
csize = int(a.attrs.get("pkg.csize", 0)) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
346 |
otw_sz = get_pkg_otw_size(a) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
347 |
cshashes[a.hash] = (sz, csize, otw_sz) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
348 |
return cshashes |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
349 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
350 |
def prune(fmri_list, all_versions, all_timestamps): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
351 |
"""Returns a filtered version of fmri_list based on the provided |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
352 |
parameters.""" |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
353 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
354 |
if all_timestamps: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
355 |
pass |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
356 |
elif all_versions: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
357 |
dedup = {} |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
358 |
for f in fmri_list: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
359 |
dedup.setdefault(f.get_short_fmri(), []).append(f) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
360 |
fmri_list = [sorted(dedup[f], reverse=True)[0] for f in dedup] |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
361 |
else: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
362 |
dedup = {} |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
363 |
for f in fmri_list: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
364 |
dedup.setdefault(f.pkg_name, []).append(f) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
365 |
fmri_list = [sorted(dedup[f], reverse=True)[0] for f in dedup] |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
366 |
return fmri_list |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
367 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
368 |
def fetch_files_byhash(src_uri, cshashes, destdir, keep_compressed, tracker): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
369 |
"""Given a list of tuples containing content hash, and size and download |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
370 |
the content from src_uri into destdir.""" |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
371 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
372 |
def valid_file(h): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
373 |
# XXX this should check data digest |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
374 |
fname = os.path.join(destdir, h) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
375 |
if os.path.exists(fname): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
376 |
if keep_compressed: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
377 |
sz = cshashes[h][1] |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
378 |
else: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
379 |
sz = cshashes[h][0] |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
380 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
381 |
if sz == 0: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
382 |
return True |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
383 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
384 |
try: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
385 |
fs = os.stat(fname) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
386 |
except: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
387 |
pass |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
388 |
else: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
389 |
if fs.st_size == sz: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
390 |
return True |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
391 |
return False |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
392 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
393 |
if src_uri.startswith("file://"): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
394 |
try: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
395 |
r = get_repo(src_uri) |
1431
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
396 |
except sr.RepositoryError, e: |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
397 |
abort(err=e) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
398 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
399 |
for h in cshashes.keys(): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
400 |
dest = os.path.join(destdir, h) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
401 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
402 |
# Check to see if the file already exists first, so the |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
403 |
# user can continue interrupted pkgrecv operations. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
404 |
retrieve = not valid_file(h) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
405 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
406 |
try: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
407 |
if retrieve and keep_compressed: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
408 |
src = r.file(h) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
409 |
shutil.copy(src, dest) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
410 |
elif retrieve: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
411 |
src = file(r.file(h), "rb") |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
412 |
outfile = open(dest, "wb") |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
413 |
gunzip_from_stream(src, outfile) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
414 |
outfile.close() |
1431
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
415 |
except (EnvironmentError, sr.RepositoryError), e: |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
416 |
try: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
417 |
portable.remove(dest) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
418 |
except: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
419 |
pass |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
420 |
abort(err=e) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
421 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
422 |
tracker.download_add_progress(1, cshashes[h][2]) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
423 |
return |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
424 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
425 |
req_dict = {} |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
426 |
for i, k in enumerate(cshashes.keys()): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
427 |
# Check to see if the file already exists first, so the user can |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
428 |
# continue interrupted pkgrecv operations. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
429 |
if valid_file(k): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
430 |
tracker.download_add_progress(1, cshashes[k][2]) |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
431 |
continue |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
432 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
433 |
entry = "File-Name-%s" % i |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
434 |
req_dict[entry] = k |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
435 |
|
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
436 |
req_str = urllib.urlencode(req_dict) |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
437 |
if not req_str: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
438 |
# Nothing to retrieve. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
439 |
return |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
440 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
441 |
tmpdir = tempfile.mkdtemp() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
442 |
tmpdirs.append(tmpdir) |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
443 |
|
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
444 |
try: |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
445 |
f = versioned_urlopen(src_uri, "filelist", [0], |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
446 |
data=req_str)[0] |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
447 |
except: |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
448 |
abort(err=_("Unable to retrieve content from: %s") % src_uri) |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
449 |
|
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
450 |
tar_stream = ptf.PkgTarFile.open(mode = "r|", fileobj = f) |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
451 |
|
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
452 |
for info in tar_stream: |
420
0b6ecdba5641
2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents:
409
diff
changeset
|
453 |
gzfobj = None |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
454 |
try: |
420
0b6ecdba5641
2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents:
409
diff
changeset
|
455 |
if not keep_compressed: |
0b6ecdba5641
2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents:
409
diff
changeset
|
456 |
# Uncompress as we retrieve the files |
0b6ecdba5641
2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents:
409
diff
changeset
|
457 |
gzfobj = tar_stream.extractfile(info) |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
458 |
fpath = os.path.join(tmpdir, |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
459 |
info.name) |
420
0b6ecdba5641
2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents:
409
diff
changeset
|
460 |
outfile = open(fpath, "wb") |
0b6ecdba5641
2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents:
409
diff
changeset
|
461 |
gunzip_from_stream(gzfobj, outfile) |
0b6ecdba5641
2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents:
409
diff
changeset
|
462 |
outfile.close() |
0b6ecdba5641
2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents:
409
diff
changeset
|
463 |
gzfobj.close() |
0b6ecdba5641
2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents:
409
diff
changeset
|
464 |
else: |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
465 |
# We want to keep the files compressed |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
466 |
# on disk. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
467 |
tar_stream.extract_to(info, tmpdir, |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
468 |
info.name) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
469 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
470 |
# Copy the file into place (rename can cause a cross- |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
471 |
# link device failure) and then remove the original. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
472 |
src = os.path.join(tmpdir, info.name) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
473 |
shutil.copy(src, os.path.join(destdir, info.name)) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
474 |
portable.remove(src) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
475 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
476 |
tracker.download_add_progress(1, cshashes[info.name][2]) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
477 |
except KeyboardInterrupt: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
478 |
raise |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
479 |
except: |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
480 |
abort(err=_("Unable to extract file: %s") % info.name) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
481 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
482 |
shutil.rmtree(tmpdirs.pop(), True) |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
483 |
|
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
484 |
tar_stream.close() |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
485 |
f.close() |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
486 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
487 |
def list_newest_fmris(fmri_list): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
488 |
"""List the provided fmris.""" |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
489 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
490 |
fm_hash = {} |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
491 |
fm_list = [] |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
492 |
|
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
493 |
# Order all fmris by package name |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
494 |
for f in sorted(fmri_list): |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
495 |
if f.pkg_name in fm_hash: |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
496 |
fm_hash[f.pkg_name].append(f) |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
497 |
else: |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
498 |
fm_hash[f.pkg_name] = [ f ] |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
499 |
|
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
500 |
# sort each fmri list |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
501 |
for k in fm_hash.keys(): |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
502 |
fm_hash[k].sort(reverse = True) |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
503 |
l = fm_hash[k] |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
504 |
fm_list.append(l[0]) |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
505 |
|
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
506 |
for e in fm_list: |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
507 |
msg(e) |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
508 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
509 |
def fetch_catalog(src_uri, tracker): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
510 |
"""Fetch the catalog from src_uri.""" |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
511 |
global complete_catalog |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
512 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
513 |
tracker.catalog_start(src_uri) |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
514 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
515 |
if src_uri.startswith("file://"): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
516 |
try: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
517 |
r = get_repo(src_uri) |
1431
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
518 |
c = r.catalog_0() |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
519 |
except sr.RepositoryError, e: |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
520 |
error(e) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
521 |
abort() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
522 |
else: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
523 |
# open connection for catalog |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
524 |
try: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
525 |
c = versioned_urlopen(src_uri, "catalog", [0])[0] |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
526 |
except: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
527 |
abort(err=_("Unable to download catalog from: %s") % \ |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
528 |
src_uri) |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
529 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
530 |
# Create a temporary directory for catalog. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
531 |
cat_dir = tempfile.mkdtemp() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
532 |
tmpdirs.append(cat_dir) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
533 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
534 |
# Call catalog.recv to retrieve catalog. |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
535 |
try: |
1431
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
536 |
sc.ServerCatalog.recv(c, cat_dir) |
1352
5c92c9d342ef
11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents:
1132
diff
changeset
|
537 |
except Exception, e: |
5c92c9d342ef
11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents:
1132
diff
changeset
|
538 |
abort(err=_("Error: %s while reading from: %s") % (e, src_uri)) |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
539 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
540 |
if hasattr(c, "close"): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
541 |
c.close() |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
542 |
|
1431
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
543 |
cat = sc.ServerCatalog(cat_dir, read_only=True) |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
544 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
545 |
d = {} |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
546 |
fmri_list = [] |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
547 |
for f in cat.fmris(): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
548 |
fmri_list.append(f) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
549 |
d.setdefault(f.pkg_name, [f]).append(f) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
550 |
for k in d.keys(): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
551 |
d[k].sort(reverse=True) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
552 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
553 |
complete_catalog = d |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
554 |
tracker.catalog_done() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
555 |
return fmri_list |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
556 |
|
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
557 |
def main_func(): |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
558 |
all_timestamps = False |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
559 |
all_versions = False |
420
0b6ecdba5641
2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents:
409
diff
changeset
|
560 |
keep_compressed = False |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
561 |
list_newest = False |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
562 |
recursive = False |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
563 |
src_uri = None |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
564 |
target = None |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
565 |
|
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
566 |
# XXX /usr/lib/locale is OpenSolaris-specific. |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
567 |
gettext.install("pkgrecv", "/usr/lib/locale") |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
568 |
|
696
6bbfd2dece6f
4371 user-agent string needs to be different for different client front-ends
Danek Duvall <danek.duvall@sun.com>
parents:
440
diff
changeset
|
569 |
global_settings.client_name = "pkgrecv" |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
570 |
target = os.environ.get("PKG_DEST", None) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
571 |
src_uri = os.environ.get("PKG_SRC", None) |
696
6bbfd2dece6f
4371 user-agent string needs to be different for different client front-ends
Danek Duvall <danek.duvall@sun.com>
parents:
440
diff
changeset
|
572 |
|
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
573 |
try: |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
574 |
opts, pargs = getopt.getopt(sys.argv[1:], "d:hkm:nrs:") |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
575 |
except getopt.GetoptError, e: |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
576 |
usage(_("Illegal option -- %s") % e.opt) |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
577 |
|
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
578 |
for opt, arg in opts: |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
579 |
if opt == "-d": |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
580 |
target = arg |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
581 |
elif opt == "-h": |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
582 |
usage(retcode=0) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
583 |
elif opt == "-k": |
420
0b6ecdba5641
2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents:
409
diff
changeset
|
584 |
keep_compressed = True |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
585 |
elif opt == "-n": |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
586 |
list_newest = True |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
587 |
elif opt == "-r": |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
588 |
recursive = True |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
589 |
elif opt == "-s": |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
590 |
src_uri = arg |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
591 |
elif opt == "-m": |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
592 |
if arg == "all-timestamps": |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
593 |
all_timestamps = True |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
594 |
elif arg == "all-versions": |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
595 |
all_versions = True |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
596 |
else: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
597 |
usage(_("Illegal option value -- %s") % arg) |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
598 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
599 |
if not src_uri: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
600 |
usage(_("a source repository must be provided")) |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
601 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
602 |
tracker = get_tracker() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
603 |
if list_newest: |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
604 |
if pargs or len(pargs) > 0: |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
605 |
usage(_("-n takes no options")) |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
606 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
607 |
fmri_list = fetch_catalog(src_uri, tracker) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
608 |
list_newest_fmris(fmri_list) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
609 |
return 0 |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
610 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
611 |
if pargs == None or len(pargs) == 0: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
612 |
usage(_("must specify at least one pkgfmri")) |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
613 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
614 |
defer_refresh = False |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
615 |
republish = False |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
616 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
617 |
if not target: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
618 |
target = basedir = os.getcwd() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
619 |
elif target.find("://") != -1: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
620 |
basedir = tempfile.mkdtemp() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
621 |
tmpdirs.append(basedir) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
622 |
republish = True |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
623 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
624 |
# Files have to be decompressed for republishing. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
625 |
keep_compressed = False |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
626 |
if target.startswith("file://"): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
627 |
# For efficiency, and publishing speed, don't update |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
628 |
# indexes until all file publishing is finished. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
629 |
defer_refresh = True |
1431
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
630 |
|
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
631 |
# Check to see if the repository exists first. |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
632 |
try: |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
633 |
t = trans.Transaction(target) |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
634 |
except trans.TransactionRepositoryInvalidError, e: |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
635 |
txt = str(e) + "\n\n" |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
636 |
txt += _("To create a repository, use the " |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
637 |
"pkgsend command.") |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
638 |
abort(err=msg) |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
639 |
except trans.TransactionRepositoryConfigError, e: |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
640 |
txt = str(e) + "\n\n" |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
641 |
txt += _("The repository configuration for " |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
642 |
"the repository located at '%s' is not " |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
643 |
"valid or the specified path does not " |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
644 |
"exist. Please correct the configuration " |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
645 |
"of the repository or create a new " |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
646 |
"one.") % target |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
647 |
abort(err=txt) |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
648 |
except trans.TransactionError, e: |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
649 |
abort(err=e) |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
650 |
else: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
651 |
basedir = target |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
652 |
if not os.path.exists(basedir): |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
653 |
try: |
1507
b956ea23d3a6
11735 pkg history data files should not be executable
Richard Lowe <richlowe@richlowe.net>
parents:
1431
diff
changeset
|
654 |
os.makedirs(basedir, misc.PKG_DIR_MODE) |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
655 |
except: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
656 |
error(_("Unable to create basedir '%s'.") % \ |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
657 |
basedir) |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
658 |
return 1 |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
659 |
|
1431
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
660 |
all_fmris = fetch_catalog(src_uri, tracker) |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
661 |
fmri_arguments = pargs |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
662 |
fmri_list = prune(list(set(expand_matching_fmris(all_fmris, |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
663 |
fmri_arguments))), all_versions, all_timestamps) |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
664 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
665 |
if recursive: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
666 |
msg(_("Retrieving manifests for dependency evaluation ...")) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
667 |
tracker.evaluate_start() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
668 |
fmri_list = prune(get_dependencies(src_uri, fmri_list, basedir, |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
669 |
tracker), all_versions, all_timestamps) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
670 |
tracker.evaluate_done() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
671 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
672 |
def get_basename(pfmri): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
673 |
open_time = pfmri.get_timestamp() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
674 |
return "%d_%s" % \ |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
675 |
(calendar.timegm(open_time.utctimetuple()), |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
676 |
urllib.quote(str(pfmri), "")) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
677 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
678 |
# First, retrieve the manifests and calculate package transfer sizes. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
679 |
npkgs = len(fmri_list) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
680 |
nfiles = 0 |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
681 |
nbytes = 0 |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
682 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
683 |
if not recursive: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
684 |
msg(_("Retrieving manifests for package evaluation ...")) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
685 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
686 |
tracker.evaluate_start(npkgs=npkgs) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
687 |
retrieve_list = [] |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
688 |
while fmri_list: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
689 |
f = fmri_list.pop() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
690 |
m = get_manifest(src_uri, f, basedir) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
691 |
cshashes = get_hashes_and_sizes(m) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
692 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
693 |
for entry in cshashes.itervalues(): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
694 |
nfiles += 1 |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
695 |
nbytes += entry[2] |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
696 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
697 |
retrieve_list.append((f, cshashes)) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
698 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
699 |
tracker.evaluate_progress(fmri=f) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
700 |
tracker.evaluate_done() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
701 |
tracker.reset() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
702 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
703 |
# Next, retrieve and store the content for each package. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
704 |
msg(_("Retrieving package content ...")) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
705 |
tracker.download_set_goal(len(retrieve_list), nfiles, nbytes) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
706 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
707 |
publish_list = [] |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
708 |
while retrieve_list: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
709 |
f, cshashes = retrieve_list.pop() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
710 |
tracker.download_start_pkg(f.get_fmri(include_scheme=False)) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
711 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
712 |
if len(cshashes) > 0: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
713 |
pkgdir = os.path.join(basedir, f.get_dir_path()) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
714 |
fetch_files_byhash(src_uri, cshashes, pkgdir, |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
715 |
keep_compressed, tracker) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
716 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
717 |
if republish: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
718 |
publish_list.append(f) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
719 |
tracker.download_end_pkg() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
720 |
tracker.download_done() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
721 |
tracker.reset() |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
722 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
723 |
# Finally, republish the packages if needed. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
724 |
while publish_list: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
725 |
f = publish_list.pop() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
726 |
msg(_("Republishing %s ...") % f) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
727 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
728 |
m = get_manifest(src_uri, f, basedir) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
729 |
|
1132
1abf9cf8f69c
9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents:
1118
diff
changeset
|
730 |
# Get first line of original manifest so that inclusion of the |
1abf9cf8f69c
9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents:
1118
diff
changeset
|
731 |
# scheme can be determined. |
1abf9cf8f69c
9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents:
1118
diff
changeset
|
732 |
use_scheme = True |
1abf9cf8f69c
9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents:
1118
diff
changeset
|
733 |
contents = get_manifest(src_uri, f, basedir, contents=True) |
1abf9cf8f69c
9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents:
1118
diff
changeset
|
734 |
if contents.splitlines()[0].find("pkg:/") == -1: |
1abf9cf8f69c
9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents:
1118
diff
changeset
|
735 |
use_scheme = False |
1abf9cf8f69c
9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents:
1118
diff
changeset
|
736 |
|
1abf9cf8f69c
9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents:
1118
diff
changeset
|
737 |
pkg_name = f.get_fmri(include_scheme=use_scheme) |
1abf9cf8f69c
9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents:
1118
diff
changeset
|
738 |
pkgdir = os.path.join(basedir, f.get_dir_path()) |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
739 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
740 |
# This is needed so any previous failures for a package |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
741 |
# can be aborted. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
742 |
trans_id = get_basename(f) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
743 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
744 |
try: |
1431
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
745 |
t = trans.Transaction(target, pkg_name=pkg_name, |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
746 |
trans_id=trans_id) |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
747 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
748 |
# Remove any previous failed attempt to |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
749 |
# to republish this package. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
750 |
try: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
751 |
t.close(abandon=True) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
752 |
except: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
753 |
# It might not exist already. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
754 |
pass |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
755 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
756 |
t.open() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
757 |
for a in m.gen_actions(): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
758 |
if a.name == "set" and \ |
1431
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
759 |
a.attrs.get("name", "") in ("fmri", |
62b6033670e4
10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents:
1352
diff
changeset
|
760 |
"pkg.fmri"): |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
761 |
# To be consistent with the server, |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
762 |
# the fmri can't be added to the |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
763 |
# manifest. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
764 |
continue |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
765 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
766 |
if hasattr(a, "hash"): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
767 |
fname = os.path.join(pkgdir, |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
768 |
a.hash) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
769 |
a.data = lambda: open(fname, |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
770 |
"rb") |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
771 |
t.add(a) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
772 |
t.close(refresh_index=not defer_refresh) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
773 |
except trans.TransactionError, e: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
774 |
abort(err=e) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
775 |
return 1 |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
776 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
777 |
# Dump all temporary data. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
778 |
cleanup() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
779 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
780 |
if republish: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
781 |
if defer_refresh: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
782 |
msg(_("Refreshing repository search indices ...")) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
783 |
try: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
784 |
t = trans.Transaction(target) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
785 |
t.refresh_index() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
786 |
except trans.TransactionError, e: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
787 |
error(e) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
788 |
return 1 |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
789 |
return 0 |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
790 |
|
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
791 |
if __name__ == "__main__": |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
792 |
try: |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
793 |
__ret = main_func() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
794 |
except (pkg.actions.ActionError, trans.TransactionError, |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
795 |
RuntimeError), _e: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
796 |
error(_e) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
797 |
cleanup() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
798 |
__ret = 1 |
440
cbd8cd1564a9
2104 pkgrecv: Spurious error message while downloading package with no files
Brad Hall <bhall@eng.sun.com>
parents:
420
diff
changeset
|
799 |
except (PipeError, KeyboardInterrupt): |
cbd8cd1564a9
2104 pkgrecv: Spurious error message while downloading package with no files
Brad Hall <bhall@eng.sun.com>
parents:
420
diff
changeset
|
800 |
# We don't want to display any messages here to prevent |
cbd8cd1564a9
2104 pkgrecv: Spurious error message while downloading package with no files
Brad Hall <bhall@eng.sun.com>
parents:
420
diff
changeset
|
801 |
# possible further broken pipe (EPIPE) errors. |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
802 |
cleanup() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
803 |
__ret = 1 |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
804 |
except SystemExit, _e: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
805 |
cleanup() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
806 |
raise _e |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
807 |
except: |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
808 |
cleanup() |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
809 |
traceback.print_exc() |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
810 |
error( |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
811 |
_("\n\nThis is an internal error. Please let the " |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
812 |
"developers know about this\nproblem by filing a bug at " |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
813 |
"http://defect.opensolaris.org and including the\nabove " |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
814 |
"traceback and this message. The version of pkg(5) is " |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
815 |
"'%s'.") % pkg.VERSION) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
816 |
__ret = 99 |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
817 |
sys.exit(__ret) |