gat 0.2.8

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.
Files changed (41) hide show
  1. data/History.txt +84 -0
  2. data/PostInstall.txt +22 -0
  3. data/README.txt +49 -0
  4. data/Rakefile +12 -0
  5. data/bin/gat +15 -0
  6. data/lib/gat.rb +323 -0
  7. data/lib/gat/action/base.rb +197 -0
  8. data/lib/gat/action/ruby_method.rb +35 -0
  9. data/lib/gat/action/shell_command.rb +185 -0
  10. data/lib/gat/boot.rb +63 -0
  11. data/lib/gat/checks.rb +136 -0
  12. data/lib/gat/debug.rb +29 -0
  13. data/lib/gat/dependence/argument.rb +62 -0
  14. data/lib/gat/dependence/base.rb +54 -0
  15. data/lib/gat/dependence/folder.rb +104 -0
  16. data/lib/gat/dependence/program.rb +36 -0
  17. data/lib/gat/email.rb +80 -0
  18. data/lib/gat/exceptions.rb +163 -0
  19. data/lib/gat/extends.rb +102 -0
  20. data/lib/gat/help.rb +79 -0
  21. data/lib/gat/interpreter.rb +93 -0
  22. data/lib/gat/launcher.rb +100 -0
  23. data/lib/gat/logger.rb +331 -0
  24. data/lib/gat/operation.rb +253 -0
  25. data/lib/gat/version.rb +20 -0
  26. data/lib/gatgets/dar_backup/dar_backup.rb +367 -0
  27. data/lib/gatgets/dar_backup/dar_backup.yml +387 -0
  28. data/lib/gatgets/dar_backup/launcher.rb +44 -0
  29. data/lib/gatgets/dar_backup/templates/list_backups.erb +31 -0
  30. data/lib/gatgets/dar_backup/templates/search.erb +33 -0
  31. data/lib/gatgets/gatgets_manager/gatgets_manager.rb +65 -0
  32. data/lib/gatgets/gatgets_manager/gatgets_manager.yml +71 -0
  33. data/lib/gatgets/gatgets_manager/templates/list.erb +9 -0
  34. data/lib/gatgets/synchronization/README +26 -0
  35. data/lib/gatgets/synchronization/launcher.rb +20 -0
  36. data/lib/gatgets/synchronization/launcher_cron.sh +69 -0
  37. data/lib/gatgets/synchronization/synchronization.rb +123 -0
  38. data/lib/gatgets/synchronization/synchronization.yml +144 -0
  39. data/test/test_gat.rb +36 -0
  40. data/test/test_helper.rb +3 -0
  41. metadata +131 -0
data/History.txt ADDED
@@ -0,0 +1,84 @@
1
+ == 0.2.8 2010-02-16
2
+ * Bugfix release
3
+ * ShellCommandChilds was only executing for the first child
4
+ * Folder backups were not ordered when reading them for deletion
5
+ * Added more error messages to avoid meaningless messages
6
+ * Tests
7
+ * Added a good lot of basic tests
8
+
9
+ == 0.2.7 2009-11-12
10
+
11
+ * Gat Improve
12
+ * Added mount capabilities to folder dependencies thourgh type 'mount'
13
+ * Starting with SPEC test
14
+ * Dar Backup Fixes
15
+ * Fix Gat::Action.get_current_action bug. Now, Base class must be called, since me move action to module.
16
+
17
+
18
+ == 0.2.6 2009-11-10
19
+
20
+ * Gat Improve
21
+ * Moved action.rb and dependences.rb to more orderned folder structure.
22
+ * Gat Fixes
23
+ * Fix blank domain at email default output
24
+ * Dar Backup Fixes
25
+ * Fix. Invalid excution of delete catalog and system backups when no need to delete backups
26
+
27
+
28
+ == 0.2.5 2009-10-23
29
+
30
+ * Gat Fixes
31
+ * Incorrect mess in hour gatget times.
32
+ * DarBackup changes:
33
+ * Added thresold concept. Space disk limit to perform backup
34
+ * Syncronization
35
+ * First include of syncronization gatget.
36
+
37
+ == 0.2.4 2009-10-20
38
+
39
+ * Gat changes
40
+ * Exceptions has been revised. Now, inherit from StandardError insted of ::Exception
41
+ * Changed Exception error.
42
+ * Include new Argument support types (get and gat_password) which gets values from stdin.
43
+ * GatgetManager Support.
44
+ * First release with GatgetManager, which is a gatget to control install of rest.
45
+ * Included launcher as bin executable, avalaible from instalation
46
+ * DarBackup gatget Bug fixes
47
+ * Fixed argument of marked backups to delete.
48
+
49
+ == 0.2.3 2009-10-18
50
+
51
+ * Gat changes
52
+ * Permanent remove of conditions. Instead of, we will use helpers everywhere.
53
+ * Revised email default body and subjects.
54
+ * DarBackup gatget Bug fixes
55
+ * Fixed argument of marked backups to delete.
56
+
57
+ == 0.2.2 2009-10-02
58
+
59
+ * Gat changes
60
+ * Temporal (or maybe permanent) deprecation of conditions
61
+ * DarBackup gatget Bug fixes
62
+ * Incorrect compartion because slashes between current and date based folder for backups.
63
+ * Revised onfail launch method
64
+
65
+ == 0.2.1 2009-09-30
66
+
67
+ * 1 minor enhancement
68
+ * Gemified.
69
+
70
+ == 0.2.0 2009-09-07
71
+
72
+ * 1 major enhancement:
73
+ * Changed all gat structure from procedural to classes
74
+ * Removed gatget modules and converted actions, conditions, outputs, etc. to classes
75
+ * Gat start to be what we thought it will be :D
76
+ * Added templates
77
+
78
+
79
+ == 0.1.0 2009-06-25
80
+
81
+ * 1 major enhancement:
82
+ * Initial release
83
+ * Moved from IRGAT proyect
84
+ * Include Backup Gatget. Sync Gatget is still under development
data/PostInstall.txt ADDED
@@ -0,0 +1,22 @@
1
+ Gat Gem Post Install Doc
2
+ ===============================================================================
3
+
4
+ Gat provides several built in Gatgets. For now, it contains
5
+
6
+ - GatgetDarBackup => Performs and maintains a whole system of backups with
7
+ dar (Disk Archiver for GNU/Linux)
8
+
9
+
10
+ To use this, simply copy the file named launcher.rb to the gatget install
11
+ folder (default by gem, /usr/lib/ruby/gems/ruby1.8/gat/gatgets/<gatget_name>)
12
+ and place it under your local executable folder (for example: /usr/local/bin).
13
+
14
+
15
+ For more information on gat, see http://gat.rubyforge.org
16
+
17
+
18
+ ===============================================================================
19
+ Copyright © 2007-2009 Gnoxys. http://www.gnoxys.net.
20
+ Gat is released under GPL v3.0 or higther. See README for more information
21
+
22
+
data/README.txt ADDED
@@ -0,0 +1,49 @@
1
+ = G.A.T. (Gnoxys Administrations Tools)
2
+
3
+ == DESCRIPTION:
4
+
5
+ GAT is a Ruby gem that tries to provide a script fast development framework.
6
+
7
+ Based on a YML structure, GAT allows you to write basic and advanced scripts with a whole set of tools that scripting need.
8
+
9
+ More info can be found at http://gat.rubyforge.org
10
+
11
+
12
+ == FEATURES/PROBLEMS:
13
+
14
+ * Still in ALPHA release. Not recommended for production use
15
+
16
+ == SYNOPSIS:
17
+
18
+
19
+ == REQUIREMENTS:
20
+
21
+
22
+
23
+ == INSTALL:
24
+
25
+ Just type at console (as root or with sudo):
26
+
27
+ # gem install gat
28
+
29
+
30
+ == EXAMPLE
31
+
32
+ Look into gatgets/example for an example of using GAT
33
+
34
+ == LICENSE:
35
+
36
+ This file is part of GAT: http://gat.rubyforge.org
37
+
38
+ (c) 2008-2009 A.C. Gnoxys info@gnoxys.net
39
+
40
+ GAT (Gnoxys Administration Tools) is released under the GPL License 3 or higher.
41
+ You can get a copy of the license easily at http://www.gnu.org/licenses/gpl.html.
42
+
43
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
44
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
45
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
46
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
47
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
48
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
49
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+ require 'hoe'
5
+
6
+ Hoe.spec 'gat' do
7
+ developer('gnoxys', 'soporte@gnoxys.net')
8
+
9
+ # self.rubyforge_name = 'blahx' # if different than 'blah'
10
+ end
11
+
12
+ # vim: syntax=ruby
data/bin/gat ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'gatgets/gatgets_manager/gatgets_manager'
4
+
5
+ class MainGatgetsManagerScript < GatgetGatgetsManager #:nodoc:
6
+ end
7
+
8
+ # default options... see all options at Gatget config file GAT_ROOT + /lib/gatgets/gatget_manager/gatgets_manager
9
+
10
+ options = {
11
+ 'gatget_config' => { }
12
+ }
13
+
14
+ # Launch Gatget
15
+ MainGatgetsManagerScript.launch(options, ARGV)
data/lib/gat.rb ADDED
@@ -0,0 +1,323 @@
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
+ # Gat Base Folder
19
+ if File.symlink?(__FILE__)
20
+ GAT_ROOT = File.expand_path(File.dirname(File.readlink(__FILE__)) + '/..')
21
+ else
22
+ GAT_ROOT = File.expand_path(File.dirname(__FILE__) + '/..')
23
+ end
24
+
25
+ # Gat Script Folder
26
+ if File.symlink?($0)
27
+ GAT_SCRIPT_PATH = File.expand_path(File.dirname(File.readlink($0)))
28
+ else
29
+ GAT_SCRIPT_PATH = File.expand_path(File.dirname($0))
30
+ end
31
+
32
+ # Gat BOOT
33
+ require GAT_ROOT + '/lib/gat/boot'
34
+
35
+
36
+
37
+ module Gat
38
+
39
+ # Gat::Base Class
40
+ #
41
+ # Gat::Base provides basic features, like logger, times, debug levels, a launcher controlled by exceptions and command line parsed
42
+ # Base class is, as we see, the container. It control the config and the whole process. But it is only the container,
43
+ # the process itlsef is runned by actions, conditions or operations.
44
+ #
45
+ # Gat::Base include then, methods to collect config information, mess the time, launch the script, etc... features that are usually needed
46
+ # by almost of the scripts
47
+ #
48
+ # Gat::Base now, delegate the execution to the Gat::Operation, but, we want that Gat::Base provides interaction framework, for
49
+ # example, interact with machine, creating onfly actions
50
+ class Base
51
+
52
+ # include module methods at base class
53
+ include Gat::Checks
54
+ include Gat::Debug
55
+ include Gat::Help
56
+ include Gat::Launcher
57
+ include Gat::Email
58
+
59
+ # set read only attributes
60
+ attr_reader :config
61
+ attr_reader :arguments
62
+ attr_reader :operation
63
+ attr_reader :debug
64
+ attr_reader :verbose
65
+ attr_reader :name
66
+ attr_reader :path
67
+
68
+
69
+ # set read && write attributes
70
+ attr :times
71
+ attr :logger
72
+ attr :variables
73
+ attr :flags
74
+
75
+ attr_accessor :onfail_error
76
+
77
+
78
+ # Initializes the Gat.Base class, reading the yaml script and any templates.
79
+ # Gat set a lot of variable accessors
80
+ # - logger: through log method, store all the ouputs of a gatget process
81
+ # - times: stores times references
82
+ # - config: gatget config merged with option passed to the script
83
+ # - dependences: needed information through the process
84
+ #
85
+ #
86
+ def initialize(options = {}, arguments = [])
87
+
88
+ @logger = Logger.new(self) # start gatget_logger
89
+
90
+ @times = Hash.new # store time
91
+ @times['init'] = Time.now
92
+
93
+ @debug,arguments = debug?(arguments) # load_debug
94
+ @verbose,arguments = verbose?(arguments) # load_verbose
95
+
96
+ @config = set_gatget_config(options) # load config
97
+
98
+ @arguments = arguments
99
+
100
+
101
+ @logger.log("message", "gatget", "Initialize #{ self.name } < #{ self.class.superclass.name } at script #{ $0 }" )
102
+ @logger.log("message", "gatget", "Gat::Version: #{ Gat::VERSION }, http://www.gnoxys.net")
103
+
104
+ # ToDO
105
+ # Gat, at this time, is only a operation framework. I mean, a gatget has many operation,
106
+ # like gat_password store_password || view_password.
107
+ # Then, at this point of development, we care only about these operations. But,
108
+ # inside gat planning, we want not only run operation but simulations or interactive
109
+ # programs, that doesnt have a start.steps.end structure, like console
110
+ #
111
+ # @operation, is though to be remove for gat::mode at future
112
+ #
113
+ @operation = build_operation(arguments) # load operation
114
+ @variables = { } # variables are empty at start
115
+ @flags = { } # flags are empty at start
116
+ end
117
+
118
+ # Return the config for a defined gatget element structure
119
+ # only arguments, folders, programs, actions, conditions, outputs element_types are allowed
120
+ #
121
+ # raise GatgetConfigException if none found
122
+ def get_element_config(element_type, element_name)
123
+
124
+ unless ['arguments', 'folders', 'programs', 'actions', 'conditions', 'parameters'].include?(element_type)
125
+ raise GatgetConfigException.new("undefined gat element type #{ element_type } in YML structure", "get_element_config")
126
+ end
127
+ @config[element_type] ||
128
+ raise(GatgetConfigException.new("'#{ element_type.capitalize }' section not defined in YML structure", "get_element_config"))
129
+ @config[element_type][element_name] ||
130
+ raise(GatgetConfigException.new("'#{ element_type.capitalize }/#{ element_name }' element not found in YML structure",
131
+ "get_element_config"))
132
+ end
133
+
134
+ def get_dependence_variable( variable_name )
135
+ get_dependence_value('variable', variable_name)
136
+ end
137
+
138
+ # Return the dependence value
139
+ # only arguments, folders, programs, static, variable are allowed
140
+ #
141
+ # raise GatgetConfigException if none found
142
+ def get_dependence_value(dependence_type, dependence_name)
143
+
144
+ unless ['arguments', 'folders', 'programs', 'static', 'variable', 'flags', 'action_output'].include?(dependence_type)
145
+ raise GatgetConfigException.new("undefined gat dependence type #{ dependence_type }", "get_dependence_value")
146
+ end
147
+
148
+ case dependence_type
149
+ when 'static'
150
+ ret = self.config['static'][dependence_name]
151
+ when 'variable'
152
+ ret = self.variables[dependence_name]
153
+ when 'folders'
154
+ dependence_folders = self.operation.send(dependence_type).select { |dependence| dependence_name[/^#{ dependence.name }/]}
155
+ if dependence_folders.any?
156
+ ret = dependence_folders.first.value(dependence_name)
157
+ else
158
+ ret = nil
159
+ end
160
+ when 'action_output'
161
+ ret = self.operation.get_action(dependence_name).output
162
+ else
163
+ values = self.operation.send(dependence_type)
164
+ if values.any?
165
+ ret = values.select { |dependence| dependence_name == dependence.name }.first.value
166
+ else
167
+ raise GatgetConfigException.new("Empty dependence '#{dependence_type}', for operation '#{self.operation.name}'", "get_dependence_value")
168
+ end
169
+ end
170
+ end
171
+
172
+ # Set a value for a variable to be used along the script
173
+ # Override variable is warned at warning level
174
+ def set_dependence_variable(variable_name, variable_value)
175
+ if self.variables[variable_name]
176
+ @logger.log("warning", "dependence", "#{ self.class } rewrite variable #{ variable_name } at #{ Time.now }")
177
+ end
178
+
179
+ self.variables[variable_name] = variable_value
180
+ end
181
+
182
+ # Set flag value
183
+ def set_flag(flag_name, true_or_false)
184
+ self.flags[flag_name] = true_or_false
185
+ end
186
+
187
+ # Get flag value
188
+ def get_flag(flag_name)
189
+ ret = self.flags[flag_name]
190
+ if ret == nil
191
+ self.operation.gatget.logger.log("warning", "get_flag","Undefined flag #{flag_name}")
192
+ ret = false
193
+ end
194
+ ret
195
+ end
196
+
197
+ # Execute the gatget
198
+ # Now, this method just call the current operation and run it. As interactive mode, and after set dependences,
199
+ # execute method will run also @operations or another interactive process
200
+ def execute
201
+ if self.operation
202
+ self.operation.execute
203
+ else
204
+ raise GatgetConfigException("Operation is undefined!", "gatget_execute")
205
+ end
206
+ end
207
+
208
+
209
+ # Set the @config attribute to the gaget. This method read the Gatget YML config and merge with other possible inputs
210
+ #
211
+ # Gat gets the gatget name by the class.superclass method. So, a Gatget must be ALWAYS runned by a launchers see example for more information
212
+ #
213
+ # options Hash with some options
214
+ # - config_file_path: where the config file is stored. By default < gat_gem_install/gatgets/category/<gatget_name>.yml
215
+ # - gatget_config: override default options with launcher options
216
+ # - gat_config: link to common gatgets config at yml format
217
+ #
218
+ private
219
+ def set_gatget_config(options)
220
+
221
+ gatget_name = self.class.superclass.name.gsub(/^Gatget/,'').underscore
222
+ @path = eval("GATGET_#{ gatget_name.upcase }_ROOT")
223
+ options ||= Hash.new
224
+ config_file = options['config_file_path'] || "#{ @path }/#{ gatget_name }.yml"
225
+
226
+ config = get_yaml_config("#{ config_file }") || Hash.new
227
+
228
+ # merge default yml script structure with specific instance options
229
+ if options['gatget_config'] and options['gatget_config'].any?
230
+ config = config.deep_merge(options['gatget_config'])
231
+ end
232
+
233
+ # include gat common config?
234
+ if options['gat_config']
235
+ gat_config = get_yaml_config(options['gat_config'])
236
+ config = config.deep_merge(gat_config)
237
+ end
238
+
239
+ # set attributes
240
+ @name = gatget_name
241
+ @description = config['description'] || 'Another Gatget'
242
+ @config_file = config_file
243
+ @config = config
244
+ end
245
+
246
+
247
+ # Get the YML config at one path
248
+ # Just to rescue the error formating at YML or so
249
+ #
250
+ def get_yaml_config(gatget_config_file)
251
+ begin
252
+ config_yml = YAML.load_file(gatget_config_file)
253
+ rescue => error_msj
254
+ raise GatgetConfigException.new(error_msj, 'get_yaml_config')
255
+ end
256
+ config_yml
257
+ end
258
+
259
+
260
+
261
+ # Evalue the gatget operation
262
+ #
263
+ # Gatget runs by operations, which *must* come as first aguments. For example. gat_backup do_backup, perform #do_backup# operations
264
+ # Detect if operations missing or not in config
265
+ def build_operation(arguments = [])
266
+
267
+ # Run help for gatget
268
+ help?(arguments)
269
+
270
+ # is gatget_operations defined?
271
+ unless @config['operations'] and @config['operations'].any?
272
+ raise GatgetConfigException.new("operations not defined in config: #{@config_file}", "build_operation")
273
+ end
274
+
275
+ # do we have an operation in arguments?
276
+ unless arguments.any?
277
+ gatget_help
278
+ raise GatgetArgumentException.new("no operation invoking gat", "build_operation")
279
+ end
280
+
281
+ # do we have an operation at config?
282
+ unless @config['operations'].include?(arguments.first)
283
+ gatget_help
284
+ raise GatgetArgumentException.new("operation `#{ arguments.first }` undefined invoking gat", "build_operation")
285
+ end
286
+
287
+ # return operation.new
288
+ operation = Gat::Operation.new(arguments.first, @config['operations'][arguments.first], self)
289
+ end
290
+
291
+
292
+ protected
293
+ # Set debug to Gat
294
+ def debug?(arguments)
295
+ debug = false
296
+ if arguments.include?('-d') or arguments.include?('--debug_mode')
297
+ debug = true
298
+ arguments = arguments - ['-d', '--debug_mode']
299
+ end
300
+ return debug, arguments
301
+ end
302
+
303
+ # Set verbose to gat
304
+ def verbose?(arguments)
305
+ verbose = 0
306
+ arguments.each do |argument|
307
+ if argument[/^-v/]
308
+ verbose = argument.count('v')
309
+ arguments = arguments - [ argument ]
310
+ end
311
+ end
312
+ return verbose, arguments
313
+ end
314
+
315
+ # Show help and exit
316
+ def help?(arguments)
317
+ if arguments.include?('-h') or arguments.include?('--help')
318
+ gatget_help
319
+ exit 0
320
+ end
321
+ end
322
+ end
323
+ end