author | Stephen Hahn <sch@Sun.COM> |
Mon, 08 Oct 2007 13:18:41 -0700 | |
changeset 135 | a1e20e9a9845 |
parent 102 | 613f3d9bef66 |
child 145 | 08bee7fd13f6 |
permissions | -rw-r--r-- |
28
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
1 |
#!/usr/bin/python |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
2 |
# |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
3 |
# CDDL HEADER START |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
4 |
# |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
5 |
# The contents of this file are subject to the terms of the |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
6 |
# Common Development and Distribution License (the "License"). |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
7 |
# You may not use this file except in compliance with the License. |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
8 |
# |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
9 |
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
10 |
# or http://www.opensolaris.org/os/licensing. |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
11 |
# See the License for the specific language governing permissions |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
12 |
# and limitations under the License. |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
13 |
# |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
14 |
# When distributing Covered Code, include this CDDL HEADER in each |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
15 |
# file and include the License file at usr/src/OPENSOLARIS.LICENSE. |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
16 |
# If applicable, add the following below this CDDL HEADER, with the |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
17 |
# fields enclosed by brackets "[]" replaced with your own identifying |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
18 |
# information: Portions Copyright [yyyy] [name of copyright owner] |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
19 |
# |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
20 |
# CDDL HEADER END |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
21 |
# |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
22 |
|
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
23 |
# |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
24 |
# Copyright 2007 Sun Microsystems, Inc. All rights reserved. |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
25 |
# Use is subject to license terms. |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
26 |
# |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
27 |
|
38
52e6547130fa
add support for bundle publishing
Danek Duvall <danek.duvall@sun.com>
parents:
33
diff
changeset
|
28 |
# We use urllib2 for GET and POST operations, but httplib for PUT and DELETE |
52e6547130fa
add support for bundle publishing
Danek Duvall <danek.duvall@sun.com>
parents:
33
diff
changeset
|
29 |
# operations. |
52e6547130fa
add support for bundle publishing
Danek Duvall <danek.duvall@sun.com>
parents:
33
diff
changeset
|
30 |
|
28
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
31 |
import httplib |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
32 |
import os |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
33 |
import urllib |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
34 |
import urllib2 |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
35 |
import urlparse |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
36 |
|
49
c3a70bdc4527
First cut of actions; make file transfer generic.
Danek Duvall <danek.duvall@sun.com>
parents:
44
diff
changeset
|
37 |
import pkg.actions |
c3a70bdc4527
First cut of actions; make file transfer generic.
Danek Duvall <danek.duvall@sun.com>
parents:
44
diff
changeset
|
38 |
|
28
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
39 |
class Transaction(object): |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
40 |
|
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
41 |
def __init__(self): |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
42 |
self.cfg = None |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
43 |
self.pkg_name = "" |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
44 |
return |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
45 |
|
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
46 |
# XXX This opens a Transaction, but who manages the server connection? |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
47 |
# If we want a pipelined HTTP session (multiple operations -- even if |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
48 |
# it's only one Transaction -- over a single connection), then we can't |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
49 |
# call HTTPConnection.close() here, and we shouldn't reopen the |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
50 |
# connection in Transaction.add(), Transaction.close(), etc. |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
51 |
def open(self, config, pkg_name): |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
52 |
self.cfg = config |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
53 |
self.pkg_name = pkg_name |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
54 |
|
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
55 |
repo = self.cfg.install_uri |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
56 |
uri_exp = urlparse.urlparse(repo) |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
57 |
host, port = uri_exp[1].split(":") |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
58 |
|
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
59 |
c = httplib.HTTPConnection(host, port) |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
60 |
c.connect() |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
61 |
c.putrequest("GET", "/open/%s" % |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
62 |
urllib.quote(self.pkg_name, "")) |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
63 |
c.putheader("Client-Release", os.uname()[2]) |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
64 |
c.endheaders() |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
65 |
|
56
3aafccb973e1
Deal sanely with server failure in a couple more places
Danek Duvall <danek.duvall@sun.com>
parents:
51
diff
changeset
|
66 |
try: |
3aafccb973e1
Deal sanely with server failure in a couple more places
Danek Duvall <danek.duvall@sun.com>
parents:
51
diff
changeset
|
67 |
r = c.getresponse() |
3aafccb973e1
Deal sanely with server failure in a couple more places
Danek Duvall <danek.duvall@sun.com>
parents:
51
diff
changeset
|
68 |
except httplib.BadStatusLine: |
3aafccb973e1
Deal sanely with server failure in a couple more places
Danek Duvall <danek.duvall@sun.com>
parents:
51
diff
changeset
|
69 |
return 500, None |
28
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
70 |
|
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
71 |
id = r.getheader("Transaction-ID", None) |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
72 |
|
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
73 |
return r.status, id |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
74 |
|
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
75 |
# XXX shouldn't need to pass trans_id or config in, as it ought to |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
76 |
# be part of self. But currently, the front-end is stateless |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
77 |
# across individual transaction elements, so we need to carry this |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
78 |
# around. |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
79 |
def close(self, config, trans_id, abandon=False): |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
80 |
op = "close" |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
81 |
if abandon: |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
82 |
op = "abandon" |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
83 |
|
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
84 |
repo = config.install_uri |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
85 |
uri = urlparse.urljoin(repo, "%s/%s" % (op, trans_id)) |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
86 |
try: |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
87 |
c = urllib2.urlopen(uri) |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
88 |
except urllib2.HTTPError: |
57
ff73d39deeb7
Add a driver action (install only, for now). This requires (and thus
Danek Duvall <danek.duvall@sun.com>
parents:
56
diff
changeset
|
89 |
return 500, None |
56
3aafccb973e1
Deal sanely with server failure in a couple more places
Danek Duvall <danek.duvall@sun.com>
parents:
51
diff
changeset
|
90 |
except httplib.BadStatusLine: |
57
ff73d39deeb7
Add a driver action (install only, for now). This requires (and thus
Danek Duvall <danek.duvall@sun.com>
parents:
56
diff
changeset
|
91 |
return 500, None |
28
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
92 |
|
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
93 |
if abandon: |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
94 |
return c.code, None |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
95 |
|
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
96 |
# Return only the headers the client should care about. |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
97 |
# XXX is there any reason to try/except KeyError here? |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
98 |
ret_hdrs = ["State", "Package-FMRI"] |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
99 |
return c.code, dict((h, c.info()[h]) for h in ret_hdrs) |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
100 |
|
49
c3a70bdc4527
First cut of actions; make file transfer generic.
Danek Duvall <danek.duvall@sun.com>
parents:
44
diff
changeset
|
101 |
def add(self, config, trans_id, action): |
30 | 102 |
"""POST the file contents to the transaction. Default is to |
103 |
post to the currently open content series. -s option selects a |
|
104 |
different series. |
|
28
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
105 |
|
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
106 |
dir mode owner group path [n=v ...] |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
107 |
file mode owner group path [n=v ...] |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
108 |
displace mode owner group path [n=v ...] |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
109 |
preserve mode owner group path [n=v ...] |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
110 |
|
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
111 |
link path_from path_to [n=v ...] |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
112 |
This action is exclusively for symbolic links. |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
113 |
|
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
114 |
service manifest_path [n=v ...] |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
115 |
0444 root sys |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
116 |
driver class [n=v ...] (a whole slew of specifiers) |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
117 |
0755 root sys binaries; 0644 root sys conf file |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
118 |
|
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
119 |
restart fmri [n=v ...] |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
120 |
[no file, illegal in user image] |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
121 |
|
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
122 |
XXX do we need hardlinks? |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
123 |
|
30 | 124 |
XXX driver action could follow the upload of two or three files. |
125 |
In this case, the action can either cause the transaction to |
|
126 |
fail (since modes and ownership may be inconsistent) or correct |
|
127 |
the transaction to follow convention (with a warning). |
|
28
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
128 |
|
30 | 129 |
XXX driver action must be architecture tag-dependent, as a |
130 |
driver may exist only on a single platform kind. |
|
28
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
131 |
|
30 | 132 |
XXX Setting a driver from the command line, rather than via a |
133 |
batched file, seems error prone. |
|
49
c3a70bdc4527
First cut of actions; make file transfer generic.
Danek Duvall <danek.duvall@sun.com>
parents:
44
diff
changeset
|
134 |
""" |
28
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
135 |
|
51
d04d55e16d0b
Simplify the action API and add real support for client-side installation
Danek Duvall <danek.duvall@sun.com>
parents:
49
diff
changeset
|
136 |
type = action.name |
49
c3a70bdc4527
First cut of actions; make file transfer generic.
Danek Duvall <danek.duvall@sun.com>
parents:
44
diff
changeset
|
137 |
attrs = action.attrs |
28
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
138 |
|
49
c3a70bdc4527
First cut of actions; make file transfer generic.
Danek Duvall <danek.duvall@sun.com>
parents:
44
diff
changeset
|
139 |
if not type in pkg.actions.types.keys(): |
c3a70bdc4527
First cut of actions; make file transfer generic.
Danek Duvall <danek.duvall@sun.com>
parents:
44
diff
changeset
|
140 |
if "path" in attrs: |
c3a70bdc4527
First cut of actions; make file transfer generic.
Danek Duvall <danek.duvall@sun.com>
parents:
44
diff
changeset
|
141 |
path = attrs["path"] |
40
61ee50abf05e
Add error handling for unknown (or currently unhandled) file types.
Danek Duvall <danek.duvall@sun.com>
parents:
38
diff
changeset
|
142 |
else: |
61ee50abf05e
Add error handling for unknown (or currently unhandled) file types.
Danek Duvall <danek.duvall@sun.com>
parents:
38
diff
changeset
|
143 |
path = "<unknown path>" |
61ee50abf05e
Add error handling for unknown (or currently unhandled) file types.
Danek Duvall <danek.duvall@sun.com>
parents:
38
diff
changeset
|
144 |
raise TypeError("%s: unknown file type '%s'" % |
61ee50abf05e
Add error handling for unknown (or currently unhandled) file types.
Danek Duvall <danek.duvall@sun.com>
parents:
38
diff
changeset
|
145 |
(path, type)) |
38
52e6547130fa
add support for bundle publishing
Danek Duvall <danek.duvall@sun.com>
parents:
33
diff
changeset
|
146 |
|
52e6547130fa
add support for bundle publishing
Danek Duvall <danek.duvall@sun.com>
parents:
33
diff
changeset
|
147 |
repo = config.install_uri |
52e6547130fa
add support for bundle publishing
Danek Duvall <danek.duvall@sun.com>
parents:
33
diff
changeset
|
148 |
uri_exp = urlparse.urlparse(repo) |
52e6547130fa
add support for bundle publishing
Danek Duvall <danek.duvall@sun.com>
parents:
33
diff
changeset
|
149 |
host, port = uri_exp[1].split(":") |
52e6547130fa
add support for bundle publishing
Danek Duvall <danek.duvall@sun.com>
parents:
33
diff
changeset
|
150 |
selector = "/add/%s/%s" % (trans_id, type) |
52e6547130fa
add support for bundle publishing
Danek Duvall <danek.duvall@sun.com>
parents:
33
diff
changeset
|
151 |
|
49
c3a70bdc4527
First cut of actions; make file transfer generic.
Danek Duvall <danek.duvall@sun.com>
parents:
44
diff
changeset
|
152 |
# XXX Need to handle large files |
51
d04d55e16d0b
Simplify the action API and add real support for client-side installation
Danek Duvall <danek.duvall@sun.com>
parents:
49
diff
changeset
|
153 |
if action.data != None: |
d04d55e16d0b
Simplify the action API and add real support for client-side installation
Danek Duvall <danek.duvall@sun.com>
parents:
49
diff
changeset
|
154 |
datastream = action.data() |
49
c3a70bdc4527
First cut of actions; make file transfer generic.
Danek Duvall <danek.duvall@sun.com>
parents:
44
diff
changeset
|
155 |
data = datastream.read() |
51
d04d55e16d0b
Simplify the action API and add real support for client-side installation
Danek Duvall <danek.duvall@sun.com>
parents:
49
diff
changeset
|
156 |
else: |
d04d55e16d0b
Simplify the action API and add real support for client-side installation
Danek Duvall <danek.duvall@sun.com>
parents:
49
diff
changeset
|
157 |
data = "" |
28
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
158 |
|
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
159 |
c = httplib.HTTPConnection(host, port) |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
160 |
c.connect() |
102
613f3d9bef66
Implement chattr token for importer and use it on a couple of files.
Danek Duvall <danek.duvall@sun.com>
parents:
57
diff
changeset
|
161 |
c.putrequest("POST", selector) |
613f3d9bef66
Implement chattr token for importer and use it on a couple of files.
Danek Duvall <danek.duvall@sun.com>
parents:
57
diff
changeset
|
162 |
for k in attrs: |
613f3d9bef66
Implement chattr token for importer and use it on a couple of files.
Danek Duvall <danek.duvall@sun.com>
parents:
57
diff
changeset
|
163 |
c.putheader("X-IPkg-SetAttr", "%s=%s" % (k, attrs[k])) |
613f3d9bef66
Implement chattr token for importer and use it on a couple of files.
Danek Duvall <danek.duvall@sun.com>
parents:
57
diff
changeset
|
164 |
c.putheader("Content-Length", len(data)) |
613f3d9bef66
Implement chattr token for importer and use it on a couple of files.
Danek Duvall <danek.duvall@sun.com>
parents:
57
diff
changeset
|
165 |
c.endheaders() |
613f3d9bef66
Implement chattr token for importer and use it on a couple of files.
Danek Duvall <danek.duvall@sun.com>
parents:
57
diff
changeset
|
166 |
c.send(data) |
28
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
167 |
|
51
d04d55e16d0b
Simplify the action API and add real support for client-side installation
Danek Duvall <danek.duvall@sun.com>
parents:
49
diff
changeset
|
168 |
try: |
d04d55e16d0b
Simplify the action API and add real support for client-side installation
Danek Duvall <danek.duvall@sun.com>
parents:
49
diff
changeset
|
169 |
r = c.getresponse() |
d04d55e16d0b
Simplify the action API and add real support for client-side installation
Danek Duvall <danek.duvall@sun.com>
parents:
49
diff
changeset
|
170 |
except httplib.BadStatusLine: |
135
a1e20e9a9845
add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents:
102
diff
changeset
|
171 |
print "Server-side exception for '%s'" % action |
51
d04d55e16d0b
Simplify the action API and add real support for client-side installation
Danek Duvall <danek.duvall@sun.com>
parents:
49
diff
changeset
|
172 |
return 500 |
28
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
173 |
|
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
174 |
return r.status |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
175 |
|
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
176 |
def meta(self, config, trans_id, args): |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
177 |
"""Via POST request, transfer a piece of metadata to the server. |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
178 |
|
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
179 |
XXX This is just a stub. |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
180 |
""" |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
181 |
|
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
182 |
repo = config.install_uri |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
183 |
uri_exp = urlparse.urlparse(repo) |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
184 |
host, port = uri_exp[1].split(":") |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
185 |
selector = "/meta/%s/%s" % (trans_id, args[0]) |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
186 |
|
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
187 |
# subcommand handling |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
188 |
# /meta/trans_id/set/property_name |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
189 |
# Payload is value. |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
190 |
# /meta/trans_id/unset/property_name |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
191 |
# No payload. |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
192 |
# /meta/trans_id/include |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
193 |
# /meta/trans_id/require |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
194 |
# /meta/trans_id/exclude |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
195 |
# Payload is fmri. |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
196 |
# /meta/trans_id/disclaim |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
197 |
# Payload is fmri. |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
198 |
|
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
199 |
headers = {} |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
200 |
headers["Path"] = args[1] |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
201 |
|
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
202 |
c = httplib.HTTPConnection(host, port) |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
203 |
c.connect() |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
204 |
c.request("POST", selector, data, headers) |
69ad5b247616
Move publication transaction processing into its own class.
Danek Duvall <danek.duvall@sun.com>
parents:
diff
changeset
|
205 |
return |