author | Bart Smaalders <Bart.Smaalders@Sun.COM> |
Tue, 27 Jan 2009 14:20:53 -0800 | |
changeset 838 | aafbe4737188 |
parent 835 | 34ec4401dc48 |
child 873 | b95d76c53b5e |
permissions | -rw-r--r-- |
409
713e20963dc2
2314 shebang lines should use minimum python version
Shawn Walker <swalker@opensolaris.org>
parents:
404
diff
changeset
|
1 |
#!/usr/bin/python2.4 |
46
86a10bea7bb6
commonize file/ prefix handling; sketch manifest difference algorithm
Stephen Hahn <sch@sun.com>
parents:
diff
changeset
|
2 |
# |
86a10bea7bb6
commonize file/ prefix handling; sketch manifest difference algorithm
Stephen Hahn <sch@sun.com>
parents:
diff
changeset
|
3 |
# CDDL HEADER START |
86a10bea7bb6
commonize file/ prefix handling; sketch manifest difference algorithm
Stephen Hahn <sch@sun.com>
parents:
diff
changeset
|
4 |
# |
86a10bea7bb6
commonize file/ prefix handling; sketch manifest difference algorithm
Stephen Hahn <sch@sun.com>
parents:
diff
changeset
|
5 |
# The contents of this file are subject to the terms of the |
86a10bea7bb6
commonize file/ prefix handling; sketch manifest difference algorithm
Stephen Hahn <sch@sun.com>
parents:
diff
changeset
|
6 |
# Common Development and Distribution License (the "License"). |
86a10bea7bb6
commonize file/ prefix handling; sketch manifest difference algorithm
Stephen Hahn <sch@sun.com>
parents:
diff
changeset
|
7 |
# You may not use this file except in compliance with the License. |
86a10bea7bb6
commonize file/ prefix handling; sketch manifest difference algorithm
Stephen Hahn <sch@sun.com>
parents:
diff
changeset
|
8 |
# |
86a10bea7bb6
commonize file/ prefix handling; sketch manifest difference algorithm
Stephen Hahn <sch@sun.com>
parents:
diff
changeset
|
9 |
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE |
86a10bea7bb6
commonize file/ prefix handling; sketch manifest difference algorithm
Stephen Hahn <sch@sun.com>
parents:
diff
changeset
|
10 |
# or http://www.opensolaris.org/os/licensing. |
86a10bea7bb6
commonize file/ prefix handling; sketch manifest difference algorithm
Stephen Hahn <sch@sun.com>
parents:
diff
changeset
|
11 |
# See the License for the specific language governing permissions |
86a10bea7bb6
commonize file/ prefix handling; sketch manifest difference algorithm
Stephen Hahn <sch@sun.com>
parents:
diff
changeset
|
12 |
# and limitations under the License. |
86a10bea7bb6
commonize file/ prefix handling; sketch manifest difference algorithm
Stephen Hahn <sch@sun.com>
parents:
diff
changeset
|
13 |
# |
86a10bea7bb6
commonize file/ prefix handling; sketch manifest difference algorithm
Stephen Hahn <sch@sun.com>
parents:
diff
changeset
|
14 |
# When distributing Covered Code, include this CDDL HEADER in each |
86a10bea7bb6
commonize file/ prefix handling; sketch manifest difference algorithm
Stephen Hahn <sch@sun.com>
parents:
diff
changeset
|
15 |
# file and include the License file at usr/src/OPENSOLARIS.LICENSE. |
86a10bea7bb6
commonize file/ prefix handling; sketch manifest difference algorithm
Stephen Hahn <sch@sun.com>
parents:
diff
changeset
|
16 |
# If applicable, add the following below this CDDL HEADER, with the |
86a10bea7bb6
commonize file/ prefix handling; sketch manifest difference algorithm
Stephen Hahn <sch@sun.com>
parents:
diff
changeset
|
17 |
# fields enclosed by brackets "[]" replaced with your own identifying |
86a10bea7bb6
commonize file/ prefix handling; sketch manifest difference algorithm
Stephen Hahn <sch@sun.com>
parents:
diff
changeset
|
18 |
# information: Portions Copyright [yyyy] [name of copyright owner] |
86a10bea7bb6
commonize file/ prefix handling; sketch manifest difference algorithm
Stephen Hahn <sch@sun.com>
parents:
diff
changeset
|
19 |
# |
86a10bea7bb6
commonize file/ prefix handling; sketch manifest difference algorithm
Stephen Hahn <sch@sun.com>
parents:
diff
changeset
|
20 |
# CDDL HEADER END |
86a10bea7bb6
commonize file/ prefix handling; sketch manifest difference algorithm
Stephen Hahn <sch@sun.com>
parents:
diff
changeset
|
21 |
# |
86a10bea7bb6
commonize file/ prefix handling; sketch manifest difference algorithm
Stephen Hahn <sch@sun.com>
parents:
diff
changeset
|
22 |
|
814
76909c2cad8f
5603 server catalog permissions should be 644, not 600
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
791
diff
changeset
|
23 |
# Copyright 2009 Sun Microsystems, Inc. All rights reserved. |
46
86a10bea7bb6
commonize file/ prefix handling; sketch manifest difference algorithm
Stephen Hahn <sch@sun.com>
parents:
diff
changeset
|
24 |
# Use is subject to license terms. |
119
537d69114be4
Implement bundled file downloads using filelist
johansen <johansen@sun.com>
parents:
108
diff
changeset
|
25 |
|
384
9d4746e5dd3e
115 pkg needs to not have a cow on a SIGPIPE
Shawn Walker <swalker@opensolaris.org>
parents:
351
diff
changeset
|
26 |
import errno |
386
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
27 |
import httplib |
119
537d69114be4
Implement bundled file downloads using filelist
johansen <johansen@sun.com>
parents:
108
diff
changeset
|
28 |
import os |
386
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
29 |
import platform |
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
30 |
import re |
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
31 |
import sha |
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
32 |
import socket |
145
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
33 |
import urllib |
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
34 |
import urllib2 |
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
35 |
import urlparse |
384
9d4746e5dd3e
115 pkg needs to not have a cow on a SIGPIPE
Shawn Walker <swalker@opensolaris.org>
parents:
351
diff
changeset
|
36 |
import sys |
342
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
37 |
import zlib |
443
5ffa5b7dac9c
2589 pyc files generate lots of verify chaff
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
429
diff
changeset
|
38 |
import time |
5ffa5b7dac9c
2589 pyc files generate lots of verify chaff
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
429
diff
changeset
|
39 |
import calendar |
462
910600c14093
45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
461
diff
changeset
|
40 |
import shutil |
791
123e9401e939
5778 Inability to set locale leads to stack trace
Danek Duvall <danek.duvall@sun.com>
parents:
779
diff
changeset
|
41 |
import locale |
462
910600c14093
45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
461
diff
changeset
|
42 |
from stat import * |
910600c14093
45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
461
diff
changeset
|
43 |
|
310
8fa744df663a
975 Catalogs need to know their origins
johansen <johansen@sun.com>
parents:
285
diff
changeset
|
44 |
import pkg.urlhelpers as urlhelpers |
319
39b8b5c538bf
1104 want custom user-agent string
Danek Duvall <danek.duvall@sun.com>
parents:
310
diff
changeset
|
45 |
import pkg.portable as portable |
39b8b5c538bf
1104 want custom user-agent string
Danek Duvall <danek.duvall@sun.com>
parents:
310
diff
changeset
|
46 |
from pkg.client.imagetypes import img_type_names, IMG_NONE |
696
6bbfd2dece6f
4371 user-agent string needs to be different for different client front-ends
Danek Duvall <danek.duvall@sun.com>
parents:
670
diff
changeset
|
47 |
from pkg.client import global_settings |
319
39b8b5c538bf
1104 want custom user-agent string
Danek Duvall <danek.duvall@sun.com>
parents:
310
diff
changeset
|
48 |
from pkg import VERSION |
310
8fa744df663a
975 Catalogs need to know their origins
johansen <johansen@sun.com>
parents:
285
diff
changeset
|
49 |
|
443
5ffa5b7dac9c
2589 pyc files generate lots of verify chaff
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
429
diff
changeset
|
50 |
def time_to_timestamp(t): |
462
910600c14093
45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
461
diff
changeset
|
51 |
"""convert seconds since epoch to %Y%m%dT%H%M%SZ format""" |
443
5ffa5b7dac9c
2589 pyc files generate lots of verify chaff
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
429
diff
changeset
|
52 |
# XXX optimize? |
5ffa5b7dac9c
2589 pyc files generate lots of verify chaff
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
429
diff
changeset
|
53 |
return time.strftime("%Y%m%dT%H%M%SZ", time.gmtime(t)) |
5ffa5b7dac9c
2589 pyc files generate lots of verify chaff
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
429
diff
changeset
|
54 |
|
5ffa5b7dac9c
2589 pyc files generate lots of verify chaff
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
429
diff
changeset
|
55 |
def timestamp_to_time(ts): |
462
910600c14093
45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
461
diff
changeset
|
56 |
"""convert %Y%m%dT%H%M%SZ format to seconds since epoch""" |
443
5ffa5b7dac9c
2589 pyc files generate lots of verify chaff
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
429
diff
changeset
|
57 |
# XXX optimize? |
5ffa5b7dac9c
2589 pyc files generate lots of verify chaff
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
429
diff
changeset
|
58 |
return calendar.timegm(time.strptime(ts, "%Y%m%dT%H%M%SZ")) |
5ffa5b7dac9c
2589 pyc files generate lots of verify chaff
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
429
diff
changeset
|
59 |
|
462
910600c14093
45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
461
diff
changeset
|
60 |
def copyfile(src_path, dst_path): |
910600c14093
45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
461
diff
changeset
|
61 |
"""copy a file, preserving attributes, ownership, etc. where possible""" |
910600c14093
45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
461
diff
changeset
|
62 |
stat = os.lstat(src_path) |
910600c14093
45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
461
diff
changeset
|
63 |
shutil.copy2(src_path, dst_path) |
910600c14093
45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
461
diff
changeset
|
64 |
try: |
910600c14093
45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
461
diff
changeset
|
65 |
portable.chown(dst_path, stat.st_uid, stat.st_gid) |
910600c14093
45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
461
diff
changeset
|
66 |
except OSError, e: |
910600c14093
45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
461
diff
changeset
|
67 |
if e.errno != errno.EPERM: |
910600c14093
45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
461
diff
changeset
|
68 |
raise |
910600c14093
45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
461
diff
changeset
|
69 |
|
46
86a10bea7bb6
commonize file/ prefix handling; sketch manifest difference algorithm
Stephen Hahn <sch@sun.com>
parents:
diff
changeset
|
70 |
def hash_file_name(f): |
86a10bea7bb6
commonize file/ prefix handling; sketch manifest difference algorithm
Stephen Hahn <sch@sun.com>
parents:
diff
changeset
|
71 |
"""Return the two-level path fragment for the given filename, which is |
86a10bea7bb6
commonize file/ prefix handling; sketch manifest difference algorithm
Stephen Hahn <sch@sun.com>
parents:
diff
changeset
|
72 |
assumed to be a content hash of at least 8 distinct characters.""" |
119
537d69114be4
Implement bundled file downloads using filelist
johansen <johansen@sun.com>
parents:
108
diff
changeset
|
73 |
return os.path.join("%s" % f[0:2], "%s" % f[2:8], "%s" % f) |
46
86a10bea7bb6
commonize file/ prefix handling; sketch manifest difference algorithm
Stephen Hahn <sch@sun.com>
parents:
diff
changeset
|
74 |
|
310
8fa744df663a
975 Catalogs need to know their origins
johansen <johansen@sun.com>
parents:
285
diff
changeset
|
75 |
def url_affix_trailing_slash(u): |
8fa744df663a
975 Catalogs need to know their origins
johansen <johansen@sun.com>
parents:
285
diff
changeset
|
76 |
if u[-1] != '/': |
8fa744df663a
975 Catalogs need to know their origins
johansen <johansen@sun.com>
parents:
285
diff
changeset
|
77 |
u = u + '/' |
8fa744df663a
975 Catalogs need to know their origins
johansen <johansen@sun.com>
parents:
285
diff
changeset
|
78 |
|
8fa744df663a
975 Catalogs need to know their origins
johansen <johansen@sun.com>
parents:
285
diff
changeset
|
79 |
return u |
8fa744df663a
975 Catalogs need to know their origins
johansen <johansen@sun.com>
parents:
285
diff
changeset
|
80 |
|
696
6bbfd2dece6f
4371 user-agent string needs to be different for different client front-ends
Danek Duvall <danek.duvall@sun.com>
parents:
670
diff
changeset
|
81 |
_client_version = "pkg/%s (%s %s; %s %s; %%s; %%s)" % \ |
319
39b8b5c538bf
1104 want custom user-agent string
Danek Duvall <danek.duvall@sun.com>
parents:
310
diff
changeset
|
82 |
(VERSION, portable.util.get_canonical_os_name(), platform.machine(), |
39b8b5c538bf
1104 want custom user-agent string
Danek Duvall <danek.duvall@sun.com>
parents:
310
diff
changeset
|
83 |
portable.util.get_os_release(), platform.version()) |
39b8b5c538bf
1104 want custom user-agent string
Danek Duvall <danek.duvall@sun.com>
parents:
310
diff
changeset
|
84 |
|
556
1c3526ca7b9e
2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents:
551
diff
changeset
|
85 |
def versioned_urlopen(base_uri, operation, versions = None, tail = None, |
551 | 86 |
data = None, headers = None, ssl_creds = None, imgtype = IMG_NONE, |
556
1c3526ca7b9e
2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents:
551
diff
changeset
|
87 |
method = "GET", uuid = None): |
145
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
88 |
"""Open the best URI for an operation given a set of versions. |
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
89 |
|
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
90 |
Both the client and the server may support multiple versions of |
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
91 |
the protocol of a particular operation. The client will pass |
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
92 |
this method an ordered array of versions it understands, along |
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
93 |
with the base URI and the operation it wants. This method will |
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
94 |
open the URL corresponding to the best version both the client |
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
95 |
and the server understand, returning a tuple of the open URL and |
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
96 |
the version used on success, and throwing an exception if no |
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
97 |
matching version can be found. |
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
98 |
""" |
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
99 |
# Ignore http_proxy for localhost case, by overriding |
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
100 |
# default proxy behaviour of urlopen(). |
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
101 |
netloc = urlparse.urlparse(base_uri)[1] |
310
8fa744df663a
975 Catalogs need to know their origins
johansen <johansen@sun.com>
parents:
285
diff
changeset
|
102 |
|
285
538afd6a9d3e
763 pkg image-create /foo , pkg image-create /tmp/foo both yield (different) tracebacks
Danek Duvall <danek.duvall@sun.com>
parents:
260
diff
changeset
|
103 |
if not netloc: |
538afd6a9d3e
763 pkg image-create /foo , pkg image-create /tmp/foo both yield (different) tracebacks
Danek Duvall <danek.duvall@sun.com>
parents:
260
diff
changeset
|
104 |
raise ValueError, "Malformed URL: %s" % base_uri |
310
8fa744df663a
975 Catalogs need to know their origins
johansen <johansen@sun.com>
parents:
285
diff
changeset
|
105 |
|
145
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
106 |
if urllib.splitport(netloc)[0] == "localhost": |
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
107 |
# XXX cache this opener? |
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
108 |
proxy_handler = urllib2.ProxyHandler({}) |
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
109 |
opener_dir = urllib2.build_opener(proxy_handler) |
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
110 |
url_opener = opener_dir.open |
310
8fa744df663a
975 Catalogs need to know their origins
johansen <johansen@sun.com>
parents:
285
diff
changeset
|
111 |
elif ssl_creds and ssl_creds != (None, None): |
8fa744df663a
975 Catalogs need to know their origins
johansen <johansen@sun.com>
parents:
285
diff
changeset
|
112 |
cert_handler = urlhelpers.HTTPSCertHandler( |
8fa744df663a
975 Catalogs need to know their origins
johansen <johansen@sun.com>
parents:
285
diff
changeset
|
113 |
key_file = ssl_creds[0], cert_file = ssl_creds[1]) |
779
35b869ed3334
4314 https proxy does not work
Tom Mueller <Tom.Mueller@sun.com>
parents:
770
diff
changeset
|
114 |
opener_dir = urllib2.build_opener( |
35b869ed3334
4314 https proxy does not work
Tom Mueller <Tom.Mueller@sun.com>
parents:
770
diff
changeset
|
115 |
urlhelpers.HTTPSProxyHandler, cert_handler) |
310
8fa744df663a
975 Catalogs need to know their origins
johansen <johansen@sun.com>
parents:
285
diff
changeset
|
116 |
url_opener = opener_dir.open |
145
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
117 |
else: |
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
118 |
url_opener = urllib2.urlopen |
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
119 |
|
556
1c3526ca7b9e
2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents:
551
diff
changeset
|
120 |
if not versions: |
1c3526ca7b9e
2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents:
551
diff
changeset
|
121 |
versions = [] |
1c3526ca7b9e
2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents:
551
diff
changeset
|
122 |
|
551 | 123 |
if not headers: |
124 |
headers = {} |
|
125 |
||
145
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
126 |
for version in versions: |
351
9301d4d85349
767 pkg client can't talk to repo at a path other than / on a server
johansen <johansen@sun.com>
parents:
342
diff
changeset
|
127 |
if base_uri[-1] != '/': |
9301d4d85349
767 pkg client can't talk to repo at a path other than / on a server
johansen <johansen@sun.com>
parents:
342
diff
changeset
|
128 |
base_uri += '/' |
9301d4d85349
767 pkg client can't talk to repo at a path other than / on a server
johansen <johansen@sun.com>
parents:
342
diff
changeset
|
129 |
|
145
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
130 |
if tail: |
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
131 |
uri = urlparse.urljoin(base_uri, "%s/%s/%s" % \ |
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
132 |
(operation, version, tail)) |
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
133 |
else: |
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
134 |
uri = urlparse.urljoin(base_uri, "%s/%s" % \ |
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
135 |
(operation, version)) |
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
136 |
|
319
39b8b5c538bf
1104 want custom user-agent string
Danek Duvall <danek.duvall@sun.com>
parents:
310
diff
changeset
|
137 |
headers["User-Agent"] = \ |
696
6bbfd2dece6f
4371 user-agent string needs to be different for different client front-ends
Danek Duvall <danek.duvall@sun.com>
parents:
670
diff
changeset
|
138 |
_client_version % (img_type_names[imgtype], |
6bbfd2dece6f
4371 user-agent string needs to be different for different client front-ends
Danek Duvall <danek.duvall@sun.com>
parents:
670
diff
changeset
|
139 |
global_settings.client_name) |
551 | 140 |
if uuid: |
141 |
headers["X-IPkg-UUID"] = uuid |
|
145
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
142 |
req = urllib2.Request(url = uri, headers = headers) |
556
1c3526ca7b9e
2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents:
551
diff
changeset
|
143 |
if method == "HEAD": |
1c3526ca7b9e
2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents:
551
diff
changeset
|
144 |
# Must override urllib2's get_method since it doesn't |
1c3526ca7b9e
2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents:
551
diff
changeset
|
145 |
# natively support this operation. |
1c3526ca7b9e
2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents:
551
diff
changeset
|
146 |
req.get_method = lambda: "HEAD" |
1c3526ca7b9e
2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents:
551
diff
changeset
|
147 |
elif data is not None: |
145
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
148 |
req.add_data(data) |
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
149 |
|
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
150 |
try: |
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
151 |
c = url_opener(req) |
153
05d90faecc40
Fix versioned_urlopen() to catch the right error, and catch URLError higher up.
Danek Duvall <danek.duvall@sun.com>
parents:
145
diff
changeset
|
152 |
except urllib2.HTTPError, e: |
386
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
153 |
if e.code != httplib.NOT_FOUND or \ |
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
154 |
e.msg != "Version not supported": |
145
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
155 |
raise |
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
156 |
continue |
260
a1b77322abb2
255 Symbolic HTTP response codes should be used
Shawn Walker <swalker@opensolaris.org>
parents:
181
diff
changeset
|
157 |
# XXX catch BadStatusLine and convert to INTERNAL_SERVER_ERROR? |
145
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
158 |
|
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
159 |
return c, version |
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
160 |
else: |
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
161 |
# Couldn't find a version that we liked. |
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
162 |
raise RuntimeError, \ |
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
163 |
"%s doesn't speak a known version of %s operation" % \ |
08bee7fd13f6
Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents:
119
diff
changeset
|
164 |
(base_uri, operation) |
327
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
165 |
|
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
166 |
|
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
167 |
_hostname_re = re.compile("^[a-zA-Z0-9](?:[a-zA-Z0-9\-]*[a-zA-Z0-9]+\.?)*$") |
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
168 |
_invalid_host_chars = re.compile(".*[^a-zA-Z0-9\-\.]+") |
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
169 |
_valid_proto = ["http", "https"] |
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
170 |
|
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
171 |
def valid_auth_prefix(prefix): |
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
172 |
"""Verify that the authority prefix only contains valid characters.""" |
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
173 |
|
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
174 |
# This is a workaround for the the hostname_re being slow when |
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
175 |
# it comes to finding invalid characters in the prefix string. |
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
176 |
|
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
177 |
if _invalid_host_chars.match(prefix): |
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
178 |
# prefix bad chars |
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
179 |
return False |
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
180 |
|
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
181 |
if _hostname_re.match(prefix): |
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
182 |
return True |
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
183 |
|
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
184 |
return False |
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
185 |
|
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
186 |
def valid_auth_url(url): |
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
187 |
"""Verify that the authority URL contains only valid characters.""" |
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
188 |
|
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
189 |
# First split the URL and check if the scheme is one we support |
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
190 |
o = urlparse.urlsplit(url) |
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
191 |
|
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
192 |
if not o[0] in _valid_proto: |
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
193 |
return False |
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
194 |
|
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
195 |
# Next verify that the network location is valid |
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
196 |
host, port = urllib.splitport(o[1]) |
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
197 |
|
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
198 |
if not host or _invalid_host_chars.match(host): |
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
199 |
return False |
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
200 |
|
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
201 |
if _hostname_re.match(host): |
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
202 |
return True |
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
203 |
|
6c6bd07efe8d
1031 authority prefix needs validation
johansen <johansen@sun.com>
parents:
319
diff
changeset
|
204 |
return False |
342
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
205 |
|
565
1fb4f05220b9
3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents:
556
diff
changeset
|
206 |
class FilelikeString(object): |
1fb4f05220b9
3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents:
556
diff
changeset
|
207 |
def __init__(self): |
1fb4f05220b9
3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents:
556
diff
changeset
|
208 |
self.buf = "" |
1fb4f05220b9
3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents:
556
diff
changeset
|
209 |
|
1fb4f05220b9
3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents:
556
diff
changeset
|
210 |
def write(self, o): |
1fb4f05220b9
3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents:
556
diff
changeset
|
211 |
self.buf += o |
1fb4f05220b9
3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents:
556
diff
changeset
|
212 |
|
342
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
213 |
def gunzip_from_stream(gz, outfile): |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
214 |
"""Decompress a gzipped input stream into an output stream. |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
215 |
|
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
216 |
The argument 'gz' is an input stream of a gzipped file (XXX make it do |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
217 |
either a gzipped file or raw zlib compressed data), and 'outfile' is is |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
218 |
an output stream. gunzip_from_stream() decompresses data from 'gz' and |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
219 |
writes it to 'outfile', and returns the hexadecimal SHA-1 sum of that |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
220 |
data. |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
221 |
""" |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
222 |
|
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
223 |
FHCRC = 2 |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
224 |
FEXTRA = 4 |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
225 |
FNAME = 8 |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
226 |
FCOMMENT = 16 |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
227 |
|
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
228 |
# Read the header |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
229 |
magic = gz.read(2) |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
230 |
if magic != "\037\213": |
621
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
231 |
raise zlib.error, "Not a gzipped file" |
342
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
232 |
method = ord(gz.read(1)) |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
233 |
if method != 8: |
621
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
234 |
raise zlib.error, "Unknown compression method" |
342
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
235 |
flag = ord(gz.read(1)) |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
236 |
gz.read(6) # Discard modtime, extraflag, os |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
237 |
|
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
238 |
# Discard an extra field |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
239 |
if flag & FEXTRA: |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
240 |
xlen = ord(gz.read(1)) |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
241 |
xlen = xlen + 256 * ord(gz.read(1)) |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
242 |
gz.read(xlen) |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
243 |
|
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
244 |
# Discard a null-terminated filename |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
245 |
if flag & FNAME: |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
246 |
while True: |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
247 |
s = gz.read(1) |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
248 |
if not s or s == "\000": |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
249 |
break |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
250 |
|
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
251 |
# Discard a null-terminated comment |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
252 |
if flag & FCOMMENT: |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
253 |
while True: |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
254 |
s = gz.read(1) |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
255 |
if not s or s == "\000": |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
256 |
break |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
257 |
|
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
258 |
# Discard a 16-bit CRC |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
259 |
if flag & FHCRC: |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
260 |
gz.read(2) |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
261 |
|
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
262 |
shasum = sha.new() |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
263 |
dcobj = zlib.decompressobj(-zlib.MAX_WBITS) |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
264 |
|
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
265 |
while True: |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
266 |
buf = gz.read(64 * 1024) |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
267 |
if buf == "": |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
268 |
ubuf = dcobj.flush() |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
269 |
shasum.update(ubuf) |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
270 |
outfile.write(ubuf) |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
271 |
break |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
272 |
ubuf = dcobj.decompress(buf) |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
273 |
shasum.update(ubuf) |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
274 |
outfile.write(ubuf) |
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
275 |
|
5e1f4d8429bf
669 Need method to print package licenses before installation
Danek Duvall <danek.duvall@sun.com>
parents:
327
diff
changeset
|
276 |
return shasum.hexdigest() |
384
9d4746e5dd3e
115 pkg needs to not have a cow on a SIGPIPE
Shawn Walker <swalker@opensolaris.org>
parents:
351
diff
changeset
|
277 |
|
9d4746e5dd3e
115 pkg needs to not have a cow on a SIGPIPE
Shawn Walker <swalker@opensolaris.org>
parents:
351
diff
changeset
|
278 |
class PipeError(Exception): |
9d4746e5dd3e
115 pkg needs to not have a cow on a SIGPIPE
Shawn Walker <swalker@opensolaris.org>
parents:
351
diff
changeset
|
279 |
""" Pipe exception. """ |
9d4746e5dd3e
115 pkg needs to not have a cow on a SIGPIPE
Shawn Walker <swalker@opensolaris.org>
parents:
351
diff
changeset
|
280 |
|
9d4746e5dd3e
115 pkg needs to not have a cow on a SIGPIPE
Shawn Walker <swalker@opensolaris.org>
parents:
351
diff
changeset
|
281 |
def __init__(self, args=None): |
9d4746e5dd3e
115 pkg needs to not have a cow on a SIGPIPE
Shawn Walker <swalker@opensolaris.org>
parents:
351
diff
changeset
|
282 |
self.args = args |
9d4746e5dd3e
115 pkg needs to not have a cow on a SIGPIPE
Shawn Walker <swalker@opensolaris.org>
parents:
351
diff
changeset
|
283 |
|
9d4746e5dd3e
115 pkg needs to not have a cow on a SIGPIPE
Shawn Walker <swalker@opensolaris.org>
parents:
351
diff
changeset
|
284 |
def msg(*text): |
429
6c9cbb6e6600
983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents:
409
diff
changeset
|
285 |
""" Emit a message. """ |
384
9d4746e5dd3e
115 pkg needs to not have a cow on a SIGPIPE
Shawn Walker <swalker@opensolaris.org>
parents:
351
diff
changeset
|
286 |
|
9d4746e5dd3e
115 pkg needs to not have a cow on a SIGPIPE
Shawn Walker <swalker@opensolaris.org>
parents:
351
diff
changeset
|
287 |
try: |
9d4746e5dd3e
115 pkg needs to not have a cow on a SIGPIPE
Shawn Walker <swalker@opensolaris.org>
parents:
351
diff
changeset
|
288 |
print ' '.join([str(l) for l in text]) |
9d4746e5dd3e
115 pkg needs to not have a cow on a SIGPIPE
Shawn Walker <swalker@opensolaris.org>
parents:
351
diff
changeset
|
289 |
except IOError, e: |
9d4746e5dd3e
115 pkg needs to not have a cow on a SIGPIPE
Shawn Walker <swalker@opensolaris.org>
parents:
351
diff
changeset
|
290 |
if e.errno == errno.EPIPE: |
9d4746e5dd3e
115 pkg needs to not have a cow on a SIGPIPE
Shawn Walker <swalker@opensolaris.org>
parents:
351
diff
changeset
|
291 |
raise PipeError, e |
9d4746e5dd3e
115 pkg needs to not have a cow on a SIGPIPE
Shawn Walker <swalker@opensolaris.org>
parents:
351
diff
changeset
|
292 |
raise |
9d4746e5dd3e
115 pkg needs to not have a cow on a SIGPIPE
Shawn Walker <swalker@opensolaris.org>
parents:
351
diff
changeset
|
293 |
|
9d4746e5dd3e
115 pkg needs to not have a cow on a SIGPIPE
Shawn Walker <swalker@opensolaris.org>
parents:
351
diff
changeset
|
294 |
def emsg(*text): |
429
6c9cbb6e6600
983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents:
409
diff
changeset
|
295 |
""" Emit a message to sys.stderr. """ |
384
9d4746e5dd3e
115 pkg needs to not have a cow on a SIGPIPE
Shawn Walker <swalker@opensolaris.org>
parents:
351
diff
changeset
|
296 |
|
9d4746e5dd3e
115 pkg needs to not have a cow on a SIGPIPE
Shawn Walker <swalker@opensolaris.org>
parents:
351
diff
changeset
|
297 |
try: |
9d4746e5dd3e
115 pkg needs to not have a cow on a SIGPIPE
Shawn Walker <swalker@opensolaris.org>
parents:
351
diff
changeset
|
298 |
print >> sys.stderr, ' '.join([str(l) for l in text]) |
9d4746e5dd3e
115 pkg needs to not have a cow on a SIGPIPE
Shawn Walker <swalker@opensolaris.org>
parents:
351
diff
changeset
|
299 |
except IOError, e: |
9d4746e5dd3e
115 pkg needs to not have a cow on a SIGPIPE
Shawn Walker <swalker@opensolaris.org>
parents:
351
diff
changeset
|
300 |
if e.errno == errno.EPIPE: |
9d4746e5dd3e
115 pkg needs to not have a cow on a SIGPIPE
Shawn Walker <swalker@opensolaris.org>
parents:
351
diff
changeset
|
301 |
raise PipeError, e |
9d4746e5dd3e
115 pkg needs to not have a cow on a SIGPIPE
Shawn Walker <swalker@opensolaris.org>
parents:
351
diff
changeset
|
302 |
raise |
9d4746e5dd3e
115 pkg needs to not have a cow on a SIGPIPE
Shawn Walker <swalker@opensolaris.org>
parents:
351
diff
changeset
|
303 |
|
791
123e9401e939
5778 Inability to set locale leads to stack trace
Danek Duvall <danek.duvall@sun.com>
parents:
779
diff
changeset
|
304 |
def setlocale(category, loc=None, printer=None): |
123e9401e939
5778 Inability to set locale leads to stack trace
Danek Duvall <danek.duvall@sun.com>
parents:
779
diff
changeset
|
305 |
"""Wraps locale.setlocale(), falling back to the C locale if the desired |
123e9401e939
5778 Inability to set locale leads to stack trace
Danek Duvall <danek.duvall@sun.com>
parents:
779
diff
changeset
|
306 |
locale is broken or unavailable. The 'printer' parameter should be a |
123e9401e939
5778 Inability to set locale leads to stack trace
Danek Duvall <danek.duvall@sun.com>
parents:
779
diff
changeset
|
307 |
function which takes a string and displays it. If 'None' (the default), |
123e9401e939
5778 Inability to set locale leads to stack trace
Danek Duvall <danek.duvall@sun.com>
parents:
779
diff
changeset
|
308 |
setlocale() will print the message to stderr.""" |
123e9401e939
5778 Inability to set locale leads to stack trace
Danek Duvall <danek.duvall@sun.com>
parents:
779
diff
changeset
|
309 |
|
123e9401e939
5778 Inability to set locale leads to stack trace
Danek Duvall <danek.duvall@sun.com>
parents:
779
diff
changeset
|
310 |
if printer is None: |
123e9401e939
5778 Inability to set locale leads to stack trace
Danek Duvall <danek.duvall@sun.com>
parents:
779
diff
changeset
|
311 |
printer = emsg |
123e9401e939
5778 Inability to set locale leads to stack trace
Danek Duvall <danek.duvall@sun.com>
parents:
779
diff
changeset
|
312 |
|
123e9401e939
5778 Inability to set locale leads to stack trace
Danek Duvall <danek.duvall@sun.com>
parents:
779
diff
changeset
|
313 |
try: |
123e9401e939
5778 Inability to set locale leads to stack trace
Danek Duvall <danek.duvall@sun.com>
parents:
779
diff
changeset
|
314 |
locale.setlocale(category, loc) |
123e9401e939
5778 Inability to set locale leads to stack trace
Danek Duvall <danek.duvall@sun.com>
parents:
779
diff
changeset
|
315 |
except locale.Error: |
123e9401e939
5778 Inability to set locale leads to stack trace
Danek Duvall <danek.duvall@sun.com>
parents:
779
diff
changeset
|
316 |
try: |
123e9401e939
5778 Inability to set locale leads to stack trace
Danek Duvall <danek.duvall@sun.com>
parents:
779
diff
changeset
|
317 |
dl = " '%s.%s'" % locale.getdefaultlocale() |
123e9401e939
5778 Inability to set locale leads to stack trace
Danek Duvall <danek.duvall@sun.com>
parents:
779
diff
changeset
|
318 |
except ValueError: |
123e9401e939
5778 Inability to set locale leads to stack trace
Danek Duvall <danek.duvall@sun.com>
parents:
779
diff
changeset
|
319 |
dl = "" |
123e9401e939
5778 Inability to set locale leads to stack trace
Danek Duvall <danek.duvall@sun.com>
parents:
779
diff
changeset
|
320 |
printer("Unable to set locale%s; locale package may be broken " |
123e9401e939
5778 Inability to set locale leads to stack trace
Danek Duvall <danek.duvall@sun.com>
parents:
779
diff
changeset
|
321 |
"or\nnot installed. Reverting to C locale." % dl) |
123e9401e939
5778 Inability to set locale leads to stack trace
Danek Duvall <danek.duvall@sun.com>
parents:
779
diff
changeset
|
322 |
locale.setlocale(category, "C") |
123e9401e939
5778 Inability to set locale leads to stack trace
Danek Duvall <danek.duvall@sun.com>
parents:
779
diff
changeset
|
323 |
|
386
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
324 |
def port_available(host, port): |
451
74f1fe85fe2d
1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents:
443
diff
changeset
|
325 |
"""Returns True if the indicated port is available to bind to; |
74f1fe85fe2d
1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents:
443
diff
changeset
|
326 |
otherwise returns False.""" |
386
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
327 |
|
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
328 |
port = int(port) |
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
329 |
if host is None: |
451
74f1fe85fe2d
1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents:
443
diff
changeset
|
330 |
# None is the same as INADDR_ANY, which for our purposes, |
74f1fe85fe2d
1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents:
443
diff
changeset
|
331 |
# should be the hostname. |
386
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
332 |
host = socket.gethostname() |
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
333 |
|
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
334 |
try: |
404
e5329e84b9a8
2331 depot command-line parsing errors cause traceback
Shawn Walker <swalker@opensolaris.org>
parents:
388
diff
changeset
|
335 |
sock = None |
e5329e84b9a8
2331 depot command-line parsing errors cause traceback
Shawn Walker <swalker@opensolaris.org>
parents:
388
diff
changeset
|
336 |
|
386
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
337 |
# Get the address family of our host (to allow for IPV6, etc.). |
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
338 |
for entry in socket.getaddrinfo(host, port, socket.AF_UNSPEC, |
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
339 |
socket.SOCK_STREAM): |
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
340 |
family, socktype, proto, canonname, sockaddr = entry |
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
341 |
|
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
342 |
# First try to bind to the specified port to see if we |
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
343 |
# have an access problem or some other issue. |
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
344 |
sock = socket.socket(family, socktype, proto) |
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
345 |
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, |
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
346 |
1) |
494
102fb5979716
2695 misc.port_available fails on Mac/OS due to EINVAL problem
Tom Mueller <Tom.Mueller@sun.com>
parents:
487
diff
changeset
|
347 |
sock.bind(sockaddr) |
386
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
348 |
sock.close() |
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
349 |
|
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
350 |
# Now try to connect to the specified port to see if it |
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
351 |
# is already in use. |
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
352 |
sock = socket.socket(family, socktype, proto) |
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
353 |
|
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
354 |
# Some systems timeout rather than refuse a connection. |
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
355 |
# This avoids getting stuck on SYN_SENT for those |
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
356 |
# systems (such as certain firewalls). |
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
357 |
sock.settimeout(1.0) |
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
358 |
|
494
102fb5979716
2695 misc.port_available fails on Mac/OS due to EINVAL problem
Tom Mueller <Tom.Mueller@sun.com>
parents:
487
diff
changeset
|
359 |
try: |
102fb5979716
2695 misc.port_available fails on Mac/OS due to EINVAL problem
Tom Mueller <Tom.Mueller@sun.com>
parents:
487
diff
changeset
|
360 |
sock.connect(sockaddr) |
102fb5979716
2695 misc.port_available fails on Mac/OS due to EINVAL problem
Tom Mueller <Tom.Mueller@sun.com>
parents:
487
diff
changeset
|
361 |
except socket.timeout: |
102fb5979716
2695 misc.port_available fails on Mac/OS due to EINVAL problem
Tom Mueller <Tom.Mueller@sun.com>
parents:
487
diff
changeset
|
362 |
# handle this at the next level |
102fb5979716
2695 misc.port_available fails on Mac/OS due to EINVAL problem
Tom Mueller <Tom.Mueller@sun.com>
parents:
487
diff
changeset
|
363 |
raise |
102fb5979716
2695 misc.port_available fails on Mac/OS due to EINVAL problem
Tom Mueller <Tom.Mueller@sun.com>
parents:
487
diff
changeset
|
364 |
except socket.error, e: |
102fb5979716
2695 misc.port_available fails on Mac/OS due to EINVAL problem
Tom Mueller <Tom.Mueller@sun.com>
parents:
487
diff
changeset
|
365 |
errnum = e[0] |
102fb5979716
2695 misc.port_available fails on Mac/OS due to EINVAL problem
Tom Mueller <Tom.Mueller@sun.com>
parents:
487
diff
changeset
|
366 |
if errnum != errno.EINVAL: |
102fb5979716
2695 misc.port_available fails on Mac/OS due to EINVAL problem
Tom Mueller <Tom.Mueller@sun.com>
parents:
487
diff
changeset
|
367 |
raise |
102fb5979716
2695 misc.port_available fails on Mac/OS due to EINVAL problem
Tom Mueller <Tom.Mueller@sun.com>
parents:
487
diff
changeset
|
368 |
# this BSD-based system has trouble with a |
102fb5979716
2695 misc.port_available fails on Mac/OS due to EINVAL problem
Tom Mueller <Tom.Mueller@sun.com>
parents:
487
diff
changeset
|
369 |
# non-blocking failed connect |
102fb5979716
2695 misc.port_available fails on Mac/OS due to EINVAL problem
Tom Mueller <Tom.Mueller@sun.com>
parents:
487
diff
changeset
|
370 |
sock.close() |
102fb5979716
2695 misc.port_available fails on Mac/OS due to EINVAL problem
Tom Mueller <Tom.Mueller@sun.com>
parents:
487
diff
changeset
|
371 |
sock = socket.socket(family, socktype, proto) |
102fb5979716
2695 misc.port_available fails on Mac/OS due to EINVAL problem
Tom Mueller <Tom.Mueller@sun.com>
parents:
487
diff
changeset
|
372 |
sock.connect(sockaddr) |
102fb5979716
2695 misc.port_available fails on Mac/OS due to EINVAL problem
Tom Mueller <Tom.Mueller@sun.com>
parents:
487
diff
changeset
|
373 |
|
386
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
374 |
sock.close() |
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
375 |
|
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
376 |
# If we successfully connected... |
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
377 |
raise socket.error(errno.EBUSY, |
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
378 |
'Port already in use') |
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
379 |
|
494
102fb5979716
2695 misc.port_available fails on Mac/OS due to EINVAL problem
Tom Mueller <Tom.Mueller@sun.com>
parents:
487
diff
changeset
|
380 |
except socket.timeout, t: |
102fb5979716
2695 misc.port_available fails on Mac/OS due to EINVAL problem
Tom Mueller <Tom.Mueller@sun.com>
parents:
487
diff
changeset
|
381 |
return True, None |
102fb5979716
2695 misc.port_available fails on Mac/OS due to EINVAL problem
Tom Mueller <Tom.Mueller@sun.com>
parents:
487
diff
changeset
|
382 |
|
386
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
383 |
except socket.error, e: |
404
e5329e84b9a8
2331 depot command-line parsing errors cause traceback
Shawn Walker <swalker@opensolaris.org>
parents:
388
diff
changeset
|
384 |
errnum = e[0] |
e5329e84b9a8
2331 depot command-line parsing errors cause traceback
Shawn Walker <swalker@opensolaris.org>
parents:
388
diff
changeset
|
385 |
try: |
451
74f1fe85fe2d
1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents:
443
diff
changeset
|
386 |
text = e[1] |
404
e5329e84b9a8
2331 depot command-line parsing errors cause traceback
Shawn Walker <swalker@opensolaris.org>
parents:
388
diff
changeset
|
387 |
except IndexError: |
451
74f1fe85fe2d
1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents:
443
diff
changeset
|
388 |
text = e[0] |
386
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
389 |
|
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
390 |
if sock: |
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
391 |
sock.close() |
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
392 |
|
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
393 |
if errnum == errno.ECONNREFUSED: |
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
394 |
# If we could not connect to the port, we know it isn't |
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
395 |
# in use. |
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
396 |
return True, None |
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
397 |
|
451
74f1fe85fe2d
1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents:
443
diff
changeset
|
398 |
return False, text |
74f1fe85fe2d
1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents:
443
diff
changeset
|
399 |
|
74f1fe85fe2d
1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents:
443
diff
changeset
|
400 |
def bytes_to_str(bytes): |
74f1fe85fe2d
1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents:
443
diff
changeset
|
401 |
"""Returns a human-formatted string representing the number of bytes |
74f1fe85fe2d
1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents:
443
diff
changeset
|
402 |
in the largest unit possible.""" |
74f1fe85fe2d
1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents:
443
diff
changeset
|
403 |
|
74f1fe85fe2d
1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents:
443
diff
changeset
|
404 |
units = [ |
660
ea2809ad4582
4126 I10n update for IPS CLI PM and UM
John Rice <john.rice@sun.com>
parents:
641
diff
changeset
|
405 |
(_("B"), 2**10), |
ea2809ad4582
4126 I10n update for IPS CLI PM and UM
John Rice <john.rice@sun.com>
parents:
641
diff
changeset
|
406 |
(_("kB"), 2**20), |
ea2809ad4582
4126 I10n update for IPS CLI PM and UM
John Rice <john.rice@sun.com>
parents:
641
diff
changeset
|
407 |
(_("MB"), 2**30), |
ea2809ad4582
4126 I10n update for IPS CLI PM and UM
John Rice <john.rice@sun.com>
parents:
641
diff
changeset
|
408 |
(_("GB"), 2**40), |
ea2809ad4582
4126 I10n update for IPS CLI PM and UM
John Rice <john.rice@sun.com>
parents:
641
diff
changeset
|
409 |
(_("TB"), 2**50), |
ea2809ad4582
4126 I10n update for IPS CLI PM and UM
John Rice <john.rice@sun.com>
parents:
641
diff
changeset
|
410 |
(_("PB"), 2**60), |
ea2809ad4582
4126 I10n update for IPS CLI PM and UM
John Rice <john.rice@sun.com>
parents:
641
diff
changeset
|
411 |
(_("EB"), 2**70) |
451
74f1fe85fe2d
1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents:
443
diff
changeset
|
412 |
] |
386
5cd680466abe
2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents:
384
diff
changeset
|
413 |
|
451
74f1fe85fe2d
1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents:
443
diff
changeset
|
414 |
for uom, limit in units: |
660
ea2809ad4582
4126 I10n update for IPS CLI PM and UM
John Rice <john.rice@sun.com>
parents:
641
diff
changeset
|
415 |
if uom != _("EB") and bytes >= limit: |
451
74f1fe85fe2d
1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents:
443
diff
changeset
|
416 |
# Try the next largest unit of measure unless this is |
74f1fe85fe2d
1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents:
443
diff
changeset
|
417 |
# the largest or if the byte size is within the current |
74f1fe85fe2d
1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents:
443
diff
changeset
|
418 |
# unit of measure's range. |
74f1fe85fe2d
1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents:
443
diff
changeset
|
419 |
continue |
74f1fe85fe2d
1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents:
443
diff
changeset
|
420 |
else: |
74f1fe85fe2d
1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents:
443
diff
changeset
|
421 |
return "%.2f %s" % (round(bytes / float( |
74f1fe85fe2d
1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents:
443
diff
changeset
|
422 |
limit / 2**10), 2), uom) |
74f1fe85fe2d
1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents:
443
diff
changeset
|
423 |
|
74f1fe85fe2d
1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents:
443
diff
changeset
|
424 |
def get_rel_path(request, uri): |
74f1fe85fe2d
1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents:
443
diff
changeset
|
425 |
# Calculate the depth of the current request path relative to our base |
74f1fe85fe2d
1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents:
443
diff
changeset
|
426 |
# uri. path_info always ends with a '/' -- so ignore it when |
74f1fe85fe2d
1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents:
443
diff
changeset
|
427 |
# calculating depth. |
74f1fe85fe2d
1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents:
443
diff
changeset
|
428 |
depth = request.path_info.count("/") - 1 |
74f1fe85fe2d
1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents:
443
diff
changeset
|
429 |
return ("../" * depth) + uri |
74f1fe85fe2d
1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents:
443
diff
changeset
|
430 |
|
487
9cb85c3d8491
2556 client should measure download progress by compressed size
johansen <johansen@sun.com>
parents:
462
diff
changeset
|
431 |
def get_pkg_otw_size(action): |
9cb85c3d8491
2556 client should measure download progress by compressed size
johansen <johansen@sun.com>
parents:
462
diff
changeset
|
432 |
"""Takes a file action and returns the over-the-wire size of |
9cb85c3d8491
2556 client should measure download progress by compressed size
johansen <johansen@sun.com>
parents:
462
diff
changeset
|
433 |
a package as an integer. The OTW size is the compressed size, |
9cb85c3d8491
2556 client should measure download progress by compressed size
johansen <johansen@sun.com>
parents:
462
diff
changeset
|
434 |
pkg.csize. If that value isn't available, it returns pkg.size. |
9cb85c3d8491
2556 client should measure download progress by compressed size
johansen <johansen@sun.com>
parents:
462
diff
changeset
|
435 |
If pkg.size isn't available, return zero.""" |
9cb85c3d8491
2556 client should measure download progress by compressed size
johansen <johansen@sun.com>
parents:
462
diff
changeset
|
436 |
|
9cb85c3d8491
2556 client should measure download progress by compressed size
johansen <johansen@sun.com>
parents:
462
diff
changeset
|
437 |
size = action.attrs.get("pkg.csize", 0) |
9cb85c3d8491
2556 client should measure download progress by compressed size
johansen <johansen@sun.com>
parents:
462
diff
changeset
|
438 |
if size == 0: |
9cb85c3d8491
2556 client should measure download progress by compressed size
johansen <johansen@sun.com>
parents:
462
diff
changeset
|
439 |
size = action.attrs.get("pkg.size", 0) |
9cb85c3d8491
2556 client should measure download progress by compressed size
johansen <johansen@sun.com>
parents:
462
diff
changeset
|
440 |
|
9cb85c3d8491
2556 client should measure download progress by compressed size
johansen <johansen@sun.com>
parents:
462
diff
changeset
|
441 |
return int(size) |
9cb85c3d8491
2556 client should measure download progress by compressed size
johansen <johansen@sun.com>
parents:
462
diff
changeset
|
442 |
|
770
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
443 |
def get_inventory_list(image, pargs, all_known, all_versions): |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
444 |
most_recent = {} |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
445 |
installed = [] |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
446 |
res = image.inventory(pargs, all_known) |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
447 |
# All_Versions reduces the output so that only the most recent |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
448 |
# version and installed version of packages appear. |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
449 |
if all_versions: |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
450 |
for pfmri, state in res: |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
451 |
if state["state"] == "installed": |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
452 |
installed.append((pfmri, state)) |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
453 |
hv = pfmri.get_pkg_stem(include_pkg=False) |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
454 |
if hv in most_recent: |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
455 |
stored_pfmri, stored_state = \ |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
456 |
most_recent[hv] |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
457 |
if pfmri.is_successor(stored_pfmri): |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
458 |
most_recent[hv] = (pfmri, state) |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
459 |
else: |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
460 |
most_recent[hv] = (pfmri, state) |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
461 |
res = installed + most_recent.values() |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
462 |
|
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
463 |
# This method is necessary because fmri.__cmp__ does |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
464 |
# not provide the desired ordering. It uses the same |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
465 |
# ordering on package names as fmri.__cmp__ but it |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
466 |
# reverse sorts on version, so that 98 comes before 97. |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
467 |
# Also, authorities are taken into account so that |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
468 |
# preferred authorities come before others. Finally, |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
469 |
# authorties are presented in alphabetical order. |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
470 |
def __fmri_cmp((f1, s1), (f2, s2)): |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
471 |
t = cmp(f1.pkg_name, f2.pkg_name) |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
472 |
if t != 0: |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
473 |
return t |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
474 |
t = cmp(f2, f1) |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
475 |
if t != 0: |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
476 |
return t |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
477 |
if f1.preferred_authority(): |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
478 |
return -1 |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
479 |
if f2.preferred_authority(): |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
480 |
return 1 |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
481 |
return cmp(f1.get_authority(), |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
482 |
f2.get_authority()) |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
483 |
|
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
484 |
res.sort(cmp=__fmri_cmp) |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
485 |
return res |
51cc59540c42
4341 IPS GUI and CLI list different status for some packages
Michal Pryc <Michal.Pryc@Sun.Com>
parents:
742
diff
changeset
|
486 |
|
835
34ec4401dc48
686 Client needs a way to tell that a response is actually from an IPS server
johansen <johansen@sun.com>
parents:
814
diff
changeset
|
487 |
class CfgCacheError(Exception): |
34ec4401dc48
686 Client needs a way to tell that a response is actually from an IPS server
johansen <johansen@sun.com>
parents:
814
diff
changeset
|
488 |
"""Thrown when there are errors with the cfg cache.""" |
34ec4401dc48
686 Client needs a way to tell that a response is actually from an IPS server
johansen <johansen@sun.com>
parents:
814
diff
changeset
|
489 |
def __init__(self, args=None): |
34ec4401dc48
686 Client needs a way to tell that a response is actually from an IPS server
johansen <johansen@sun.com>
parents:
814
diff
changeset
|
490 |
self.args = args |
34ec4401dc48
686 Client needs a way to tell that a response is actually from an IPS server
johansen <johansen@sun.com>
parents:
814
diff
changeset
|
491 |
|
576
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
492 |
class TransportException(Exception): |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
493 |
""" Abstract base class for various transport exceptions """ |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
494 |
def __init__(self): |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
495 |
self.count = 1 |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
496 |
|
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
497 |
class TransportFailures(TransportException): |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
498 |
""" This exception encapsulates multiple transport exceptions """ |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
499 |
|
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
500 |
# |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
501 |
# This class is a subclass of TransportException so that calling |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
502 |
# code can reasonably 'except TransportException' and get either |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
503 |
# a single-valued or in this case a multi-valued instance. |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
504 |
# |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
505 |
def __init__(self): |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
506 |
TransportException.__init__(self) |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
507 |
self.exceptions = [] |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
508 |
|
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
509 |
def append(self, exc): |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
510 |
assert isinstance(exc, TransportException) |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
511 |
for x in self.exceptions: |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
512 |
if cmp(x, exc) == 0: |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
513 |
x.count += 1 |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
514 |
return |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
515 |
|
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
516 |
self.exceptions.append(exc) |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
517 |
|
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
518 |
def __str__(self): |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
519 |
if len(self.exceptions) == 0: |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
520 |
return "[no errors accumulated]" |
388
5a08791fb814
2188 Client must fail gracefully when network timeout occurs
johansen <johansen@sun.com>
parents:
386
diff
changeset
|
521 |
|
576
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
522 |
s = "" |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
523 |
for i, x in enumerate(self.exceptions): |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
524 |
if len(self.exceptions) > 1: |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
525 |
s += "%d: " % (i + 1) |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
526 |
s += str(x) |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
527 |
if x.count > 1: |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
528 |
s += " (happened %d times)" % x.count |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
529 |
s += "\n" |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
530 |
return s |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
531 |
|
835
34ec4401dc48
686 Client needs a way to tell that a response is actually from an IPS server
johansen <johansen@sun.com>
parents:
814
diff
changeset
|
532 |
def __len__(self): |
34ec4401dc48
686 Client needs a way to tell that a response is actually from an IPS server
johansen <johansen@sun.com>
parents:
814
diff
changeset
|
533 |
return len(self.exceptions) |
34ec4401dc48
686 Client needs a way to tell that a response is actually from an IPS server
johansen <johansen@sun.com>
parents:
814
diff
changeset
|
534 |
|
670
2785b97791ed
4400 Remove redundant transport error handling logic
johansen <johansen@sun.com>
parents:
660
diff
changeset
|
535 |
class TransferIOException(TransportException): |
2785b97791ed
4400 Remove redundant transport error handling logic
johansen <johansen@sun.com>
parents:
660
diff
changeset
|
536 |
"""Raised for retryable IO errors on underlying transport. |
2785b97791ed
4400 Remove redundant transport error handling logic
johansen <johansen@sun.com>
parents:
660
diff
changeset
|
537 |
Protocol errors are TransferContentExceptions, timeouts |
2785b97791ed
4400 Remove redundant transport error handling logic
johansen <johansen@sun.com>
parents:
660
diff
changeset
|
538 |
are TransferTimedOutExceptions.""" |
2785b97791ed
4400 Remove redundant transport error handling logic
johansen <johansen@sun.com>
parents:
660
diff
changeset
|
539 |
def __init__(self, url, reason=None): |
2785b97791ed
4400 Remove redundant transport error handling logic
johansen <johansen@sun.com>
parents:
660
diff
changeset
|
540 |
TransportException.__init__(self) |
2785b97791ed
4400 Remove redundant transport error handling logic
johansen <johansen@sun.com>
parents:
660
diff
changeset
|
541 |
self.url = url |
2785b97791ed
4400 Remove redundant transport error handling logic
johansen <johansen@sun.com>
parents:
660
diff
changeset
|
542 |
self.reason = reason |
2785b97791ed
4400 Remove redundant transport error handling logic
johansen <johansen@sun.com>
parents:
660
diff
changeset
|
543 |
|
2785b97791ed
4400 Remove redundant transport error handling logic
johansen <johansen@sun.com>
parents:
660
diff
changeset
|
544 |
def __str__(self): |
2785b97791ed
4400 Remove redundant transport error handling logic
johansen <johansen@sun.com>
parents:
660
diff
changeset
|
545 |
s = "IO Error while communicating with '%s'" % self.url |
2785b97791ed
4400 Remove redundant transport error handling logic
johansen <johansen@sun.com>
parents:
660
diff
changeset
|
546 |
if self.reason: |
2785b97791ed
4400 Remove redundant transport error handling logic
johansen <johansen@sun.com>
parents:
660
diff
changeset
|
547 |
s += ": %s" % self.reason |
2785b97791ed
4400 Remove redundant transport error handling logic
johansen <johansen@sun.com>
parents:
660
diff
changeset
|
548 |
s += "." |
2785b97791ed
4400 Remove redundant transport error handling logic
johansen <johansen@sun.com>
parents:
660
diff
changeset
|
549 |
return s |
2785b97791ed
4400 Remove redundant transport error handling logic
johansen <johansen@sun.com>
parents:
660
diff
changeset
|
550 |
|
2785b97791ed
4400 Remove redundant transport error handling logic
johansen <johansen@sun.com>
parents:
660
diff
changeset
|
551 |
def __cmp__(self, other): |
2785b97791ed
4400 Remove redundant transport error handling logic
johansen <johansen@sun.com>
parents:
660
diff
changeset
|
552 |
if not isinstance(other, TransferIOException): |
2785b97791ed
4400 Remove redundant transport error handling logic
johansen <johansen@sun.com>
parents:
660
diff
changeset
|
553 |
return -1 |
2785b97791ed
4400 Remove redundant transport error handling logic
johansen <johansen@sun.com>
parents:
660
diff
changeset
|
554 |
r = cmp(self.url, other.url) |
2785b97791ed
4400 Remove redundant transport error handling logic
johansen <johansen@sun.com>
parents:
660
diff
changeset
|
555 |
if r != 0: |
2785b97791ed
4400 Remove redundant transport error handling logic
johansen <johansen@sun.com>
parents:
660
diff
changeset
|
556 |
return r |
2785b97791ed
4400 Remove redundant transport error handling logic
johansen <johansen@sun.com>
parents:
660
diff
changeset
|
557 |
return cmp(self.reason, other.reason) |
576
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
558 |
|
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
559 |
class TransferTimedOutException(TransportException): |
621
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
560 |
"""Raised when the transfer times out, or is terminated with a |
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
561 |
retryable error.""" |
576
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
562 |
def __init__(self, url, reason=None): |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
563 |
TransportException.__init__(self) |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
564 |
self.url = url |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
565 |
self.reason = reason |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
566 |
|
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
567 |
def __str__(self): |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
568 |
s = "Transfer from '%s' timed out" % self.url |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
569 |
if self.reason: |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
570 |
s += ": %s" % self.reason |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
571 |
s += "." |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
572 |
return s |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
573 |
|
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
574 |
def __cmp__(self, other): |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
575 |
if not isinstance(other, TransferTimedOutException): |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
576 |
return -1 |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
577 |
r = cmp(self.url, other.url) |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
578 |
if r != 0: |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
579 |
return r |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
580 |
return cmp(self.reason, other.reason) |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
581 |
|
429
6c9cbb6e6600
983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents:
409
diff
changeset
|
582 |
|
518
1d9021e9f558
2584 pkg needs to handle proxy error
johansen <johansen@sun.com>
parents:
494
diff
changeset
|
583 |
# Retryable http errors. These are the HTTP errors that we'll catch. When we |
1d9021e9f558
2584 pkg needs to handle proxy error
johansen <johansen@sun.com>
parents:
494
diff
changeset
|
584 |
# catch them, we throw a TransferTimedOutException instead re-raising the |
1d9021e9f558
2584 pkg needs to handle proxy error
johansen <johansen@sun.com>
parents:
494
diff
changeset
|
585 |
# HTTPError and letting some other handler catch it. |
1d9021e9f558
2584 pkg needs to handle proxy error
johansen <johansen@sun.com>
parents:
494
diff
changeset
|
586 |
|
576
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
587 |
# XXX consider moving to pkg.client module |
518
1d9021e9f558
2584 pkg needs to handle proxy error
johansen <johansen@sun.com>
parents:
494
diff
changeset
|
588 |
retryable_http_errors = set((httplib.REQUEST_TIMEOUT, httplib.BAD_GATEWAY, |
1d9021e9f558
2584 pkg needs to handle proxy error
johansen <johansen@sun.com>
parents:
494
diff
changeset
|
589 |
httplib.GATEWAY_TIMEOUT)) |
621
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
590 |
retryable_socket_errors = set((errno.ECONNABORTED, errno.ECONNRESET, |
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
591 |
errno.ECONNREFUSED)) |
518
1d9021e9f558
2584 pkg needs to handle proxy error
johansen <johansen@sun.com>
parents:
494
diff
changeset
|
592 |
|
1d9021e9f558
2584 pkg needs to handle proxy error
johansen <johansen@sun.com>
parents:
494
diff
changeset
|
593 |
|
576
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
594 |
class TransferContentException(TransportException): |
621
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
595 |
"""Raised when there are problems downloading the requested content.""" |
576
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
596 |
def __init__(self, url, reason=None): |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
597 |
TransportException.__init__(self) |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
598 |
self.url = url |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
599 |
self.reason = reason |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
600 |
|
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
601 |
def __str__(self): |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
602 |
s = "Transfer from '%s' failed" % self.url |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
603 |
if self.reason: |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
604 |
s += ": %s" % self.reason |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
605 |
s += "." |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
606 |
return s |
461
37cf3ac75e37
1018 actions with payloads should include all sizes and hashes
johansen <johansen@sun.com>
parents:
451
diff
changeset
|
607 |
|
576
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
608 |
def __cmp__(self, other): |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
609 |
if not isinstance(other, TransferContentException): |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
610 |
return -1 |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
611 |
r = cmp(self.url, other.url) |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
612 |
if r != 0: |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
613 |
return r |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
614 |
return cmp(self.reason, other.reason) |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
615 |
|
621
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
616 |
class TruncatedTransferException(TransportException): |
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
617 |
"""Raised when the transfer that was received doesn't match the |
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
618 |
expected length.""" |
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
619 |
def __init__(self, url, recd=-1, expected=-1): |
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
620 |
TransportException.__init__(self) |
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
621 |
self.url = url |
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
622 |
self.recd = recd |
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
623 |
self.expected = expected |
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
624 |
|
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
625 |
def __str__(self): |
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
626 |
s = "Transfer from '%s' unexpectedly terminated" % self.url |
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
627 |
if self.recd > -1 and self.expected > -1: |
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
628 |
s += ": received %d of %d bytes" % (self.recd, |
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
629 |
self.expected) |
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
630 |
s += "." |
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
631 |
return s |
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
632 |
|
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
633 |
def __cmp__(self, other): |
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
634 |
if not isinstance(other, TruncatedTransferException): |
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
635 |
return -1 |
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
636 |
r = cmp(self.url, other.url) |
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
637 |
if r != 0: |
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
638 |
return r |
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
639 |
r = cmp(self.expected, other.expected) |
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
640 |
if r != 0: |
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
641 |
return r |
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
642 |
return cmp(self.recd, other.recd) |
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
643 |
|
576
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
644 |
|
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
645 |
class InvalidContentException(TransportException): |
621
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
646 |
"""Raised when the content's hash/chash doesn't verify, or the |
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
647 |
content is received in an unreadable format.""" |
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
648 |
def __init__(self, path, data): |
576
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
649 |
TransportException.__init__(self) |
621
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
650 |
self.path = path |
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
651 |
self.data = data |
461
37cf3ac75e37
1018 actions with payloads should include all sizes and hashes
johansen <johansen@sun.com>
parents:
451
diff
changeset
|
652 |
|
37cf3ac75e37
1018 actions with payloads should include all sizes and hashes
johansen <johansen@sun.com>
parents:
451
diff
changeset
|
653 |
def __str__(self): |
621
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
654 |
s = "Invalid content for action with path %s" % self.path |
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
655 |
if self.data: |
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
656 |
s += " %s." % self.data |
576
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
657 |
return s |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
658 |
|
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
659 |
def __cmp__(self, other): |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
660 |
if not isinstance(other, InvalidContentException): |
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
661 |
return -1 |
621
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
662 |
r = cmp(self.path, other.path) |
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
663 |
if r != 0: |
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
664 |
return r |
6c144915eed1
551 IPS should handle socket errors
johansen <johansen@sun.com>
parents:
576
diff
changeset
|
665 |
return cmp(self.data, other.data) |
576
6ee6de304041
3777 PKG_TIMEOUT_MAX is a placebo setting
Dan Price <dp@eng.sun.com>
parents:
565
diff
changeset
|
666 |
|
429
6c9cbb6e6600
983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents:
409
diff
changeset
|
667 |
# Default maximum memory useage during indexing |
6c9cbb6e6600
983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents:
409
diff
changeset
|
668 |
# This is a soft cap since memory usage is estimated. |
6c9cbb6e6600
983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents:
409
diff
changeset
|
669 |
try: |
6c9cbb6e6600
983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents:
409
diff
changeset
|
670 |
phys_pages = os.sysconf("SC_PHYS_PAGES") |
6c9cbb6e6600
983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents:
409
diff
changeset
|
671 |
page_size = os.sysconf("SC_PAGE_SIZE") |
6c9cbb6e6600
983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents:
409
diff
changeset
|
672 |
SERVER_DEFAULT_MEM_USE_KB = (phys_pages / 1024.0) * page_size / 3 |
6c9cbb6e6600
983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents:
409
diff
changeset
|
673 |
CLIENT_DEFAULT_MEM_USE_KB = SERVER_DEFAULT_MEM_USE_KB / 2.0 |
565
1fb4f05220b9
3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents:
556
diff
changeset
|
674 |
except KeyboardInterrupt: |
1fb4f05220b9
3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents:
556
diff
changeset
|
675 |
raise |
429
6c9cbb6e6600
983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents:
409
diff
changeset
|
676 |
except: |
6c9cbb6e6600
983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents:
409
diff
changeset
|
677 |
CLIENT_DEFAULT_MEM_USE_KB = 100 |
6c9cbb6e6600
983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents:
409
diff
changeset
|
678 |
SERVER_DEFAULT_MEM_USE_KB = 500 |
838
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
679 |
|
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
680 |
# ImmutableDict and EmptyI for argument defaults |
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
681 |
EmptyI = tuple() |
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
682 |
|
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
683 |
class ImmutableDict(dict): |
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
684 |
def __init__(self, default=EmptyI): |
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
685 |
dict.__init__(self, default) |
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
686 |
|
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
687 |
def __setitem__(self, item, value): |
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
688 |
self.__oops() |
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
689 |
|
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
690 |
def __delitem__(self, item, value): |
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
691 |
self.__oops() |
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
692 |
|
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
693 |
def pop(self, item, default=None): |
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
694 |
self.__oops() |
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
695 |
|
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
696 |
def popitem(self): |
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
697 |
self.__oops() |
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
698 |
|
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
699 |
def setdefault(self, item, default=None): |
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
700 |
self.__oops() |
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
701 |
|
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
702 |
def update(self, d): |
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
703 |
self.__oops() |
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
704 |
|
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
705 |
def copy(self): |
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
706 |
return ImmutableDict() |
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
707 |
|
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
708 |
def clear(self): |
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
709 |
self.__oops() |
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
710 |
|
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
711 |
def __oops(self): |
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
712 |
raise TypeError, "Item assignment to ImmutableDict" |
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
713 |
|
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
714 |
EmptyDict = ImmutableDict() |
aafbe4737188
3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
835
diff
changeset
|
715 |