hunter 0.0.1
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 +4 -0
- data/Gemfile +4 -0
- data/README.md +42 -0
- data/Rakefile +1 -0
- data/hunter.gemspec +20 -0
- data/lib/hunter.rb +74 -0
- data/lib/hunter/version.rb +3 -0
- metadata +53 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Search for a pattern in your log files
|
|
2
|
+
|
|
3
|
+
I generally use a tracking gif in the mass emails I send out to get a rough idea of the open rate. It's not a small task to open each log file, filter it and then count each occurance of the gif.
|
|
4
|
+
|
|
5
|
+
Hunter does this for you!
|
|
6
|
+
|
|
7
|
+
**WARNING:** Hunter has <u>**no tests**</u>. This was thrown together, so use with caution. Contributions are very welcome.
|
|
8
|
+
|
|
9
|
+
## How to Use
|
|
10
|
+
|
|
11
|
+
### Install
|
|
12
|
+
|
|
13
|
+
gem install hunter
|
|
14
|
+
|
|
15
|
+
### Use
|
|
16
|
+
|
|
17
|
+
Create a new hunt for the string you want to match:
|
|
18
|
+
|
|
19
|
+
hunt = Hunter::Hunt.new('/images/email/tracking.gif')
|
|
20
|
+
|
|
21
|
+
#### Look in the current log
|
|
22
|
+
|
|
23
|
+
hunt.look_in('/var/log/httpd/access.log')
|
|
24
|
+
|
|
25
|
+
#### Look in an archived log
|
|
26
|
+
|
|
27
|
+
hunt.look_in_archived('/var/log/httpd/log_archive/access.log.1.gz')
|
|
28
|
+
|
|
29
|
+
#### Look through a folder of archived logs
|
|
30
|
+
|
|
31
|
+
hunt.look_through_archive('/var/log/httpd/log_archive')
|
|
32
|
+
|
|
33
|
+
#### Look through a folder of archived logs for a specific log type
|
|
34
|
+
|
|
35
|
+
hunt.look_through_archive('/var/log/httpd/log_archive', 'access.log')
|
|
36
|
+
|
|
37
|
+
## Known Issues
|
|
38
|
+
|
|
39
|
+
* "Archived" means with the file extension `.gz` – no other compression formats are supported
|
|
40
|
+
* `look_through_archive()` relies on your log appending a digit after the original filename and then compressing to `.gz`
|
|
41
|
+
* e.g. `access.log` becomes `access.log.1.gz`
|
|
42
|
+
* **There are no tests**
|
data/Rakefile
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require 'bundler/gem_tasks'
|
data/hunter.gemspec
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
|
3
|
+
require "hunter/version"
|
|
4
|
+
|
|
5
|
+
Gem::Specification.new do |s|
|
|
6
|
+
s.name = "hunter"
|
|
7
|
+
s.version = Hunter::VERSION
|
|
8
|
+
s.authors = ["Gareth Rees"]
|
|
9
|
+
s.email = ["gareth.h.rees@gmail.com"]
|
|
10
|
+
s.homepage = ""
|
|
11
|
+
s.summary = %q{Hunter hunts for a pattern in your log files}
|
|
12
|
+
s.description = %q{Hunter was made to look through log archive directories and inside each log count the number of hits on an email tracking gif}
|
|
13
|
+
|
|
14
|
+
s.rubyforge_project = "hunter"
|
|
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
|
+
end
|
data/lib/hunter.rb
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
require "hunter/version"
|
|
2
|
+
require 'zlib'
|
|
3
|
+
|
|
4
|
+
module Hunter
|
|
5
|
+
|
|
6
|
+
class Hunt
|
|
7
|
+
|
|
8
|
+
attr_accessor :string_to_match
|
|
9
|
+
|
|
10
|
+
def initialize(string_to_match)
|
|
11
|
+
@string_to_match = string_to_match
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# ONE FILE
|
|
15
|
+
def look_in(file)
|
|
16
|
+
counter = 0
|
|
17
|
+
File.open(file, "r") do |infile|
|
|
18
|
+
while line = infile.gets
|
|
19
|
+
counter += 1 if look_for_match(line)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
puts counter
|
|
23
|
+
counter
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# ONE .GZ FILE
|
|
27
|
+
def look_in_archived(file)
|
|
28
|
+
counter = 0
|
|
29
|
+
File.open(file) do |f|
|
|
30
|
+
gz = Zlib::GzipReader.new(f)
|
|
31
|
+
gz.each_line do |line|
|
|
32
|
+
counter += 1 if look_for_match(line)
|
|
33
|
+
end
|
|
34
|
+
gz.close
|
|
35
|
+
end
|
|
36
|
+
puts counter
|
|
37
|
+
counter
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# ARCHIVE OF .GZ FILES
|
|
41
|
+
def look_through_archive(directory, file_basename = "*", compression = "gz")
|
|
42
|
+
counter = 0
|
|
43
|
+
files = Dir.glob("/#{directory}/#{file_basename}.*.#{compression}")
|
|
44
|
+
files = sort_archive(files)
|
|
45
|
+
|
|
46
|
+
files.each do |file|
|
|
47
|
+
matches = look_in_archived(file)
|
|
48
|
+
counter += matches
|
|
49
|
+
puts "#{file}: #{matches}"
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
puts "TOTAL: " + counter.to_s
|
|
53
|
+
counter
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
# HELPERS
|
|
58
|
+
def look_for_match(line)
|
|
59
|
+
true if line.include? @string_to_match
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def sort_archive(files)
|
|
63
|
+
r = Regexp.new(".([0-9]+).gz")
|
|
64
|
+
sorted_files = files.sort do |f1, f2|
|
|
65
|
+
n1 = r.match(f1)[1].to_i
|
|
66
|
+
n2 = r.match(f2)[1].to_i
|
|
67
|
+
n1 <=> n2
|
|
68
|
+
end
|
|
69
|
+
sorted_files
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: hunter
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.0.1
|
|
5
|
+
prerelease:
|
|
6
|
+
platform: ruby
|
|
7
|
+
authors:
|
|
8
|
+
- Gareth Rees
|
|
9
|
+
autorequire:
|
|
10
|
+
bindir: bin
|
|
11
|
+
cert_chain: []
|
|
12
|
+
date: 2011-12-13 00:00:00.000000000Z
|
|
13
|
+
dependencies: []
|
|
14
|
+
description: Hunter was made to look through log archive directories and inside each
|
|
15
|
+
log count the number of hits on an email tracking gif
|
|
16
|
+
email:
|
|
17
|
+
- gareth.h.rees@gmail.com
|
|
18
|
+
executables: []
|
|
19
|
+
extensions: []
|
|
20
|
+
extra_rdoc_files: []
|
|
21
|
+
files:
|
|
22
|
+
- .gitignore
|
|
23
|
+
- Gemfile
|
|
24
|
+
- README.md
|
|
25
|
+
- Rakefile
|
|
26
|
+
- hunter.gemspec
|
|
27
|
+
- lib/hunter.rb
|
|
28
|
+
- lib/hunter/version.rb
|
|
29
|
+
homepage: ''
|
|
30
|
+
licenses: []
|
|
31
|
+
post_install_message:
|
|
32
|
+
rdoc_options: []
|
|
33
|
+
require_paths:
|
|
34
|
+
- lib
|
|
35
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
36
|
+
none: false
|
|
37
|
+
requirements:
|
|
38
|
+
- - ! '>='
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '0'
|
|
41
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
42
|
+
none: false
|
|
43
|
+
requirements:
|
|
44
|
+
- - ! '>='
|
|
45
|
+
- !ruby/object:Gem::Version
|
|
46
|
+
version: '0'
|
|
47
|
+
requirements: []
|
|
48
|
+
rubyforge_project: hunter
|
|
49
|
+
rubygems_version: 1.8.11
|
|
50
|
+
signing_key:
|
|
51
|
+
specification_version: 3
|
|
52
|
+
summary: Hunter hunts for a pattern in your log files
|
|
53
|
+
test_files: []
|