gat 0.2.8
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +84 -0
- data/PostInstall.txt +22 -0
- data/README.txt +49 -0
- data/Rakefile +12 -0
- data/bin/gat +15 -0
- data/lib/gat.rb +323 -0
- data/lib/gat/action/base.rb +197 -0
- data/lib/gat/action/ruby_method.rb +35 -0
- data/lib/gat/action/shell_command.rb +185 -0
- data/lib/gat/boot.rb +63 -0
- data/lib/gat/checks.rb +136 -0
- data/lib/gat/debug.rb +29 -0
- data/lib/gat/dependence/argument.rb +62 -0
- data/lib/gat/dependence/base.rb +54 -0
- data/lib/gat/dependence/folder.rb +104 -0
- data/lib/gat/dependence/program.rb +36 -0
- data/lib/gat/email.rb +80 -0
- data/lib/gat/exceptions.rb +163 -0
- data/lib/gat/extends.rb +102 -0
- data/lib/gat/help.rb +79 -0
- data/lib/gat/interpreter.rb +93 -0
- data/lib/gat/launcher.rb +100 -0
- data/lib/gat/logger.rb +331 -0
- data/lib/gat/operation.rb +253 -0
- data/lib/gat/version.rb +20 -0
- data/lib/gatgets/dar_backup/dar_backup.rb +367 -0
- data/lib/gatgets/dar_backup/dar_backup.yml +387 -0
- data/lib/gatgets/dar_backup/launcher.rb +44 -0
- data/lib/gatgets/dar_backup/templates/list_backups.erb +31 -0
- data/lib/gatgets/dar_backup/templates/search.erb +33 -0
- data/lib/gatgets/gatgets_manager/gatgets_manager.rb +65 -0
- data/lib/gatgets/gatgets_manager/gatgets_manager.yml +71 -0
- data/lib/gatgets/gatgets_manager/templates/list.erb +9 -0
- data/lib/gatgets/synchronization/README +26 -0
- data/lib/gatgets/synchronization/launcher.rb +20 -0
- data/lib/gatgets/synchronization/launcher_cron.sh +69 -0
- data/lib/gatgets/synchronization/synchronization.rb +123 -0
- data/lib/gatgets/synchronization/synchronization.yml +144 -0
- data/test/test_gat.rb +36 -0
- data/test/test_helper.rb +3 -0
- metadata +131 -0
data/lib/gat/logger.rb
ADDED
@@ -0,0 +1,331 @@
|
|
1
|
+
=begin
|
2
|
+
This file is part of GAT: http://gat.rubyforge.org
|
3
|
+
|
4
|
+
(c) 2008-2009 A.C. Gnoxys info@gnoxys.net
|
5
|
+
|
6
|
+
GAT (Gnoxys Administration Tools) is released under the GPL License 3 or higher.
|
7
|
+
You can get a copy of the license easily at http://www.gnu.org/licenses/gpl.html.
|
8
|
+
|
9
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
10
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
11
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
12
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
13
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
14
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
15
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
16
|
+
=end
|
17
|
+
|
18
|
+
module Gat
|
19
|
+
class Logger
|
20
|
+
|
21
|
+
include Gat::Debug
|
22
|
+
|
23
|
+
attr_reader :gatget
|
24
|
+
attr_reader :global_types
|
25
|
+
|
26
|
+
attr_accessor :times
|
27
|
+
attr_accessor :entries
|
28
|
+
|
29
|
+
def initialize(gatget)
|
30
|
+
@global_types = { 'trace' => { 'description' => 'Traces debug logs', 'verbose' => 4 },
|
31
|
+
'message' => { 'description' => 'Message by gat', 'verbose' => 3 },
|
32
|
+
'warning' => { 'description' => 'Warnings', 'verbose' => 2 },
|
33
|
+
'error' => { 'description' => 'Errors at Gatget', 'verbose' => 1 },
|
34
|
+
'direct' => { 'description' => 'Direct Outputs', 'verbose' => 0 }
|
35
|
+
}
|
36
|
+
|
37
|
+
@gatget = gatget || raise(GatgetException.new("Logger needs a gatget object", "initialize_logger"))
|
38
|
+
@times = Hash.new
|
39
|
+
@times['init'] = Time.now
|
40
|
+
@entries = Array.new
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
|
45
|
+
# Log method
|
46
|
+
# Store logs entry into entries array instance attribute
|
47
|
+
def log(*args)
|
48
|
+
log_entry = LogEntry.new(self, *args)
|
49
|
+
direct_output?(log_entry)
|
50
|
+
@entries << log_entry
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
# Gatget Logger output
|
55
|
+
# When operation or whatever is finish, gatget logger throw the outputs
|
56
|
+
#
|
57
|
+
# 3 Standar types are defined
|
58
|
+
# - Template output: Template output works with ERB standard template rubye engine. Template is evalued at printed as direct log
|
59
|
+
# Template is searched at <gatget_path>/templates/<operation_name>.erb
|
60
|
+
#
|
61
|
+
# - Email output: Email output deliver log to default email config or raise Exception. Default email config must be stored at
|
62
|
+
# @gatget.config['email_config']. Multiple to address can be defined and smtp && sendmail deliver methods are avalaible
|
63
|
+
#
|
64
|
+
# - YML output: YML output consist in a dump of logger to a yml structure file, so, then, log can be easily interpreted. YML log must be stored
|
65
|
+
# at /var/log/gat/<gatget_name>_<operation_name>_<time>.yml, so, log folder must we writtable or exception will be launched.
|
66
|
+
#
|
67
|
+
# Gat is planned to have more custom outputs by yml config like
|
68
|
+
#
|
69
|
+
# At operation definition (gatget yml config)
|
70
|
+
#
|
71
|
+
# operations:
|
72
|
+
# example_operation:
|
73
|
+
# outputs: [ custom_template, custom_email]
|
74
|
+
#
|
75
|
+
# and then, at templates definition
|
76
|
+
#
|
77
|
+
# templates:
|
78
|
+
# custom_template:
|
79
|
+
# type: template
|
80
|
+
# config:
|
81
|
+
# path: <your custom template path>
|
82
|
+
# log_level: <direct|warning|whatever>
|
83
|
+
# custom_email:
|
84
|
+
# type: email
|
85
|
+
# config:
|
86
|
+
# <overwrite here default email config>
|
87
|
+
#
|
88
|
+
# But it is still on mind :D
|
89
|
+
#
|
90
|
+
def output(type)
|
91
|
+
case type
|
92
|
+
when 'template','email','yml'
|
93
|
+
send("output_#{ type }")
|
94
|
+
else
|
95
|
+
# Now, do nothing! :D
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def to_yaml
|
100
|
+
entries_hash_array = []
|
101
|
+
@entries.each do |entry|
|
102
|
+
entries_hash_array << entry.to_hash
|
103
|
+
end
|
104
|
+
entries_hash_array.to_yaml
|
105
|
+
end
|
106
|
+
|
107
|
+
def human_sume
|
108
|
+
process_resume = "Process Resume:\n---------------\n\n"
|
109
|
+
process_resume << " - Times: \n * start: #{ self.gatget.times['init'] }\n * now: #{ Time.now }\n * secs: #{ Time.now - self.gatget.times['init']} \n * min: #{ (Time.now - self.gatget.times['init'])/60 } \n * hours: #{ ( Time.now - self.gatget.times['init'])/3600 } \n\n"
|
110
|
+
process_resume << " - Logger:\n * msgs: #{ self.entries.size }\n * warnings: #{ self.entries.select{|e| e.global_type == 'warning' }.size }\n * errors: #{ self.entries.select{|e| e.global_type == 'error' }.size }\n\n"
|
111
|
+
process_resume << " - Whole log: \n#{ self.entries.map{ |e| " * #{ e.inspect } \n" } }"
|
112
|
+
process_resume
|
113
|
+
end
|
114
|
+
|
115
|
+
private
|
116
|
+
# just output message if direct output is enabled by debug or by verbosity
|
117
|
+
def direct_output?(log_entry)
|
118
|
+
if @gatget.debug
|
119
|
+
print_debug_msg(log_entry.inspect)
|
120
|
+
else
|
121
|
+
$stdout.puts log_entry.output unless self.gatget.verbose < log_entry.verbose_level
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
|
126
|
+
# Standar template output
|
127
|
+
# See output for more information
|
128
|
+
def output_template
|
129
|
+
template_file = "#{ @gatget.path }/templates/#{ @gatget.operation.name }.erb"
|
130
|
+
|
131
|
+
# raise GatgetException if template not found
|
132
|
+
unless File.exists?(template_file)
|
133
|
+
raise GatgetException.new("Template for operation #{ @gatget.operation.name } not found at #{ template_file }", "run_outputs_template")
|
134
|
+
end
|
135
|
+
|
136
|
+
template_content = File.read(template_file)
|
137
|
+
|
138
|
+
# bind operation variable to template
|
139
|
+
operation = @gatget.operation
|
140
|
+
template = ERB.new(template_content, 0, "%<>")
|
141
|
+
@gatget.logger.log("direct", "operation_output_template", template.result(binding))
|
142
|
+
end
|
143
|
+
|
144
|
+
# Standar email output
|
145
|
+
# See output for more information
|
146
|
+
def output_email
|
147
|
+
# default email config is used
|
148
|
+
unless @gatget.config['email_config']
|
149
|
+
raise GatgetConfigException.new("Default email config is empty at @gatget.config['email_config']", "run_output_email")
|
150
|
+
end
|
151
|
+
|
152
|
+
if @gatget.operation.status == 'ok'
|
153
|
+
subject_prefix = 'OK'
|
154
|
+
elsif @gatget.operation.status == 'failed'
|
155
|
+
subject_prefix = 'ERROR'
|
156
|
+
else
|
157
|
+
subject_prefix = 'WARNING'
|
158
|
+
end
|
159
|
+
|
160
|
+
email_subject = "[GAT] [#{ @gatget.class }] [#{ @gatget.operation.name.camelize }] [#{ subject_prefix }]"
|
161
|
+
|
162
|
+
email_body = "#{ @gatget.logger.human_sume }"
|
163
|
+
|
164
|
+
@gatget.create_and_deliver_email(@gatget.config['email_config']['send_to'], { 'subject' => email_subject, 'body' => email_body }, @gatget.config['email_config'])
|
165
|
+
end
|
166
|
+
|
167
|
+
# Standar yml output
|
168
|
+
# See output for more information
|
169
|
+
def output_yml
|
170
|
+
yml_log = File.new("/var/log/gat/#{ self.gatget.name.underscore }_#{ self.gatget.operation.name }_#{ Time.now.strftime("%Y%m%d%H%M%S") }.yml", "w+")
|
171
|
+
yml_log.write(self.gatget.logger.to_yaml)
|
172
|
+
yml_log.close
|
173
|
+
end
|
174
|
+
|
175
|
+
end
|
176
|
+
|
177
|
+
|
178
|
+
class LogEntry
|
179
|
+
|
180
|
+
attr_reader :logger
|
181
|
+
attr_reader :global_type
|
182
|
+
attr_reader :category
|
183
|
+
attr_reader :message
|
184
|
+
attr_reader :options
|
185
|
+
attr_reader :verbose_level
|
186
|
+
attr_reader :time
|
187
|
+
|
188
|
+
|
189
|
+
def initialize(logger, global_type = "trace", category = "undefined", message = "Empty", *options)
|
190
|
+
@logger = logger
|
191
|
+
@time = Time.now
|
192
|
+
@global_type = global_type
|
193
|
+
|
194
|
+
unless logger.global_types.keys.include?(global_type)
|
195
|
+
raise GatgetException.new("Undefined log global_type #{ global_type }", "initialize_log_entry")
|
196
|
+
end
|
197
|
+
|
198
|
+
@category = category
|
199
|
+
@message = message
|
200
|
+
@options = options
|
201
|
+
@verbose_level = logger.global_types[global_type]['verbose']
|
202
|
+
end
|
203
|
+
|
204
|
+
|
205
|
+
def inspect
|
206
|
+
"#{ self.time.strftime("%Y-%m-%d %H:%M:%S") } | #{ self.global_type.ljust(20) } | #{ self.category.ljust(20) } => #{ self.message }"
|
207
|
+
end
|
208
|
+
|
209
|
+
def to_hash
|
210
|
+
{ 'time' => self.time, 'global_type' => self.global_type, 'category' => self.category, 'message' => self.message, 'options' => self.options }
|
211
|
+
end
|
212
|
+
|
213
|
+
def output
|
214
|
+
self.message
|
215
|
+
end
|
216
|
+
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
|
221
|
+
=begin
|
222
|
+
|
223
|
+
module Logger
|
224
|
+
|
225
|
+
|
226
|
+
# This function must be as robust as possible, so we can not allow any exception here
|
227
|
+
def log(global_type = "trace", category = "undefined", message = "Empty", options = {})
|
228
|
+
|
229
|
+
# log goes always to gat::log
|
230
|
+
|
231
|
+
#gatget_object = self.class.name == 'Gat::Base' ? self : self.gatget
|
232
|
+
gatget_object = self
|
233
|
+
|
234
|
+
log_entry = Hash.new
|
235
|
+
log_entry['type'] = global_type
|
236
|
+
log_entry['category'] = category
|
237
|
+
log_entry['message'] = message
|
238
|
+
log_entry['position'] = @logger.size
|
239
|
+
gatget_object.logger << log_entry
|
240
|
+
|
241
|
+
# skip output on debug mode
|
242
|
+
if gatget_object.debug
|
243
|
+
log_to_debug(log_entry)
|
244
|
+
else
|
245
|
+
|
246
|
+
#gatget_stout_output = gatget_object.config['gatget_operations'][gatget_object.operation]['output'] || 'enabled'
|
247
|
+
#if gatget_stout_output == 'enabled'
|
248
|
+
# log_entry_level = get_debug_levels[log_entry['type']] || 5
|
249
|
+
# if self.verbose >= log_entry_level
|
250
|
+
# $stdout.puts format_output(log_entry)
|
251
|
+
# end
|
252
|
+
#end
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
def format_output(log_entry, format = nil)
|
257
|
+
gatget_format_output = format || self.config['gatget_operations'][self.operation]['output_format'] || 'template'
|
258
|
+
|
259
|
+
if gatget_format_output == 'template'
|
260
|
+
|
261
|
+
template_file = self.templates["stdout"] || GAT_ROOT + '/templates/stdout.template'
|
262
|
+
template = File.new(template_file, "r")
|
263
|
+
template_content = ""
|
264
|
+
while (line = template.gets)
|
265
|
+
template_content << line
|
266
|
+
end
|
267
|
+
template.close
|
268
|
+
ret = eval(template_content)
|
269
|
+
else
|
270
|
+
ret = " #{ log_entry['position'].to_s.ljust(3) } | #{ log_entry['type'].ljust(10).upcase } | #{ log_entry['category'].ljust(30).upcase } | #{ log_entry['message'] }\n"
|
271
|
+
end
|
272
|
+
ret
|
273
|
+
end
|
274
|
+
|
275
|
+
|
276
|
+
# debug purpuose method, just output all
|
277
|
+
def log_to_debug(log_entry)
|
278
|
+
print_debug_msg "#{ log_entry['position'] } ** #{ log_entry['category'] } » #{ log_entry['message'] } «"
|
279
|
+
end
|
280
|
+
|
281
|
+
def get_type_messages(type)
|
282
|
+
entries = []
|
283
|
+
@logger.map { |log_entry|
|
284
|
+
entries << log_entry if log_entry['type'] == type
|
285
|
+
}
|
286
|
+
entries
|
287
|
+
end
|
288
|
+
|
289
|
+
|
290
|
+
|
291
|
+
# construct a string with all the logger information
|
292
|
+
def build_whole_log(options = {})
|
293
|
+
whole_log = ''
|
294
|
+
|
295
|
+
if options['start_text']
|
296
|
+
whole_log << options['start_text']
|
297
|
+
end
|
298
|
+
|
299
|
+
if options['include_resume']
|
300
|
+
for entry_type in ['error', 'warning']
|
301
|
+
type_entries = get_type_messages(entry_type)
|
302
|
+
|
303
|
+
if type_entries and type_entries.any?
|
304
|
+
whole_log << "\n"
|
305
|
+
whole_log << "#{ entry_type }s at gatget (#{ type_entries.size })\n"
|
306
|
+
whole_log << "#{ '-' * entry_type.size }-------------#{ '-' * type_entries.size.to_s.size }-\n"
|
307
|
+
whole_log << "\n"
|
308
|
+
|
309
|
+
type_entries.each do |type_entry|
|
310
|
+
whole_log << format_output(type_entry, 'plain')
|
311
|
+
end
|
312
|
+
else
|
313
|
+
whole_log << "0 #{ entry_type }s at gatget"
|
314
|
+
end
|
315
|
+
end
|
316
|
+
end
|
317
|
+
|
318
|
+
# include all log
|
319
|
+
whole_log << "\n"
|
320
|
+
whole_log << "whole log\n"
|
321
|
+
whole_log << "---------\n"
|
322
|
+
self.logger.each do |log_entry|
|
323
|
+
whole_log << format_output(log_entry, 'plain')
|
324
|
+
whole_log << "\n"
|
325
|
+
end
|
326
|
+
|
327
|
+
whole_log
|
328
|
+
end
|
329
|
+
end
|
330
|
+
end
|
331
|
+
=end
|
@@ -0,0 +1,253 @@
|
|
1
|
+
=begin
|
2
|
+
|
3
|
+
:file => operation.rb
|
4
|
+
:author => (c) 2008-2009 A.C. Gnoxys info@gnoxys.net
|
5
|
+
|
6
|
+
######################################################################################
|
7
|
+
## This file is part of GAT: http://gat.rubyforge.org ##
|
8
|
+
## ##
|
9
|
+
## GAT (Gnoxys Administration Tools) is released under the GPL License 3 or higher. ##
|
10
|
+
## You can get a copy of the license easily at http://www.gnu.org/licenses/gpl.html.##
|
11
|
+
######################################################################################
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
14
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
15
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
16
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
17
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
18
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
19
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
20
|
+
|
21
|
+
=end
|
22
|
+
|
23
|
+
|
24
|
+
module Gat
|
25
|
+
|
26
|
+
# Gat::Operation
|
27
|
+
#
|
28
|
+
# Operations are the pieces of a gatget. Operations means the whole procement when we want to make something
|
29
|
+
# Operations have the next config options at YML definition
|
30
|
+
#
|
31
|
+
# <operation_name> *must be uniq*
|
32
|
+
# description: <description text>
|
33
|
+
# Description of operation... It will be showed at gatget help
|
34
|
+
# users: [ <allowed users to run gat> ]
|
35
|
+
# Users that are allowed to run GatGet. If empty or missing, no restrictions are applied
|
36
|
+
# programs: [ <array of programs_names> ]
|
37
|
+
# Array of programs that are defined in YML config that operation will need
|
38
|
+
# arguments:[ <array of arguments_names> ]
|
39
|
+
# Array of arguments that are defined in YML config that operation will need
|
40
|
+
# folders:[ <array of folders_names> ]
|
41
|
+
# Array of folders that are defined in YML config that operation will need
|
42
|
+
# helpers:[ <array of helpers_names> ]
|
43
|
+
# Ruby methods that will be launched before actions starts
|
44
|
+
# actions:
|
45
|
+
# Array of actions that operation will launch
|
46
|
+
# outpus:
|
47
|
+
# Array of outputs that operation will print or make
|
48
|
+
# onfail:
|
49
|
+
# Ruby method that is launched if Operation fail_do_backup
|
50
|
+
#
|
51
|
+
|
52
|
+
|
53
|
+
class Operation
|
54
|
+
|
55
|
+
attr_reader :gatget
|
56
|
+
|
57
|
+
attr_reader :config
|
58
|
+
attr_reader :name
|
59
|
+
attr_reader :description
|
60
|
+
|
61
|
+
attr_reader :programs
|
62
|
+
attr_reader :arguments
|
63
|
+
attr_reader :folders
|
64
|
+
|
65
|
+
attr_reader :helpers
|
66
|
+
|
67
|
+
attr_reader :outputs
|
68
|
+
attr_reader :users
|
69
|
+
|
70
|
+
attr_accessor :actions
|
71
|
+
attr_accessor :status
|
72
|
+
|
73
|
+
def initialize(operation_name, operation_config, gatget)
|
74
|
+
@name = operation_name
|
75
|
+
@gatget = gatget
|
76
|
+
@description = operation_config['description'] || "#{ operation_name } at GatGet #{ self.class }"
|
77
|
+
@config = operation_config
|
78
|
+
@helpers = operation_config['helpers'] || []
|
79
|
+
|
80
|
+
@status = 'ok'
|
81
|
+
|
82
|
+
if operation_config['users'] and not valid_user(operation_config['users'])
|
83
|
+
raise GatgetException.new('Current user is not allowed to run gatget operation', 'valid_user')
|
84
|
+
end
|
85
|
+
|
86
|
+
for dependence in [ 'programs', 'arguments', 'folders' ]
|
87
|
+
self.instance_variable_set("@#{ dependence }", evalue_dependences(dependence))
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
|
92
|
+
def evalue_dependences(dependence_type)
|
93
|
+
# get named dependences
|
94
|
+
dependences = self.config[dependence_type] || []
|
95
|
+
evalued_dependences = Array.new
|
96
|
+
dependences.each do |dependence|
|
97
|
+
config = self.gatget.get_element_config(dependence_type, dependence)
|
98
|
+
dependence_object = Object.module_eval("Gat::Dependence::#{ dependence_type.gsub(/s$/,'').capitalize }").new(dependence, config, self)
|
99
|
+
dependence_object.evalue
|
100
|
+
evalued_dependences << dependence_object
|
101
|
+
end
|
102
|
+
|
103
|
+
evalued_dependences
|
104
|
+
end
|
105
|
+
|
106
|
+
# Execute operation.
|
107
|
+
# After set all dependences, operation is ready to run. Just do it
|
108
|
+
# By steps, operation will run:
|
109
|
+
#
|
110
|
+
# 1) Helpers
|
111
|
+
# 2) Actions
|
112
|
+
# 3) Outputs
|
113
|
+
#
|
114
|
+
# Each step, operation will check that state is ok, if not ok, operation is stopped
|
115
|
+
def execute
|
116
|
+
run_helpers if continue_operation('helpers')
|
117
|
+
ret = run_actions if continue_operation('actions')
|
118
|
+
|
119
|
+
self.gatget.logger.log("message", "operation", "Operation #{ self.name } Ended!")
|
120
|
+
|
121
|
+
run_outputs
|
122
|
+
ret
|
123
|
+
end
|
124
|
+
|
125
|
+
|
126
|
+
def get_action(action_name)
|
127
|
+
actions = self.actions.select { |a| a.name == action_name }
|
128
|
+
actions.first || raise(GatgetException.new("Action #{ action_name } not found at operation #{ self.name }", "get_actions"))
|
129
|
+
end
|
130
|
+
|
131
|
+
private
|
132
|
+
# Run Helpers
|
133
|
+
#
|
134
|
+
# Helpers are:
|
135
|
+
#
|
136
|
+
# - Ruby methods that are wrotten at controller gatget file and provides specific features to the gatget
|
137
|
+
# - Helpers can not stop or modify gatget operation status, only actions can do it
|
138
|
+
#
|
139
|
+
def run_helpers
|
140
|
+
self.helpers.each do |helper|
|
141
|
+
self.gatget.logger.log("trace", "helper", "Running helper #{ self.class } @#{ helper }")
|
142
|
+
|
143
|
+
self.gatget.send(helper)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
|
148
|
+
def run_actions
|
149
|
+
action_result = nil
|
150
|
+
actions = self.config['actions'] || []
|
151
|
+
|
152
|
+
if actions.empty?
|
153
|
+
raise GatgetConfigException.new("Actions are empty for operation #{ self.name }", "run_actions")
|
154
|
+
end
|
155
|
+
|
156
|
+
self.actions = Array.new
|
157
|
+
actions.each do |action|
|
158
|
+
action_config = self.gatget.get_element_config('actions', action) || []
|
159
|
+
|
160
|
+
if not action_config['type'] or action_config['type'].empty?
|
161
|
+
raise GatgetConfigException.new("Action type missing or empty for operation #{ self.name }", "run_actions")
|
162
|
+
end
|
163
|
+
|
164
|
+
action_object = Object.module_eval("Gat::Action::#{ action_config['type'].camelize }").new(action, action_config, self)
|
165
|
+
|
166
|
+
action_result = action_object.execute
|
167
|
+
self.actions << action_object
|
168
|
+
end
|
169
|
+
action_result
|
170
|
+
end
|
171
|
+
|
172
|
+
def run_outputs
|
173
|
+
outputs = self.config['outputs'] || []
|
174
|
+
|
175
|
+
outputs.each do |output|
|
176
|
+
self.gatget.logger.output(output)
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
|
181
|
+
def valid_user(users)
|
182
|
+
users.empty? or users.include?(%x[ whoami ].strip)
|
183
|
+
end
|
184
|
+
|
185
|
+
def continue_operation(continue_with)
|
186
|
+
ret = true
|
187
|
+
if self.status == 'failed'
|
188
|
+
self.gatget.logger.log("message", "operation", "Operation #{ self.name } will not run #{ continue_with }. Status is #{ self.status }")
|
189
|
+
ret = false
|
190
|
+
end
|
191
|
+
ret
|
192
|
+
end
|
193
|
+
|
194
|
+
|
195
|
+
end
|
196
|
+
|
197
|
+
end
|
198
|
+
|
199
|
+
|
200
|
+
|
201
|
+
# gatget_name: Your underscore gatgetname
|
202
|
+
|
203
|
+
# gatget_description: Your Gatget Description
|
204
|
+
|
205
|
+
# gatget_config_variables: Variable configurations to be used accross the gatget
|
206
|
+
|
207
|
+
# gatget_arguments: Gatget needed Arguments, by stdin or pipe
|
208
|
+
|
209
|
+
# gatget_programs: Array of programs gatget will use
|
210
|
+
|
211
|
+
# gaget_outputs Outputs an operations will launch
|
212
|
+
|
213
|
+
# gatget_conditions Conditions to be checked
|
214
|
+
# < condition_name >
|
215
|
+
# description Condition description
|
216
|
+
# type Condition check Type
|
217
|
+
# onfail What happens when condition fail
|
218
|
+
# onfail_message Optional Message for onfail
|
219
|
+
|
220
|
+
# gatget_actions
|
221
|
+
|
222
|
+
|
223
|
+
# gatget_operations Operations gatget will suport
|
224
|
+
# < operation_name >
|
225
|
+
# description Operation description
|
226
|
+
# arguments Array of arguments
|
227
|
+
# stdout: Array of stdouts
|
228
|
+
# instructions Array of instructions to execute
|
229
|
+
# onfail On fail Method
|
230
|
+
|
231
|
+
|
232
|
+
=begin
|
233
|
+
|
234
|
+
Gatget instance methods
|
235
|
+
# log Array of logs entries RW
|
236
|
+
|
237
|
+
# config Gatget Structure config R
|
238
|
+
# times Gatget Process Times RW
|
239
|
+
|
240
|
+
# operation Gatget runned operations R
|
241
|
+
|
242
|
+
# dependences: All that is needed by the program to run.extrated from config
|
243
|
+
# programs: Array with all the programs... take by config['gatget_config']['programs ']
|
244
|
+
# folders Array of Hasesh with config['gatget_config'][¡folder_name'] => { 'path' => '<path>', 'tree' => [ <tree folder array> ] }
|
245
|
+
# static Hash of static variables to the script
|
246
|
+
# arguments Command Line Arguments by get || pipe
|
247
|
+
#
|
248
|
+
|
249
|
+
=end
|
250
|
+
|
251
|
+
|
252
|
+
|
253
|
+
|