parselogs 0.0.8
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.
- checksums.yaml +15 -0
- data/README.rdoc +42 -0
- data/bin/parselogs +79 -0
- data/lib/parselogs.rb +8 -0
- data/lib/parselogs/file_ops.rb +64 -0
- data/lib/parselogs/track.rb +28 -0
- data/lib/parselogs/version.rb +3 -0
- data/parselogs.rdoc +5 -0
- metadata +109 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
MTQ1MDc5ZjI5YjBhYjg5ODk0NTUyNmU1NDJkNmU1NTQyMzAzMWY3Nw==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
ZTYwYjA3ZTc4Yzc3NGNjNmVmNTQzZTdjZTg1ZWVhZGEwYWY3NDllZQ==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
ZWRjMWMyZDYyMjdhYTA1NjM3M2VjYTNkZDk4NWVhODFkMzY1ZmJkNjVjOWYy
|
10
|
+
YTJiODEwZGY1ZTcxNWM5MTk5ZWI0Y2FkNTk5YjA1ZmRiN2NiZGI4NDgxOGE1
|
11
|
+
N2VjYTEyMjQ3MmJlNzc3M2ZhOTI0YmMxNWM4ZTZhOGU3OTQ3ODU=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
YWM3OTM2ZDc5MGFmYjIzMTcxM2FmNzg0ZGIzOTI5N2UzYmFlMDIwOTNiODI5
|
14
|
+
YTVjNzhjYjhhZGIyMTMzY2I5NDUyMGI4MzBiMmE1NzNjYjU5ZjgyODFiZmFi
|
15
|
+
YzJjNGI3YzM4YmQ1ZTYxYzU1ZjRmN2ZjMWU5N2QwYjUwY2M1YTY=
|
data/README.rdoc
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
The Parselogs cli tool
|
2
|
+
====================
|
3
|
+
A simple log parser that searches a given string over a period of days and handles compressed files
|
4
|
+
|
5
|
+
|
6
|
+
Installation
|
7
|
+
------------
|
8
|
+
gem install parselogs
|
9
|
+
|
10
|
+
|
11
|
+
Help output
|
12
|
+
-----------
|
13
|
+
|
14
|
+
SYNOPSIS
|
15
|
+
|
16
|
+
parselogs [global options] command [command options] [files...]
|
17
|
+
|
18
|
+
GLOBAL OPTIONS
|
19
|
+
|
20
|
+
-d, --days=days - number of days back to search (default: 1)
|
21
|
+
--help - Show this message
|
22
|
+
-s, --search=string - the string you are searching for (default: none)
|
23
|
+
--version
|
24
|
+
|
25
|
+
COMMANDS
|
26
|
+
|
27
|
+
all - Search all logs from locations provided
|
28
|
+
help - Shows a list of commands or help for one command
|
29
|
+
|
30
|
+
|
31
|
+
Sample Usage
|
32
|
+
------------
|
33
|
+
|
34
|
+
parselogs --days 30 --search ctsimpson all /var/log/syslog*
|
35
|
+
|
36
|
+
Mulitple File Locations
|
37
|
+
-----------------------
|
38
|
+
|
39
|
+
Just separate out multiple folder locations as arguments at the end of the command
|
40
|
+
|
41
|
+
parselogs -d 60 -s ctsimpson all /var/log/*.log /tmp/*.log
|
42
|
+
|
data/bin/parselogs
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'gli'
|
4
|
+
begin
|
5
|
+
require 'parselogs'
|
6
|
+
rescue LoadError
|
7
|
+
STDERR.puts "Seems to be some problem loading all the libraries"
|
8
|
+
exit 64
|
9
|
+
end
|
10
|
+
|
11
|
+
include GLI::App
|
12
|
+
|
13
|
+
# Usage example :
|
14
|
+
# parselogs -s ctsimpso -d 30 /var/log /var/log/archive
|
15
|
+
|
16
|
+
program_desc 'Extract user data from logs for a given period of time'
|
17
|
+
|
18
|
+
version Parselogs::VERSION
|
19
|
+
|
20
|
+
desc 'the string you are searching for'
|
21
|
+
arg_name 'string'
|
22
|
+
flag [:s, :search]
|
23
|
+
|
24
|
+
desc 'number of days back to search'
|
25
|
+
arg_name 'days'
|
26
|
+
flag [:d, :days], :default_value => 1
|
27
|
+
|
28
|
+
desc 'Search all logs from locations provided'
|
29
|
+
arg_name ''
|
30
|
+
command :all do |c|
|
31
|
+
c.action do |global_options,options,args|
|
32
|
+
if args.length < 1
|
33
|
+
raise "You need to provide some folder locations"
|
34
|
+
end
|
35
|
+
|
36
|
+
search = ''
|
37
|
+
if global_options[:search].nil?
|
38
|
+
raise "You must provide search criteria"
|
39
|
+
else
|
40
|
+
search = global_options[:search]
|
41
|
+
end
|
42
|
+
|
43
|
+
puts "Searching #{global_options[:days]} day(s) back."
|
44
|
+
args.each do |folder|
|
45
|
+
track = Parselogs::Parse.new(global_options)
|
46
|
+
track.search(folder)
|
47
|
+
end
|
48
|
+
|
49
|
+
#args.each { |folder| puts "Completed searching #{folder}"} unless args.empty?
|
50
|
+
|
51
|
+
# If you have any errors, just raise them
|
52
|
+
# raise "that command made no sense"
|
53
|
+
|
54
|
+
puts "Search ran successful"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
pre do |global,command,options,args|
|
59
|
+
# Pre logic here
|
60
|
+
# Return true to proceed; false to abort and not call the
|
61
|
+
# chosen command
|
62
|
+
# Use skips_pre before a command to skip this block
|
63
|
+
# on that command only
|
64
|
+
true
|
65
|
+
end
|
66
|
+
|
67
|
+
post do |global,command,options,args|
|
68
|
+
# Post logic here
|
69
|
+
# Use skips_post before a command to skip this
|
70
|
+
# block on that command only
|
71
|
+
end
|
72
|
+
|
73
|
+
on_error do |exception|
|
74
|
+
# Error logic here
|
75
|
+
# return false to skip default error handling
|
76
|
+
true
|
77
|
+
end
|
78
|
+
|
79
|
+
exit run(ARGV)
|
data/lib/parselogs.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'date'
|
2
|
+
|
3
|
+
module Parselogs
|
4
|
+
class FileOps
|
5
|
+
|
6
|
+
|
7
|
+
def get_file_with_date(file)
|
8
|
+
file_date = File.stat(file).mtime.to_s
|
9
|
+
{:name => file, :date => file_date}
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
def file_in_range?(file_date,days_back)
|
14
|
+
compare_date = Date.today - days_back
|
15
|
+
file_date = Date.parse(file_date)
|
16
|
+
file_date > compare_date
|
17
|
+
end
|
18
|
+
|
19
|
+
def parse_file(file,search)
|
20
|
+
if logfile?(file)
|
21
|
+
File.open(file) do |open_file|
|
22
|
+
open_file.each do |line|
|
23
|
+
parse_line(line,search)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def parse_compressed_file(file,search)
|
30
|
+
File.open(file) do |f|
|
31
|
+
gz = Zlib::GzipReader.new(f)
|
32
|
+
gz.each_line do |line|
|
33
|
+
parse_line(line,search)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def logfile?(file)
|
39
|
+
if file.match(/.log$|.log.1$/)
|
40
|
+
true
|
41
|
+
else
|
42
|
+
false
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def compressed?(file)
|
47
|
+
File.extname(file) == '.gz'
|
48
|
+
end
|
49
|
+
|
50
|
+
def parse_line(line,search)
|
51
|
+
match_data = []
|
52
|
+
line = encoder(line)
|
53
|
+
if line.match(search)
|
54
|
+
puts line
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def encoder(input)
|
59
|
+
input.force_encoding('UTF-8').encode('UTF-16', :invalid => :replace, :replace => '').encode('UTF-8')
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'date'
|
2
|
+
require 'zlib'
|
3
|
+
|
4
|
+
module Parselogs
|
5
|
+
class Parse
|
6
|
+
|
7
|
+
def initialize(options)
|
8
|
+
@options = options
|
9
|
+
end
|
10
|
+
|
11
|
+
def search(folder)
|
12
|
+
file_ops = Parselogs::FileOps.new()
|
13
|
+
files = Dir.glob(folder)
|
14
|
+
files.each do |file|
|
15
|
+
file = file_ops.get_file_with_date(file)
|
16
|
+
if file_ops.file_in_range?(file[:date], @options[:days].to_i)
|
17
|
+
puts "Parsing : #{file[:name]}"
|
18
|
+
if file_ops.logfile?(file[:name])
|
19
|
+
file_ops.parse_file(file[:name],@options[:search])
|
20
|
+
elsif file_ops.compressed?(file[:name])
|
21
|
+
file_ops.parse_compressed_file(file[:name],@options[:search])
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
data/parselogs.rdoc
ADDED
metadata
ADDED
@@ -0,0 +1,109 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: parselogs
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.8
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Chris Simpson
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-04-24 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ! '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ! '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rdoc
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ! '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: aruba
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ! '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: gli
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 2.5.4
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 2.5.4
|
69
|
+
description:
|
70
|
+
email: ctsimpson@gmail.com
|
71
|
+
executables:
|
72
|
+
- parselogs
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files:
|
75
|
+
- README.rdoc
|
76
|
+
- parselogs.rdoc
|
77
|
+
files:
|
78
|
+
- bin/parselogs
|
79
|
+
- lib/parselogs/version.rb
|
80
|
+
- lib/parselogs/track.rb
|
81
|
+
- lib/parselogs/file_ops.rb
|
82
|
+
- lib/parselogs.rb
|
83
|
+
- README.rdoc
|
84
|
+
- parselogs.rdoc
|
85
|
+
homepage: http://ctsimpson.com
|
86
|
+
licenses: []
|
87
|
+
metadata: {}
|
88
|
+
post_install_message:
|
89
|
+
rdoc_options: []
|
90
|
+
require_paths:
|
91
|
+
- lib
|
92
|
+
- lib
|
93
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - ! '>='
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0'
|
98
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - ! '>='
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
requirements: []
|
104
|
+
rubyforge_project:
|
105
|
+
rubygems_version: 2.0.3
|
106
|
+
signing_key:
|
107
|
+
specification_version: 4
|
108
|
+
summary: Simple Log parser that handles compressed files
|
109
|
+
test_files: []
|