clarity 0.9.2 → 0.9.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -10,9 +10,7 @@ lib/clarity/cli.rb
10
10
  lib/clarity/commands/command_builder.rb
11
11
  lib/clarity/commands/tail_command_builder.rb
12
12
  lib/clarity/grep_renderer.rb
13
- lib/clarity/parsers/hostname_parser.rb
14
- lib/clarity/parsers/shop_parser.rb
15
- lib/clarity/parsers/time_parser.rb
13
+ lib/clarity/process_tree.rb
16
14
  lib/clarity/renderers/log_renderer.rb
17
15
  lib/clarity/server.rb
18
16
  lib/clarity/server/basic_auth.rb
@@ -23,7 +23,7 @@ big success internally that we decided to release it as open source.
23
23
 
24
24
  == SCREENSHOT:
25
25
 
26
- http://img.skitch.com/20091104-je9kq1a2gfr586ia8y246bq4n8.png
26
+ http://img.skitch.com/20091104-je9kq1a2gfr586ia8y246bq4n8.png
27
27
 
28
28
  == REQUIREMENTS:
29
29
 
data/Rakefile CHANGED
@@ -1,27 +1,21 @@
1
+ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), "lib")
2
+
1
3
  require 'rubygems'
2
4
  gem 'hoe', '>= 2.1.0'
5
+ gem 'newgem'
6
+
3
7
  require 'hoe'
4
- require 'fileutils'
5
- require './lib/clarity'
8
+ require 'clarity'
6
9
 
7
10
  Hoe.plugin :newgem
8
- # Hoe.plugin :website
9
- # Hoe.plugin :cucumberfeatures
10
11
 
11
- # Generate all the Rake tasks
12
- # Run 'rake -T' to see list of generated tasks (from gem root directory)
13
12
  $hoe = Hoe.spec 'clarity' do
14
13
  self.developer 'Tobias Lütke', 'tobi@shopify.com'
15
14
  self.developer 'John Tajima', 'john@shopify.com'
16
- self.post_install_message = 'PostInstall.txt' # TODO remove if post-install message not required
17
- # self.rubyforge_name = self.name # TODO this is default value
18
-
15
+ self.post_install_message = 'PostInstall.txt'
19
16
  self.extra_deps = [['eventmachine','>= 0.12.10'], ['eventmachine_httpserver','>= 0.2.0']]
17
+ self.test_globs = ['test/**/*_test.rb']
20
18
  end
21
19
 
22
20
  require 'newgem/tasks'
23
- Dir['tasks/**/*.rake'].each { |t| load t }
24
-
25
- # TODO - want other tests/tasks run by default? Add them to the list
26
- # remove_task :default
27
- # task :default => [:spec, :features]
21
+ Dir['tasks/**/*.rake'].each { |t| load t }
@@ -13,7 +13,7 @@ require 'clarity/parsers/shop_parser'
13
13
  require 'clarity/renderers/log_renderer'
14
14
 
15
15
  module Clarity
16
- VERSION = '0.9.2'
16
+ VERSION = '0.9.5'
17
17
 
18
18
  Templates = File.dirname(__FILE__) + '/../views'
19
19
  Public = File.dirname(__FILE__) + '/../public'
@@ -1,6 +1,4 @@
1
1
  require 'optparse'
2
- #require File.dirname(__FILE__) + '/../clarity'
3
-
4
2
 
5
3
  module Clarity
6
4
  class CLI
@@ -9,9 +7,11 @@ module Clarity
9
7
  options = {
10
8
  :username => nil,
11
9
  :password => nil,
12
- :log_files => ['**/*.log*'],
10
+ :log_files => nil,
13
11
  :port => 8080,
14
- :address => "0.0.0.0"
12
+ :address => "0.0.0.0",
13
+ :user => nil,
14
+ :group => nil
15
15
  }
16
16
 
17
17
  mandatory_options = %w( )
@@ -23,7 +23,10 @@ module Clarity
23
23
  opts.separator "Specific options:"
24
24
 
25
25
  opts.on( "-f", "--config=FILE", String, "Config file (yml)" ) do |opt|
26
- options.update YAML.load_file( opt )
26
+ config = YAML.load_file( opt )
27
+ config.keys.each do |key|
28
+ options[key.to_sym] = config[key]
29
+ end
27
30
  end
28
31
 
29
32
  opts.on( "-p", "--port=PORT", Integer, "Port to listen on" ) do |opt|
@@ -38,7 +41,11 @@ module Clarity
38
41
  options[:log_files] ||= []
39
42
  options[:log_files] += opt
40
43
  end
41
-
44
+
45
+ opts.on( "--user=USER", String, "User to run as" ) do |opt|
46
+ options[:user] = opt
47
+ end
48
+
42
49
  opts.separator " "
43
50
  opts.separator "Password protection:"
44
51
 
@@ -67,6 +74,8 @@ module Clarity
67
74
  Dir.chdir(arguments.first)
68
75
  end
69
76
 
77
+ options[:log_files] ||= ['**/*.log*']
78
+
70
79
  ::Clarity::Server.run(options)
71
80
 
72
81
  #rescue
@@ -1,10 +1,7 @@
1
1
  module Clarity
2
- module GrepRenderer
3
- attr_accessor :response, :parser, :marker, :params
4
-
5
- def parser
6
- @parser ||= TimeParser.new( HostnameParser.new(ShopParser.new), params)
7
- end
2
+ module GrepRenderer
3
+ attr_accessor :response
4
+ attr_writer :renderer
8
5
 
9
6
  def renderer
10
7
  @renderer ||= LogRenderer.new
@@ -15,22 +12,25 @@ module Clarity
15
12
  @buffer ||= StringScanner.new("")
16
13
  @buffer << data
17
14
 
18
- html = ""
19
15
  while line = @buffer.scan_until(/\n/)
20
- tokens = parser.parse(line)
21
- html << renderer.render(tokens)
22
- end
23
-
24
- return if html.empty?
25
-
26
- response.chunk html
16
+ response.chunk renderer.render(line)
17
+ flush
18
+ end
19
+ end
20
+
21
+ def flush
27
22
  response.send_chunks
28
23
  end
24
+
25
+ def close
26
+ ProcessTree.kill(get_status.pid)
27
+ end
29
28
 
30
- def unbind
31
- response.chunk '</div><hr><p id="done">Done</p></body></html>'
29
+ def unbind
30
+ response.chunk renderer.finalize
32
31
  response.chunk ''
33
- response.send_chunks
32
+ close
33
+ flush
34
34
  puts 'Done'
35
35
  end
36
36
  end
@@ -0,0 +1,23 @@
1
+ module ProcessTree
2
+
3
+ def self.kill(ppid)
4
+ return if ppid.nil?
5
+ all_pids = [ppid] + child_pids_of(ppid).flatten.uniq.compact
6
+ all_pids.each do |pid|
7
+ Process.kill('TERM',pid.to_i) rescue nil
8
+ end
9
+ end
10
+
11
+ def self.child_pids_of(ppid)
12
+ out = `ps -opid,ppid | grep #{ppid.to_s}`
13
+ ids = out.split("\n").map {|line| $1 if line =~ /^\s*([0-9]+)\s.*/ }.compact
14
+ ids.delete(ppid.to_s)
15
+ if ids.empty?
16
+ ids
17
+ else
18
+ ids << ids.map {|id| child_pids_of(id) }
19
+ end
20
+ end
21
+
22
+
23
+ end
@@ -1,47 +1,36 @@
1
- require 'action_view'
2
1
  require 'uri'
2
+ require 'erb'
3
3
 
4
- class LogRenderer
5
- include ActionView::Helpers::TagHelper
6
- include ActionView::Helpers::UrlHelper
4
+ class LogRenderer
7
5
 
6
+ # Thank you to http://daringfireball.net/2009/11/liberal_regex_for_matching_urls
7
+ #
8
+ UrlParser = %r{\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))}
8
9
  Prefix = ""
9
10
  Suffix = "<br/>\n"
10
- TagOrder = [ :timestamp, :shop, :labels, :line ]
11
- MarkTime = 60 * 5 # 5 minutes
12
-
13
- def initialize()
14
- @last_timestamp = nil
15
- end
16
-
17
- def render(elements = {})
18
- @elements = elements
19
- @tags = []
20
- TagOrder.each do |tag|
21
- if content = @elements.fetch(tag, nil)
22
- method = ("tag_"+tag.to_s).to_sym
23
- @tags << self.send(method, content)
24
- end
25
- end
26
-
27
- @tags.empty? ? "" : Prefix + @tags.join(" ").to_s + Suffix
28
- end
29
11
 
12
+ def render(line = {})
13
+ # Escape
14
+ output = ERB::Util.h(line)
30
15
 
31
- def tag_timestamp(content, options = {})
32
- content + " : "
16
+ # Transform urls into html links
17
+ output.gsub!(UrlParser) do |match|
18
+ html_link(match)
19
+ end
20
+
21
+ # Return with formatting
22
+ "#{Prefix}#{output}#{Suffix}"
33
23
  end
34
24
 
35
- def tag_line(content, options = {})
36
- ERB::Util.h(content)
25
+ def finalize
26
+ '</div><hr><p id="done">Done</p></body></html>'
37
27
  end
38
28
 
39
- def tag_shop(content, options = {})
40
- "[<a href='http://#{URI.escape(content)}'>#{content}</a>]"
29
+ private
30
+
31
+ def html_link(url)
32
+ uri = URI.parse(url)
33
+ "<a href='#{uri}'>#{url}</a>"
41
34
  end
42
35
 
43
- def tag_labels(content, options = {})
44
- "[#{content}]"
45
- end
46
-
47
36
  end
@@ -3,6 +3,7 @@ require File.dirname(__FILE__) + '/server/basic_auth'
3
3
  require File.dirname(__FILE__) + '/server/mime_types'
4
4
  require File.dirname(__FILE__) + '/server/chunk_http'
5
5
  require File.dirname(__FILE__) + '/grep_renderer'
6
+ require File.dirname(__FILE__) + '/process_tree'
6
7
 
7
8
  module Clarity
8
9
  class NotFoundError < StandardError; end
@@ -18,6 +19,7 @@ module Clarity
18
19
  attr_accessor :log_files
19
20
 
20
21
  def self.run(options)
22
+
21
23
  EventMachine::run do
22
24
  EventMachine.epoll
23
25
  EventMachine::start_server(options[:address], options[:port], self) do |a|
@@ -25,7 +27,14 @@ module Clarity
25
27
  a.required_username = options[:username]
26
28
  a.required_password = options[:password]
27
29
  end
30
+
28
31
  STDERR.puts "Listening #{options[:address]}:#{options[:port]}..."
32
+
33
+ if options[:user]
34
+ STDERR.puts "Running as user #{options[:user]}"
35
+ EventMachine.set_effective_user(options[:user])
36
+ end
37
+
29
38
  STDERR.puts "Adding log files: #{options[:log_files].inspect}"
30
39
  end
31
40
  end
@@ -54,10 +63,9 @@ module Clarity
54
63
  response.chunk results_page # display page header
55
64
 
56
65
  puts "Running: #{command}"
66
+
57
67
  EventMachine::popen(command, GrepRenderer) do |grepper|
58
68
  @grepper = grepper
59
- @grepper.marker = 0
60
- @grepper.params = params
61
69
  @grepper.response = response
62
70
  end
63
71
  end
@@ -97,34 +105,10 @@ module Clarity
97
105
  end
98
106
 
99
107
  def unbind
100
- return unless @grepper
101
- kill_processes(@grepper.get_status.pid)
108
+ @grepper.close_connection if @grepper
102
109
  close_connection
103
110
  end
104
111
 
105
- def kill_processes(ppid)
106
- return if ppid.nil?
107
- all_pids = [ppid] + get_child_pids(ppid).flatten.uniq.compact
108
- puts "=== pids are #{all_pids.inspect}"
109
- all_pids.each do |pid|
110
- Process.kill('TERM',pid.to_i)
111
- puts "=== killing #{pid}"
112
- end
113
- rescue Exception => e
114
- puts "!Error killing processes: #{e}"
115
- end
116
-
117
- def get_child_pids(ppid)
118
- out = `ps -opid,ppid | grep #{ppid.to_s}`
119
- ids = out.split("\n").map {|line| $1 if line =~ /^\s*([0-9]+)\s.*/ }.compact
120
- ids.delete(ppid.to_s)
121
- if ids.empty?
122
- ids
123
- else
124
- ids << ids.map {|id| get_child_pids(id) }
125
- end
126
- end
127
-
128
112
  private
129
113
 
130
114
  def authenticate!
@@ -1,3 +1,5 @@
1
+ require 'erb'
2
+
1
3
  module Clarity
2
4
 
3
5
  module ChunkHttp
@@ -1,5 +1,4 @@
1
- require "test/unit"
2
- require File.dirname(__FILE__) + "/../../lib/commands/command_builder.rb"
1
+ require 'test_helper'
3
2
 
4
3
  class CommandBuilderTest < Test::Unit::TestCase
5
4
 
@@ -29,35 +28,35 @@ class CommandBuilderTest < Test::Unit::TestCase
29
28
  def test_exec_functions_for_log
30
29
  command = CommandBuilder.new(@params)
31
30
  assert_equal 1, command.exec_functions.size
32
- assert_match /^grep/, command.exec_functions.first
31
+ assert_match(/^grep/, command.exec_functions.first)
33
32
  end
34
33
 
35
34
  def test_exec_functions_with_multiple_terms_for_log
36
35
  command = CommandBuilder.new(@params.merge("term2" => "bar", "term3" => "baz"))
37
36
  assert_equal 3, command.exec_functions.size
38
- assert_match /^grep/, command.exec_functions[0]
39
- assert_match /^grep/, command.exec_functions[1]
40
- assert_match /^grep/, command.exec_functions[2]
37
+ assert_match(/^grep/, command.exec_functions[0])
38
+ assert_match(/^grep/, command.exec_functions[1])
39
+ assert_match(/^grep/, command.exec_functions[2])
41
40
  end
42
41
 
43
42
  def test_exec_function_with_no_terms_for_log
44
43
  command = CommandBuilder.new(@params.merge("term1" => nil))
45
44
  assert_equal 1, command.exec_functions.size
46
- assert_match /^cat/, command.exec_functions[0]
45
+ assert_match(/^cat/, command.exec_functions[0])
47
46
  end
48
47
 
49
48
  def test_exec_funcations_for_gzip
50
49
  command = CommandBuilder.new(@params.merge("file" => "testfile.gz"))
51
50
  assert_equal 1, command.exec_functions.size
52
- assert_match /^zgrep/, command.exec_functions.first
51
+ assert_match(/^zgrep/, command.exec_functions.first)
53
52
  end
54
53
 
55
54
  def test_exec_functions_with_multiple_terms_for_gzip
56
55
  command = CommandBuilder.new(@params.merge("file" => "testfile.gz", "term2" => "bar", "term3" => "baz"))
57
56
  assert_equal 3, command.exec_functions.size
58
- assert_match /^zgrep/, command.exec_functions[0]
59
- assert_match /^grep/, command.exec_functions[1]
60
- assert_match /^grep/, command.exec_functions[2]
57
+ assert_match(/^zgrep/, command.exec_functions[0])
58
+ assert_match(/^grep/, command.exec_functions[1])
59
+ assert_match(/^grep/, command.exec_functions[2])
61
60
  end
62
61
 
63
62
  def test_exec_function_with_no_terms_for_gzip
@@ -1,5 +1,4 @@
1
- require "test/unit"
2
- require File.dirname(__FILE__) + "/../../lib/commands/tail_command_builder.rb"
1
+ require 'test_helper'
3
2
 
4
3
  class TailCommandBuilderTest < Test::Unit::TestCase
5
4
 
@@ -1,5 +1,4 @@
1
- require "test/unit"
2
- require File.dirname(__FILE__) + "/../../lib/parsers/hostname_parser.rb"
1
+ require 'test_helper'
3
2
 
4
3
  class HostnameParserTest < Test::Unit::TestCase
5
4
 
@@ -1,5 +1,4 @@
1
- require "test/unit"
2
- require File.dirname(__FILE__) + "/../../lib/parsers/shop_parser.rb"
1
+ require 'test_helper'
3
2
 
4
3
  class ShopParserTest < Test::Unit::TestCase
5
4
 
@@ -1,5 +1,4 @@
1
- require "test/unit"
2
- require File.dirname(__FILE__) + "/../../lib/parsers/time_parser.rb"
1
+ require 'test_helper'
3
2
 
4
3
  class TimeParserTest < Test::Unit::TestCase
5
4
 
@@ -1,3 +1,4 @@
1
- require 'stringio'
1
+ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), "..", "lib")
2
+
2
3
  require 'test/unit'
3
- require File.dirname(__FILE__) + '/../lib/clarity'
4
+ require 'clarity'
@@ -1,5 +1,4 @@
1
- require "test/unit"
2
-
1
+ require 'test_helper'
3
2
  require "strscan"
4
3
 
5
4
  class TestLibraryFileName < Test::Unit::TestCase
@@ -81,9 +81,9 @@
81
81
  </div>
82
82
 
83
83
  <script>
84
- Search.init({ 'grep': <%= logfiles.map {|f| f }.to_json %>,
85
- 'tail': <%= logfiles.map {|f| f if f =~ /log$/ }.compact.to_json %> },
86
- <%= params.empty? ? nil.to_json : params.to_json %> );
84
+ Search.init({ 'grep': <%= logfiles.map {|f| f }.inspect %>,
85
+ 'tail': <%= logfiles.map {|f| f if f =~ /log$/ }.compact.inspect %> },
86
+ <%= params.empty? ? 'null' : params.inspect %> );
87
87
 
88
88
 
89
89
  </script>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: clarity
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.2
4
+ version: 0.9.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - "Tobias L\xC3\xBCtke"
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2009-11-04 00:00:00 -05:00
13
+ date: 2009-12-04 00:00:00 -05:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -77,9 +77,7 @@ files:
77
77
  - lib/clarity/commands/command_builder.rb
78
78
  - lib/clarity/commands/tail_command_builder.rb
79
79
  - lib/clarity/grep_renderer.rb
80
- - lib/clarity/parsers/hostname_parser.rb
81
- - lib/clarity/parsers/shop_parser.rb
82
- - lib/clarity/parsers/time_parser.rb
80
+ - lib/clarity/process_tree.rb
83
81
  - lib/clarity/renderers/log_renderer.rb
84
82
  - lib/clarity/server.rb
85
83
  - lib/clarity/server/basic_auth.rb
@@ -133,5 +131,8 @@ signing_key:
133
131
  specification_version: 3
134
132
  summary: "Clarity - a log search tool By John Tajima & Tobi L\xC3\xBCtke Clarity is a Splunk like web interface for your server log files"
135
133
  test_files:
136
- - test/test_helper.rb
137
- - test/test_string_scanner.rb
134
+ - test/commands/command_builder_test.rb
135
+ - test/commands/tail_command_builder_test.rb
136
+ - test/parsers/hostname_parser_test.rb
137
+ - test/parsers/shop_parser_test.rb
138
+ - test/parsers/time_parser_test.rb
@@ -1,43 +0,0 @@
1
-
2
- class HostnameParser
3
-
4
- # given a string in format:
5
- #
6
- # app3 rails.shopify[9855]: [wadedemt.myshopify.com] Processing ShopController#products (for 192.168.1.230 at 2009-07-24 14:58:21) [GET]
7
- # 129.123.2.1 rails.shopify[9855]: [wadedemt.myshopify.com] Processing ShopController#products (for 192.168.1.230 at 2009-07-24 14:58:21) [GET]
8
- #
9
- # strips out the hostname/IP and appname
10
- #
11
- # result => [wadedemt.myshopify.com] Processing ShopController#products (for 192.168.1.230 at 2009-07-24 14:58:21) [GET]
12
-
13
-
14
- LineRegexp = /^([\w-]+|\d+\.\d+\.\d+\.\d+)\s([^:]*):\s*(.*)/
15
-
16
- attr_accessor :elements, :next_parser
17
-
18
- def initialize(next_renderer = nil)
19
- @next_renderer = next_renderer
20
- end
21
-
22
- def parse(line, elements = {})
23
- @elements = elements
24
- # parse line into elements and put into element
25
- next_line = parse_line(line)
26
- if @next_renderer && next_line
27
- @elements = @next_renderer.parse(next_line, @elements)
28
- end
29
- @elements
30
- end
31
-
32
- # parse line and break into pieces
33
- def parse_line(line)
34
- results = LineRegexp.match(line)
35
- if results
36
- @elements[:line] = results[-1]
37
- results[-1] # remaining line
38
- else
39
- @elements[:line] = line
40
- line
41
- end
42
- end
43
- end
@@ -1,48 +0,0 @@
1
- class ShopParser
2
-
3
- # given a string in format:
4
- #
5
- # [wadedemt.myshopify.com] Processing ShopController#products (for 192.168.1.230 at 2009-07-24 14:58:21) [GET]
6
- #
7
- # strips out the shop name
8
- #
9
- # result => :shop => wadedemt.myshopify.com
10
- # :line => Processing ShopController#products (for 192.168.1.230 at 2009-07-24 14:58:21) [GET]
11
-
12
-
13
- LineRegexp = /^\s*\[([a-zA-Z0-9\-.]+)\]\s*(.*)/
14
-
15
- attr_accessor :elements
16
-
17
- def initialize(next_renderer = nil)
18
- @next_renderer = next_renderer
19
- end
20
-
21
- def parse(line, elements = {})
22
- @elements = elements
23
- # parse line into elements and put into element
24
- next_line = parse_line(line)
25
- if @next_renderer && next_line
26
- @elements = @next_renderer.parse(next_line, @elements)
27
- end
28
- @elements
29
- end
30
-
31
- # parse line and break into pieces
32
- def parse_line(line)
33
- results = LineRegexp.match(line)
34
- if results
35
- if results[1] =~ /\./
36
- @elements[:shop] = results[1]
37
- @elements[:line] = results[-1]
38
- results[-1]
39
- else
40
- @elements[:line] = line
41
- line
42
- end
43
- else
44
- @elements[:line] = line
45
- line
46
- end
47
- end
48
- end
@@ -1,93 +0,0 @@
1
-
2
- class TimeParser
3
-
4
- # strips out timestamp and if start/end times are defined, will reject lines that don't fall within proper time periods
5
- #
6
- # entry format:
7
- # Jul 24 14:58:21 app3 rails.shopify[9855]: [wadedemt.myshopify.com] Processing ShopController#products (for 192.168.1.230 at 2009-07-24 14:58:21) [GET]
8
- #
9
- # params = {
10
- # 'sh' => start hour
11
- # 'sm' => start minute
12
- # 'ss' => start second
13
- # 'eh' => end hour
14
- # 'em' => end minute
15
- # 'es' => end second
16
- # }
17
- #
18
- # if 'sh' is defined, reject any lines where timestamp is earlier than start time
19
- # if 'eh' is defined, reject any lines where timestamp is later than end time
20
- # if 'sh' && 'eh' is defined, reject any lines where timestamp is not between start time and end time
21
-
22
- LineRegexp = /^(\w+\s+\d+\s\d\d:\d\d:\d\d)\s(.*)/
23
-
24
- attr_accessor :elements, :params
25
-
26
- def initialize(next_renderer = nil, params = {})
27
- @next_renderer = next_renderer
28
- @params = params
29
- end
30
-
31
- def parse(line, elements = {})
32
- @elements = elements
33
- next_line = parse_line(line)
34
-
35
- # reject line if we filter by time
36
- if check_time?
37
- if !start_time_valid? || !end_time_valid?
38
- # reject this entry
39
- @elements = {}
40
- return @elements
41
- end
42
- else
43
- if @next_renderer && next_line
44
- @elements = @next_renderer.parse(next_line, @elements)
45
- end
46
- end
47
- @elements
48
- end
49
-
50
- def check_time?
51
- (params['sh'] && !params['sh'].empty?) || (params['eh'] && !params['eh'].empty?)
52
- end
53
-
54
- # check if current line's time is >= start time, if it was set
55
- def start_time_valid?
56
- line_time = parse_time_from_string(@elements[:timestamp])
57
- start_time = Time.utc(line_time.year, line_time.month, line_time.day, params.fetch('sh',0).to_i, params.fetch('sm', 0).to_i, params.fetch('ss', 0).to_i )
58
- line_time >= start_time ? true : false
59
- rescue Exception => e
60
- puts "Error! #{e}"
61
- end
62
-
63
- def end_time_valid?
64
- line_time = parse_time_from_string(@elements[:timestamp])
65
- end_time = Time.utc(line_time.year, line_time.month, line_time.day, params.fetch('eh',23).to_i, params.fetch('em', 59).to_i, params.fetch('es', 59).to_i )
66
- line_time <= end_time ? true : false
67
- rescue Exception => e
68
- puts "Error! #{e}"
69
- end
70
-
71
- def parse_time_from_string(text)
72
- # Jul 24 14:58:21
73
- time = nil
74
- if text =~ /(\w+)\s+(\d+)\s+(\d+):(\d+):(\d+)/
75
- time = Time.utc(Time.now.year, $1, $2, $3, $4, $5)
76
- end
77
- time
78
- end
79
-
80
- # parse line and break into pieces
81
- def parse_line(line)
82
- results = LineRegexp.match(line)
83
- if results
84
- @elements[:timestamp] = results[1]
85
- @elements[:line] = results[-1]
86
- results[-1] # remaining line
87
- else
88
- @elements[:line] = line
89
- line
90
- end
91
- end
92
-
93
- end