author | Shawn Walker <srw@sun.com> |
Thu, 28 Jan 2010 22:08:37 -0600 | |
changeset 1710 | 139720e2e756 |
parent 1658 | 49b8cc06eecb |
child 1829 | e581a205ec02 |
permissions | -rw-r--r-- |
1516
8c950a3b4171
10485 move pkg(5) to Python 2.6
Rich Burridge <rich.burridge@sun.com>
parents:
1507
diff
changeset
|
1 |
#!/usr/bin/python |
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
2 |
# |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
3 |
# CDDL HEADER START |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
4 |
# |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
5 |
# The contents of this file are subject to the terms of the |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
6 |
# Common Development and Distribution License (the "License"). |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
7 |
# You may not use this file except in compliance with the License. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
8 |
# |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
9 |
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
10 |
# or http://www.opensolaris.org/os/licensing. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
11 |
# See the License for the specific language governing permissions |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
12 |
# and limitations under the License. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
13 |
# |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
14 |
# When distributing Covered Code, include this CDDL HEADER in each |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
15 |
# file and include the License file at usr/src/OPENSOLARIS.LICENSE. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
16 |
# If applicable, add the following below this CDDL HEADER, with the |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
17 |
# fields enclosed by brackets "[]" replaced with your own identifying |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
18 |
# information: Portions Copyright [yyyy] [name of copyright owner] |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
19 |
# |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
20 |
# CDDL HEADER END |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
21 |
# |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
22 |
|
926
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
23 |
# |
1710
139720e2e756
1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents:
1658
diff
changeset
|
24 |
# Copyright 2010 Sun Microsystems, Inc. All rights reserved. |
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
25 |
# Use is subject to license terms. |
926
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
26 |
# |
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
27 |
|
1027
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
28 |
import copy |
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
29 |
import errno |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
30 |
import os |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
31 |
import shutil |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
32 |
import sys |
1032
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
33 |
import traceback |
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
34 |
import xml.dom.minidom as xmini |
732
9ea802fef2fb
3540 client should be resilient against corrupt history
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
696
diff
changeset
|
35 |
import xml.parsers.expat as expat |
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
36 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
37 |
import pkg |
926
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
38 |
import pkg.client.api_errors as api_errors |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
39 |
import pkg.fmri as fmri |
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
40 |
import pkg.misc as misc |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
41 |
import pkg.portable as portable |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
42 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
43 |
# Constants for the (outcome, reason) combination for operation result. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
44 |
# Indicates that the user canceled the operation. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
45 |
RESULT_CANCELED = ["Canceled"] |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
46 |
# Indicates that the operation had no work to perform or didn't need to make |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
47 |
# any changes to the image. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
48 |
RESULT_NOTHING_TO_DO = ["Nothing to do"] |
926
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
49 |
# Indicates that the operation succeeded. |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
50 |
RESULT_SUCCEEDED = ["Succeeded"] |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
51 |
# Indicates that the user or client provided bad information which resulted in |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
52 |
# operation failure. |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
53 |
RESULT_FAILED_BAD_REQUEST = ["Failed", "Bad Request"] |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
54 |
# Indicates that the operation failed due to a configuration error (such as an |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
55 |
# invalid SSL Certificate, etc.). |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
56 |
RESULT_FAILED_CONFIGURATION = ["Failed", "Configuration"] |
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
57 |
# Indicates that the operation failed due to package constraints or because of |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
58 |
# a restriction enforced by the client (e.g. SUNWipkg out of date). |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
59 |
RESULT_FAILED_CONSTRAINED = ["Failed", "Constrained"] |
1710
139720e2e756
1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents:
1658
diff
changeset
|
60 |
# Indicates an operation failed because the image was already in use. |
139720e2e756
1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents:
1658
diff
changeset
|
61 |
RESULT_FAILED_LOCKED = ["Failed", "Locked"] |
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
62 |
# Indicates that a search operation failed. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
63 |
RESULT_FAILED_SEARCH = ["Failed", "Search"] |
1658
49b8cc06eecb
13360 client can traceback if corrupt catalogs exist
Shawn Walker <srw@sun.com>
parents:
1540
diff
changeset
|
64 |
# Indicates that there was a problem reading, writing, or accessing a file. |
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
65 |
RESULT_FAILED_STORAGE = ["Failed", "Storage"] |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
66 |
# Indicates that a transport error caused the operation to fail. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
67 |
RESULT_FAILED_TRANSPORT = ["Failed", "Transport"] |
1019
e61c57c724c9
7663 disable_fmri should be synchronous
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
926
diff
changeset
|
68 |
# Indicates that the operation failed due to an actuator problem |
e61c57c724c9
7663 disable_fmri should be synchronous
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
926
diff
changeset
|
69 |
RESULT_FAILED_ACTUATOR = ["Failed", "Actuator"] |
1035
0e243b7eb121
2297 top level error handler for out of memory conditions needed
Danek Duvall <danek.duvall@sun.com>
parents:
1032
diff
changeset
|
70 |
# Indicates that the operation failed due to not enough memory |
0e243b7eb121
2297 top level error handler for out of memory conditions needed
Danek Duvall <danek.duvall@sun.com>
parents:
1032
diff
changeset
|
71 |
RESULT_FAILED_OUTOFMEMORY = ["Failed", "Out of Memory"] |
926
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
72 |
# Indicates that the operation failed for an unknown reason. |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
73 |
RESULT_FAILED_UNKNOWN = ["Failed", "Unknown"] |
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
74 |
|
556
1c3526ca7b9e
2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents:
539
diff
changeset
|
75 |
# Operations that are discarded, not saved, when recorded by history. |
1c3526ca7b9e
2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents:
539
diff
changeset
|
76 |
DISCARDED_OPERATIONS = ["contents", "info", "list"] |
1c3526ca7b9e
2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents:
539
diff
changeset
|
77 |
|
926
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
78 |
# Cross-reference table for errors and results. Entries should be ordered |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
79 |
# most-specific to least-specific. |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
80 |
error_results = { |
1710
139720e2e756
1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents:
1658
diff
changeset
|
81 |
api_errors.ImageLockedError: RESULT_FAILED_LOCKED, |
1658
49b8cc06eecb
13360 client can traceback if corrupt catalogs exist
Shawn Walker <srw@sun.com>
parents:
1540
diff
changeset
|
82 |
api_errors.InvalidCatalogFile: RESULT_FAILED_STORAGE, |
1027
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
83 |
api_errors.BENamingNotSupported: RESULT_FAILED_BAD_REQUEST, |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
84 |
api_errors.InvalidBENameException: RESULT_FAILED_BAD_REQUEST, |
926
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
85 |
api_errors.CertificateError: RESULT_FAILED_CONFIGURATION, |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
86 |
api_errors.PublisherError: RESULT_FAILED_BAD_REQUEST, |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
87 |
api_errors.CanceledException: RESULT_CANCELED, |
1027
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
88 |
api_errors.ImageUpdateOnLiveImageException: RESULT_FAILED_BAD_REQUEST, |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
89 |
api_errors.ProblematicPermissionsIndexException: RESULT_FAILED_STORAGE, |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
90 |
api_errors.PermissionsException: RESULT_FAILED_STORAGE, |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
91 |
api_errors.MainDictParsingException: RESULT_FAILED_STORAGE, |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
92 |
api_errors.SearchException: RESULT_FAILED_SEARCH, |
1505
cc598d70bbbe
4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents:
1271
diff
changeset
|
93 |
api_errors.PlanCreationException: RESULT_FAILED_CONSTRAINED, |
1027
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
94 |
api_errors.NonLeafPackageException: RESULT_FAILED_CONSTRAINED, |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
95 |
api_errors.IpkgOutOfDateException: RESULT_FAILED_CONSTRAINED, |
1102
5ea5cdb4360d
5014 api sets successful result for image-create with failed catalog refresh
Shawn Walker <srw@sun.com>
parents:
1035
diff
changeset
|
96 |
api_errors.InvalidDepotResponseException: RESULT_FAILED_TRANSPORT, |
926
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
97 |
fmri.IllegalFmri: RESULT_FAILED_BAD_REQUEST, |
1027
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
98 |
KeyboardInterrupt: RESULT_CANCELED, |
1035
0e243b7eb121
2297 top level error handler for out of memory conditions needed
Danek Duvall <danek.duvall@sun.com>
parents:
1032
diff
changeset
|
99 |
MemoryError: RESULT_FAILED_OUTOFMEMORY, |
926
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
100 |
} |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
101 |
|
732
9ea802fef2fb
3540 client should be resilient against corrupt history
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
696
diff
changeset
|
102 |
class _HistoryException(Exception): |
569
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
103 |
"""Private base exception class for all History exceptions.""" |
1540
de040c9fd0c0
13003 exception messages not always displayed correctly with python 2.6
Shawn Walker <srw@sun.com>
parents:
1516
diff
changeset
|
104 |
|
569
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
105 |
def __init__(self, *args): |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
106 |
Exception.__init__(self, *args) |
732
9ea802fef2fb
3540 client should be resilient against corrupt history
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
696
diff
changeset
|
107 |
self.error = args[0] |
569
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
108 |
|
1540
de040c9fd0c0
13003 exception messages not always displayed correctly with python 2.6
Shawn Walker <srw@sun.com>
parents:
1516
diff
changeset
|
109 |
def __unicode__(self): |
de040c9fd0c0
13003 exception messages not always displayed correctly with python 2.6
Shawn Walker <srw@sun.com>
parents:
1516
diff
changeset
|
110 |
# To workaround python issues 6108 and 2517, this provides a |
de040c9fd0c0
13003 exception messages not always displayed correctly with python 2.6
Shawn Walker <srw@sun.com>
parents:
1516
diff
changeset
|
111 |
# a standard wrapper for this class' exceptions so that they |
de040c9fd0c0
13003 exception messages not always displayed correctly with python 2.6
Shawn Walker <srw@sun.com>
parents:
1516
diff
changeset
|
112 |
# have a chance of being stringified correctly. |
de040c9fd0c0
13003 exception messages not always displayed correctly with python 2.6
Shawn Walker <srw@sun.com>
parents:
1516
diff
changeset
|
113 |
return str(self) |
de040c9fd0c0
13003 exception messages not always displayed correctly with python 2.6
Shawn Walker <srw@sun.com>
parents:
1516
diff
changeset
|
114 |
|
569
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
115 |
def __str__(self): |
732
9ea802fef2fb
3540 client should be resilient against corrupt history
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
696
diff
changeset
|
116 |
return str(self.error) |
569
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
117 |
|
732
9ea802fef2fb
3540 client should be resilient against corrupt history
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
696
diff
changeset
|
118 |
class HistoryLoadException(_HistoryException): |
569
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
119 |
"""Used to indicate that an unexpected error occurred while loading |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
120 |
History operation information. |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
121 |
|
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
122 |
The first argument should be an exception object related to the |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
123 |
error encountered. |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
124 |
""" |
732
9ea802fef2fb
3540 client should be resilient against corrupt history
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
696
diff
changeset
|
125 |
def __init__(self, *args): |
9ea802fef2fb
3540 client should be resilient against corrupt history
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
696
diff
changeset
|
126 |
_HistoryException.__init__(self, *args) |
9ea802fef2fb
3540 client should be resilient against corrupt history
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
696
diff
changeset
|
127 |
self.parse_failure = isinstance(self.error, expat.ExpatError) |
569
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
128 |
|
732
9ea802fef2fb
3540 client should be resilient against corrupt history
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
696
diff
changeset
|
129 |
class HistoryStoreException(_HistoryException): |
569
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
130 |
"""Used to indicate that an unexpected error occurred while storing |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
131 |
History operation information. |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
132 |
|
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
133 |
The first argument should be an exception object related to the |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
134 |
error encountered. |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
135 |
""" |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
136 |
pass |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
137 |
|
732
9ea802fef2fb
3540 client should be resilient against corrupt history
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
696
diff
changeset
|
138 |
class HistoryPurgeException(_HistoryException): |
569
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
139 |
"""Used to indicate that an unexpected error occurred while purging |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
140 |
History operation information. |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
141 |
|
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
142 |
The first argument should be an exception object related to the |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
143 |
error encountered. |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
144 |
""" |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
145 |
pass |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
146 |
|
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
147 |
class _HistoryOperation(object): |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
148 |
"""A _HistoryOperation object is a representation of data about an |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
149 |
operation that a pkg(5) client has performed. This class is private |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
150 |
and not intended for use by classes other than History. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
151 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
152 |
This class provides an abstraction layer between the stack of |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
153 |
operations that History manages should these values need to be |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
154 |
manipulated as they are set or retrieved. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
155 |
""" |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
156 |
|
1027
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
157 |
def __copy__(self): |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
158 |
h = _HistoryOperation() |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
159 |
for attr in ("name", "start_time", "end_time", "start_state", |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
160 |
"end_state", "username", "userid", "result"): |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
161 |
setattr(h, attr, getattr(self, attr)) |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
162 |
h.errors = [copy.copy(e) for e in self.errors] |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
163 |
return h |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
164 |
|
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
165 |
def __setattr__(self, name, value): |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
166 |
if name not in ("result", "errors"): |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
167 |
# Force all other attribute values to be a string |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
168 |
# to avoid issues with minidom. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
169 |
value = str(value) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
170 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
171 |
return object.__setattr__(self, name, value) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
172 |
|
569
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
173 |
def __str__(self): |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
174 |
return """\ |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
175 |
Operation Name: %s |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
176 |
Operation Result: %s |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
177 |
Operation Start Time: %s |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
178 |
Operation End Time: %s |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
179 |
Operation Start State: |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
180 |
%s |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
181 |
Operation End State: |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
182 |
%s |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
183 |
Operation User: %s (%s) |
1235
7c34ba6e5e4f
9287 history can log wrong exception information when operations fail
Shawn Walker <srw@sun.com>
parents:
1102
diff
changeset
|
184 |
Operation Errors: |
7c34ba6e5e4f
9287 history can log wrong exception information when operations fail
Shawn Walker <srw@sun.com>
parents:
1102
diff
changeset
|
185 |
%s |
569
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
186 |
""" % (self.name, self.result, self.start_time, self.end_time, |
1235
7c34ba6e5e4f
9287 history can log wrong exception information when operations fail
Shawn Walker <srw@sun.com>
parents:
1102
diff
changeset
|
187 |
self.start_state, self.end_state, self.username, self.userid, |
7c34ba6e5e4f
9287 history can log wrong exception information when operations fail
Shawn Walker <srw@sun.com>
parents:
1102
diff
changeset
|
188 |
self.errors) |
569
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
189 |
|
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
190 |
# All "time" values should be in UTC, using ISO 8601 as the format. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
191 |
# Name of the operation performed (e.g. install, image-update, etc.). |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
192 |
name = None |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
193 |
# When the operation started. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
194 |
start_time = None |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
195 |
# When the operation ended. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
196 |
end_time = None |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
197 |
# The starting state of the operation (e.g. image plan pre-evaluation). |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
198 |
start_state = None |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
199 |
# The ending state of the operation (e.g. image plan post-evaluation). |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
200 |
end_state = None |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
201 |
# Errors encountered during an operation. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
202 |
errors = None |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
203 |
# username of the user that performed the operation. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
204 |
username = None |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
205 |
# id of the user that performed the operation. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
206 |
userid = None |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
207 |
# The result of the operation (must be a list indicating (outcome, |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
208 |
# reason)). |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
209 |
result = None |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
210 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
211 |
def __init__(self): |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
212 |
self.errors = [] |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
213 |
|
1027
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
214 |
|
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
215 |
class History(object): |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
216 |
"""A History object is a representation of data about a pkg(5) client |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
217 |
and about operations that the client is executing or has executed. It |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
218 |
uses the _HistoryOperation class to represent the data about an |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
219 |
operation. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
220 |
""" |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
221 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
222 |
# The directory where the history directory can be found (or |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
223 |
# created if it doesn't exist). |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
224 |
root_dir = None |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
225 |
# The name of the client (e.g. pkg, packagemanager, etc.) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
226 |
client_name = None |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
227 |
# The version of the client (e.g. 093ca22da67c). |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
228 |
client_version = None |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
229 |
# How the client was invoked (e.g. 'pkg install -n foo'). |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
230 |
client_args = None |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
231 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
232 |
# A stack where operation data will actually be stored. |
1271
036d87b0bd44
6831 need 'pkg change-variant' command
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents:
1235
diff
changeset
|
233 |
__operations = [] |
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
234 |
|
1027
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
235 |
# A private property used by preserve() and restore() to store snapshots |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
236 |
# of history and operation state information. |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
237 |
__snapshot = None |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
238 |
|
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
239 |
# These attributes exist to fake access to the operations stack. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
240 |
operation_name = None |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
241 |
operation_username = None |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
242 |
operation_userid = None |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
243 |
operation_start_time = None |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
244 |
operation_end_time = None |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
245 |
operation_start_state = None |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
246 |
operation_end_state = None |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
247 |
operation_errors = None |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
248 |
operation_result = None |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
249 |
|
1027
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
250 |
def __copy__(self): |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
251 |
h = History() |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
252 |
for attr in ("root_dir", "client_name", "client_version"): |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
253 |
setattr(h, attr, getattr(self, attr)) |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
254 |
object.__setattr__(self, "client_args", |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
255 |
[copy.copy(a) for a in self.client_args]) |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
256 |
# A deepcopy has to be performed here since this a list of dicts |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
257 |
# and not just History operation objects. |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
258 |
h.__operations = [copy.deepcopy(o) for o in self.__operations] |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
259 |
return h |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
260 |
|
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
261 |
def __getattribute__(self, name): |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
262 |
if name == "client_args": |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
263 |
return object.__getattribute__(self, name)[:] |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
264 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
265 |
if not name.startswith("operation_"): |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
266 |
return object.__getattribute__(self, name) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
267 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
268 |
ops = object.__getattribute__(self, "_History__operations") |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
269 |
if not ops: |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
270 |
return None |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
271 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
272 |
return getattr(ops[-1]["operation"], name[len("operation_"):]) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
273 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
274 |
def __setattr__(self, name, value): |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
275 |
if name == "client_args": |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
276 |
raise AttributeError("'history' object attribute '%s' " |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
277 |
"is read-only." % name) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
278 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
279 |
if not name.startswith("operation_"): |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
280 |
return object.__setattr__(self, name, value) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
281 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
282 |
ops = object.__getattribute__(self, "_History__operations") |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
283 |
if name == "operation_name": |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
284 |
if not ops: |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
285 |
ops = [] |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
286 |
object.__setattr__(self, |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
287 |
"_History__operations", ops) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
288 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
289 |
ops.append({ |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
290 |
"pathname": None, |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
291 |
"operation": _HistoryOperation() |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
292 |
}) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
293 |
elif not ops: |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
294 |
raise AttributeError("'history' object attribute '%s' " |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
295 |
"cannot be set before 'operation_name'." % name) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
296 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
297 |
op = ops[-1]["operation"] |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
298 |
setattr(op, name[len("operation_"):], value) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
299 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
300 |
# Access to the class attributes is done through object instead |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
301 |
# of just referencing self to avoid any of the special logic in |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
302 |
# place interfering with logic here. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
303 |
if name == "operation_name": |
1235
7c34ba6e5e4f
9287 history can log wrong exception information when operations fail
Shawn Walker <srw@sun.com>
parents:
1102
diff
changeset
|
304 |
# Before a new operation starts, clear exception state |
7c34ba6e5e4f
9287 history can log wrong exception information when operations fail
Shawn Walker <srw@sun.com>
parents:
1102
diff
changeset
|
305 |
# for the current one so that when this one ends, the |
7c34ba6e5e4f
9287 history can log wrong exception information when operations fail
Shawn Walker <srw@sun.com>
parents:
1102
diff
changeset
|
306 |
# last operation's exception won't be recorded to this |
7c34ba6e5e4f
9287 history can log wrong exception information when operations fail
Shawn Walker <srw@sun.com>
parents:
1102
diff
changeset
|
307 |
# one. If the error hasn't been recorded by now, it |
7c34ba6e5e4f
9287 history can log wrong exception information when operations fail
Shawn Walker <srw@sun.com>
parents:
1102
diff
changeset
|
308 |
# doesn't matter anyway, so should be safe to clear. |
7c34ba6e5e4f
9287 history can log wrong exception information when operations fail
Shawn Walker <srw@sun.com>
parents:
1102
diff
changeset
|
309 |
sys.exc_clear() |
7c34ba6e5e4f
9287 history can log wrong exception information when operations fail
Shawn Walker <srw@sun.com>
parents:
1102
diff
changeset
|
310 |
|
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
311 |
# Mark the operation as having started and record |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
312 |
# other, relevant information. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
313 |
op.start_time = misc.time_to_timestamp(None) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
314 |
op.username = portable.get_username() |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
315 |
op.userid = portable.get_userid() |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
316 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
317 |
ca = None |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
318 |
if sys.argv[0]: |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
319 |
ca = [sys.argv[0]] |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
320 |
else: |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
321 |
# Fallback for clients that provide no value. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
322 |
ca = [self.client_name] |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
323 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
324 |
ca.extend(sys.argv[1:]) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
325 |
object.__setattr__(self, "client_args", ca) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
326 |
object.__setattr__(self, "client_version", pkg.VERSION) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
327 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
328 |
elif name == "operation_result": |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
329 |
# Record when the operation ended. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
330 |
op.end_time = misc.time_to_timestamp(None) |
556
1c3526ca7b9e
2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents:
539
diff
changeset
|
331 |
|
1c3526ca7b9e
2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents:
539
diff
changeset
|
332 |
# Some operations shouldn't be saved -- they're merely |
1c3526ca7b9e
2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents:
539
diff
changeset
|
333 |
# included in the stack for completeness or to support |
1c3526ca7b9e
2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents:
539
diff
changeset
|
334 |
# client functionality. |
1c3526ca7b9e
2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents:
539
diff
changeset
|
335 |
if op.name not in DISCARDED_OPERATIONS: |
1c3526ca7b9e
2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents:
539
diff
changeset
|
336 |
# Write current history and last operation to a |
1c3526ca7b9e
2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents:
539
diff
changeset
|
337 |
# file. |
1c3526ca7b9e
2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents:
539
diff
changeset
|
338 |
self.__save() |
1c3526ca7b9e
2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents:
539
diff
changeset
|
339 |
|
1c3526ca7b9e
2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents:
539
diff
changeset
|
340 |
# Discard it now that it is no longer needed. |
569
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
341 |
del ops[-1] |
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
342 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
343 |
def __init__(self, root_dir=".", filename=None): |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
344 |
"""'root_dir' should be the path of the directory where the |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
345 |
history directory can be found (or created if it doesn't |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
346 |
exist). 'filename' should be the name of an XML file |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
347 |
containing serialized history information to load. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
348 |
""" |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
349 |
# Since this is a read-only attribute normally, we have to |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
350 |
# bypass our setattr override by calling object. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
351 |
object.__setattr__(self, "client_args", []) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
352 |
|
696
6bbfd2dece6f
4371 user-agent string needs to be different for different client front-ends
Danek Duvall <danek.duvall@sun.com>
parents:
593
diff
changeset
|
353 |
# Initialize client_name to what the client thinks it is. This |
6bbfd2dece6f
4371 user-agent string needs to be different for different client front-ends
Danek Duvall <danek.duvall@sun.com>
parents:
593
diff
changeset
|
354 |
# will be overridden if we load history entries off disk. |
6bbfd2dece6f
4371 user-agent string needs to be different for different client front-ends
Danek Duvall <danek.duvall@sun.com>
parents:
593
diff
changeset
|
355 |
self.client_name = pkg.client.global_settings.client_name |
6bbfd2dece6f
4371 user-agent string needs to be different for different client front-ends
Danek Duvall <danek.duvall@sun.com>
parents:
593
diff
changeset
|
356 |
|
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
357 |
self.root_dir = root_dir |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
358 |
if filename: |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
359 |
self.__load(filename) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
360 |
|
569
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
361 |
def __str__(self): |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
362 |
ops = self.__operations |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
363 |
return "\n".join([str(op["operation"]) for op in ops]) |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
364 |
|
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
365 |
@property |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
366 |
def path(self): |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
367 |
"""The directory where history files will be written to or |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
368 |
read from. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
369 |
""" |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
370 |
return os.path.join(self.root_dir, "history") |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
371 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
372 |
@property |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
373 |
def pathname(self): |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
374 |
"""Returns the pathname that the history information was read |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
375 |
from or will attempted to be written to. Returns None if no |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
376 |
operation has started yet or if no operation has been loaded. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
377 |
""" |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
378 |
if not self.operation_start_time: |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
379 |
return None |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
380 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
381 |
ops = self.__operations |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
382 |
pathname = ops[-1]["pathname"] |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
383 |
if not pathname: |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
384 |
return os.path.join(self.path, |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
385 |
"%s-01.xml" % ops[-1]["operation"].start_time) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
386 |
return pathname |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
387 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
388 |
def clear(self): |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
389 |
"""Discards all information related to the current history |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
390 |
object. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
391 |
""" |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
392 |
self.client_name = None |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
393 |
self.client_version = None |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
394 |
object.__setattr__(self, "client_args", []) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
395 |
self.__operations = [] |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
396 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
397 |
def __load_client_data(self, node): |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
398 |
"""Internal function to load the client data from the given XML |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
399 |
'node' object. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
400 |
""" |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
401 |
self.client_name = node.getAttribute("name") |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
402 |
self.client_version = node.getAttribute("version") |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
403 |
try: |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
404 |
args = node.getElementsByTagName("args")[0] |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
405 |
except IndexError: |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
406 |
# There might not be any. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
407 |
pass |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
408 |
else: |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
409 |
ca = object.__getattribute__(self, "client_args") |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
410 |
for cnode in args.getElementsByTagName("arg"): |
1032
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
411 |
try: |
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
412 |
ca.append(cnode.childNodes[0].wholeText) |
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
413 |
except (AttributeError, IndexError): |
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
414 |
# There may be no childNodes, or |
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
415 |
# wholeText may not be defined. |
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
416 |
pass |
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
417 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
418 |
@staticmethod |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
419 |
def __load_operation_data(node): |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
420 |
"""Internal function to load the operation data from the given |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
421 |
XML 'node' object and return a _HistoryOperation object. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
422 |
""" |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
423 |
op = _HistoryOperation() |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
424 |
op.name = node.getAttribute("name") |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
425 |
op.start_time = node.getAttribute("start_time") |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
426 |
op.end_time = node.getAttribute("end_time") |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
427 |
op.username = node.getAttribute("username") |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
428 |
op.userid = node.getAttribute("userid") |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
429 |
op.result = node.getAttribute("result").split(", ") |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
430 |
|
1032
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
431 |
def get_node_values(parent_name, child_name=None): |
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
432 |
try: |
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
433 |
parent = node.getElementsByTagName(parent_name)[0] |
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
434 |
if child_name: |
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
435 |
cnodes = parent.getElementsByTagName( |
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
436 |
child_name) |
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
437 |
return [ |
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
438 |
cnode.childNodes[0].wholeText |
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
439 |
for cnode in cnodes |
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
440 |
] |
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
441 |
return parent.childNodes[0].wholeText |
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
442 |
except (AttributeError, IndexError): |
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
443 |
# Assume no values are present for the node. |
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
444 |
pass |
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
445 |
if child_name: |
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
446 |
return [] |
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
447 |
return |
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
448 |
|
1032
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
449 |
op.start_state = get_node_values("start_state") |
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
450 |
op.end_state = get_node_values("end_state") |
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
451 |
op.errors.extend(get_node_values("errors", child_name="error")) |
1507
b956ea23d3a6
11735 pkg history data files should not be executable
Richard Lowe <richlowe@richlowe.net>
parents:
1505
diff
changeset
|
452 |
|
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
453 |
return op |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
454 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
455 |
def __load(self, filename): |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
456 |
"""Loads the history from a file located in self.path/history/ |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
457 |
{filename}. The file should contain a serialized history |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
458 |
object in XML format. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
459 |
""" |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
460 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
461 |
# Ensure all previous information is discarded. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
462 |
self.clear() |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
463 |
|
569
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
464 |
try: |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
465 |
pathname = os.path.join(self.path, filename) |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
466 |
d = xmini.parse(pathname) |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
467 |
root = d.documentElement |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
468 |
for cnode in root.childNodes: |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
469 |
if cnode.nodeName == "client": |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
470 |
self.__load_client_data(cnode) |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
471 |
elif cnode.nodeName == "operation": |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
472 |
# Operations load differently due to |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
473 |
# the stack. |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
474 |
self.__operations.append({ |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
475 |
"pathname": pathname, |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
476 |
"operation": |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
477 |
self.__load_operation_data( |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
478 |
cnode) |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
479 |
}) |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
480 |
except KeyboardInterrupt: |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
481 |
raise |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
482 |
except Exception, e: |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
483 |
raise HistoryLoadException(e) |
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
484 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
485 |
def __serialize_client_data(self, d): |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
486 |
"""Internal function used to serialize current client data |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
487 |
using the supplied 'd' (xml.dom.minidom) object. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
488 |
""" |
569
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
489 |
|
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
490 |
assert self.client_name is not None |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
491 |
assert self.client_version is not None |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
492 |
|
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
493 |
root = d.documentElement |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
494 |
client = d.createElement("client") |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
495 |
client.setAttribute("name", self.client_name) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
496 |
client.setAttribute("version", self.client_version) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
497 |
root.appendChild(client) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
498 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
499 |
if self.client_args: |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
500 |
args = d.createElement("args") |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
501 |
client.appendChild(args) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
502 |
for entry in self.client_args: |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
503 |
arg = d.createElement("arg") |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
504 |
args.appendChild(arg) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
505 |
arg.appendChild( |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
506 |
d.createCDATASection(str(entry))) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
507 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
508 |
def __serialize_operation_data(self, d): |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
509 |
"""Internal function used to serialize current operation data |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
510 |
using the supplied 'd' (xml.dom.minidom) object. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
511 |
""" |
569
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
512 |
|
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
513 |
if self.operation_userid is None: |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
514 |
raise HistoryStoreException("Unable to determine the " |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
515 |
"id of the user that performed the current " |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
516 |
"operation; unable to store history information.") |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
517 |
elif self.operation_username is None: |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
518 |
raise HistoryStoreException("Unable to determine the " |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
519 |
"username of the user that performed the current " |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
520 |
"operation; unable to store history information.") |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
521 |
|
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
522 |
root = d.documentElement |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
523 |
op = d.createElement("operation") |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
524 |
op.setAttribute("name", self.operation_name) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
525 |
# Must explictly convert values to a string due to minidom bug |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
526 |
# that causes a fatal whenever using types other than str. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
527 |
op.setAttribute("username", str(self.operation_username)) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
528 |
op.setAttribute("userid", str(self.operation_userid)) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
529 |
op.setAttribute("result", ", ".join(self.operation_result)) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
530 |
op.setAttribute("start_time", self.operation_start_time) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
531 |
op.setAttribute("end_time", self.operation_end_time) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
532 |
root.appendChild(op) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
533 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
534 |
if self.operation_start_state: |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
535 |
state = d.createElement("start_state") |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
536 |
op.appendChild(state) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
537 |
state.appendChild(d.createCDATASection( |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
538 |
str(self.operation_start_state))) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
539 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
540 |
if self.operation_end_state: |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
541 |
state = d.createElement("end_state") |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
542 |
op.appendChild(state) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
543 |
state.appendChild(d.createCDATASection( |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
544 |
str(self.operation_end_state))) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
545 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
546 |
if self.operation_errors: |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
547 |
errors = d.createElement("errors") |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
548 |
op.appendChild(errors) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
549 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
550 |
for entry in self.operation_errors: |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
551 |
error = d.createElement("error") |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
552 |
errors.appendChild(error) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
553 |
error.appendChild( |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
554 |
d.createCDATASection(str(entry))) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
555 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
556 |
def __save(self): |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
557 |
"""Serializes the current history information and writes it to |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
558 |
a file in self.path/{operation_start_time}-{sequence}.xml. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
559 |
""" |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
560 |
d = xmini.Document() |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
561 |
d.appendChild(d.createElement("history")) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
562 |
self.__serialize_client_data(d) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
563 |
self.__serialize_operation_data(d) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
564 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
565 |
if not os.path.exists(self.path): |
593
f4305c5f2602
3823 no perms to create /var/pkg/history results in stack trace, even with -n
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
569
diff
changeset
|
566 |
try: |
1102
5ea5cdb4360d
5014 api sets successful result for image-create with failed catalog refresh
Shawn Walker <srw@sun.com>
parents:
1035
diff
changeset
|
567 |
# Only the right-most directory should be |
5ea5cdb4360d
5014 api sets successful result for image-create with failed catalog refresh
Shawn Walker <srw@sun.com>
parents:
1035
diff
changeset
|
568 |
# created. Assume that if the parent structure |
5ea5cdb4360d
5014 api sets successful result for image-create with failed catalog refresh
Shawn Walker <srw@sun.com>
parents:
1035
diff
changeset
|
569 |
# does not exist, it shouldn't be created. |
1507
b956ea23d3a6
11735 pkg history data files should not be executable
Richard Lowe <richlowe@richlowe.net>
parents:
1505
diff
changeset
|
570 |
os.mkdir(self.path, misc.PKG_DIR_MODE) |
593
f4305c5f2602
3823 no perms to create /var/pkg/history results in stack trace, even with -n
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
569
diff
changeset
|
571 |
except EnvironmentError, e: |
1102
5ea5cdb4360d
5014 api sets successful result for image-create with failed catalog refresh
Shawn Walker <srw@sun.com>
parents:
1035
diff
changeset
|
572 |
if e.errno not in (errno.EROFS, errno.EACCES, |
5ea5cdb4360d
5014 api sets successful result for image-create with failed catalog refresh
Shawn Walker <srw@sun.com>
parents:
1035
diff
changeset
|
573 |
errno.ENOENT): |
593
f4305c5f2602
3823 no perms to create /var/pkg/history results in stack trace, even with -n
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
569
diff
changeset
|
574 |
# Ignore read-only file system and |
f4305c5f2602
3823 no perms to create /var/pkg/history results in stack trace, even with -n
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
569
diff
changeset
|
575 |
# access errors as it isn't critical |
f4305c5f2602
3823 no perms to create /var/pkg/history results in stack trace, even with -n
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
569
diff
changeset
|
576 |
# to the image that this data is |
f4305c5f2602
3823 no perms to create /var/pkg/history results in stack trace, even with -n
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
569
diff
changeset
|
577 |
# written. |
1102
5ea5cdb4360d
5014 api sets successful result for image-create with failed catalog refresh
Shawn Walker <srw@sun.com>
parents:
1035
diff
changeset
|
578 |
raise HistoryStoreException(e) |
593
f4305c5f2602
3823 no perms to create /var/pkg/history results in stack trace, even with -n
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
569
diff
changeset
|
579 |
# Return, since without the directory, the rest |
f4305c5f2602
3823 no perms to create /var/pkg/history results in stack trace, even with -n
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
569
diff
changeset
|
580 |
# of this will fail. |
f4305c5f2602
3823 no perms to create /var/pkg/history results in stack trace, even with -n
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
569
diff
changeset
|
581 |
return |
f4305c5f2602
3823 no perms to create /var/pkg/history results in stack trace, even with -n
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
569
diff
changeset
|
582 |
except KeyboardInterrupt: |
f4305c5f2602
3823 no perms to create /var/pkg/history results in stack trace, even with -n
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
569
diff
changeset
|
583 |
raise |
f4305c5f2602
3823 no perms to create /var/pkg/history results in stack trace, even with -n
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
569
diff
changeset
|
584 |
except Exception, e: |
f4305c5f2602
3823 no perms to create /var/pkg/history results in stack trace, even with -n
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
569
diff
changeset
|
585 |
raise HistoryStoreException(e) |
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
586 |
|
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
587 |
# Repeatedly attempt to write the history (only if it's because |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
588 |
# the file already exists). This is necessary due to multiple |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
589 |
# operations possibly occuring within the same second (but not |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
590 |
# microsecond). |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
591 |
pathname = self.pathname |
569
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
592 |
for i in range(1, 100): |
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
593 |
try: |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
594 |
f = os.fdopen(os.open(pathname, |
1507
b956ea23d3a6
11735 pkg history data files should not be executable
Richard Lowe <richlowe@richlowe.net>
parents:
1505
diff
changeset
|
595 |
os.O_CREAT|os.O_EXCL|os.O_WRONLY, |
b956ea23d3a6
11735 pkg history data files should not be executable
Richard Lowe <richlowe@richlowe.net>
parents:
1505
diff
changeset
|
596 |
misc.PKG_FILE_MODE), "w") |
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
597 |
d.writexml(f, |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
598 |
encoding=sys.getdefaultencoding()) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
599 |
f.close() |
569
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
600 |
return |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
601 |
except EnvironmentError, e: |
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
602 |
if e.errno == errno.EEXIST: |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
603 |
name, ext = os.path.splitext( |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
604 |
os.path.basename(pathname)) |
569
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
605 |
name = name.split("-", 1)[0] |
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
606 |
# Pick the next name in our sequence |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
607 |
# and try again. |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
608 |
pathname = os.path.join(self.path, |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
609 |
"%s-%02d%s" % (name, i + 1, ext)) |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
610 |
continue |
569
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
611 |
elif e.errno not in (errno.EROFS, |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
612 |
errno.EACCES): |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
613 |
# Ignore read-only file system and |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
614 |
# access errors as it isn't critical |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
615 |
# to the image that this data is |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
616 |
# written. |
1507
b956ea23d3a6
11735 pkg history data files should not be executable
Richard Lowe <richlowe@richlowe.net>
parents:
1505
diff
changeset
|
617 |
raise HistoryStoreException(e) |
593
f4305c5f2602
3823 no perms to create /var/pkg/history results in stack trace, even with -n
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
569
diff
changeset
|
618 |
# For all other failures, return, and avoid any |
f4305c5f2602
3823 no perms to create /var/pkg/history results in stack trace, even with -n
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
569
diff
changeset
|
619 |
# further attempts. |
f4305c5f2602
3823 no perms to create /var/pkg/history results in stack trace, even with -n
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
569
diff
changeset
|
620 |
return |
569
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
621 |
except KeyboardInterrupt: |
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
622 |
raise |
569
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
623 |
except Exception, e: |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
624 |
raise HistoryStoreException(e) |
593
f4305c5f2602
3823 no perms to create /var/pkg/history results in stack trace, even with -n
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
569
diff
changeset
|
625 |
|
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
626 |
def purge(self): |
569
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
627 |
"""Removes all history information by deleting the directory |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
628 |
indicated by the value self.path and then creates a new history |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
629 |
entry to record that this purge occurred. |
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
630 |
""" |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
631 |
self.operation_name = "purge-history" |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
632 |
try: |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
633 |
shutil.rmtree(self.path) |
569
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
634 |
except KeyboardInterrupt: |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
635 |
raise |
732
9ea802fef2fb
3540 client should be resilient against corrupt history
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
696
diff
changeset
|
636 |
except EnvironmentError, e: |
834
f8b3396500b3
4883 import failure for non-sunos platforms due to missing pspawn
Tom Mueller <Tom.Mueller@sun.com>
parents:
732
diff
changeset
|
637 |
if e.errno in (errno.ENOENT, errno.ESRCH): |
732
9ea802fef2fb
3540 client should be resilient against corrupt history
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
696
diff
changeset
|
638 |
# History already purged; record as successful. |
9ea802fef2fb
3540 client should be resilient against corrupt history
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
696
diff
changeset
|
639 |
self.operation_result = RESULT_SUCCEEDED |
9ea802fef2fb
3540 client should be resilient against corrupt history
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
696
diff
changeset
|
640 |
return |
9ea802fef2fb
3540 client should be resilient against corrupt history
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
696
diff
changeset
|
641 |
raise HistoryPurgeException(e) |
569
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
642 |
except Exception, e: |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
643 |
raise HistoryPurgeException(e) |
539
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
644 |
else: |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
645 |
self.operation_result = RESULT_SUCCEEDED |
7486304966c5
1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents:
diff
changeset
|
646 |
|
569
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
647 |
def abort(self, result): |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
648 |
"""Intended to be used by the client during top-level error |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
649 |
handling to indicate that an unrecoverable error occurred |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
650 |
during the current operation(s). This allows History to end |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
651 |
all of the current operations properly and handle any possible |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
652 |
errors that might be encountered in History itself. |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
653 |
""" |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
654 |
try: |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
655 |
# Ensure that all operations in the current stack are |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
656 |
# ended properly. |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
657 |
while self.operation_name: |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
658 |
self.operation_result = result |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
659 |
except HistoryStoreException: |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
660 |
# Ignore storage errors as it's likely that whatever |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
661 |
# caused the client to abort() also caused the storage |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
662 |
# of the history information to fail. |
48f7e9d2b1ac
3715 permission or read-only filesystem errors cause history traceback
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
556
diff
changeset
|
663 |
return |
926
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
664 |
|
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
665 |
def log_operation_start(self, name): |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
666 |
"""Marks the start of an operation to be recorded in image |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
667 |
history.""" |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
668 |
self.operation_name = name |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
669 |
|
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
670 |
def log_operation_end(self, error=None, result=None): |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
671 |
"""Marks the end of an operation to be recorded in image |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
672 |
history. |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
673 |
|
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
674 |
'result' should be a pkg.client.history constant value |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
675 |
representing the outcome of an operation. If not provided, |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
676 |
and 'error' is provided, the final result of the operation will |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
677 |
be based on the class of 'error' and 'error' will be recorded |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
678 |
for the current operation. If 'result' and 'error' is not |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
679 |
provided, success is assumed.""" |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
680 |
|
1027
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
681 |
if error: |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
682 |
self.log_operation_error(error) |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
683 |
|
926
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
684 |
if error and not result: |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
685 |
try: |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
686 |
# Attempt get an exact error match first. |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
687 |
result = error_results[error.__class__] |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
688 |
except (AttributeError, KeyError): |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
689 |
# Failing an exact match, determine if this |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
690 |
# error is a subclass of an existing one. |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
691 |
for entry, val in error_results.iteritems(): |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
692 |
if isinstance(error, entry): |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
693 |
result = val |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
694 |
break |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
695 |
if not result: |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
696 |
# If a result could still not be determined, |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
697 |
# assume unknown failure case. |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
698 |
result = RESULT_FAILED_UNKNOWN |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
699 |
elif not result: |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
700 |
# Assume success if no error and no result. |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
701 |
result = RESULT_SUCCEEDED |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
702 |
self.operation_result = result |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
703 |
|
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
704 |
def log_operation_error(self, error): |
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
705 |
"""Adds an error to the list of errors to be recorded in image |
1032
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
706 |
history for the current operation.""" |
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
707 |
|
926
6ee411c9026a
5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents:
834
diff
changeset
|
708 |
if self.operation_name: |
1032
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
709 |
out_stack = None |
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
710 |
out_err = None |
1235
7c34ba6e5e4f
9287 history can log wrong exception information when operations fail
Shawn Walker <srw@sun.com>
parents:
1102
diff
changeset
|
711 |
use_current_stack = True |
1032
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
712 |
if isinstance(error, Exception): |
1235
7c34ba6e5e4f
9287 history can log wrong exception information when operations fail
Shawn Walker <srw@sun.com>
parents:
1102
diff
changeset
|
713 |
# Attempt to get the exception's stack trace |
7c34ba6e5e4f
9287 history can log wrong exception information when operations fail
Shawn Walker <srw@sun.com>
parents:
1102
diff
changeset
|
714 |
# from the stack. If the exception on the stack |
7c34ba6e5e4f
9287 history can log wrong exception information when operations fail
Shawn Walker <srw@sun.com>
parents:
1102
diff
changeset
|
715 |
# isn't the same object as the one being logged, |
7c34ba6e5e4f
9287 history can log wrong exception information when operations fail
Shawn Walker <srw@sun.com>
parents:
1102
diff
changeset
|
716 |
# then we have to use the current stack (which |
7c34ba6e5e4f
9287 history can log wrong exception information when operations fail
Shawn Walker <srw@sun.com>
parents:
1102
diff
changeset
|
717 |
# is somewhat less useful) instead of being able |
7c34ba6e5e4f
9287 history can log wrong exception information when operations fail
Shawn Walker <srw@sun.com>
parents:
1102
diff
changeset
|
718 |
# to find the code location of the original |
7c34ba6e5e4f
9287 history can log wrong exception information when operations fail
Shawn Walker <srw@sun.com>
parents:
1102
diff
changeset
|
719 |
# error. |
7c34ba6e5e4f
9287 history can log wrong exception information when operations fail
Shawn Walker <srw@sun.com>
parents:
1102
diff
changeset
|
720 |
type, val, tb = sys.exc_info() |
7c34ba6e5e4f
9287 history can log wrong exception information when operations fail
Shawn Walker <srw@sun.com>
parents:
1102
diff
changeset
|
721 |
if error == val: |
7c34ba6e5e4f
9287 history can log wrong exception information when operations fail
Shawn Walker <srw@sun.com>
parents:
1102
diff
changeset
|
722 |
output = traceback.format_exc() |
7c34ba6e5e4f
9287 history can log wrong exception information when operations fail
Shawn Walker <srw@sun.com>
parents:
1102
diff
changeset
|
723 |
use_current_stack = False |
7c34ba6e5e4f
9287 history can log wrong exception information when operations fail
Shawn Walker <srw@sun.com>
parents:
1102
diff
changeset
|
724 |
|
7c34ba6e5e4f
9287 history can log wrong exception information when operations fail
Shawn Walker <srw@sun.com>
parents:
1102
diff
changeset
|
725 |
if use_current_stack: |
1032
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
726 |
# Assume the current stack is more useful if |
1235
7c34ba6e5e4f
9287 history can log wrong exception information when operations fail
Shawn Walker <srw@sun.com>
parents:
1102
diff
changeset
|
727 |
# the error doesn't inherit from Exception or |
7c34ba6e5e4f
9287 history can log wrong exception information when operations fail
Shawn Walker <srw@sun.com>
parents:
1102
diff
changeset
|
728 |
# we can't use the last exception's stack. |
1032
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
729 |
out_stack = "".join(traceback.format_stack()) |
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
730 |
|
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
731 |
if error: |
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
732 |
# This may result in the text |
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
733 |
# of the error itself being written |
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
734 |
# twice, but that is necessary in case |
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
735 |
# it is not contained within the |
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
736 |
# output of format_exc(). |
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
737 |
out_err = str(error) |
1235
7c34ba6e5e4f
9287 history can log wrong exception information when operations fail
Shawn Walker <srw@sun.com>
parents:
1102
diff
changeset
|
738 |
if not out_err or out_err == "None": |
7c34ba6e5e4f
9287 history can log wrong exception information when operations fail
Shawn Walker <srw@sun.com>
parents:
1102
diff
changeset
|
739 |
out_err = \ |
7c34ba6e5e4f
9287 history can log wrong exception information when operations fail
Shawn Walker <srw@sun.com>
parents:
1102
diff
changeset
|
740 |
error.__class__.__name__ |
1032
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
741 |
|
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
742 |
output = "".join([ |
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
743 |
item for item in [out_stack, out_err] |
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
744 |
if item |
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
745 |
]) |
1235
7c34ba6e5e4f
9287 history can log wrong exception information when operations fail
Shawn Walker <srw@sun.com>
parents:
1102
diff
changeset
|
746 |
|
1032
ff3c6b09f430
8072 history load code needs to be more resilient against unexpected data format
Shawn Walker <srw@sun.com>
parents:
1027
diff
changeset
|
747 |
self.operation_errors.append(output.strip()) |
1027
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
748 |
|
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
749 |
def create_snapshot(self): |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
750 |
"""Stores a snapshot of the current history and operation state |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
751 |
information in memory so that it can be restored in the event of |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
752 |
client failure (such as inability to store history information |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
753 |
or the failure of a boot environment operation). Each call to |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
754 |
this function will overwrite the previous snapshot.""" |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
755 |
|
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
756 |
attrs = self.__snapshot = {} |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
757 |
for attr in ("root_dir", "client_name", "client_version"): |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
758 |
attrs[attr] = getattr(self, attr) |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
759 |
attrs["client_args"] = [copy.copy(a) for a in self.client_args] |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
760 |
# A deepcopy has to be performed here since this a list of dicts |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
761 |
# and not just History operation objects. |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
762 |
attrs["__operations"] = \ |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
763 |
[copy.deepcopy(o) for o in self.__operations] |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
764 |
|
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
765 |
def discard_snapshot(self): |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
766 |
"""Discards the current history and operation state information |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
767 |
snapshot.""" |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
768 |
self.__snapshot = None |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
769 |
|
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
770 |
def restore_snapshot(self): |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
771 |
"""Restores the last snapshot taken of history and operation |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
772 |
state information completely discarding the existing history and |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
773 |
operation state information. If nothing exists to restore, this |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
774 |
this function will silently return.""" |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
775 |
|
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
776 |
if not self.__snapshot: |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
777 |
return |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
778 |
|
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
779 |
for name, val in self.__snapshot.iteritems(): |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
780 |
if not name.startswith("__"): |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
781 |
object.__setattr__(self, name, val) |
e827313523d8
7774 image history discarded when bootenv operations fail or succeed
Shawn Walker <srw@sun.com>
parents:
1019
diff
changeset
|
782 |
self.__operations = self.__snapshot["__operations"] |