omf_base 1.0
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/.gitignore +2 -0
- data/Gemfile +4 -0
- data/README.md +10 -0
- data/Rakefile +10 -0
- data/lib/omf_base/load_yaml.rb +90 -0
- data/lib/omf_base/lobject.rb +187 -0
- data/lib/omf_base/log4r_outputter.rb +69 -0
- data/lib/omf_base/thin/logging.rb +54 -0
- data/lib/omf_base/thin/runner.rb +115 -0
- data/lib/omf_base/version.rb +6 -0
- data/lib/omf_base.rb +0 -0
- data/omf_base.gemspec +24 -0
- metadata +73 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
|
|
2
|
+
# OMF Base
|
|
3
|
+
|
|
4
|
+
This GEM contains a few commonly used helper classes used in various places inside the
|
|
5
|
+
OMF related libraries. This used to be omf_common, but that by now ballooned into something
|
|
6
|
+
much too big for many other tasks.
|
|
7
|
+
|
|
8
|
+
## Install
|
|
9
|
+
|
|
10
|
+
gem install omf_base
|
data/Rakefile
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
|
|
2
|
+
if $0 == __FILE__
|
|
3
|
+
module OMF; module Common; end; end
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
module OMF::Base::YAML
|
|
7
|
+
|
|
8
|
+
class YamlFileNotFound < Exception; end
|
|
9
|
+
|
|
10
|
+
# A method to load YAML files
|
|
11
|
+
#
|
|
12
|
+
# file_name - Name of file to load
|
|
13
|
+
# opts -
|
|
14
|
+
# => :default - value to use if file can't be loaded
|
|
15
|
+
# => :path - array of directories to look for file
|
|
16
|
+
#
|
|
17
|
+
# raise YamlFileNotFound if YAML file can't be found
|
|
18
|
+
#
|
|
19
|
+
def self.load(file_name, opts = {})
|
|
20
|
+
if (file_name.split('.').length == 1)
|
|
21
|
+
file_name = file_name + '.yaml'
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
path = opts[:path] || ['.', File.dirname(__FILE__)]
|
|
25
|
+
begin
|
|
26
|
+
path.each do |d|
|
|
27
|
+
begin
|
|
28
|
+
return _load_file(d + '/' + file_name)
|
|
29
|
+
rescue YamlFileNotFound => ex
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
if (default = opts[:default])
|
|
33
|
+
return _symbolize(default)
|
|
34
|
+
end
|
|
35
|
+
raise YamlFileNotFound.new("Can't read YAML file '#{file_name}' in '#{path.join(':')}'")
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
private
|
|
40
|
+
|
|
41
|
+
def self._load_file(file, opts = {})
|
|
42
|
+
begin
|
|
43
|
+
begin
|
|
44
|
+
require 'rbyaml'
|
|
45
|
+
h = RbYAML::load_file(file)
|
|
46
|
+
rescue LoadError => ex
|
|
47
|
+
require 'yaml'
|
|
48
|
+
h = YAML::load_file(file)
|
|
49
|
+
end
|
|
50
|
+
rescue Exception => ex
|
|
51
|
+
unless (h = opts[:default])
|
|
52
|
+
raise YamlFileNotFound.new("Can't read YAML file '#{file}'")
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
_symbolize(h)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def self._symbolize(obj)
|
|
60
|
+
if obj.kind_of? Hash
|
|
61
|
+
res = {}
|
|
62
|
+
obj.each do |k, v|
|
|
63
|
+
if k.kind_of? String
|
|
64
|
+
if k.start_with?(":")
|
|
65
|
+
k = k[1 .. -1]
|
|
66
|
+
end
|
|
67
|
+
k = k.to_sym
|
|
68
|
+
end
|
|
69
|
+
res[k] = _symbolize(v)
|
|
70
|
+
end
|
|
71
|
+
return res
|
|
72
|
+
elsif obj.kind_of? Array
|
|
73
|
+
return obj.collect do |el|
|
|
74
|
+
_symbolize(el)
|
|
75
|
+
end
|
|
76
|
+
else
|
|
77
|
+
return obj
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
if $0 == __FILE__
|
|
83
|
+
h = OMF::Base::YAML.load 'foo'#, :default => {':foo' => {:goo=> 3}}
|
|
84
|
+
puts h.inspect
|
|
85
|
+
puts h.keys[0].class
|
|
86
|
+
puts h[:foo].keys[0].class
|
|
87
|
+
|
|
88
|
+
#puts OMF::Base::YAML.load('omf-expctl', :path => ['../../../omf-expctl/etc/omf-expctl']).inspect
|
|
89
|
+
|
|
90
|
+
end
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright (c) 2006-2009 National ICT Australia (NICTA), Australia
|
|
3
|
+
#
|
|
4
|
+
# Copyright (c) 2004-2009 WINLAB, Rutgers University, USA
|
|
5
|
+
#
|
|
6
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
+
# of this software and associated documentation files (the "Software"), to deal
|
|
8
|
+
# in the Software without restriction, including without limitation the rights
|
|
9
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
10
|
+
# copies of the Software, and to permit persons to whom the Software is
|
|
11
|
+
# furnished to do so, subject to the following conditions:
|
|
12
|
+
#
|
|
13
|
+
# The above copyright notice and this permission notice shall be included in
|
|
14
|
+
# all copies or substantial portions of the Software.
|
|
15
|
+
#
|
|
16
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
18
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
19
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
20
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
22
|
+
# THE SOFTWARE.
|
|
23
|
+
#
|
|
24
|
+
#
|
|
25
|
+
#
|
|
26
|
+
require 'rubygems'
|
|
27
|
+
require 'date'
|
|
28
|
+
require 'log4r'
|
|
29
|
+
require 'log4r/configurator'
|
|
30
|
+
require 'log4r/yamlconfigurator'
|
|
31
|
+
require 'log4r/outputter/datefileoutputter'
|
|
32
|
+
require 'omf_base/log4r_outputter'
|
|
33
|
+
|
|
34
|
+
#include Log4r
|
|
35
|
+
|
|
36
|
+
module OMF; module Base; end end
|
|
37
|
+
|
|
38
|
+
#
|
|
39
|
+
# An extended object class with support for logging
|
|
40
|
+
#
|
|
41
|
+
module OMF::Base
|
|
42
|
+
module Loggable
|
|
43
|
+
@@logger = nil
|
|
44
|
+
@@rootLoggerName = nil
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
#
|
|
48
|
+
# Initialize the logger. The 'appName' is used to build some of the defaults.
|
|
49
|
+
# The 'environment' is the name of the root
|
|
50
|
+
# logger. 'AppInstance' and 'appName' are available as parameters
|
|
51
|
+
# in the log configuration file. The 'opts' hash can optionally
|
|
52
|
+
# contain information on how to find a configuration file. The
|
|
53
|
+
# following keys are used:
|
|
54
|
+
#
|
|
55
|
+
# * :environment - Name used for root logger name ['development']
|
|
56
|
+
# * :env - Name of environment variable holding dominant config file
|
|
57
|
+
# * :fileName - Name of config file [#{appName}_log.xml]
|
|
58
|
+
# * :searchPath - Array of directories to look for 'fileName'
|
|
59
|
+
#
|
|
60
|
+
def self.init_log(appName, opts = {})
|
|
61
|
+
|
|
62
|
+
#@@logger = ::Log4r::Logger.new(appName)
|
|
63
|
+
set_environment(opts[:environment] || 'development')
|
|
64
|
+
@@logger = ::Log4r::Logger.new(@@rootLoggerName)
|
|
65
|
+
|
|
66
|
+
configFile = opts[:configFile]
|
|
67
|
+
if (configFile == nil && logEnv = opts[:env])
|
|
68
|
+
configFile = ENV[logEnv]
|
|
69
|
+
end
|
|
70
|
+
if (configFile != nil)
|
|
71
|
+
# Make sure log exists ...
|
|
72
|
+
configFile = File.exists?(configFile) ? configFile : nil
|
|
73
|
+
else
|
|
74
|
+
name = opts[:fileName] || "#{appName}_log4r.yaml"
|
|
75
|
+
if ((searchPath = opts[:searchPath]) != nil)
|
|
76
|
+
searchPath = searchPath.is_a?(Enumerable) ? searchPath : [searchPath]
|
|
77
|
+
logDir = searchPath.find {|dir|
|
|
78
|
+
File.exists?("#{dir}/#{name}")
|
|
79
|
+
}
|
|
80
|
+
#puts "logDir '#{logDir}:#{logDir.class}'"
|
|
81
|
+
configFile = "#{logDir}/#{name}" if logDir != nil
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
#puts "config file '#{configFile}'"
|
|
85
|
+
if !(configFile || '').empty?
|
|
86
|
+
::Log4r::Configurator['appName'] = appName
|
|
87
|
+
begin
|
|
88
|
+
ycfg = YAML.load_file(configFile)
|
|
89
|
+
::Log4r::YamlConfigurator.decode_yaml(ycfg['log4r'])
|
|
90
|
+
#::Log4r::Configurator.load_xml_file(configFile)
|
|
91
|
+
# rescue ::Log4r::ConfigError => ex
|
|
92
|
+
# @@logger.outputters = ::Log4r::Outputter.stdout
|
|
93
|
+
# # TODO: FIX ME
|
|
94
|
+
# puts("ERROR: Log::Config: #{ex}")
|
|
95
|
+
end
|
|
96
|
+
else
|
|
97
|
+
# set default behavior
|
|
98
|
+
::Log4r::Logger.global.level = ::Log4r::ALL
|
|
99
|
+
formatter = ::Log4r::PatternFormatter.new(:pattern => "%l %c: %m")
|
|
100
|
+
::Log4r::StdoutOutputter.new('console', :formatter => formatter)
|
|
101
|
+
@@logger.add 'console'
|
|
102
|
+
#@@logger.outputters = ::Log4r::StdoutOutputter.new('console') #Outputter.stdout
|
|
103
|
+
##@@logger.outputters = ::Log4r::Outputter.stdout
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def self.set_environment(root_logger_name)
|
|
108
|
+
if root_logger_name.nil? || root_logger_name.empty?
|
|
109
|
+
# TODO: FIX ME
|
|
110
|
+
puts("ERROR: LObject: Ignoring empty root logger")
|
|
111
|
+
return
|
|
112
|
+
end
|
|
113
|
+
@@rootLoggerName = root_logger_name
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def self.logger(category)
|
|
117
|
+
raise "Logger not initialized" unless @@logger
|
|
118
|
+
|
|
119
|
+
name = "#{@@rootLoggerName}::#{category}"
|
|
120
|
+
logger = Log4r::Logger[name]
|
|
121
|
+
if logger == nil
|
|
122
|
+
logger = Log4r::Logger.new(name)
|
|
123
|
+
end
|
|
124
|
+
return logger
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def debug(*message)
|
|
128
|
+
logger = _logger()
|
|
129
|
+
logger.debug(message.join('')) if logger.debug?
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def info(*message)
|
|
133
|
+
logger = _logger()
|
|
134
|
+
logger.info(message.join('')) if logger.info?
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def warn(*message)
|
|
138
|
+
logger = _logger()
|
|
139
|
+
logger.warn(message.join('')) if logger.warn?
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def error(*message)
|
|
143
|
+
logger = _logger()
|
|
144
|
+
logger.error(message.join('')) if logger.error?
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def fatal(*message)
|
|
148
|
+
logger = _logger()
|
|
149
|
+
logger.fatal(message.join('')) if logger.fatal?
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def _logger(category = nil)
|
|
153
|
+
unless @logger #&& category.nil?
|
|
154
|
+
cat = self.is_a?(Class) ? self.to_s + 'Class' : self.class.to_s
|
|
155
|
+
if category
|
|
156
|
+
cat = "#{cat}-#{category}"
|
|
157
|
+
end
|
|
158
|
+
@logger = OMF::Base::Loggable.logger(cat)
|
|
159
|
+
end
|
|
160
|
+
return @logger
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
class LObject
|
|
166
|
+
include Loggable
|
|
167
|
+
extend Loggable
|
|
168
|
+
|
|
169
|
+
def initialize(logCategory = nil)
|
|
170
|
+
_logger(logCategory)
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
if $0 == __FILE__
|
|
177
|
+
OMF::Base::Loggable.init_log 'foo'
|
|
178
|
+
#puts OMF::Base::Loggable.logger('test').inspect
|
|
179
|
+
o = OMF::Base::LObject.new
|
|
180
|
+
#puts (o.methods - Object.new.methods).sort
|
|
181
|
+
o.debug 'Something happened'
|
|
182
|
+
|
|
183
|
+
o2 = OMF::Base::LObject.new('fancy')
|
|
184
|
+
o2.debug 'Something happened'
|
|
185
|
+
|
|
186
|
+
end
|
|
187
|
+
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
require 'log4r/outputter/fileoutputter'
|
|
4
|
+
|
|
5
|
+
module Log4r
|
|
6
|
+
# When daemonizing, the file handler gets closed and we fall over here.
|
|
7
|
+
# The following monkey patch retries once to open the file and write again
|
|
8
|
+
#
|
|
9
|
+
class FileOutputter
|
|
10
|
+
|
|
11
|
+
# def initialize(_name, hash={})
|
|
12
|
+
# raise "#{_name}::#{hash.inspect}"
|
|
13
|
+
# end
|
|
14
|
+
|
|
15
|
+
def write(data)
|
|
16
|
+
#puts ">>> #{data}"
|
|
17
|
+
begin
|
|
18
|
+
@out.print data
|
|
19
|
+
@out.flush
|
|
20
|
+
rescue IOError => ioe # recover from this instead of crash
|
|
21
|
+
# retry once
|
|
22
|
+
unless @retrying
|
|
23
|
+
@retrying = true
|
|
24
|
+
@out = File.new(@filename, (@trunc ? "w" : "a"))
|
|
25
|
+
return write(data)
|
|
26
|
+
end
|
|
27
|
+
Logger.log_internal {"IOError in Outputter '#{@name}'!"}
|
|
28
|
+
Logger.log_internal {ioe}
|
|
29
|
+
close
|
|
30
|
+
rescue NameError => ne
|
|
31
|
+
Logger.log_internal {"Outputter '#{@name}' IO is #{@out.class}!"}
|
|
32
|
+
Logger.log_internal {ne}
|
|
33
|
+
close
|
|
34
|
+
end
|
|
35
|
+
@retrying = false
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# module OMF; module Common; end end
|
|
41
|
+
#
|
|
42
|
+
# #
|
|
43
|
+
# # An extended object class with support for logging
|
|
44
|
+
# #
|
|
45
|
+
# module OMF::Base
|
|
46
|
+
# module Log4r
|
|
47
|
+
#
|
|
48
|
+
# class DateFileOutputter < ::Log4r::DateFileOutputter
|
|
49
|
+
#
|
|
50
|
+
# def write(data)
|
|
51
|
+
# puts ">>> #{data}"
|
|
52
|
+
# begin
|
|
53
|
+
# @out.print data
|
|
54
|
+
# @out.flush
|
|
55
|
+
# rescue IOError => ioe # recover from this instead of crash
|
|
56
|
+
# Logger.log_internal {"IOError in Outputter '#{@name}'!"}
|
|
57
|
+
# Logger.log_internal {ioe}
|
|
58
|
+
# close
|
|
59
|
+
# rescue NameError => ne
|
|
60
|
+
# Logger.log_internal {"Outputter '#{@name}' IO is #{@out.class}!"}
|
|
61
|
+
# Logger.log_internal {ne}
|
|
62
|
+
# close
|
|
63
|
+
# end
|
|
64
|
+
# end
|
|
65
|
+
# end
|
|
66
|
+
# end
|
|
67
|
+
# end
|
|
68
|
+
#
|
|
69
|
+
# puts "REQUIRE #{OMF::Base::Log4r::DateFileOutputter}"
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
require 'omf_base/lobject'
|
|
2
|
+
|
|
3
|
+
module Thin
|
|
4
|
+
# Overwrite thin's logging mix-in to work more nicely
|
|
5
|
+
# with log4r
|
|
6
|
+
#
|
|
7
|
+
module Logging
|
|
8
|
+
class << self
|
|
9
|
+
attr_writer :trace, :debug, :silent
|
|
10
|
+
|
|
11
|
+
def trace?; !@silent && @trace end
|
|
12
|
+
def debug?; !@silent && @debug end
|
|
13
|
+
def silent?; @silent end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# # Global silencer methods
|
|
17
|
+
# def silent
|
|
18
|
+
# Logging.silent?
|
|
19
|
+
# end
|
|
20
|
+
# def silent=(value)
|
|
21
|
+
# Logging.silent = value
|
|
22
|
+
# end
|
|
23
|
+
|
|
24
|
+
# Log a message to the console
|
|
25
|
+
def log(msg)
|
|
26
|
+
(@logger ||= OMF::Base::LObject.new(self.class)).info(msg)
|
|
27
|
+
end
|
|
28
|
+
module_function :log
|
|
29
|
+
public :log
|
|
30
|
+
|
|
31
|
+
# Log a message to the console if tracing is activated
|
|
32
|
+
def trace(msg=nil)
|
|
33
|
+
return unless msg
|
|
34
|
+
(@logger ||= OMF::Base::LObject.new(self.class)).debug(msg)
|
|
35
|
+
end
|
|
36
|
+
module_function :trace
|
|
37
|
+
public :trace
|
|
38
|
+
|
|
39
|
+
# Log a message to the console if debugging is activated
|
|
40
|
+
def debug(msg=nil)
|
|
41
|
+
return unless msg
|
|
42
|
+
(@logger ||= OMF::Base::LObject.new(self.class)).debug(msg)
|
|
43
|
+
end
|
|
44
|
+
module_function :debug
|
|
45
|
+
public :debug
|
|
46
|
+
|
|
47
|
+
# Log an error backtrace if debugging is activated
|
|
48
|
+
def log_error(e = $!)
|
|
49
|
+
(@logger ||= OMF::Base::LObject.new(self.class)).error(e)
|
|
50
|
+
end
|
|
51
|
+
module_function :log_error
|
|
52
|
+
public :log_error
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
|
|
2
|
+
require 'thin'
|
|
3
|
+
require 'omf_base/thin/logging'
|
|
4
|
+
|
|
5
|
+
#
|
|
6
|
+
# Add code to Thin::Connection to verify peer certificate
|
|
7
|
+
#
|
|
8
|
+
module Thin
|
|
9
|
+
class Connection
|
|
10
|
+
def ssl_verify_peer(cert_s)
|
|
11
|
+
true # will be verified later
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
module OMF::Base::Thin
|
|
17
|
+
class Runner < Thin::Runner
|
|
18
|
+
include OMF::Base::Loggable
|
|
19
|
+
|
|
20
|
+
@@instance = nil
|
|
21
|
+
|
|
22
|
+
def self.instance
|
|
23
|
+
@@instance
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
attr_reader :options
|
|
27
|
+
|
|
28
|
+
def initialize(argv, opts = {})
|
|
29
|
+
raise "SINGLETON" if @@instance
|
|
30
|
+
|
|
31
|
+
@argv = argv
|
|
32
|
+
sopts = opts.delete(:ssl) # runner has it's own idea of ssl options
|
|
33
|
+
|
|
34
|
+
# Default options values
|
|
35
|
+
app_name = opts[:app_name] || 'omf_web_app'
|
|
36
|
+
@options = {
|
|
37
|
+
:app_name => app_name,
|
|
38
|
+
:chdir => Dir.pwd,
|
|
39
|
+
:environment => 'development',
|
|
40
|
+
:address => '0.0.0.0',
|
|
41
|
+
:port => Thin::Server::DEFAULT_PORT,
|
|
42
|
+
:timeout => Thin::Server::DEFAULT_TIMEOUT,
|
|
43
|
+
:log => "/tmp/#{app_name}_thin.log",
|
|
44
|
+
:pid => "/tmp/#{app_name}.pid",
|
|
45
|
+
:max_conns => Thin::Server::DEFAULT_MAXIMUM_CONNECTIONS,
|
|
46
|
+
:max_persistent_conns => Thin::Server::DEFAULT_MAXIMUM_PERSISTENT_CONNECTIONS,
|
|
47
|
+
:require => [],
|
|
48
|
+
:wait => Thin::Controllers::Cluster::DEFAULT_WAIT_TIME,
|
|
49
|
+
|
|
50
|
+
:rackup => File.dirname(__FILE__) + '/../config.ru',
|
|
51
|
+
:static_dirs => ["#{File.dirname(__FILE__)}/../../../share/htdocs"],
|
|
52
|
+
:static_dirs_pre => ["./resources"], # directories to prepend to 'static_dirs'
|
|
53
|
+
|
|
54
|
+
:handlers => {} # procs to call at various times of the server's life cycle
|
|
55
|
+
}.merge(opts)
|
|
56
|
+
# Search path for resource files is concatination of 'pre' and 'standard' static dirs
|
|
57
|
+
@options[:static_dirs] = @options[:static_dirs_pre].concat(@options[:static_dirs])
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
print_options = false
|
|
62
|
+
p = parser
|
|
63
|
+
|
|
64
|
+
p.separator ""
|
|
65
|
+
p.separator "Testing options:"
|
|
66
|
+
p.on("--disable-https", "Run server without SSL") do sopts = nil end
|
|
67
|
+
p.on("--print-options", "Print option settings after parsing command lines args") do print_options = true end
|
|
68
|
+
|
|
69
|
+
# Allow application to add it's own parsing options
|
|
70
|
+
if ph = @options[:handlers][:pre_parse]
|
|
71
|
+
ph.call(p, @options)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
parse!
|
|
75
|
+
|
|
76
|
+
if sopts
|
|
77
|
+
@options[:ssl] = true
|
|
78
|
+
@options[:ssl_key_file] ||= sopts[:key_file]
|
|
79
|
+
@options[:ssl_cert_file] ||= sopts[:cert_file]
|
|
80
|
+
@options[:ssl_verify] ||= sopts[:verify_peer]
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Change the name of the root logger so we can apply different logging
|
|
84
|
+
# policies depending on environment.
|
|
85
|
+
#
|
|
86
|
+
OMF::Base::Loggable.set_environment @options[:environment]
|
|
87
|
+
|
|
88
|
+
if print_options
|
|
89
|
+
require 'pp'
|
|
90
|
+
pp @options
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
@@instance = self
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def life_cycle(step)
|
|
97
|
+
begin
|
|
98
|
+
if (p = @options[:handlers][step])
|
|
99
|
+
p.arity == 0 ? p.call() : p.call(@options)
|
|
100
|
+
end
|
|
101
|
+
rescue => ex
|
|
102
|
+
error ex
|
|
103
|
+
debug "#{ex.backtrace.join("\n")}"
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def run!
|
|
108
|
+
life_cycle(:pre_run)
|
|
109
|
+
super
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
|
data/lib/omf_base.rb
ADDED
|
File without changes
|
data/omf_base.gemspec
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
|
3
|
+
require "omf_base/version"
|
|
4
|
+
|
|
5
|
+
Gem::Specification.new do |s|
|
|
6
|
+
s.name = "omf_base"
|
|
7
|
+
s.version = OMF::Base::VERSION
|
|
8
|
+
s.authors = ["NICTA"]
|
|
9
|
+
s.email = ["omf-user@lists.nicta.com.au"]
|
|
10
|
+
s.homepage = "https://www.mytestbed.net"
|
|
11
|
+
s.summary = %q{Some basic, but common functionality used in OMF libraries.}
|
|
12
|
+
s.description = %q{Some basic, but common functionality used in OMF libraries.}
|
|
13
|
+
|
|
14
|
+
s.rubyforge_project = "omf_base"
|
|
15
|
+
|
|
16
|
+
s.files = `git ls-files`.split("\n")
|
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
|
19
|
+
s.require_paths = ["lib"]
|
|
20
|
+
|
|
21
|
+
# specify any dependencies here; for example:
|
|
22
|
+
# s.add_development_dependency "minitest", "~> 2.11.3"
|
|
23
|
+
s.add_runtime_dependency 'log4j'
|
|
24
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: omf_base
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: '1.0'
|
|
5
|
+
prerelease:
|
|
6
|
+
platform: ruby
|
|
7
|
+
authors:
|
|
8
|
+
- NICTA
|
|
9
|
+
autorequire:
|
|
10
|
+
bindir: bin
|
|
11
|
+
cert_chain: []
|
|
12
|
+
date: 2013-08-29 00:00:00.000000000 Z
|
|
13
|
+
dependencies:
|
|
14
|
+
- !ruby/object:Gem::Dependency
|
|
15
|
+
name: log4j
|
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
|
17
|
+
none: false
|
|
18
|
+
requirements:
|
|
19
|
+
- - ! '>='
|
|
20
|
+
- !ruby/object:Gem::Version
|
|
21
|
+
version: '0'
|
|
22
|
+
type: :runtime
|
|
23
|
+
prerelease: false
|
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
25
|
+
none: false
|
|
26
|
+
requirements:
|
|
27
|
+
- - ! '>='
|
|
28
|
+
- !ruby/object:Gem::Version
|
|
29
|
+
version: '0'
|
|
30
|
+
description: Some basic, but common functionality used in OMF libraries.
|
|
31
|
+
email:
|
|
32
|
+
- omf-user@lists.nicta.com.au
|
|
33
|
+
executables: []
|
|
34
|
+
extensions: []
|
|
35
|
+
extra_rdoc_files: []
|
|
36
|
+
files:
|
|
37
|
+
- .gitignore
|
|
38
|
+
- Gemfile
|
|
39
|
+
- README.md
|
|
40
|
+
- Rakefile
|
|
41
|
+
- lib/omf_base.rb
|
|
42
|
+
- lib/omf_base/load_yaml.rb
|
|
43
|
+
- lib/omf_base/lobject.rb
|
|
44
|
+
- lib/omf_base/log4r_outputter.rb
|
|
45
|
+
- lib/omf_base/thin/logging.rb
|
|
46
|
+
- lib/omf_base/thin/runner.rb
|
|
47
|
+
- lib/omf_base/version.rb
|
|
48
|
+
- omf_base.gemspec
|
|
49
|
+
homepage: https://www.mytestbed.net
|
|
50
|
+
licenses: []
|
|
51
|
+
post_install_message:
|
|
52
|
+
rdoc_options: []
|
|
53
|
+
require_paths:
|
|
54
|
+
- lib
|
|
55
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
56
|
+
none: false
|
|
57
|
+
requirements:
|
|
58
|
+
- - ! '>='
|
|
59
|
+
- !ruby/object:Gem::Version
|
|
60
|
+
version: '0'
|
|
61
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
62
|
+
none: false
|
|
63
|
+
requirements:
|
|
64
|
+
- - ! '>='
|
|
65
|
+
- !ruby/object:Gem::Version
|
|
66
|
+
version: '0'
|
|
67
|
+
requirements: []
|
|
68
|
+
rubyforge_project: omf_base
|
|
69
|
+
rubygems_version: 1.8.23
|
|
70
|
+
signing_key:
|
|
71
|
+
specification_version: 3
|
|
72
|
+
summary: Some basic, but common functionality used in OMF libraries.
|
|
73
|
+
test_files: []
|