rbatch 2.1.1 → 2.1.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/README.ja.md +14 -5
- data/README.md +164 -154
- data/bin/rbatch-init +21 -13
- data/doc/RBatch/Cmd.html +300 -316
- data/doc/RBatch/CmdException.html +146 -141
- data/doc/RBatch/CmdResult.html +467 -470
- data/doc/RBatch/Config.html +392 -433
- data/doc/RBatch/Controller.html +374 -0
- data/doc/RBatch/DoubleRunCheckException.html +146 -141
- data/doc/RBatch/DoubleRunChecker.html +258 -256
- data/doc/RBatch/Journal.html +332 -0
- data/doc/RBatch/Log.html +636 -805
- data/doc/RBatch/LogException.html +164 -0
- data/doc/RBatch/RBatch/RBatch/ConfigException.html +164 -0
- data/doc/RBatch/RBatch/RBatch.html +163 -0
- data/doc/RBatch/RBatch/VariablesException.html +164 -0
- data/doc/RBatch/RBatch.html +165 -0
- data/doc/RBatch/RunConf/Exception.html +146 -141
- data/doc/RBatch/RunConf.html +478 -532
- data/doc/RBatch/Variables.html +437 -0
- data/doc/RBatch.html +388 -862
- data/doc/created.rid +11 -9
- data/doc/index.html +178 -184
- data/doc/js/darkfish.js +9 -7
- data/doc/lib/rbatch/cmd_rb.html +46 -44
- data/doc/lib/rbatch/config_rb.html +42 -42
- data/doc/lib/rbatch/controller_rb.html +66 -0
- data/doc/lib/rbatch/double_run_checker_rb.html +42 -42
- data/doc/lib/rbatch/journal_rb.html +52 -0
- data/doc/lib/rbatch/log_rb.html +46 -46
- data/doc/lib/rbatch/run_conf_rb.html +42 -42
- data/doc/lib/rbatch/variables_rb.html +54 -0
- data/doc/lib/rbatch/version_rb.html +38 -38
- data/doc/lib/rbatch_rb.html +40 -52
- data/doc/rdoc.css +365 -308
- data/lib/rbatch/cmd.rb +15 -58
- data/lib/rbatch/config.rb +7 -7
- data/lib/rbatch/controller.rb +37 -61
- data/lib/rbatch/double_run_checker.rb +0 -0
- data/lib/rbatch/journal.rb +40 -0
- data/lib/rbatch/log.rb +71 -129
- data/lib/rbatch/run_conf.rb +13 -24
- data/lib/rbatch/variables.rb +82 -0
- data/lib/rbatch/version.rb +1 -1
- data/lib/rbatch.rb +7 -36
- data/sample/.rbatchrc +41 -7
- data/spec/01_rbach_spec.rb +99 -0
- data/spec/{cmd_spec.rb → rbatch/cmd_spec.rb} +40 -43
- data/spec/rbatch/config_spec.rb +67 -0
- data/spec/rbatch/controller_spec.rb +18 -0
- data/spec/{double_run_checker_spec.rb → rbatch/double_run_checker_spec.rb} +3 -0
- data/spec/rbatch/journal_spec.rb +29 -0
- data/spec/rbatch/log_spec.rb +350 -0
- data/spec/{run_conf_spec.rb → rbatch/run_conf_spec.rb} +13 -5
- data/spec/rbatch/variables_spec.rb +68 -0
- data/spec/spec_helper.rb +4 -5
- metadata +33 -17
- data/lib/rbatch/common_config.rb +0 -0
- data/spec/common_config_spec.rb +0 -85
- data/spec/config_spec.rb +0 -79
- data/spec/log_spec.rb +0 -430
- data/spec/rbatch_spec.rb +0 -22
data/lib/rbatch/cmd.rb
CHANGED
@@ -1,87 +1,52 @@
|
|
1
1
|
require 'fileutils'
|
2
2
|
require 'tempfile'
|
3
3
|
require 'tmpdir'
|
4
|
-
|
4
|
+
require 'timeout'
|
5
5
|
module RBatch
|
6
6
|
|
7
|
-
# External command runcher.
|
8
|
-
#
|
9
|
-
#This module is a wrapper of Kernel#spawn.
|
10
|
-
#
|
11
|
-
# * Arguments(cmd_params) are inputed to Kernel#spawn directly and run command.
|
12
|
-
# * Return an object of RBatch::CmdResult which includes stdout, stderr, and exit status.
|
13
|
-
#
|
14
|
-
# ==== Sample 1
|
15
|
-
# require 'rbatch'
|
16
|
-
# result = RBatch::cmd("ls")
|
17
|
-
# p result.stdout
|
18
|
-
# => "fileA\nfileB\n"
|
19
|
-
#
|
20
|
-
# ==== Sample 2 (use option)
|
21
|
-
# require 'rbatch'
|
22
|
-
# result = RBatch::cmd("ls",{:timeout => 1})
|
23
|
-
# p result.stdout
|
24
|
-
# => "fileA\nfileB\n"
|
25
|
-
#
|
26
|
-
# ==== Sample 3 (use instance)
|
27
|
-
# require 'rbatch'
|
28
|
-
# cmd = RBatch::Cmd.new("ls")
|
29
|
-
# result = cmd.run
|
30
|
-
# p result.stdout
|
31
|
-
# => "fileA\nfileB\n"
|
32
|
-
#
|
33
7
|
class Cmd
|
8
|
+
@@def_vars
|
9
|
+
def Cmd.def_vars=(a) ; @@def_vars=a ; end
|
34
10
|
@cmd_str
|
35
11
|
@opt
|
36
|
-
|
37
|
-
# Cmd instance
|
38
|
-
#
|
39
|
-
# ==== Params
|
40
|
-
# +cmd_str+ = Command string such as "ls -l"
|
41
|
-
# +opt+ = Option hash object.
|
42
|
-
# - +:raise+ (Boolean) = If command exit status is not 0, raise exception. Default is false.
|
43
|
-
# - +:timeout+ (Integer) = If command timeout , raise exception and kill process. Default is 0 sec ( 0 means disable) .
|
12
|
+
@vars
|
44
13
|
def initialize(cmd_str,opt = nil)
|
45
14
|
raise(CmdException,"Command string is nil") if cmd_str.nil?
|
46
15
|
@cmd_str = cmd_str
|
47
|
-
|
48
|
-
if opt.nil?
|
49
|
-
|
50
|
-
|
16
|
+
@vars = @@def_vars.clone
|
17
|
+
if ! opt.nil?
|
18
|
+
# change opt key from "hoge" to "log_hoge"
|
19
|
+
tmp = {}
|
51
20
|
opt.each_key do |key|
|
52
21
|
tmp[("cmd_" + key.to_s).to_sym] = opt[key]
|
53
22
|
end
|
54
|
-
@
|
23
|
+
@vars.merge!(tmp)
|
55
24
|
end
|
56
25
|
end
|
57
26
|
|
58
|
-
# Run command
|
59
|
-
#
|
60
|
-
# ==== Return
|
61
|
-
# instance of RBatch::CmdResult
|
62
27
|
def run()
|
63
28
|
stdout_file = Tempfile::new("rbatch_tmpout",Dir.tmpdir)
|
64
29
|
stderr_file = Tempfile::new("rbatch_tmperr",Dir.tmpdir)
|
65
30
|
pid = spawn(@cmd_str,:out => [stdout_file,"w"],:err => [stderr_file,"w"])
|
66
31
|
status = nil
|
67
|
-
if @
|
32
|
+
if @vars[:cmd_timeout] != 0
|
68
33
|
begin
|
69
|
-
timeout(@
|
34
|
+
timeout(@vars[:cmd_timeout]) do
|
70
35
|
status = Process.waitpid2(pid)[1] >> 8
|
71
36
|
end
|
72
37
|
rescue Timeout::Error => e
|
73
38
|
begin
|
74
39
|
Process.kill('SIGINT', pid)
|
75
|
-
raise(CmdException,"Run time of command \"#{@cmd_str}\" is over #{@
|
40
|
+
raise(CmdException,"Run time of command \"#{@cmd_str}\" is over #{@vars[:cmd_timeout].to_s} sec. Success to kill process : PID=#{pid}" )
|
76
41
|
rescue
|
77
|
-
raise(CmdException,"Run time of command \"#{@cmd_str}\" is over #{@
|
42
|
+
raise(CmdException,"Run time of command \"#{@cmd_str}\" is over #{@vars[:cmd_timeout].to_s} sec. Fail to kill process : PID=#{pid}" )
|
78
43
|
end
|
79
44
|
end
|
80
45
|
else
|
81
46
|
status = Process.waitpid2(pid)[1] >> 8
|
82
47
|
end
|
83
48
|
result = RBatch::CmdResult.new(stdout_file,stderr_file,status,@cmd_str)
|
84
|
-
if @
|
49
|
+
if @vars[:cmd_raise] && status != 0
|
85
50
|
raise(CmdException,"Command exit status is not 0. result: " + result.to_s)
|
86
51
|
end
|
87
52
|
return result
|
@@ -117,13 +82,5 @@ module RBatch
|
|
117
82
|
end
|
118
83
|
end
|
119
84
|
|
120
|
-
class CmdException <
|
121
|
-
|
122
|
-
module_function
|
123
|
-
|
124
|
-
# shortcut of RBatch::Cmd
|
125
|
-
def cmd(cmd_str,opt = nil)
|
126
|
-
Cmd.new(cmd_str,opt).run
|
127
|
-
end
|
128
|
-
|
85
|
+
class CmdException < StandardError ; end
|
129
86
|
end
|
data/lib/rbatch/config.rb
CHANGED
@@ -16,15 +16,15 @@ module RBatch
|
|
16
16
|
end
|
17
17
|
def[](key)
|
18
18
|
if @hash.nil?
|
19
|
-
raise RBatch::
|
19
|
+
raise RBatch::ConfigException, "Config file \"#{@path}\" does not exist"
|
20
20
|
end
|
21
21
|
if @hash[key].nil?
|
22
22
|
if key.class == Symbol
|
23
|
-
raise RBatch::
|
23
|
+
raise RBatch::ConfigException, "Value of key(:#{key} (Symbol)) is nil. By any chance, dou you mistake key class Symbol for String?"
|
24
24
|
elsif key.class == String
|
25
|
-
raise RBatch::
|
25
|
+
raise RBatch::ConfigException, "Value of key(\"#{key}\" (String)) is nil"
|
26
26
|
else
|
27
|
-
raise RBatch::
|
27
|
+
raise RBatch::ConfigException, "Value of key(#{key}) is nil."
|
28
28
|
end
|
29
29
|
else
|
30
30
|
@hash[key]
|
@@ -34,20 +34,20 @@ module RBatch
|
|
34
34
|
def exist? ; ! @hash.nil? ; end
|
35
35
|
def to_h
|
36
36
|
if @hash.nil?
|
37
|
-
raise RBatch::
|
37
|
+
raise RBatch::ConfigException, "Config file \"#{@path}\" does not exist"
|
38
38
|
else
|
39
39
|
@hash
|
40
40
|
end
|
41
41
|
end
|
42
42
|
def to_s
|
43
43
|
if @hash.nil?
|
44
|
-
raise RBatch::
|
44
|
+
raise RBatch::ConfigException, "Config file \"#{@path}\" does not exist"
|
45
45
|
else
|
46
46
|
@hash.to_s
|
47
47
|
end
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
|
-
class RBatch::
|
51
|
+
class RBatch::ConfigException < StandardError ; end
|
52
52
|
end
|
53
53
|
|
data/lib/rbatch/controller.rb
CHANGED
@@ -1,75 +1,51 @@
|
|
1
|
+
require 'rbatch/variables'
|
2
|
+
require 'rbatch/journal'
|
3
|
+
require 'rbatch/run_conf'
|
4
|
+
require 'rbatch/double_run_checker'
|
5
|
+
require 'rbatch/log'
|
6
|
+
require 'rbatch/config'
|
7
|
+
require 'rbatch/cmd'
|
8
|
+
|
1
9
|
module RBatch
|
2
10
|
class Controller
|
3
|
-
|
4
|
-
attr :program_name,:program_path
|
5
|
-
attr :home_dir,:log_dir,:conf_dir,:lib_dir
|
6
|
-
attr :run_conf_path, :run_conf
|
7
|
-
attr :config, :config_path
|
8
|
-
attr :common_config, :common_config_path
|
9
|
-
attr :journals,:logs
|
11
|
+
attr :vars,:config,:common_config,:journal,:user_logs
|
10
12
|
def initialize
|
11
|
-
@
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
@
|
19
|
-
@
|
20
|
-
@
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
@run_conf = RunConf.new(@run_conf_path,@home_dir)
|
28
|
-
journal :info, "=== START RBatch === (PID=#{$$.to_s})"
|
29
|
-
journal :debug,"RB_HOME : \"#{@home_dir}\""
|
30
|
-
journal :info, "Load Run-Conf: \"#{@run_conf_path}\""
|
31
|
-
journal :debug,"RBatch option : #{@run_conf.inspect}"
|
32
|
-
@lib_dir = @run_conf[:lib_dir].gsub("<home>",@home_dir)
|
33
|
-
@conf_dir = @run_conf[:conf_dir].gsub("<home>",@home_dir)
|
34
|
-
@log_dir = @run_conf[:log_dir].gsub("<home>",@home_dir)
|
35
|
-
# common config
|
36
|
-
@common_config_path = File.join(@conf_dir,@run_conf[:common_conf_name])
|
37
|
-
@common_config = RBatch::Config.new(@common_config_path)
|
38
|
-
journal :info, "Load Config : \"#{@common_config_path}\"" if ! @common_config.nil?
|
39
|
-
# user config
|
40
|
-
@config_path = File.join(@conf_dir,Pathname(File.basename(@program_name)).sub_ext(".yaml").to_s)
|
41
|
-
@config = RBatch::Config.new(@config_path)
|
42
|
-
journal :info, "Load Config : \"#{@config_path}\"" if ! @config.nil?
|
13
|
+
@vars = RBatch::Variables.new()
|
14
|
+
RBatch::Journal.def_vars = @vars
|
15
|
+
RBatch::Log.def_vars = @vars
|
16
|
+
RBatch::Cmd.def_vars = @vars
|
17
|
+
@journal = RBatch::Journal.new()
|
18
|
+
RBatch::Log.journal = @journal
|
19
|
+
@user_logs = []
|
20
|
+
@journal.put 1,"=== START RBatch === (PID=#{$$.to_s})"
|
21
|
+
@journal.put 1, "RB_HOME : \"#{@vars[:home_dir]}\""
|
22
|
+
@journal.put 1, "Load Run-Conf: \"#{@vars[:run_conf_path]}\""
|
23
|
+
@journal.put 2, "RBatch Variables : #{@vars.inspect}"
|
24
|
+
@common_config = RBatch::Config.new(@vars[:common_config_path])
|
25
|
+
@journal.put 1, "Load Config : \"#{@vars[:common_config_path]}\"" if ! @common_config.nil?
|
26
|
+
@config = RBatch::Config.new(@vars[:config_path])
|
27
|
+
@journal.put 1, "Load Config : \"#{@vars[:config_path]}\"" if ! @config.nil?
|
28
|
+
|
43
29
|
# double_run_check
|
44
|
-
if ( @
|
45
|
-
RBatch::DoubleRunChecker.check(@
|
46
|
-
RBatch::DoubleRunChecker.make_lock_file(@program_base)
|
30
|
+
if ( @vars[:forbid_double_run])
|
31
|
+
RBatch::DoubleRunChecker.check(@pvars[:rogram_base]) #raise error if check is NG
|
32
|
+
RBatch::DoubleRunChecker.make_lock_file(@vars[:program_base])
|
47
33
|
end
|
48
34
|
# load_lib
|
49
|
-
if @
|
50
|
-
Dir::foreach(@lib_dir) do |file|
|
35
|
+
if @vars[:auto_lib_load] && Dir.exist?(@vars[:lib_dir])
|
36
|
+
Dir::foreach(@vars[:lib_dir]) do |file|
|
51
37
|
if /.*rb/ =~ file
|
52
|
-
require File.join(@lib_dir,File.basename(file,".rb"))
|
53
|
-
journal
|
38
|
+
require File.join(@vars[:lib_dir],File.basename(file,".rb"))
|
39
|
+
@journal.put 1, "Load Library : \"#{File.join(@vars[:lib_dir],file)}\" "
|
54
40
|
end
|
55
41
|
end
|
56
42
|
end
|
57
|
-
journal
|
43
|
+
@journal.put 1, "Start Script : \"#{@vars[:program_path]}\""
|
58
44
|
end #end def
|
59
|
-
def
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
@journals << str
|
64
|
-
@logs.each do |log|
|
65
|
-
if RBatch.run_conf[:mix_rbatch_msg_to_log]
|
66
|
-
log.journal(str)
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
def add_log(log)
|
72
|
-
@logs << log
|
45
|
+
def config ; @config ; end
|
46
|
+
def common_config ; @common_config ; end
|
47
|
+
def cmd(cmd_str,opt)
|
48
|
+
RBatch::Cmd.new(cmd_str,opt).run
|
73
49
|
end
|
74
50
|
end
|
75
51
|
end
|
File without changes
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module RBatch
|
2
|
+
class Journal
|
3
|
+
@@def_vars
|
4
|
+
def Journal.def_vars=(a) ; @@def_vars=a ; end
|
5
|
+
attr :journals,:journal_verbose,:user_logs
|
6
|
+
def initialize(verbose=nil)
|
7
|
+
if verbose.nil?
|
8
|
+
if ENV["RB_VERBOSE"]
|
9
|
+
@journal_verbose = ENV["RB_VERBOSE"].to_i
|
10
|
+
else
|
11
|
+
@journal_verbose = 1
|
12
|
+
end
|
13
|
+
else
|
14
|
+
@journal_verbose = verbose
|
15
|
+
end
|
16
|
+
@journals = []
|
17
|
+
@user_logs = []
|
18
|
+
end
|
19
|
+
def put(level,str)
|
20
|
+
if level <= @journal_verbose
|
21
|
+
@journals << str
|
22
|
+
str = "[RBatch] " + str
|
23
|
+
puts str
|
24
|
+
@user_logs.each do |log|
|
25
|
+
if @@def_vars[:mix_rbatch_journal_to_logs]
|
26
|
+
log.journal(str)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
def add_log(log)
|
32
|
+
@user_logs << log
|
33
|
+
if @@def_vars[:mix_rbatch_journal_to_logs]
|
34
|
+
@journals.each do |j|
|
35
|
+
log.journal(j)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/rbatch/log.rb
CHANGED
@@ -3,140 +3,82 @@ require 'fileutils'
|
|
3
3
|
require 'pathname'
|
4
4
|
require 'net/smtp'
|
5
5
|
|
6
|
+
|
6
7
|
module RBatch
|
7
|
-
#=== About RBatch::Log
|
8
|
-
#
|
9
|
-
#By using Logging block, RBatch writes to logfile automatically.
|
10
|
-
#
|
11
|
-
#The default location of log file is "${RB_HOME}/log/YYYYMMDD_HHMMSS_(program base name).log" .
|
12
|
-
#
|
13
|
-
#If an exception occuerd, then RBatch writes back trace to logfile.
|
14
|
-
#
|
15
|
-
#=== Sample
|
16
|
-
#
|
17
|
-
#script : ${RB_HOME}/bin/sample1.rb
|
18
|
-
#
|
19
|
-
# require 'rbatch'
|
20
|
-
#
|
21
|
-
# RBatch::Log.new(){ |log| # Logging block
|
22
|
-
# log.info "info string"
|
23
|
-
# log.error "error string"
|
24
|
-
# raise "exception"
|
25
|
-
# }
|
26
|
-
#
|
27
|
-
#
|
28
|
-
#logfile : ${RB_HOME}/log/20121020_005953_sample1.log
|
29
|
-
#
|
30
|
-
# [2012-10-20 00:59:53 +900] [INFO ] info string
|
31
|
-
# [2012-10-20 00:59:53 +900] [ERROR] error string
|
32
|
-
# [2012-10-20 00:59:53 +900] [FATAL] Caught exception; existing 1
|
33
|
-
# [2012-10-20 00:59:53 +900] [FATAL] exception (RuntimeError)
|
34
|
-
# [backtrace] test.rb:6:in `block in <main>'
|
35
|
-
# [backtrace] /usr/local/lib/ruby192/lib/ruby/gems/1.9.1/gems/rbatch-1.0.0/lib/rbatch/auto_logger.rb:37:in `initialize'
|
36
|
-
# [backtrace] test.rb:3:in `new'
|
37
|
-
# [backtrace] test.rb:3:in `<main>'
|
38
|
-
#
|
39
8
|
class Log
|
40
|
-
@@
|
41
|
-
|
9
|
+
@@FORMATTER = proc do |severity, datetime, progname, msg|
|
10
|
+
head = "[#{datetime}] [" + sprintf("%-5s",severity) +"]"
|
11
|
+
if msg.is_a? Exception
|
12
|
+
"#{head} #{msg}\n" + msg.backtrace.map{|s| " [backtrace] #{s}"}.join("\n") + "\n"
|
13
|
+
else
|
14
|
+
"#{head} #{msg}\n"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
@@STDOUT_FORMATTER = proc do |severity, datetime, progname, msg|
|
18
|
+
head = "[" + sprintf("%-5s",severity) +"]"
|
19
|
+
if msg.is_a? Exception
|
20
|
+
"#{head} #{msg}\n" + msg.backtrace.map{|s| " [backtrace] #{s}"}.join("\n") + "\n"
|
21
|
+
else
|
22
|
+
"#{head} #{msg}\n"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
@@LOG_LEVEL_MAP = {
|
42
26
|
"debug" => Logger::DEBUG,
|
43
27
|
"info" => Logger::INFO,
|
44
28
|
"warn" => Logger::WARN,
|
45
29
|
"error" => Logger::ERROR,
|
46
30
|
"fatal" => Logger::FATAL
|
47
31
|
}
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
def opt
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
# - +:name+ (String) = name of log file. Default is "<date>_<time>_<prog>.log". Reservation-words are "<date>","<time>","<prog>","<host>". "<date>" is replaced YYYYMMDD. "<time>" is replaced HHMMSS. "<prog>" is replaced a base-name of program file.
|
69
|
-
# - +:dir+ (String) = log direcotry. Default is "${RB_HOME}/log"
|
70
|
-
# - +:level+ (String) = log level. Default is "info". ["debug"|"info"|"warn"|"error"|"fatal"] .
|
71
|
-
# - +:append+ (Boolean) = appned to log or not(=overwrite). Default is ture.
|
72
|
-
# - +:stdout+ (Boolean) = output both the log file and STDOUT. Default is false.
|
73
|
-
# ==== Block params
|
74
|
-
# +log+ = Instance of +Logger+
|
75
|
-
# ==== Sample
|
76
|
-
# RBatch::Log.new({:dir => "/tmp", :level => "info"}){ |log|
|
77
|
-
# log.info "info string"
|
78
|
-
# }
|
79
|
-
#
|
80
|
-
def initialize(opt = nil)
|
81
|
-
# parse option
|
82
|
-
tmp = {}
|
83
|
-
if opt.nil?
|
84
|
-
@opt=RBatch.run_conf.clone
|
85
|
-
else
|
32
|
+
@@def_vars
|
33
|
+
def Log.def_vars=(a)
|
34
|
+
raise ArgumentError, "type mismatch: #{a} for #RBatch::Variables" if ! a.kind_of?(RBatch::Variables)
|
35
|
+
@@def_vars=a
|
36
|
+
end
|
37
|
+
def Log.def_vars ; @@def_vars ; end
|
38
|
+
@@journal
|
39
|
+
def Log.journal=(a) ; @@journal=a ; end
|
40
|
+
|
41
|
+
@vars
|
42
|
+
@opt
|
43
|
+
@log
|
44
|
+
@stdout_log
|
45
|
+
|
46
|
+
def initialize(opt=nil)
|
47
|
+
@opt = opt
|
48
|
+
@vars = @@def_vars.clone
|
49
|
+
if ! opt.nil?
|
50
|
+
# change opt key from "hoge" to "log_hoge"
|
51
|
+
tmp = {}
|
86
52
|
opt.each_key do |key|
|
87
53
|
tmp[("log_" + key.to_s).to_sym] = opt[key]
|
88
54
|
end
|
89
|
-
@
|
55
|
+
@vars.merge!(tmp)
|
90
56
|
end
|
91
|
-
|
92
|
-
# determine log file name
|
93
|
-
@prog_base = Pathname(File.basename(RBatch.ctrl.program_name)).sub_ext("").to_s
|
94
|
-
@file_name = @opt[:log_name].clone
|
95
|
-
@file_name.gsub!("<date>", Time.now.strftime("%Y%m%d"))
|
96
|
-
@file_name.gsub!("<time>", Time.now.strftime("%H%M%S"))
|
97
|
-
@file_name.gsub!("<prog>", @prog_base)
|
98
|
-
@file_name.gsub!("<host>", @opt[:log_hostname])
|
99
|
-
@log_dir = @opt[:log_dir].gsub("<home>",RBatch.ctrl.home_dir)
|
100
|
-
path = File.join(@log_dir,@file_name)
|
57
|
+
@path = File.join(@vars[:log_dir],@vars[:log_name])
|
101
58
|
# create Logger instance
|
102
59
|
begin
|
103
|
-
if @
|
104
|
-
@log = Logger.new(open(path,"a"))
|
60
|
+
if @vars[:log_append] && File.exist?(@path)
|
61
|
+
@log = Logger.new(open(@path,"a"))
|
105
62
|
else
|
106
|
-
@log = Logger.new(open(path,"w"))
|
63
|
+
@log = Logger.new(open(@path,"w"))
|
107
64
|
end
|
108
65
|
rescue Errno::ENOENT => e
|
109
|
-
|
110
|
-
raise e
|
66
|
+
raise LogException,"Can not open log file - #{@path}"
|
111
67
|
end
|
112
68
|
# set logger option
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
"#{head} #{msg}\n" + msg.backtrace.map{|s| " [backtrace] #{s}"}.join("\n") + "\n"
|
117
|
-
else
|
118
|
-
"#{head} #{msg}\n"
|
119
|
-
end
|
120
|
-
end
|
121
|
-
@log.level = @@log_level_map[@opt[:log_level]]
|
122
|
-
@log.formatter = formatter
|
123
|
-
if @opt[:log_stdout]
|
69
|
+
@log.level = @@LOG_LEVEL_MAP[@vars[:log_level]]
|
70
|
+
@log.formatter = @@FORMATTER
|
71
|
+
if @vars[:log_stdout]
|
124
72
|
# ccreate Logger instance for STDOUT
|
125
73
|
@stdout_log = Logger.new(STDOUT)
|
126
|
-
@stdout_log.level = @@
|
127
|
-
@stdout_log.formatter =
|
74
|
+
@stdout_log.level = @@LOG_LEVEL_MAP[@vars[:log_level]]
|
75
|
+
@stdout_log.formatter = @@STDOUT_FORMATTER
|
128
76
|
end
|
129
|
-
RBatch.ctrl.journal :info,"Start Logging: \"#{path}\""
|
130
77
|
# delete old log
|
131
|
-
self.delete_old_log(@
|
132
|
-
# Firstly write journal to log
|
133
|
-
if RBatch.run_conf[:mix_rbatch_msg_to_log]
|
134
|
-
RBatch.ctrl.journals.each do |str|
|
135
|
-
self.journal(str)
|
136
|
-
end
|
137
|
-
RBatch.ctrl.add_log(self)
|
138
|
-
end
|
78
|
+
self.delete_old_log(@vars[:log_delete_old_log_date]) if @vars[:log_delete_old_log]
|
139
79
|
# Start logging
|
80
|
+
@@journal.put 1,"Logging Start: \"#{@path}\""
|
81
|
+
@@journal.add_log(self)
|
140
82
|
if block_given?
|
141
83
|
begin
|
142
84
|
yield self
|
@@ -151,29 +93,29 @@ module RBatch
|
|
151
93
|
end
|
152
94
|
|
153
95
|
def fatal(a)
|
154
|
-
@stdout_log.fatal(a) if @
|
96
|
+
@stdout_log.fatal(a) if @vars[:log_stdout]
|
155
97
|
@log.fatal(a)
|
156
|
-
send_mail(a) if @
|
98
|
+
send_mail(a) if @vars[:log_send_mail]
|
157
99
|
end
|
158
100
|
|
159
101
|
def error(a)
|
160
|
-
@stdout_log.error(a) if @
|
102
|
+
@stdout_log.error(a) if @vars[:log_stdout]
|
161
103
|
@log.error(a)
|
162
|
-
send_mail(a) if @
|
104
|
+
send_mail(a) if @vars[:log_send_mail]
|
163
105
|
end
|
164
106
|
|
165
107
|
def warn(a)
|
166
|
-
@stdout_log.warn(a) if @
|
108
|
+
@stdout_log.warn(a) if @vars[:log_stdout]
|
167
109
|
@log.warn(a)
|
168
110
|
end
|
169
111
|
|
170
112
|
def info(a)
|
171
|
-
@stdout_log.info(a) if @
|
113
|
+
@stdout_log.info(a) if @vars[:log_stdout]
|
172
114
|
@log.info(a)
|
173
115
|
end
|
174
116
|
|
175
117
|
def debug(a)
|
176
|
-
@stdout_log.debug(a) if @
|
118
|
+
@stdout_log.debug(a) if @vars[:log_stdout]
|
177
119
|
@log.debug(a)
|
178
120
|
end
|
179
121
|
|
@@ -182,27 +124,26 @@ module RBatch
|
|
182
124
|
end
|
183
125
|
|
184
126
|
def close
|
185
|
-
@stdout_log.close if @opt[:log_stdout]
|
186
127
|
@log.close
|
187
128
|
end
|
188
129
|
|
189
130
|
# Delete old log files.
|
190
|
-
# If @
|
131
|
+
# If @vars[:log_name] is not include "<date>", then do nothing.
|
191
132
|
#
|
192
133
|
# ==== Params
|
193
134
|
# - +date+ (Integer): The day of leaving log files
|
194
135
|
#
|
195
136
|
def delete_old_log(date = 7)
|
196
|
-
if Dir.exists?(@log_dir) && @
|
197
|
-
Dir::foreach(@log_dir) do |file|
|
137
|
+
if Dir.exists?(@vars[:log_dir]) && @vars.raw_value(:log_name).include?("<date>")
|
138
|
+
Dir::foreach(@vars[:log_dir]) do |file|
|
198
139
|
r = Regexp.new("^" \
|
199
|
-
+ @
|
140
|
+
+ @vars.raw_value(:log_name).gsub("<prog>",@vars[:program_base])\
|
200
141
|
.gsub("<time>","[0-2][0-9][0-5][0-9][0-5][0-9]")\
|
201
142
|
.gsub("<date>","([0-9][0-9][0-9][0-9][0-1][0-9][0-3][0-9])")\
|
202
143
|
+ "$")
|
203
144
|
if r =~ file && Date.strptime($1,"%Y%m%d") <= Date.today - date
|
204
|
-
|
205
|
-
File::delete(File.join(@log_dir , file))
|
145
|
+
@@journal.put 1, "Delete old log file: " + File.join(@vars[:log_dir] , file)
|
146
|
+
File::delete(File.join(@vars[:log_dir] , file))
|
206
147
|
end
|
207
148
|
end
|
208
149
|
end
|
@@ -213,9 +154,9 @@ module RBatch
|
|
213
154
|
# send mail
|
214
155
|
def send_mail(msg)
|
215
156
|
body = <<EOT
|
216
|
-
From: <#{@
|
217
|
-
To: <#{@
|
218
|
-
Subject: [RBatch] #{
|
157
|
+
From: <#{@vars[:log_mail_from]}>
|
158
|
+
To: <#{@vars[:log_mail_to]}>
|
159
|
+
Subject: [RBatch] #{@vars[:program_name]} has error
|
219
160
|
Date: #{Time::now.strftime("%a, %d %b %Y %X %z")}
|
220
161
|
Mime-Version: 1.0
|
221
162
|
Content-Type: text/plain; charset=ISO-2022-JP
|
@@ -223,10 +164,11 @@ Content-Transfer-Encoding: 7bit
|
|
223
164
|
|
224
165
|
#{msg}
|
225
166
|
EOT
|
226
|
-
Net::SMTP.start(@
|
227
|
-
smtp.send_mail(body,@
|
167
|
+
Net::SMTP.start(@vars[:log_mail_server_host],@vars[:log_mail_server_port] ) {|smtp|
|
168
|
+
smtp.send_mail(body,@vars[:log_mail_from],@vars[:log_mail_to])
|
228
169
|
}
|
229
170
|
end
|
230
171
|
end # end class
|
172
|
+
class LogException < StandardError ; end
|
231
173
|
end # end module
|
232
174
|
|
data/lib/rbatch/run_conf.rb
CHANGED
@@ -2,9 +2,8 @@ require 'tmpdir'
|
|
2
2
|
require 'yaml'
|
3
3
|
module RBatch
|
4
4
|
class RunConf
|
5
|
-
|
5
|
+
attr :path,:opt
|
6
6
|
@yaml
|
7
|
-
attr_reader :run_conf_path,:home_dir
|
8
7
|
@@def_opt = {
|
9
8
|
:conf_dir => "<home>/conf",
|
10
9
|
:common_conf_name => "common.yaml",
|
@@ -21,35 +20,26 @@ module RBatch
|
|
21
20
|
:log_delete_old_log => false,
|
22
21
|
:log_delete_old_log_date => 7,
|
23
22
|
:log_send_mail => false,
|
24
|
-
:log_hostname => "unknownhost",
|
25
23
|
:log_mail_to => nil,
|
26
24
|
:log_mail_from => "rbatch.localhost",
|
27
25
|
:log_mail_server_host => "localhost",
|
28
26
|
:log_mail_server_port => 25,
|
29
|
-
:
|
27
|
+
:rbatch_journal_level => 1,
|
28
|
+
:mix_rbatch_journal_to_logs => true
|
30
29
|
}
|
31
|
-
def initialize(
|
32
|
-
|
33
|
-
|
34
|
-
reset
|
35
|
-
load
|
36
|
-
end
|
37
|
-
|
38
|
-
def reset()
|
39
|
-
@opt = @@def_opt.clone
|
40
|
-
case RUBY_PLATFORM
|
41
|
-
when /mswin|mingw/
|
42
|
-
@opt[:log_hostname] = ENV["COMPUTERNAME"] ? ENV["COMPUTERNAME"] : "unknownhost"
|
43
|
-
when /cygwin|linux/
|
44
|
-
@opt[:log_hostname] = ENV["HOSTNAME"] ? ENV["HOSTNAME"] : "unknownhost"
|
30
|
+
def initialize(path=nil)
|
31
|
+
if path.nil?
|
32
|
+
@opt = @@def_opt.clone
|
45
33
|
else
|
46
|
-
@
|
34
|
+
@path = path
|
35
|
+
@opt = @@def_opt.clone
|
36
|
+
load
|
47
37
|
end
|
48
38
|
end
|
49
39
|
|
50
40
|
def load()
|
51
41
|
begin
|
52
|
-
@yaml = YAML::load_file(@
|
42
|
+
@yaml = YAML::load_file(@path)
|
53
43
|
rescue
|
54
44
|
# when run_conf does not exist, do nothing.
|
55
45
|
@yaml = false
|
@@ -65,11 +55,10 @@ module RBatch
|
|
65
55
|
end
|
66
56
|
end
|
67
57
|
|
68
|
-
def
|
69
|
-
|
70
|
-
load
|
58
|
+
def has_key?(key)
|
59
|
+
@opt.has_key?(key)
|
71
60
|
end
|
72
|
-
|
61
|
+
|
73
62
|
def merge!(opt)
|
74
63
|
opt.each_key do |key|
|
75
64
|
if @opt.has_key?(key)
|