ec2_amitools 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README.md +54 -0
- data/bin/console +14 -0
- data/bin/ec2-ami-tools-version +6 -0
- data/bin/ec2-bundle-image +6 -0
- data/bin/ec2-bundle-vol +6 -0
- data/bin/ec2-delete-bundle +6 -0
- data/bin/ec2-download-bundle +6 -0
- data/bin/ec2-migrate-bundle +6 -0
- data/bin/ec2-migrate-manifest +6 -0
- data/bin/ec2-unbundle +6 -0
- data/bin/ec2-upload-bundle +6 -0
- data/bin/setup +8 -0
- data/etc/ec2/amitools/cert-ec2-cn-north-1.pem +28 -0
- data/etc/ec2/amitools/cert-ec2-gov.pem +17 -0
- data/etc/ec2/amitools/cert-ec2.pem +23 -0
- data/etc/ec2/amitools/mappings.csv +9 -0
- data/lib/ec2/amitools/bundle.rb +251 -0
- data/lib/ec2/amitools/bundle_base.rb +58 -0
- data/lib/ec2/amitools/bundleimage.rb +94 -0
- data/lib/ec2/amitools/bundleimageparameters.rb +42 -0
- data/lib/ec2/amitools/bundlemachineparameters.rb +60 -0
- data/lib/ec2/amitools/bundleparameters.rb +120 -0
- data/lib/ec2/amitools/bundlevol.rb +240 -0
- data/lib/ec2/amitools/bundlevolparameters.rb +164 -0
- data/lib/ec2/amitools/crypto.rb +379 -0
- data/lib/ec2/amitools/decryptmanifest.rb +20 -0
- data/lib/ec2/amitools/defaults.rb +12 -0
- data/lib/ec2/amitools/deletebundle.rb +212 -0
- data/lib/ec2/amitools/deletebundleparameters.rb +78 -0
- data/lib/ec2/amitools/downloadbundle.rb +161 -0
- data/lib/ec2/amitools/downloadbundleparameters.rb +84 -0
- data/lib/ec2/amitools/exception.rb +86 -0
- data/lib/ec2/amitools/fileutil.rb +219 -0
- data/lib/ec2/amitools/format.rb +127 -0
- data/lib/ec2/amitools/instance-data.rb +97 -0
- data/lib/ec2/amitools/manifest_wrapper.rb +132 -0
- data/lib/ec2/amitools/manifestv20070829.rb +361 -0
- data/lib/ec2/amitools/manifestv20071010.rb +403 -0
- data/lib/ec2/amitools/manifestv3.rb +331 -0
- data/lib/ec2/amitools/mapids.rb +148 -0
- data/lib/ec2/amitools/migratebundle.rb +222 -0
- data/lib/ec2/amitools/migratebundleparameters.rb +173 -0
- data/lib/ec2/amitools/migratemanifest.rb +225 -0
- data/lib/ec2/amitools/migratemanifestparameters.rb +118 -0
- data/lib/ec2/amitools/minimalec2.rb +116 -0
- data/lib/ec2/amitools/parameter_exceptions.rb +34 -0
- data/lib/ec2/amitools/parameters_base.rb +168 -0
- data/lib/ec2/amitools/region.rb +93 -0
- data/lib/ec2/amitools/s3toolparameters.rb +183 -0
- data/lib/ec2/amitools/showversion.rb +12 -0
- data/lib/ec2/amitools/syschecks.rb +27 -0
- data/lib/ec2/amitools/tool_base.rb +224 -0
- data/lib/ec2/amitools/unbundle.rb +107 -0
- data/lib/ec2/amitools/unbundleparameters.rb +65 -0
- data/lib/ec2/amitools/uploadbundle.rb +361 -0
- data/lib/ec2/amitools/uploadbundleparameters.rb +108 -0
- data/lib/ec2/amitools/util.rb +532 -0
- data/lib/ec2/amitools/version.rb +33 -0
- data/lib/ec2/amitools/xmlbuilder.rb +237 -0
- data/lib/ec2/amitools/xmlutil.rb +55 -0
- data/lib/ec2/common/constants.rb +16 -0
- data/lib/ec2/common/curl.rb +110 -0
- data/lib/ec2/common/headers.rb +95 -0
- data/lib/ec2/common/headersv4.rb +173 -0
- data/lib/ec2/common/http.rb +333 -0
- data/lib/ec2/common/s3support.rb +231 -0
- data/lib/ec2/common/signature.rb +68 -0
- data/lib/ec2/oem/LICENSE.txt +58 -0
- data/lib/ec2/oem/open4.rb +399 -0
- data/lib/ec2/platform/base/architecture.rb +26 -0
- data/lib/ec2/platform/base/constants.rb +54 -0
- data/lib/ec2/platform/base/pipeline.rb +181 -0
- data/lib/ec2/platform/base.rb +57 -0
- data/lib/ec2/platform/current.rb +55 -0
- data/lib/ec2/platform/linux/architecture.rb +35 -0
- data/lib/ec2/platform/linux/constants.rb +23 -0
- data/lib/ec2/platform/linux/fstab.rb +99 -0
- data/lib/ec2/platform/linux/identity.rb +16 -0
- data/lib/ec2/platform/linux/image.rb +811 -0
- data/lib/ec2/platform/linux/mtab.rb +74 -0
- data/lib/ec2/platform/linux/pipeline.rb +40 -0
- data/lib/ec2/platform/linux/rsync.rb +114 -0
- data/lib/ec2/platform/linux/tar.rb +124 -0
- data/lib/ec2/platform/linux/uname.rb +50 -0
- data/lib/ec2/platform/linux.rb +83 -0
- data/lib/ec2/platform/solaris/architecture.rb +28 -0
- data/lib/ec2/platform/solaris/constants.rb +30 -0
- data/lib/ec2/platform/solaris/fstab.rb +43 -0
- data/lib/ec2/platform/solaris/identity.rb +16 -0
- data/lib/ec2/platform/solaris/image.rb +327 -0
- data/lib/ec2/platform/solaris/mtab.rb +29 -0
- data/lib/ec2/platform/solaris/pipeline.rb +40 -0
- data/lib/ec2/platform/solaris/rsync.rb +24 -0
- data/lib/ec2/platform/solaris/tar.rb +36 -0
- data/lib/ec2/platform/solaris/uname.rb +21 -0
- data/lib/ec2/platform/solaris.rb +38 -0
- data/lib/ec2/platform.rb +69 -0
- data/lib/ec2/version.rb +8 -0
- data/lib/ec2_amitools +1 -0
- data/lib/ec2_amitools.rb +7 -0
- metadata +184 -0
@@ -0,0 +1,108 @@
|
|
1
|
+
# Copyright 2008-2014 Amazon.com, Inc. or its affiliates. All Rights
|
2
|
+
# Reserved. Licensed under the Amazon Software License (the
|
3
|
+
# "License"). You may not use this file except in compliance with the
|
4
|
+
# License. A copy of the License is located at
|
5
|
+
# http://aws.amazon.com/asl or in the "license" file accompanying this
|
6
|
+
# file. This file is distributed on an "AS IS" BASIS, WITHOUT
|
7
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See
|
8
|
+
# the License for the specific language governing permissions and
|
9
|
+
# limitations under the License.
|
10
|
+
|
11
|
+
require 'ec2/amitools/s3toolparameters'
|
12
|
+
require 'ec2/amitools/region'
|
13
|
+
|
14
|
+
#------------------------------------------------------------------------------#
|
15
|
+
|
16
|
+
class UploadBundleParameters < S3ToolParameters
|
17
|
+
|
18
|
+
MANIFEST_DESCRIPTION = "The path to the manifest file."
|
19
|
+
ACL_DESCRIPTION = ["The access control list policy [\"public-read\" | \"aws-exec-read\"].",
|
20
|
+
"Defaults to \"aws-exec-read\"."]
|
21
|
+
DIRECTORY_DESCRIPTION = ["The directory containing the bundled AMI parts to upload.",
|
22
|
+
"Defaults to the directory containing the manifest."]
|
23
|
+
PART_DESCRIPTION = "Upload the specified part and upload all subsequent parts."
|
24
|
+
RETRY_DESCRIPTION = "Automatically retry failed uploads."
|
25
|
+
SKIP_MANIFEST_DESCRIPTION = "Do not upload the manifest."
|
26
|
+
LOCATION_DESCRIPTION = "The location of the bucket to upload to [#{AwsRegion.s3_locations.join(',')}]."
|
27
|
+
|
28
|
+
attr_accessor :manifest,
|
29
|
+
:acl,
|
30
|
+
:directory,
|
31
|
+
:part,
|
32
|
+
:retry,
|
33
|
+
:skipmanifest,
|
34
|
+
:location
|
35
|
+
|
36
|
+
#----------------------------------------------------------------------------#
|
37
|
+
|
38
|
+
def mandatory_params()
|
39
|
+
super()
|
40
|
+
|
41
|
+
on('-m', '--manifest PATH', String, MANIFEST_DESCRIPTION) do |manifest|
|
42
|
+
assert_file_exists(manifest, '--manifest')
|
43
|
+
@manifest = manifest
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
#----------------------------------------------------------------------------#
|
48
|
+
|
49
|
+
def optional_params()
|
50
|
+
super()
|
51
|
+
|
52
|
+
on('--acl ACL', String, *ACL_DESCRIPTION) do |acl|
|
53
|
+
assert_option_in(acl, ['public-read', 'aws-exec-read'], '--acl')
|
54
|
+
@acl = acl
|
55
|
+
end
|
56
|
+
|
57
|
+
on('-d', '--directory DIRECTORY', String, *DIRECTORY_DESCRIPTION) do |directory|
|
58
|
+
assert_directory_exists(directory, '--directory')
|
59
|
+
@directory = directory
|
60
|
+
end
|
61
|
+
|
62
|
+
on('--part PART', Integer, PART_DESCRIPTION) do |part|
|
63
|
+
@part = part
|
64
|
+
end
|
65
|
+
|
66
|
+
on('--retry', RETRY_DESCRIPTION) do
|
67
|
+
@retry = true
|
68
|
+
end
|
69
|
+
|
70
|
+
on('--skipmanifest', SKIP_MANIFEST_DESCRIPTION) do
|
71
|
+
@skipmanifest = true
|
72
|
+
end
|
73
|
+
|
74
|
+
on('--location LOCATION', LOCATION_DESCRIPTION) do |location|
|
75
|
+
assert_option_in(location, AwsRegion.s3_locations, '--location')
|
76
|
+
@location = case location
|
77
|
+
when "eu-west-1" then "EU"
|
78
|
+
when "US" then :unconstrained
|
79
|
+
else location
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
#----------------------------------------------------------------------------#
|
85
|
+
|
86
|
+
def validate_params()
|
87
|
+
super()
|
88
|
+
raise MissingMandatory.new('--manifest') unless @manifest
|
89
|
+
end
|
90
|
+
|
91
|
+
#----------------------------------------------------------------------------#
|
92
|
+
|
93
|
+
def set_defaults()
|
94
|
+
super()
|
95
|
+
@acl ||= 'aws-exec-read'
|
96
|
+
@directory ||= File::dirname(@manifest)
|
97
|
+
# If no location is given, set it equal to the region.
|
98
|
+
# For legacy reasons if no location is given the location is set to US
|
99
|
+
# If the region is us-east-1, we must not set the location. By not setting
|
100
|
+
# the location S3 will default to the correct US location (which can't be
|
101
|
+
# specified).
|
102
|
+
if @region && !@location && !(@region == 'us-east-1')
|
103
|
+
STDERR.puts "No location specified, setting location to conform with region: #{@region}"
|
104
|
+
@location = @region
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
@@ -0,0 +1,532 @@
|
|
1
|
+
# Copyright 2008-2014 Amazon.com, Inc. or its affiliates. All Rights
|
2
|
+
# Reserved. Licensed under the Amazon Software License (the
|
3
|
+
# "License"). You may not use this file except in compliance with the
|
4
|
+
# License. A copy of the License is located at
|
5
|
+
# http://aws.amazon.com/asl or in the "license" file accompanying this
|
6
|
+
# file. This file is distributed on an "AS IS" BASIS, WITHOUT
|
7
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See
|
8
|
+
# the License for the specific language governing permissions and
|
9
|
+
# limitations under the License.
|
10
|
+
|
11
|
+
require 'monitor'
|
12
|
+
require 'thread'
|
13
|
+
require 'syslog'
|
14
|
+
|
15
|
+
##
|
16
|
+
# generate a unique identifier used for filenames
|
17
|
+
#
|
18
|
+
def gen_ident()
|
19
|
+
(0..19).inject("") {|ident, n| ident+(?A + Kernel.rand(26)).chr}
|
20
|
+
end
|
21
|
+
|
22
|
+
#------------------------------------------------------------------------------#
|
23
|
+
|
24
|
+
# A thread local buffer manager. Provide's each thread with a single
|
25
|
+
# pre-allocated IO buffer. IMPORTANT: as these buffers are indexed in a
|
26
|
+
# hashtable they will not be freed until the application closes. If a thread
|
27
|
+
# needs to free the memory its buffer is using, it must call
|
28
|
+
# <code>delete_buffer</code> and ensure it has no references to the buffer.
|
29
|
+
class ThreadLocalBuffer
|
30
|
+
POWER = 12 # Log SIZE base 2
|
31
|
+
SIZE = 2**POWER # Size of the buffer.
|
32
|
+
@@buffers = {}
|
33
|
+
@@buffers.extend( MonitorMixin )
|
34
|
+
|
35
|
+
#----------------------------------------------------------------------------#
|
36
|
+
|
37
|
+
# Return the thread's buffer.
|
38
|
+
def ThreadLocalBuffer.get_buffer
|
39
|
+
@@buffers.synchronize do
|
40
|
+
@@buffers[Thread.current] = new_buffer unless @@buffers.has_key?( Thread.current )
|
41
|
+
@@buffers[Thread.current]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
#----------------------------------------------------------------------------#
|
46
|
+
|
47
|
+
# Delete the threads buffer.
|
48
|
+
def delete_buffer buffer
|
49
|
+
@@buffers.delete buffer
|
50
|
+
end
|
51
|
+
|
52
|
+
#----------------------------------------------------------------------------#
|
53
|
+
|
54
|
+
def ThreadLocalBuffer.new_buffer
|
55
|
+
buffer = String.new
|
56
|
+
buffer = Format::hex2bin( '00' )
|
57
|
+
POWER.times { buffer << buffer }
|
58
|
+
buffer
|
59
|
+
end
|
60
|
+
|
61
|
+
private_class_method :new_buffer
|
62
|
+
end
|
63
|
+
|
64
|
+
#------------------------------------------------------------------------------#
|
65
|
+
|
66
|
+
##
|
67
|
+
# Base class for XML-RPC structures. Stores key and values pairs. Key names are
|
68
|
+
# mapped to method names by converting '-' to '_' characters.
|
69
|
+
#
|
70
|
+
class XMLRPCStruct < Hash
|
71
|
+
# _members_ A list of the structure's key names or nil if any key names
|
72
|
+
# are allowed.
|
73
|
+
def initialize members
|
74
|
+
unless members.kind_of? Array or members.nil?
|
75
|
+
raise ArgumentError.new( "invalid members argument" )
|
76
|
+
end
|
77
|
+
@members = members
|
78
|
+
end
|
79
|
+
|
80
|
+
# Provide direct access to individual instance elements by methods named after
|
81
|
+
# the element's key.
|
82
|
+
def method_missing( method_symbol, argument=nil )
|
83
|
+
# Here kid, play with this loaded gun...
|
84
|
+
method = method_symbol.to_s
|
85
|
+
|
86
|
+
# Determine if setter or getter call and remove '=' if setter.
|
87
|
+
setter = /[\S]+=/.match(method)
|
88
|
+
member = (setter ? method.slice(0, method.size - 1) : method)
|
89
|
+
|
90
|
+
# Map method name to member name.
|
91
|
+
member = member.gsub('_', '-')
|
92
|
+
|
93
|
+
# If valid attribute set or get accordingly. If the member list is nil then
|
94
|
+
# any members are allowed.
|
95
|
+
if @members.nil? or @members.include?( member )
|
96
|
+
if setter
|
97
|
+
raise ArgumentError, "value for key #{member} may not be nil" if argument.nil?
|
98
|
+
self[member] = argument
|
99
|
+
else
|
100
|
+
self[member]
|
101
|
+
end
|
102
|
+
else
|
103
|
+
raise NoMethodError.new( method )
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
#------------------------------------------------------------------------------#
|
109
|
+
|
110
|
+
##
|
111
|
+
# Note to self - use log4r next time ;)
|
112
|
+
#
|
113
|
+
class Log
|
114
|
+
#----------------------------------------------------------------------------#
|
115
|
+
|
116
|
+
# @deprecated use Priority instead
|
117
|
+
class Verbosity
|
118
|
+
private_class_method :new
|
119
|
+
@@levels = Hash.new
|
120
|
+
|
121
|
+
def initialize value
|
122
|
+
@value = value
|
123
|
+
@@levels[value] = self
|
124
|
+
end
|
125
|
+
|
126
|
+
V0 = new 0 # Unhandled exceptions only.
|
127
|
+
V1 = new 1 # As for 0 but with error messages.
|
128
|
+
V2 = new 2 # As for 1 but with informational messages.
|
129
|
+
V3 = new 3 # As for 2 but with XML-RPC logging.
|
130
|
+
V4 = new 4 # As for 3 but with Xen logging.
|
131
|
+
V5 = new 5 # As for 4 but with debugging messages.
|
132
|
+
|
133
|
+
attr_accessor :value
|
134
|
+
|
135
|
+
def >= operand
|
136
|
+
@value >= operand.value
|
137
|
+
end
|
138
|
+
|
139
|
+
def Verbosity.from_string s
|
140
|
+
level = s.to_i
|
141
|
+
if not @@levels[level]
|
142
|
+
raise ArgumentError.new("invalid logging verbosity level #{level}")
|
143
|
+
else
|
144
|
+
@@levels[level]
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
def to_priority
|
149
|
+
case self
|
150
|
+
when V0
|
151
|
+
return Priority::ALERT
|
152
|
+
when V1
|
153
|
+
return Priority::ERR
|
154
|
+
when V2
|
155
|
+
return Priority::WARNING
|
156
|
+
when V3
|
157
|
+
return Priority::NOTICE
|
158
|
+
when V4
|
159
|
+
return Priority::INFO
|
160
|
+
else
|
161
|
+
return Priority::DEBUG
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
#----------------------------------------------------------------------------#
|
167
|
+
|
168
|
+
class Facility
|
169
|
+
private_class_method :new
|
170
|
+
|
171
|
+
def initialize(name)
|
172
|
+
@name = name
|
173
|
+
@value = (name == "AES")?(12<<3):eval("Syslog::LOG_#{name}")
|
174
|
+
end
|
175
|
+
|
176
|
+
AUTHPRIV = new "AUTHPRIV"
|
177
|
+
CRON = new "CRON"
|
178
|
+
DAEMON = new "DAEMON"
|
179
|
+
FTP = new "FTP"
|
180
|
+
KERN = new "KERN"
|
181
|
+
LOCAL0 = new "LOCAL0"
|
182
|
+
LOCAL1 = new "LOCAL1"
|
183
|
+
LOCAL2 = new "LOCAL2"
|
184
|
+
LOCAL3 = new "LOCAL3"
|
185
|
+
LOCAL4 = new "LOCAL4"
|
186
|
+
LOCAL5 = new "LOCAL5"
|
187
|
+
LOCAL6 = new "LOCAL6"
|
188
|
+
LOCAL7 = new "LOCAL7"
|
189
|
+
LPR = new "LPR"
|
190
|
+
MAIL = new "MAIL"
|
191
|
+
NEWS = new "NEWS"
|
192
|
+
SYSLOG = new "SYSLOG"
|
193
|
+
USER = new "USER"
|
194
|
+
UUCP = new "UUCP"
|
195
|
+
AES = new "AES"
|
196
|
+
|
197
|
+
attr_accessor :value
|
198
|
+
attr_accessor :name
|
199
|
+
|
200
|
+
def to_s
|
201
|
+
"Facility[LOG_#{@name}]"
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
#----------------------------------------------------------------------------#
|
206
|
+
|
207
|
+
class Priority
|
208
|
+
include Comparable
|
209
|
+
|
210
|
+
private_class_method :new
|
211
|
+
|
212
|
+
def initialize(name)
|
213
|
+
@name = name
|
214
|
+
@value = eval("Syslog::LOG_#{name}")
|
215
|
+
end
|
216
|
+
|
217
|
+
EMERG = new "EMERG" # 0
|
218
|
+
ALERT = new "ALERT" # 1
|
219
|
+
CRIT = new "CRIT" # 2
|
220
|
+
ERR = new "ERR" # 3
|
221
|
+
WARNING = new "WARNING" # 4
|
222
|
+
NOTICE = new "NOTICE" # 5
|
223
|
+
INFO = new "INFO" # 6
|
224
|
+
DEBUG = new "DEBUG" # 7
|
225
|
+
|
226
|
+
attr_accessor :value
|
227
|
+
attr_accessor :name
|
228
|
+
|
229
|
+
def <=>(priority)
|
230
|
+
@value <=> priority.value
|
231
|
+
end
|
232
|
+
|
233
|
+
def to_s
|
234
|
+
"Priority[LOG_#{@name}]"
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
238
|
+
#----------------------------------------------------------------------------#
|
239
|
+
|
240
|
+
@@facility = Facility::AES
|
241
|
+
@@priority = Priority::INFO
|
242
|
+
@@identity = nil
|
243
|
+
@@streams_mutex = Mutex.new
|
244
|
+
@@streams = []
|
245
|
+
|
246
|
+
#----------------------------------------------------------------------------#
|
247
|
+
|
248
|
+
##
|
249
|
+
# Set the verbosity of the logging.
|
250
|
+
# @deprecated use set_priority
|
251
|
+
def Log.set_verbosity(verbosity)
|
252
|
+
set_priority(verbosity.to_priority)
|
253
|
+
end
|
254
|
+
|
255
|
+
#----------------------------------------------------------------------------#
|
256
|
+
|
257
|
+
##
|
258
|
+
# Set the IO instance to log to.
|
259
|
+
# @deprecated use add_stream
|
260
|
+
def Log.set_io(io)
|
261
|
+
add_stream(io)
|
262
|
+
end
|
263
|
+
|
264
|
+
#----------------------------------------------------------------------------#
|
265
|
+
|
266
|
+
##
|
267
|
+
# Log a debug message.
|
268
|
+
def Log.debug(msg=nil)
|
269
|
+
if block_given?
|
270
|
+
write(Priority::DEBUG) {yield}
|
271
|
+
else
|
272
|
+
write(Priority::DEBUG) {msg}
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
276
|
+
#----------------------------------------------------------------------------#
|
277
|
+
|
278
|
+
##
|
279
|
+
# Log a warning message.
|
280
|
+
def Log.warn(msg=nil)
|
281
|
+
if block_given?
|
282
|
+
write(Priority::WARNING) {yield}
|
283
|
+
else
|
284
|
+
write(Priority::WARNING) {msg}
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
288
|
+
#----------------------------------------------------------------------------#
|
289
|
+
|
290
|
+
##
|
291
|
+
# Log an informational message.
|
292
|
+
def Log.info(msg=nil)
|
293
|
+
if block_given?
|
294
|
+
write(Priority::INFO) {yield}
|
295
|
+
else
|
296
|
+
write(Priority::INFO) {msg}
|
297
|
+
end
|
298
|
+
end
|
299
|
+
|
300
|
+
#----------------------------------------------------------------------------#
|
301
|
+
|
302
|
+
##
|
303
|
+
# Log an error message.
|
304
|
+
def Log.err(msg=nil)
|
305
|
+
if block_given?
|
306
|
+
write(Priority::ERR) {yield}
|
307
|
+
else
|
308
|
+
write(Priority::ERR) {msg}
|
309
|
+
end
|
310
|
+
end
|
311
|
+
|
312
|
+
#----------------------------------------------------------------------------#
|
313
|
+
|
314
|
+
##
|
315
|
+
# Log a warning message.
|
316
|
+
def Log.warn(msg=nil)
|
317
|
+
if block_given?
|
318
|
+
write(Priority::WARNING) {yield}
|
319
|
+
else
|
320
|
+
write(Priority::WARNING) {msg}
|
321
|
+
end
|
322
|
+
end
|
323
|
+
|
324
|
+
#----------------------------------------------------------------------------#
|
325
|
+
|
326
|
+
##
|
327
|
+
# Log an unhandled exception.
|
328
|
+
# @deprecated use write
|
329
|
+
def Log.exception(e)
|
330
|
+
if block_given?
|
331
|
+
write(Priority::ALERT) {yield}
|
332
|
+
else
|
333
|
+
write(Priority::ALERT) {Log.exception_str(e)}
|
334
|
+
end
|
335
|
+
end
|
336
|
+
|
337
|
+
#----------------------------------------------------------------------------#
|
338
|
+
|
339
|
+
##
|
340
|
+
# Log an informational message.
|
341
|
+
# @deprecated use write
|
342
|
+
def Log.msg(msg)
|
343
|
+
write(Verbosity::V2.to_priority) {msg}
|
344
|
+
end
|
345
|
+
|
346
|
+
#----------------------------------------------------------------------------#
|
347
|
+
|
348
|
+
# @deprecated use write
|
349
|
+
def Log.xen_msg(msg)
|
350
|
+
write(Verbosity::V4.to_priority) {msg}
|
351
|
+
end
|
352
|
+
|
353
|
+
#----------------------------------------------------------------------------#
|
354
|
+
|
355
|
+
# @deprecated use write
|
356
|
+
def Log.xmlrpcmethod_call(name, *paramstructs)
|
357
|
+
write(Verbosity::V3.to_priority) {Log.xmlrpcmethod_call_str(name, paramstructs)}
|
358
|
+
end
|
359
|
+
|
360
|
+
#----------------------------------------------------------------------------#
|
361
|
+
|
362
|
+
# @deprecated use write
|
363
|
+
def Log.xmlrpcmethod_return(name, value)
|
364
|
+
write(Verbosity::V3.to_priority) {Log.xmlrpcmethod_return_str(name, value)}
|
365
|
+
end
|
366
|
+
|
367
|
+
#----------------------------------------------------------------------------#
|
368
|
+
|
369
|
+
# @deprecated use write
|
370
|
+
def Log.xmlrpcfault(xmlrpc_method, fault)
|
371
|
+
write(Verbosity::V3.to_priority) {Log.xmlrpcfault_str(xmlrpc_method, fault)}
|
372
|
+
end
|
373
|
+
|
374
|
+
#----------------------------------------------------------------------------#
|
375
|
+
|
376
|
+
##
|
377
|
+
# Add an additional stream (like a file, or $stdout) to send
|
378
|
+
# log output to.
|
379
|
+
#
|
380
|
+
def Log.add_stream(stream)
|
381
|
+
@@streams_mutex.synchronize do
|
382
|
+
@@streams.push(stream)
|
383
|
+
@@streams.delete_if { |io| io.closed? }
|
384
|
+
end
|
385
|
+
end
|
386
|
+
|
387
|
+
#----------------------------------------------------------------------------#
|
388
|
+
|
389
|
+
def Log.exception_str(e)
|
390
|
+
e.message + "\n" + e.backtrace.to_s
|
391
|
+
end
|
392
|
+
|
393
|
+
#----------------------------------------------------------------------------#
|
394
|
+
|
395
|
+
def Log.xmlrpcfault_str(xmlrpc_method, fault)
|
396
|
+
"XML-RPC method fault\nmethod: #{xmlrpc_method}\nfault code: #{fault.faultCode}\nfault string: #{fault.faultString}"
|
397
|
+
end
|
398
|
+
|
399
|
+
#----------------------------------------------------------------------------#
|
400
|
+
|
401
|
+
def Log.xmlrpcmethod_call_str(name, *paramstructs)
|
402
|
+
msg = "name: #{name}\n"
|
403
|
+
paramstructs.each_index { |i| msg += "parameter #{i + 1}: #{paramstructs[i].inspect}\n" }
|
404
|
+
"XML-RPC method call\n#{msg}"
|
405
|
+
end
|
406
|
+
|
407
|
+
#----------------------------------------------------------------------------#
|
408
|
+
|
409
|
+
def Log.xmlrpcmethod_return_str(name, value)
|
410
|
+
msg = "name: #{name}\nvalue: #{value.inspect}"
|
411
|
+
"XML-RPC method return\n#{msg}"
|
412
|
+
end
|
413
|
+
|
414
|
+
#----------------------------------------------------------------------------#
|
415
|
+
|
416
|
+
##
|
417
|
+
# Set the minimum priority of the logging. Messages logged with a
|
418
|
+
# lower (less urgent) priority will be ignored.
|
419
|
+
#
|
420
|
+
def Log.set_priority(priority)
|
421
|
+
@@priority = priority
|
422
|
+
end
|
423
|
+
|
424
|
+
#----------------------------------------------------------------------------#
|
425
|
+
|
426
|
+
##
|
427
|
+
# Set the facility to log messages against when no explicit facility is
|
428
|
+
# provided.
|
429
|
+
#
|
430
|
+
def Log.set_facility(facility)
|
431
|
+
@@facility = facility
|
432
|
+
end
|
433
|
+
|
434
|
+
#----------------------------------------------------------------------------#
|
435
|
+
|
436
|
+
##
|
437
|
+
# Set the identity to log messages against when no explicit identity is
|
438
|
+
# provided. If no identity is provided (either using this method or explicitly
|
439
|
+
# when logging) the system will use the application name as the identity.
|
440
|
+
#
|
441
|
+
def Log.set_identity(identity)
|
442
|
+
@@identity = identity
|
443
|
+
end
|
444
|
+
|
445
|
+
#----------------------------------------------------------------------------#
|
446
|
+
|
447
|
+
SYSLOG_OPTS = (Syslog::LOG_PID | Syslog::LOG_CONS)
|
448
|
+
|
449
|
+
#----------------------------------------------------------------------------#
|
450
|
+
|
451
|
+
def Log.time
|
452
|
+
Time.new.to_s
|
453
|
+
end
|
454
|
+
|
455
|
+
private_class_method :time
|
456
|
+
|
457
|
+
#----------------------------------------------------------------------------#
|
458
|
+
|
459
|
+
def Log.write(priority=Priority::DEBUG, facility=nil, identity=nil)
|
460
|
+
# If the priority of this message is below the defined priority
|
461
|
+
# for logging then we don't want to do this at all. NOTE: Priorities
|
462
|
+
# for syslog are defined in ascending order (so lower priorities
|
463
|
+
# are more urgent).
|
464
|
+
return unless priority <= @@priority
|
465
|
+
return unless block_given?
|
466
|
+
|
467
|
+
begin
|
468
|
+
facility = (facility == nil)?(@@facility):(facility)
|
469
|
+
fac_int = facility.value
|
470
|
+
ident = (identity == nil)?(@@identity):(identity)
|
471
|
+
msg = yield
|
472
|
+
Syslog.open(ident, SYSLOG_OPTS, fac_int) do |log|
|
473
|
+
log.log(priority.value, '%s', msg)
|
474
|
+
end
|
475
|
+
|
476
|
+
# Now pass the message onto each registered stream
|
477
|
+
# Access to our list of streams is synchronized so that it can be changed
|
478
|
+
# at runtime.
|
479
|
+
@@streams_mutex.synchronize do
|
480
|
+
@@streams.each do |stream|
|
481
|
+
begin
|
482
|
+
stream.puts "#{time}: #{ident}: #{priority.value}: #{msg}"
|
483
|
+
stream.flush
|
484
|
+
rescue Exception => e
|
485
|
+
$stderr.puts 'error writing to stream [#{stream}], logging to stdout'
|
486
|
+
end
|
487
|
+
end
|
488
|
+
end
|
489
|
+
rescue Exception => e
|
490
|
+
$stderr.puts "error loggin to syslog, logging to stdout: #{e}"
|
491
|
+
if block_given?
|
492
|
+
begin
|
493
|
+
$stdout.puts "Msg: #{msg}"
|
494
|
+
rescue Exception => e
|
495
|
+
$stderr.puts "Block raised error: #{e}"
|
496
|
+
end
|
497
|
+
end
|
498
|
+
end
|
499
|
+
end
|
500
|
+
end
|
501
|
+
|
502
|
+
#------------------------------------------------------------------------------#
|
503
|
+
|
504
|
+
##
|
505
|
+
# Utilities used for logging (in order for compatability between AESLogger and the previous Log class)
|
506
|
+
|
507
|
+
class LogUtils
|
508
|
+
|
509
|
+
##
|
510
|
+
# Prevent instantiation
|
511
|
+
private_class_method :new
|
512
|
+
|
513
|
+
def LogUtils.exception_str(e)
|
514
|
+
e.message + "\n" + e.backtrace.to_s
|
515
|
+
end
|
516
|
+
|
517
|
+
def LogUtils.xmlrpcfault_str(xmlrpc_method, fault)
|
518
|
+
"XML-RPC method fault : method: #{xmlrpc_method} : fault code: #{fault.faultCode} : fault string: #{fault.faultString}"
|
519
|
+
end
|
520
|
+
|
521
|
+
def LogUtils.xmlrpcmethod_call_str(name, *paramstructs)
|
522
|
+
msg = "name: #{name} : "
|
523
|
+
paramstructs.each_index { |i| msg += "parameter #{i + 1}: #{paramstructs[i].inspect} : " }
|
524
|
+
"XML-RPC method call\n#{msg}"
|
525
|
+
end
|
526
|
+
|
527
|
+
def LogUtils.xmlrpcmethod_return_str(name, value)
|
528
|
+
msg = "name: #{name} : value: #{value.inspect}"
|
529
|
+
"XML-RPC method return : #{msg}"
|
530
|
+
end
|
531
|
+
end
|
532
|
+
|