author | Shawn Walker <srw@sun.com> |
Fri, 11 Sep 2009 05:01:08 -0500 | |
changeset 1352 | 5c92c9d342ef |
parent 1132 | 1abf9cf8f69c |
child 1431 | 62b6033670e4 |
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 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
39 |
import pkg.client.progress as progress |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
40 |
import pkg.fmri |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
41 |
import pkg.manifest as manifest |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
42 |
import pkg.pkgtarfile as ptf |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
43 |
import pkg.portable as portable |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
44 |
import pkg.publish.transaction as trans |
1352
5c92c9d342ef
11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents:
1132
diff
changeset
|
45 |
import pkg.server.catalog as catalog |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
46 |
import pkg.server.config as config |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
47 |
import pkg.server.repository as repo |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
48 |
import pkg.server.repositoryconfig as rc |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
49 |
import pkg.version as version |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
50 |
|
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
|
51 |
from pkg.client import global_settings |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
52 |
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
|
53 |
versioned_urlopen, PipeError) |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
54 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
55 |
# Globals |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
56 |
complete_catalog = None |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
57 |
repo_cache = {} |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
58 |
tmpdirs = [] |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
59 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
60 |
def error(text): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
61 |
"""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
|
62 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
63 |
# 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
|
64 |
# it down to a string. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
65 |
text = str(text) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
66 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
67 |
# 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
|
68 |
# *before* the command-name prefix. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
69 |
text_nows = text.lstrip() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
70 |
ws = text[:len(text) - len(text_nows)] |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
71 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
72 |
# 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
|
73 |
# program name on all platforms. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
74 |
emsg(ws + "pkgrecv: " + text_nows) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
75 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
76 |
def usage(usage_error=None, retcode=2): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
77 |
"""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
|
78 |
error message. Causes program to exit.""" |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
79 |
|
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
80 |
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
|
81 |
error(usage_error) |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
82 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
83 |
msg(_("""\ |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
84 |
Usage: |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
85 |
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
|
86 |
(fmri|pattern) ... |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
87 |
pkgrecv [-s src_repo_uri] -n |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
88 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
89 |
Options: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
90 |
-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
|
91 |
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
|
92 |
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
|
93 |
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
|
94 |
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
|
95 |
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
|
96 |
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
|
97 |
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
|
98 |
to republish it. |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
99 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
100 |
-h Display this usage message. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
101 |
-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
|
102 |
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
|
103 |
-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
|
104 |
all-timestamps |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
105 |
includes all matching timestamps, not just |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
106 |
latest (implies all-versions) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
107 |
all-versions |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
108 |
includes all matching versions, not just latest |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
109 |
-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
|
110 |
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
|
111 |
options except -s will be ignored). |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
112 |
-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
|
113 |
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
|
114 |
-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
|
115 |
repository to retrieve package data from. |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
116 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
117 |
Environment: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
118 |
PKG_DEST Destination directory or repository URI |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
119 |
PKG_SRC Source repository URI""")) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
120 |
sys.exit(retcode) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
121 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
122 |
def cleanup(): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
123 |
"""To be called at program finish.""" |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
124 |
for d in tmpdirs: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
125 |
shutil.rmtree(d, True) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
126 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
127 |
def abort(err=None, retcode=1): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
128 |
"""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
|
129 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
130 |
if err: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
131 |
# Clear any possible output first. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
132 |
msg("") |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
133 |
error(err) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
134 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
135 |
cleanup() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
136 |
sys.exit(retcode) |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
137 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
138 |
def get_tracker(quiet=False): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
139 |
if quiet: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
140 |
progresstracker = progress.QuietProgressTracker() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
141 |
else: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
142 |
try: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
143 |
progresstracker = \ |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
144 |
progress.FancyUNIXProgressTracker() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
145 |
except progress.ProgressTrackerException: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
146 |
progresstracker = progress.CommandLineProgressTracker() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
147 |
return progresstracker |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
148 |
|
1132
1abf9cf8f69c
9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents:
1118
diff
changeset
|
149 |
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
|
150 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
151 |
m = None |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
152 |
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
|
153 |
mpath = os.path.join(pkgdir, "manifest") |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
154 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
155 |
raw = None |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
156 |
overwrite = False |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
157 |
if not os.path.exists(mpath): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
158 |
raw = fetch_manifest(src_uri, pfmri) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
159 |
overwrite = True |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
160 |
else: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
161 |
try: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
162 |
raw = file(mpath, "rb").read() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
163 |
except: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
164 |
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
|
165 |
" '%s'.") % (mpath, pfmri)) |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
166 |
|
1132
1abf9cf8f69c
9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents:
1118
diff
changeset
|
167 |
if contents: |
1abf9cf8f69c
9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents:
1118
diff
changeset
|
168 |
return raw |
1abf9cf8f69c
9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents:
1118
diff
changeset
|
169 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
170 |
try: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
171 |
m = manifest.CachedManifest(pfmri, basedir, None, |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
172 |
contents=raw) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
173 |
except: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
174 |
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
|
175 |
"'%s'") % (mpath, pfmri)) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
176 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
177 |
if overwrite: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
178 |
# 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
|
179 |
# 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
|
180 |
try: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
181 |
f = open(mpath, "wb") |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
182 |
f.write(raw) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
183 |
f.close() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
184 |
except: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
185 |
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
|
186 |
" '%s'.") % (mpath, pfmri)) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
187 |
return m |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
188 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
189 |
def get_repo(uri): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
190 |
if uri in repo_cache: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
191 |
return repo_cache[uri] |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
192 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
193 |
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
|
194 |
path = urllib.url2pathname(parts[2]) |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
195 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
196 |
scfg = config.SvrConfig(path, None, None) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
197 |
scfg.set_read_only() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
198 |
try: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
199 |
scfg.init_dirs() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
200 |
except (config.SvrConfigError, EnvironmentError), e: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
201 |
raise repo.RepositoryError(_("An error occurred while " |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
202 |
"trying to initialize the repository directory " |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
203 |
"structures:\n%s") % e) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
204 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
205 |
scfg.acquire_in_flight() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
206 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
207 |
try: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
208 |
scfg.acquire_catalog() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
209 |
except catalog.CatalogPermissionsException, e: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
210 |
raise repo.RepositoryError(str(e)) |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
211 |
|
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
212 |
try: |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
213 |
repo_cache[uri] = repo.Repository(scfg) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
214 |
except rc.InvalidAttributeValueError, e: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
215 |
raise repo.RepositoryError(_("The specified repository's " |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
216 |
"configuration data is not valid:\n%s") % e) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
217 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
218 |
return repo_cache[uri] |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
219 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
220 |
def fetch_manifest(src_uri, pfmri): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
221 |
"""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
|
222 |
at 'src_uri'.""" |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
223 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
224 |
if src_uri.startswith("file://"): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
225 |
try: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
226 |
r = get_repo(src_uri) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
227 |
m = file(r.manifest(pfmri), "rb") |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
228 |
except (EnvironmentError, repo.RepositoryError), e: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
229 |
abort(err=e) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
230 |
else: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
231 |
# Request manifest from repository. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
232 |
try: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
233 |
m = versioned_urlopen(src_uri, "manifest", [0], |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
234 |
pfmri.get_url_path())[0] |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
235 |
except Exception, e: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
236 |
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
|
237 |
"%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
|
238 |
except: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
239 |
abort() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
240 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
241 |
# Read from repository, return to caller. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
242 |
try: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
243 |
mfst_str = m.read() |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
244 |
except: |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
245 |
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
|
246 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
247 |
if hasattr(m, "close"): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
248 |
m.close() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
249 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
250 |
return mfst_str |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
251 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
252 |
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
|
253 |
"""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
|
254 |
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
|
255 |
if isinstance(pfmri, str): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
256 |
pfmri = pkg.fmri.PkgFmri(pfmri, "5.11") |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
257 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
258 |
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
|
259 |
if not pfmri.version or \ |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
260 |
f.version.is_successor(pfmri.version, constraint): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
261 |
return f |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
262 |
return |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
263 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
264 |
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
|
265 |
"""find matching fmris using pattern matching and |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
266 |
constraint auto.""" |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
267 |
counthash = {} |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
268 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
269 |
try: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
270 |
patterns = [ |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
271 |
pkg.fmri.MatchingPkgFmri(s, "5.11") |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
272 |
for s in pfmri_strings |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
273 |
] |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
274 |
except pkg.fmri.FmriError, e: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
275 |
abort(err=e) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
276 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
277 |
matches = catalog.extract_matching_fmris(fmri_list, |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
278 |
patterns=patterns, constraint=version.CONSTRAINT_AUTO, |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
279 |
counthash=counthash, matcher=pkg.fmri.glob_match) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
280 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
281 |
bail = False |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
282 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
283 |
for f in patterns: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
284 |
if f not in counthash: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
285 |
emsg(_("No match found for %s") % f.pkg_name) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
286 |
bail = True |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
287 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
288 |
if bail: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
289 |
abort() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
290 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
291 |
return matches |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
292 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
293 |
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
|
294 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
295 |
old_limit = sys.getrecursionlimit() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
296 |
# 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
|
297 |
sys.setrecursionlimit(3000) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
298 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
299 |
s = set() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
300 |
for f in fmri_list: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
301 |
pfmri = expand_fmri(f) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
302 |
_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
|
303 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
304 |
# Restore the previous default. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
305 |
sys.setrecursionlimit(old_limit) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
306 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
307 |
return list(s) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
308 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
309 |
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
|
310 |
"""Expand all dependencies.""" |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
311 |
tracker.evaluate_progress(fmri=pfmri) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
312 |
s.add(pfmri) |
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 |
m = get_manifest(src_uri, pfmri, basedir) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
315 |
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
|
316 |
new_fmri = expand_fmri(a.attrs["fmri"]) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
317 |
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
|
318 |
_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
|
319 |
tracker) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
320 |
return s |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
321 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
322 |
def get_hashes_and_sizes(m): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
323 |
"""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
|
324 |
in a manifest.""" |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
325 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
326 |
seen_hashes = set() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
327 |
def repeated(a): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
328 |
if a in seen_hashes: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
329 |
return True |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
330 |
seen_hashes.add(a) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
331 |
return False |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
332 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
333 |
cshashes = {} |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
334 |
for atype in ("file", "license"): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
335 |
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
|
336 |
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
|
337 |
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
|
338 |
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
|
339 |
otw_sz = get_pkg_otw_size(a) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
340 |
cshashes[a.hash] = (sz, csize, otw_sz) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
341 |
return cshashes |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
342 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
343 |
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
|
344 |
"""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
|
345 |
parameters.""" |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
346 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
347 |
if all_timestamps: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
348 |
pass |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
349 |
elif all_versions: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
350 |
dedup = {} |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
351 |
for f in fmri_list: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
352 |
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
|
353 |
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
|
354 |
else: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
355 |
dedup = {} |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
356 |
for f in fmri_list: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
357 |
dedup.setdefault(f.pkg_name, []).append(f) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
358 |
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
|
359 |
return fmri_list |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
360 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
361 |
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
|
362 |
"""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
|
363 |
the content from src_uri into destdir.""" |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
364 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
365 |
def valid_file(h): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
366 |
# XXX this should check data digest |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
367 |
fname = os.path.join(destdir, h) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
368 |
if os.path.exists(fname): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
369 |
if keep_compressed: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
370 |
sz = cshashes[h][1] |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
371 |
else: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
372 |
sz = cshashes[h][0] |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
373 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
374 |
if sz == 0: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
375 |
return True |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
376 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
377 |
try: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
378 |
fs = os.stat(fname) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
379 |
except: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
380 |
pass |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
381 |
else: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
382 |
if fs.st_size == sz: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
383 |
return True |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
384 |
return False |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
385 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
386 |
if src_uri.startswith("file://"): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
387 |
try: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
388 |
r = get_repo(src_uri) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
389 |
except repo.RepositoryError, e: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
390 |
abort(err=e) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
391 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
392 |
for h in cshashes.keys(): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
393 |
dest = os.path.join(destdir, h) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
394 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
395 |
# 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
|
396 |
# user can continue interrupted pkgrecv operations. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
397 |
retrieve = not valid_file(h) |
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 |
try: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
400 |
if retrieve and keep_compressed: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
401 |
src = r.file(h) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
402 |
shutil.copy(src, dest) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
403 |
elif retrieve: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
404 |
src = file(r.file(h), "rb") |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
405 |
outfile = open(dest, "wb") |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
406 |
gunzip_from_stream(src, outfile) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
407 |
outfile.close() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
408 |
except (EnvironmentError, |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
409 |
repo.RepositoryError), e: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
410 |
try: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
411 |
portable.remove(dest) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
412 |
except: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
413 |
pass |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
414 |
abort(err=e) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
415 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
416 |
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
|
417 |
return |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
418 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
419 |
req_dict = {} |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
420 |
for i, k in enumerate(cshashes.keys()): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
421 |
# 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
|
422 |
# continue interrupted pkgrecv operations. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
423 |
if valid_file(k): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
424 |
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
|
425 |
continue |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
426 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
427 |
entry = "File-Name-%s" % i |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
428 |
req_dict[entry] = k |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
429 |
|
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
430 |
req_str = urllib.urlencode(req_dict) |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
431 |
if not req_str: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
432 |
# Nothing to retrieve. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
433 |
return |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
434 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
435 |
tmpdir = tempfile.mkdtemp() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
436 |
tmpdirs.append(tmpdir) |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
437 |
|
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
438 |
try: |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
439 |
f = versioned_urlopen(src_uri, "filelist", [0], |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
440 |
data=req_str)[0] |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
441 |
except: |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
442 |
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
|
443 |
|
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
444 |
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
|
445 |
|
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
446 |
for info in tar_stream: |
420
0b6ecdba5641
2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents:
409
diff
changeset
|
447 |
gzfobj = None |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
448 |
try: |
420
0b6ecdba5641
2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents:
409
diff
changeset
|
449 |
if not keep_compressed: |
0b6ecdba5641
2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents:
409
diff
changeset
|
450 |
# Uncompress as we retrieve the files |
0b6ecdba5641
2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents:
409
diff
changeset
|
451 |
gzfobj = tar_stream.extractfile(info) |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
452 |
fpath = os.path.join(tmpdir, |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
453 |
info.name) |
420
0b6ecdba5641
2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents:
409
diff
changeset
|
454 |
outfile = open(fpath, "wb") |
0b6ecdba5641
2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents:
409
diff
changeset
|
455 |
gunzip_from_stream(gzfobj, outfile) |
0b6ecdba5641
2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents:
409
diff
changeset
|
456 |
outfile.close() |
0b6ecdba5641
2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents:
409
diff
changeset
|
457 |
gzfobj.close() |
0b6ecdba5641
2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents:
409
diff
changeset
|
458 |
else: |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
459 |
# We want to keep the files compressed |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
460 |
# on disk. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
461 |
tar_stream.extract_to(info, tmpdir, |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
462 |
info.name) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
463 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
464 |
# 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
|
465 |
# 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
|
466 |
src = os.path.join(tmpdir, info.name) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
467 |
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
|
468 |
portable.remove(src) |
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 |
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
|
471 |
except KeyboardInterrupt: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
472 |
raise |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
473 |
except: |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
474 |
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
|
475 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
476 |
shutil.rmtree(tmpdirs.pop(), True) |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
477 |
|
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
478 |
tar_stream.close() |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
479 |
f.close() |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
480 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
481 |
def list_newest_fmris(fmri_list): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
482 |
"""List the provided fmris.""" |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
483 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
484 |
fm_hash = {} |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
485 |
fm_list = [] |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
486 |
|
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
487 |
# Order all fmris by package name |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
488 |
for f in sorted(fmri_list): |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
489 |
if f.pkg_name in fm_hash: |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
490 |
fm_hash[f.pkg_name].append(f) |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
491 |
else: |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
492 |
fm_hash[f.pkg_name] = [ f ] |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
493 |
|
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
494 |
# sort each fmri list |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
495 |
for k in fm_hash.keys(): |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
496 |
fm_hash[k].sort(reverse = True) |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
497 |
l = fm_hash[k] |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
498 |
fm_list.append(l[0]) |
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 |
for e in fm_list: |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
501 |
msg(e) |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
502 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
503 |
def fetch_catalog(src_uri, tracker): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
504 |
"""Fetch the catalog from src_uri.""" |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
505 |
global complete_catalog |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
506 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
507 |
tracker.catalog_start(src_uri) |
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 |
if src_uri.startswith("file://"): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
510 |
try: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
511 |
r = get_repo(src_uri) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
512 |
c = r.catalog() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
513 |
except repo.RepositoryError, e: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
514 |
error(e) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
515 |
abort() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
516 |
else: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
517 |
# open connection for catalog |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
518 |
try: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
519 |
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
|
520 |
except: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
521 |
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
|
522 |
src_uri) |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
523 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
524 |
# Create a temporary directory for catalog. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
525 |
cat_dir = tempfile.mkdtemp() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
526 |
tmpdirs.append(cat_dir) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
527 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
528 |
# Call catalog.recv to retrieve catalog. |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
529 |
try: |
1352
5c92c9d342ef
11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents:
1132
diff
changeset
|
530 |
catalog.ServerCatalog.recv(c, cat_dir) |
5c92c9d342ef
11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents:
1132
diff
changeset
|
531 |
except Exception, e: |
5c92c9d342ef
11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents:
1132
diff
changeset
|
532 |
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
|
533 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
534 |
if hasattr(c, "close"): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
535 |
c.close() |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
536 |
|
1352
5c92c9d342ef
11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents:
1132
diff
changeset
|
537 |
cat = catalog.ServerCatalog(cat_dir, read_only=True) |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
538 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
539 |
d = {} |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
540 |
fmri_list = [] |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
541 |
for f in cat.fmris(): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
542 |
fmri_list.append(f) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
543 |
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
|
544 |
for k in d.keys(): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
545 |
d[k].sort(reverse=True) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
546 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
547 |
complete_catalog = d |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
548 |
tracker.catalog_done() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
549 |
return fmri_list |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
550 |
|
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
551 |
def main_func(): |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
552 |
all_timestamps = False |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
553 |
all_versions = False |
420
0b6ecdba5641
2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents:
409
diff
changeset
|
554 |
keep_compressed = False |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
555 |
list_newest = False |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
556 |
recursive = False |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
557 |
src_uri = None |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
558 |
target = None |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
559 |
|
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
560 |
# XXX /usr/lib/locale is OpenSolaris-specific. |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
561 |
gettext.install("pkgrecv", "/usr/lib/locale") |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
562 |
|
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
|
563 |
global_settings.client_name = "pkgrecv" |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
564 |
target = os.environ.get("PKG_DEST", None) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
565 |
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
|
566 |
|
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
567 |
try: |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
568 |
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
|
569 |
except getopt.GetoptError, e: |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
570 |
usage(_("Illegal option -- %s") % e.opt) |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
571 |
|
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
572 |
for opt, arg in opts: |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
573 |
if opt == "-d": |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
574 |
target = arg |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
575 |
elif opt == "-h": |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
576 |
usage(retcode=0) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
577 |
elif opt == "-k": |
420
0b6ecdba5641
2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents:
409
diff
changeset
|
578 |
keep_compressed = True |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
579 |
elif opt == "-n": |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
580 |
list_newest = True |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
581 |
elif opt == "-r": |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
582 |
recursive = True |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
583 |
elif opt == "-s": |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
584 |
src_uri = arg |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
585 |
elif opt == "-m": |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
586 |
if arg == "all-timestamps": |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
587 |
all_timestamps = True |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
588 |
elif arg == "all-versions": |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
589 |
all_versions = True |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
590 |
else: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
591 |
usage(_("Illegal option value -- %s") % arg) |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
592 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
593 |
if not src_uri: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
594 |
usage(_("a source repository must be provided")) |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
595 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
596 |
tracker = get_tracker() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
597 |
if list_newest: |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
598 |
if pargs or len(pargs) > 0: |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
599 |
usage(_("-n takes no options")) |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
600 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
601 |
fmri_list = fetch_catalog(src_uri, tracker) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
602 |
list_newest_fmris(fmri_list) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
603 |
return 0 |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
604 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
605 |
if pargs == None or len(pargs) == 0: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
606 |
usage(_("must specify at least one pkgfmri")) |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
607 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
608 |
all_fmris = fetch_catalog(src_uri, tracker) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
609 |
fmri_arguments = pargs |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
610 |
fmri_list = prune(list(set(expand_matching_fmris(all_fmris, |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
611 |
fmri_arguments))), all_versions, all_timestamps) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
612 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
613 |
create_repo = False |
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 |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
626 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
627 |
# Automatically create repository at target location if it |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
628 |
# doesn't exist. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
629 |
if target.startswith("file://"): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
630 |
create_repo = True |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
631 |
# 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
|
632 |
# indexes until all file publishing is finished. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
633 |
defer_refresh = True |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
634 |
else: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
635 |
basedir = target |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
636 |
if not os.path.exists(basedir): |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
637 |
try: |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
638 |
os.makedirs(basedir, 0755) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
639 |
except: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
640 |
error(_("Unable to create basedir '%s'.") % \ |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
641 |
basedir) |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
642 |
return 1 |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
643 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
644 |
if recursive: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
645 |
msg(_("Retrieving manifests for dependency evaluation ...")) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
646 |
tracker.evaluate_start() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
647 |
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
|
648 |
tracker), all_versions, all_timestamps) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
649 |
tracker.evaluate_done() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
650 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
651 |
def get_basename(pfmri): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
652 |
open_time = pfmri.get_timestamp() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
653 |
return "%d_%s" % \ |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
654 |
(calendar.timegm(open_time.utctimetuple()), |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
655 |
urllib.quote(str(pfmri), "")) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
656 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
657 |
# 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
|
658 |
npkgs = len(fmri_list) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
659 |
nfiles = 0 |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
660 |
nbytes = 0 |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
661 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
662 |
if not recursive: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
663 |
msg(_("Retrieving manifests for package evaluation ...")) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
664 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
665 |
tracker.evaluate_start(npkgs=npkgs) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
666 |
retrieve_list = [] |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
667 |
while fmri_list: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
668 |
f = fmri_list.pop() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
669 |
m = get_manifest(src_uri, f, basedir) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
670 |
cshashes = get_hashes_and_sizes(m) |
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 |
for entry in cshashes.itervalues(): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
673 |
nfiles += 1 |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
674 |
nbytes += entry[2] |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
675 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
676 |
retrieve_list.append((f, cshashes)) |
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 |
tracker.evaluate_progress(fmri=f) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
679 |
tracker.evaluate_done() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
680 |
tracker.reset() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
681 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
682 |
# 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
|
683 |
msg(_("Retrieving package content ...")) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
684 |
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
|
685 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
686 |
publish_list = [] |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
687 |
while retrieve_list: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
688 |
f, cshashes = retrieve_list.pop() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
689 |
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
|
690 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
691 |
if len(cshashes) > 0: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
692 |
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
|
693 |
fetch_files_byhash(src_uri, cshashes, pkgdir, |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
694 |
keep_compressed, tracker) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
695 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
696 |
if republish: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
697 |
publish_list.append(f) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
698 |
tracker.download_end_pkg() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
699 |
tracker.download_done() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
700 |
tracker.reset() |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
701 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
702 |
# Finally, republish the packages if needed. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
703 |
while publish_list: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
704 |
f = publish_list.pop() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
705 |
msg(_("Republishing %s ...") % f) |
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 |
m = get_manifest(src_uri, f, basedir) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
708 |
|
1132
1abf9cf8f69c
9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents:
1118
diff
changeset
|
709 |
# 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
|
710 |
# 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
|
711 |
use_scheme = True |
1abf9cf8f69c
9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents:
1118
diff
changeset
|
712 |
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
|
713 |
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
|
714 |
use_scheme = False |
1abf9cf8f69c
9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents:
1118
diff
changeset
|
715 |
|
1abf9cf8f69c
9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents:
1118
diff
changeset
|
716 |
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
|
717 |
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
|
718 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
719 |
# 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
|
720 |
# can be aborted. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
721 |
trans_id = get_basename(f) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
722 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
723 |
try: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
724 |
t = trans.Transaction(target, create_repo=create_repo, |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
725 |
pkg_name=pkg_name, trans_id=trans_id) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
726 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
727 |
# Remove any previous failed attempt to |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
728 |
# to republish this package. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
729 |
try: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
730 |
t.close(abandon=True) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
731 |
except: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
732 |
# It might not exist already. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
733 |
pass |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
734 |
|
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
735 |
t.open() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
736 |
for a in m.gen_actions(): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
737 |
if a.name == "set" and \ |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
738 |
a.attrs.get("name", "") == "fmri": |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
739 |
# To be consistent with the server, |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
740 |
# 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
|
741 |
# manifest. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
742 |
continue |
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 |
if hasattr(a, "hash"): |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
745 |
fname = os.path.join(pkgdir, |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
746 |
a.hash) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
747 |
a.data = lambda: open(fname, |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
748 |
"rb") |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
749 |
t.add(a) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
750 |
t.close(refresh_index=not defer_refresh) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
751 |
except trans.TransactionError, e: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
752 |
abort(err=e) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
753 |
return 1 |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
754 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
755 |
# Dump all temporary data. |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
756 |
cleanup() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
757 |
|
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
758 |
if republish: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
759 |
if defer_refresh: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
760 |
msg(_("Refreshing repository search indices ...")) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
761 |
try: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
762 |
t = trans.Transaction(target) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
763 |
t.refresh_index() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
764 |
except trans.TransactionError, e: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
765 |
error(e) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
766 |
return 1 |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
767 |
return 0 |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
768 |
|
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
769 |
if __name__ == "__main__": |
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
770 |
try: |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
771 |
__ret = main_func() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
772 |
except (pkg.actions.ActionError, trans.TransactionError, |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
773 |
RuntimeError), _e: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
774 |
error(_e) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
775 |
cleanup() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
776 |
__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
|
777 |
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
|
778 |
# 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
|
779 |
# possible further broken pipe (EPIPE) errors. |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
780 |
cleanup() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
781 |
__ret = 1 |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
782 |
except SystemExit, _e: |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
783 |
cleanup() |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
784 |
raise _e |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
785 |
except: |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
786 |
cleanup() |
375
fa5286b09191
1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff
changeset
|
787 |
traceback.print_exc() |
1118
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
788 |
error( |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
789 |
_("\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
|
790 |
"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
|
791 |
"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
|
792 |
"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
|
793 |
"'%s'.") % pkg.VERSION) |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
794 |
__ret = 99 |
f2dd69165173
6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents:
1063
diff
changeset
|
795 |
sys.exit(__ret) |