irgat 0.0.1 → 0.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.
- data/History.txt +13 -0
- data/Manifest.txt +1 -3
- data/PostInstall.txt +10 -1
- data/README.rdoc +6 -5
- data/Rakefile +1 -1
- data/TODO +23 -3
- data/bin/irgat +19 -33
- data/bin/irgat_setup +12 -3
- data/bin/irgat_updater +86 -0
- data/config/hoe.rb +2 -2
- data/lib/irgat.rb +85 -22
- data/lib/irgat/console.rb +1 -1
- data/lib/irgat/dependencies.rb +14 -9
- data/lib/irgat/execs.rb +36 -39
- data/lib/irgat/log.rb +60 -27
- data/lib/irgat/utils.rb +1 -0
- data/lib/irgat/version.rb +8 -3
- data/lib/modules/backup.rb +117 -35
- data/lib/modules/console.rb +2 -10
- data/lib/modules/kwallet.rb +6 -8
- data/setup/etc/backup.yml.example +8 -5
- data/setup/etc/irgat.yml.example +7 -7
- data/setup/etc/kwallet.yml.example +12 -1
- data/website/index.html +5 -2
- metadata +18 -19
- data/setup/etc/console.yml.default +0 -11
- data/setup/etc/dar.yml.example +0 -16
- data/setup/etc/kwallet.yml.default +0 -18
data/lib/irgat/console.rb
CHANGED
data/lib/irgat/dependencies.rb
CHANGED
@@ -17,9 +17,9 @@ module Irgat
|
|
17
17
|
@programs = Hash.new
|
18
18
|
programs.each { |p|
|
19
19
|
# locate program
|
20
|
-
program_path =
|
21
|
-
if program_path
|
22
|
-
@programs[p.to_sym] = program_path.strip
|
20
|
+
program_path = execute_command("which #{ p }","Where is #{ p } program", { :debug => 3 })
|
21
|
+
if program_path[:output]
|
22
|
+
@programs[p.to_sym] = program_path[:output].strip
|
23
23
|
else
|
24
24
|
exit_with_error("Irgat couldn't find the program #{ p } needed by #{ self.class } module")
|
25
25
|
end
|
@@ -45,20 +45,25 @@ module Irgat
|
|
45
45
|
end
|
46
46
|
|
47
47
|
def check_mounted_folder(folder)
|
48
|
-
mount_points = execute_command("mount",
|
49
|
-
|
48
|
+
mount_points = execute_command("mount",
|
49
|
+
"Getting mount points",
|
50
|
+
{ :debug => 3 })
|
51
|
+
if mount_points[:output].include?(folder)
|
50
52
|
log("text","OK. #{folder} already mounted")
|
51
53
|
else
|
52
54
|
# we try to mount
|
53
|
-
log("text","Warning. #{folder} not mounted. Triying to mount")
|
55
|
+
log("text", "Warning. #{folder} not mounted. Triying to mount", 2)
|
54
56
|
execute_command("mount #{folder}",
|
55
57
|
"Mounting working directory #{folder}",
|
56
|
-
{:fatal_error => true})
|
58
|
+
{:fatal_error => true, :debug => 3 })
|
57
59
|
end
|
58
60
|
end
|
59
61
|
|
60
62
|
def check_egid(user)
|
61
|
-
|
63
|
+
command = execute_command("whoami",
|
64
|
+
"Getting irgat launcher user",
|
65
|
+
{ :debug => 3 })
|
66
|
+
if user != command[:output].strip
|
62
67
|
exit_with_error("#{ @config_module[:subsystem_name] } Irgat module must run as #{ user } User")
|
63
68
|
end
|
64
69
|
end
|
@@ -67,7 +72,7 @@ module Irgat
|
|
67
72
|
def exist_or_create_folder(folder_absolute_path)
|
68
73
|
if ! test(?d,folder_absolute_path)
|
69
74
|
Dir.mkdir(folder_absolute_path)
|
70
|
-
log("text", "Creating folder #{ folder_absolute_path }",
|
75
|
+
log("text", "Creating folder #{ folder_absolute_path }", 3)
|
71
76
|
end
|
72
77
|
end
|
73
78
|
|
data/lib/irgat/execs.rb
CHANGED
@@ -4,66 +4,63 @@ module Irgat
|
|
4
4
|
module Execs
|
5
5
|
|
6
6
|
def execute_command(command, command_description, options = {})
|
7
|
-
@commands_launched ||=
|
7
|
+
@commands_launched ||= Array.new
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
9
|
+
command_data = Hash.new
|
10
|
+
|
11
|
+
command_data[:info] = command_description
|
12
|
+
command_data[:exec] = command.to_s
|
13
|
+
command_data[:pre_time] = Time.now
|
14
|
+
command_data[:output] = %x[ #{command_data[:exec]} 2> /tmp/error_out ]
|
15
|
+
command_data[:status] = $?
|
16
|
+
command_data[:pos_time] = Time.now
|
17
|
+
command_data[:errors] = File.new("/tmp/error_out").read
|
18
|
+
|
19
|
+
# add to commands launched
|
20
|
+
@commands_launched << { command_data[:info] => command_data[:status] }
|
15
21
|
|
16
22
|
# exit?
|
17
|
-
if
|
23
|
+
if command_data[:status] != 0 && options[:fatal_error]
|
18
24
|
debug_mode = "\n"
|
19
|
-
debug_mode << "\n [ Command Syntax ] => #{
|
20
|
-
debug_mode << "\n [ Command Output ] => #{
|
21
|
-
debug_mode << "\n [ Command Errors ] => #{
|
25
|
+
debug_mode << "\n [ Command Syntax ] => #{ command_data[:exec] }"
|
26
|
+
debug_mode << "\n [ Command Output ] => #{ command_data[:output] }"
|
27
|
+
debug_mode << "\n [ Command Errors ] => #{ command_data[:errors] }"
|
22
28
|
|
23
|
-
|
29
|
+
|
30
|
+
exit_with_error("Command '#{ command_data[:info] }' exit with a #{ command_data[:status] } status. Error is reported as FATAL, then, exit Irgat process. #{ debug_mode if @config[:debug_level] == 3 }", { :exit_level => 6 })
|
24
31
|
end
|
25
32
|
|
26
33
|
# Log the outputs || debug 1
|
27
|
-
log("command", "* [#{ (
|
34
|
+
log("command", "* [#{ (command_data[:status] == 0 ? " OK " : " WARNING") }: #{Time.now.strftime("%H:%M:%S")}] -> #{ command_data[:info] }", 1) unless options[:debug] == 2 || options[:debug] == 3
|
28
35
|
|
29
36
|
# Log warning level
|
30
|
-
if
|
31
|
-
log("warning", "Command #{
|
37
|
+
if command_data[:status] != 0
|
38
|
+
log("warning", " ** Command #{ command_data[:info] } exited with a #{ command_data[:status] } status.", 2)
|
32
39
|
end
|
33
40
|
|
34
41
|
# Log 3 level... commands launched and reports
|
35
|
-
text_to_log = "\n
|
36
|
-
text_to_log << "\n
|
37
|
-
text_to_log << "\n
|
38
|
-
text_to_log << "\n
|
39
|
-
text_to_log << "\n
|
40
|
-
text_to_log << "\n
|
42
|
+
text_to_log = "\n *** [COMMAND LOG]"
|
43
|
+
text_to_log << "\n [ Command Syntax ] => #{ command_data[:exec] }"
|
44
|
+
text_to_log << "\n [ Command Status ] => #{ command_data[:status] }"
|
45
|
+
text_to_log << "\n [ Command Output ] => #{ command_data[:output] }"
|
46
|
+
text_to_log << "\n [ Command Errors ] => #{ command_data[:errors] }"
|
47
|
+
text_to_log << "\n [ Command P.Time ] => #{ command_data[:pos_time] - command_data[:pre_time] }\n\n"
|
41
48
|
|
42
49
|
log("text", text_to_log, 3)
|
43
50
|
|
44
|
-
|
45
|
-
@commands_launched[command_description] = finish_status
|
46
|
-
|
47
|
-
return command_output
|
51
|
+
return command_data
|
48
52
|
end
|
49
53
|
|
50
|
-
# method to end irgat process and report
|
51
|
-
def finish_process(options = {})
|
52
|
-
output_options = Hash.new
|
53
|
-
output_options[:fatal] = options[:fatal] || false
|
54
|
-
output_options[:main_msj] = options[:msj] || "Finish Process"
|
55
|
-
# output the logs
|
56
|
-
output_log({ :fatal => output_options[:fatal],
|
57
|
-
:main_msj => output_options[:main_msj] })
|
58
|
-
end
|
59
54
|
|
60
55
|
# Exit irgat process with error and optional exit status
|
61
56
|
def exit_with_error(msj, options = {})
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
57
|
+
log("error", msj, 1)
|
58
|
+
|
59
|
+
|
60
|
+
output_log(self,
|
61
|
+
{ :main_msj => "[IRGAT] [#{ self.config_module[:subsystem_name].capitalize }] [ERROR] #{ self.action } process in #{ @config[:server_name] }",
|
62
|
+
:fatal => true })
|
63
|
+
|
67
64
|
exit (options[:exit_level] ? options[:exit_level] : 1)
|
68
65
|
end
|
69
66
|
|
data/lib/irgat/log.rb
CHANGED
@@ -3,47 +3,49 @@
|
|
3
3
|
module Irgat
|
4
4
|
module Log
|
5
5
|
|
6
|
+
# Store the output messages in a class array variable
|
6
7
|
def log(output_type, message, debug = nil)
|
7
|
-
# create @log_process if not exist or use it
|
8
8
|
@log_process ||= Array.new
|
9
9
|
# add new hash to point variable
|
10
10
|
log_point = Hash.new
|
11
11
|
log_point[:type] = output_type
|
12
12
|
log_point[:msj] = message
|
13
|
-
log_point[:debug] = debug || 3
|
13
|
+
log_point[:debug] = debug.to_i || 3 # highter level if not marked
|
14
14
|
@log_process << log_point
|
15
|
-
# need to puts
|
16
15
|
|
17
|
-
|
18
|
-
|
16
|
+
# to stodout
|
17
|
+
unless @config[:debug_level].to_i < log_point[:debug]
|
18
|
+
puts colorize(log_point)
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
-
def output_log(options = {})
|
22
|
+
def output_log(module_process, options = {})
|
23
|
+
|
23
24
|
fatal = options[:fatal] || false
|
24
25
|
|
25
26
|
# build report
|
26
|
-
report = build_report
|
27
|
-
resume = build_resume(fatal)
|
27
|
+
report = build_report(module_process.log_process)
|
28
|
+
resume = build_resume(fatal, module_process)
|
28
29
|
|
29
|
-
|
30
|
-
|
31
|
-
report_to_log(report)
|
30
|
+
# output to email or log file
|
31
|
+
if module_process.config_module[:log_file_actions].include?(module_process.action)
|
32
|
+
report_to_log(report, module_process)
|
32
33
|
end
|
33
34
|
|
34
|
-
if
|
35
|
+
if module_process.config_module[:log_file_actions].include?(module_process.action)
|
35
36
|
report_to_email(resume, report, options[:main_msj] )
|
36
37
|
end
|
38
|
+
|
37
39
|
end
|
38
40
|
|
39
|
-
def report_to_log(report)
|
41
|
+
def report_to_log(report, module_process)
|
40
42
|
exist_or_create_folder(@config[:log_path])
|
41
43
|
|
42
|
-
log_file_folder = "#{ @config[:log_path] }/#{
|
44
|
+
log_file_folder = "#{ @config[:log_path] }/#{ module_process.config_module[:subsystem_name] }"
|
43
45
|
|
44
46
|
exist_or_create_folder(log_file_folder)
|
45
47
|
|
46
|
-
log_file = "#{ log_file_folder }/#{ Time.now.strftime("%Y-%m-%d") }_#{ @config[:server_name] }.log"
|
48
|
+
log_file = "#{ log_file_folder }/#{ Time.now.strftime("%Y-%m-%d") }_#{ module_process.action }_in_#{ @config[:server_name] }.log"
|
47
49
|
|
48
50
|
if log_out = File.new(log_file,"w+")
|
49
51
|
log_out.puts report
|
@@ -62,15 +64,16 @@ module Irgat
|
|
62
64
|
send_email({ :subject => subject, :body => resume })
|
63
65
|
end
|
64
66
|
|
65
|
-
|
67
|
+
private
|
68
|
+
def build_report(log_process)
|
66
69
|
report = ''
|
67
70
|
|
68
|
-
|
71
|
+
log_process.each { |log_entry|
|
69
72
|
case log_entry[:type]
|
70
73
|
when "point"
|
71
74
|
@point ||= 0
|
72
75
|
underscroll_caracter = "="
|
73
|
-
report << "\n #{ @point } #{ log_entry[:msj] } \n"
|
76
|
+
report << "\n\n #{ @point } #{ log_entry[:msj] } \n"
|
74
77
|
report << ' ' + (underscroll_caracter * @point.to_s.length) + underscroll_caracter + (underscroll_caracter * log_entry[:msj].length) + "\n"
|
75
78
|
@point += 1
|
76
79
|
when "text"
|
@@ -79,7 +82,7 @@ module Irgat
|
|
79
82
|
end
|
80
83
|
when "command"
|
81
84
|
if @config[:debug_level] >= log_entry[:debug]
|
82
|
-
report << "\n
|
85
|
+
report << "\n #{ log_entry[:msj] }"
|
83
86
|
end
|
84
87
|
end
|
85
88
|
}
|
@@ -87,11 +90,9 @@ module Irgat
|
|
87
90
|
end
|
88
91
|
|
89
92
|
# method to report a info of the irgat process
|
90
|
-
def build_resume(fatal)
|
91
|
-
|
92
|
-
|
93
|
+
def build_resume(fatal,module_process)
|
93
94
|
total_time = Time.now - @init_time
|
94
|
-
total_time_log = "#{ total_time.to_s.slice(0,5) } sec., #{ (total_time / 60).to_s.slice(0,5) } min., #{ ((total_time / 60) / 60).to_s.slice(0,5) } hours."
|
95
|
+
total_time_log = "#{ total_time.to_s.slice(0,5) } sec., #{ (total_time / 60).to_s.slice(0,5) } min., #{ ((total_time / 60) / 60).to_int.to_s.slice(0,5) } hours."
|
95
96
|
fatal_log = (fatal ? "ERROR" : "OK")
|
96
97
|
|
97
98
|
report_resume = "\n"
|
@@ -100,17 +101,49 @@ module Irgat
|
|
100
101
|
report_resume << "\n"
|
101
102
|
report_resume << " * Resume info \n"
|
102
103
|
report_resume << " [ Serv Host ] -> #{ @config[:server_name] } \n"
|
103
|
-
report_resume << " [ Module ] -> #{
|
104
|
+
report_resume << " [ Module ] -> #{ module_process.config_module[:subsystem_name].capitalize } \n"
|
104
105
|
report_resume << " [ Init Time ] -> #{ @init_time } \n"
|
105
106
|
report_resume << " [ End Time ] -> #{ Time.now } \n"
|
106
107
|
report_resume << " [ TotalTime ] -> #{ total_time_log } \n"
|
107
|
-
if
|
108
|
-
report_resume << " [ CmdsExecs ] -> #{
|
109
|
-
report_resume << " [ Warnings ] -> #{
|
108
|
+
if module_process.commands_launched
|
109
|
+
report_resume << " [ CmdsExecs ] -> #{ module_process.commands_launched.select { |v| v.values.to_s == "0" }.size } \n"
|
110
|
+
report_resume << " [ Warnings ] -> #{ module_process.commands_launched.select { |v| v.values.to_s != "0" }.size} \n"
|
111
|
+
end
|
112
|
+
|
113
|
+
if fatal
|
114
|
+
report_resume << "\n [ **FATAL** ] -> Irgat Process ended in command: '#{ module_process.commands_launched.last.keys.to_s }'"
|
110
115
|
end
|
111
116
|
|
112
117
|
return report_resume
|
113
118
|
end
|
114
119
|
|
120
|
+
def colorize(log_entry)
|
121
|
+
case log_entry[:type]
|
122
|
+
when "text"
|
123
|
+
return_msj = "\x1b[#{ 38 };5;#{ 244 }m#{ log_entry[:msj] }\x1b[0m"
|
124
|
+
when "error"
|
125
|
+
return_msj = "\n \x1b[#{ 38 };5;#{ 160 }m#{ "ERROR!!" } \x1b[0m" + log_entry[:msj].gsub(/#{ "FATAL" }/, "\x1b[#{38};5;#{ 160 }m#{ "*FATAL*" }\x1b[0m")
|
126
|
+
when "warning"
|
127
|
+
return_msj = "\x1b[#{ 38 };5;#{ 240 }m#{ log_entry[:msj] }\x1b[0m"
|
128
|
+
when "point"
|
129
|
+
return_msj = "\n\x1b[#{ 48 };5;#{ 252 }m#{ log_entry[:msj] }\x1b[0m \n"
|
130
|
+
when "command"
|
131
|
+
if log_entry[:msj]["OK"]
|
132
|
+
color = 2
|
133
|
+
text = "OK"
|
134
|
+
elsif log_entry[:msj]["WARNING"]
|
135
|
+
color = 220
|
136
|
+
text = "WARNING"
|
137
|
+
elsif log_entry[:msj]["ERROR"]
|
138
|
+
color = 160
|
139
|
+
text = "ERROR"
|
140
|
+
elsif log_entry[:msj]["FATAL"]
|
141
|
+
color = 160
|
142
|
+
text = "FATAL"
|
143
|
+
end
|
144
|
+
return_msj = log_entry[:msj].gsub(/#{ text }/, "\x1b[#{38};5;#{ color }m#{ text }\x1b[0m")
|
145
|
+
end
|
146
|
+
return_msj
|
147
|
+
end
|
115
148
|
end
|
116
149
|
end
|
data/lib/irgat/utils.rb
CHANGED
data/lib/irgat/version.rb
CHANGED
data/lib/modules/backup.rb
CHANGED
@@ -17,7 +17,8 @@ module Irgat
|
|
17
17
|
class Backup < Irgat
|
18
18
|
|
19
19
|
# initialize the Class... make default operations
|
20
|
-
def initialize
|
20
|
+
def initialize(values = {})
|
21
|
+
@action = values[:action]
|
21
22
|
# Create and irgat process
|
22
23
|
irgat_process = Irgat.new()
|
23
24
|
# Get the instance variables
|
@@ -37,23 +38,66 @@ module Irgat
|
|
37
38
|
@config_module[:folders_tree] ],
|
38
39
|
:check_egid => @config_module[:run_as_user]
|
39
40
|
)
|
40
|
-
|
41
41
|
end
|
42
42
|
|
43
43
|
def default(args = {})
|
44
|
-
|
45
|
-
puts 'FIXME * action needed'
|
44
|
+
exit_with_error("\n ** [ ERROR ] No default action for Backup Module. Avaible methods: \n list, search, restore, launch", { :exit_level => 7 })
|
46
45
|
end
|
47
46
|
|
48
47
|
def list(args = [])
|
49
|
-
|
48
|
+
log("text", list_catalog[:output])
|
49
|
+
end
|
50
|
+
|
51
|
+
def search(args = [])
|
52
|
+
if args.include?('-c')
|
53
|
+
args.delete('-c')
|
54
|
+
result = search_complete(args.first)
|
55
|
+
if !result.empty?
|
56
|
+
text = "\n * The pattern match in: \n\n"
|
57
|
+
text << "#{ result }"
|
58
|
+
text << "\n * Restore the file with $ irgat backup restore <number backup> <file name>\n File will be restored in #{ @folders[:restore] }/<file name> }"
|
59
|
+
log("text", text, 1)
|
60
|
+
else
|
61
|
+
exit_with_error(" ** [ ERROR ] not pattern found.\n Exit", { :exit_level => 3} )
|
62
|
+
end
|
63
|
+
else
|
64
|
+
result = search_file(args.first)
|
65
|
+
if result[:status] == 0
|
66
|
+
text = "\n * The file exist in these backups \n\n"
|
67
|
+
text << "#{ result[:output] }"
|
68
|
+
text << "\n * Restore the file with $ irgat backup restore <number backup> <file>\n File will be restored in #{ @folders[:restore] }/<file> }"
|
69
|
+
log("text", text, 1)
|
70
|
+
|
71
|
+
else
|
72
|
+
exit_with_error(" ** [ ERROR ] not file found.\n Use $ irgat backup search <file> with -c option for a complete search", { :exit_level => 3} )
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def restore(args = [])
|
78
|
+
backup_number = args[0] || nil
|
79
|
+
restore_file = args[1] || nil
|
80
|
+
if !backup_number or !restore_file
|
81
|
+
exit_with_error(" ** [ ERROR] Not Backup or restore file passed. Syntax is $ irgat backup restore <number of backup> <file to restore>", { :exit_level => 7 })
|
82
|
+
else
|
83
|
+
# identify backup file
|
84
|
+
if ( !backup_data = get_backup_data(backup_number))
|
85
|
+
exit_with_error(" ** [ ERROR ] Backup '#{ backup_number }' not found in catalog", { :exit_level => 3 })
|
86
|
+
else
|
87
|
+
# try to restore
|
88
|
+
restore_command = "#{ @programs[:dar] } -x #{ backup_data[:file] } -R #{ @folders[:restore] } -K '#{ @config_module[:dar]["decrypt_passwd"] }' -v -g '#{ restore_file }'"
|
89
|
+
result = execute_command(
|
90
|
+
restore_command,
|
91
|
+
"Restoring file",
|
92
|
+
{ :fatal_error => true })
|
93
|
+
log("text"," Files were succesfull restored", 1)
|
94
|
+
end
|
95
|
+
end
|
50
96
|
end
|
51
97
|
|
52
98
|
def launch(args = [])
|
53
|
-
# @backup.set_log_output_to_file
|
54
99
|
log("point", "Init Irgat Backup Launch")
|
55
100
|
|
56
|
-
# mysql dumps? FIXME to bbdd_dumps?
|
57
101
|
if @config_module[:dump_mysql]
|
58
102
|
log("point","Doing MySQL database Dumping")
|
59
103
|
do_mysql_dumps
|
@@ -62,8 +106,8 @@ module Irgat
|
|
62
106
|
# use the specific backup program
|
63
107
|
self.send("do_backup_with_" + @config_module[:backup_program])
|
64
108
|
|
65
|
-
# finish process
|
66
|
-
|
109
|
+
# finish process || return STRING
|
110
|
+
return "[IRGAT] [BACKUP] [OK] Backup Launch in #{ @config[:server_name] } server"
|
67
111
|
|
68
112
|
end
|
69
113
|
|
@@ -83,7 +127,7 @@ module Irgat
|
|
83
127
|
end
|
84
128
|
|
85
129
|
# Each db, make dump and compress with gzip
|
86
|
-
dbs.each { |db|
|
130
|
+
dbs[:output].each { |db|
|
87
131
|
dump_file = "mysqldump_#{ Date.today }_#{db.chop}.sql"
|
88
132
|
execute_command(
|
89
133
|
"#{ @programs[:mysqldump] } -u #{ @config_module[:mysql_user] } -p#{ @config_module[:mysql_pass] } #{db.chop} -r #{dump_file}",
|
@@ -117,7 +161,7 @@ module Irgat
|
|
117
161
|
dar_command = build_dar_command("do_backup", { "backup_type" => backup_type })
|
118
162
|
|
119
163
|
# exec backup
|
120
|
-
log("point", "Doing
|
164
|
+
log("point", "Doing #{ backup_type.capitalize } Backup")
|
121
165
|
execute_command(dar_command, "Doing #{ backup_type.capitalize } Backup")
|
122
166
|
|
123
167
|
# test backup
|
@@ -245,8 +289,13 @@ module Irgat
|
|
245
289
|
execute_command(
|
246
290
|
command_list_catalog,
|
247
291
|
"Listing backup in catalog")
|
292
|
+
execute_command(
|
293
|
+
"ls /tmpdede",
|
294
|
+
"Listing the kaka",
|
295
|
+
{:fatal_error => true })
|
248
296
|
end
|
249
297
|
|
298
|
+
|
250
299
|
def identifies_backups_in_catalog(pattern)
|
251
300
|
ids_backups = []
|
252
301
|
backups_in_catalog = list_catalog
|
@@ -257,33 +306,15 @@ module Irgat
|
|
257
306
|
}
|
258
307
|
return ids_backups
|
259
308
|
end
|
260
|
-
|
261
|
-
# end backups process... report state and send emails if is configured for
|
262
|
-
def do_finish_backup(fatal = nil)
|
263
|
-
# take a report for the backup process
|
264
|
-
report = self.process_report
|
265
|
-
|
266
|
-
# if email reporting is avaible, we have to send an email
|
267
|
-
if @config_module[:report_email]
|
268
|
-
#build subjetc
|
269
|
-
if fatal
|
270
|
-
subject_email="[IRGAT Backup] Fatal error in #{self.config[:server_name]}"
|
271
|
-
else
|
272
|
-
subject_email="[IRGAT Backup] Succesfull in #{self.config[:server_name]}"
|
273
|
-
end
|
274
309
|
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
self.send_email(:body=>report,:subject => subject_email)
|
280
|
-
end
|
281
|
-
|
310
|
+
def get_backup_data(num_backup)
|
311
|
+
backups = get_all_backups_in_catalog
|
312
|
+
for backup in backups
|
313
|
+
select_backup = backup if backup[:id] == num_backup
|
282
314
|
end
|
283
|
-
|
284
|
-
self.log("text",report,1)
|
315
|
+
select_backup
|
285
316
|
end
|
286
|
-
|
317
|
+
|
287
318
|
def create_catalog(catalog_file_name)
|
288
319
|
create_catalog_command = @programs[:dar_manager] + ' -C ' + catalog_file_name
|
289
320
|
execute_command(
|
@@ -292,6 +323,54 @@ module Irgat
|
|
292
323
|
{ :fatal_error => true })
|
293
324
|
end
|
294
325
|
|
326
|
+
def search_complete(pattern)
|
327
|
+
backups = get_all_backups_in_catalog
|
328
|
+
catalog = @folders[:catalog] + '/catalog_' + @config[:server_name]
|
329
|
+
|
330
|
+
result = ""
|
331
|
+
for backup in backups
|
332
|
+
log("point", "Searching #{ pattern } in backup #{ backup[:file] }")
|
333
|
+
search_complete_command = "#{ @programs[:dar_manager] } -B #{ catalog } -u #{ backup[:id] }"
|
334
|
+
command = execute_command(
|
335
|
+
search_complete_command,
|
336
|
+
"Listing files in backup #{ backup[:file] }")
|
337
|
+
command[:output].each_line { |backup_lines|
|
338
|
+
if backup_lines.include?(pattern)
|
339
|
+
result << " - Backup number: #{ backup[:id] } (#{ backup[:file] }) -- File name: '#{ backup_lines.split(' ')[2] }'\n"
|
340
|
+
end
|
341
|
+
}
|
342
|
+
end
|
343
|
+
result
|
344
|
+
end
|
345
|
+
|
346
|
+
|
347
|
+
def search_file(pattern)
|
348
|
+
if !pattern
|
349
|
+
exit_with_error("\n ** Can't search without name file. Please type a file to search", { :exit_level => 7 })
|
350
|
+
end
|
351
|
+
|
352
|
+
catalog = @folders[:catalog] + '/catalog_' + @config[:server_name]
|
353
|
+
command_search_file = "#{ @programs[:dar_manager] } -B #{ catalog } -f '#{ pattern }'"
|
354
|
+
execute_command(
|
355
|
+
command_search_file,
|
356
|
+
"Searching file")
|
357
|
+
end
|
358
|
+
|
359
|
+
def get_all_backups_in_catalog()
|
360
|
+
backups = Array.new
|
361
|
+
# get all the backups in catalog and build variable
|
362
|
+
list_backups = list_catalog[:output]
|
363
|
+
list_backups.each_line { |backup_in_catalog|
|
364
|
+
if backup_in_catalog.strip =~ /^[0-9]/
|
365
|
+
backup = Hash.new
|
366
|
+
backup[:id] = backup_in_catalog.split(' ')[0]
|
367
|
+
backup[:file] = "#{ backup_in_catalog.split(' ')[1] }/#{ backup_in_catalog.split(' ')[2] }"
|
368
|
+
backups << backup
|
369
|
+
end
|
370
|
+
}
|
371
|
+
backups
|
372
|
+
end
|
373
|
+
|
295
374
|
# FIXME
|
296
375
|
def build_dar_command(for_what, options = {})
|
297
376
|
# merge options with default
|
@@ -320,6 +399,9 @@ module Irgat
|
|
320
399
|
for folder in @config_module[:exclude_folders]
|
321
400
|
dar_command[:exclude_folders] << "-P #{folder} "
|
322
401
|
end
|
402
|
+
## add exclude data and restore folder
|
403
|
+
dar_command[:exclude_folders] << "-P #{ @folders[:restore][1..-1] } -P #{ @folders[:data][1..-1] } "
|
404
|
+
|
323
405
|
dar_command[:exclude_files] = ''
|
324
406
|
for extension in @config_module[:exclude_files]
|
325
407
|
dar_command[:exclude_files] << "-X '*#{extension}' "
|