rec 1.1.2 → 1.1.3
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/CHANGELOG +3 -0
- data/bin/mplex +43 -28
- data/lib/rec/state.rb +15 -2
- data/rulesets/rules.rb +5 -5
- metadata +19 -5
data/CHANGELOG
CHANGED
data/bin/mplex
CHANGED
@@ -10,6 +10,7 @@ Usage: mplex [OPTION] -i infile [-i infile2...] -o outfile [-o outfile2...]
|
|
10
10
|
where mplex reads from one or more infiles and writes to one or more outfiles.
|
11
11
|
--input, -i the path to a log file to read from
|
12
12
|
--output, -o the path to a log file to write to
|
13
|
+
--name myapp changes the process name to "myapp", default="mplex"
|
13
14
|
--help, -h display usage
|
14
15
|
--version, -v show version
|
15
16
|
--debug, -d display each line on stdout as it is passes through mplex
|
@@ -27,12 +28,15 @@ options = GetoptLong.new(
|
|
27
28
|
[ '--help', '-h', GetoptLong::NO_ARGUMENT ],
|
28
29
|
[ '--version', '-v', GetoptLong::NO_ARGUMENT ],
|
29
30
|
[ '--debug', '-d', GetoptLong::NO_ARGUMENT ],
|
31
|
+
[ '--name', '-n', GetoptLong::REQUIRED_ARGUMENT ],
|
30
32
|
[ '--input', '-i', GetoptLong::REQUIRED_ARGUMENT ],
|
31
33
|
[ '--output', '-o', GetoptLong::REQUIRED_ARGUMENT ]
|
32
34
|
)
|
33
35
|
|
34
36
|
infilenames = []
|
35
37
|
outfilenames = []
|
38
|
+
debug = false
|
39
|
+
appname = "mplex"
|
36
40
|
options.each { |opt, arg|
|
37
41
|
case opt
|
38
42
|
when "--help"
|
@@ -47,6 +51,8 @@ options.each { |opt, arg|
|
|
47
51
|
outfilenames << arg
|
48
52
|
when "--debug"
|
49
53
|
debug = true
|
54
|
+
when "--name"
|
55
|
+
appname = arg
|
50
56
|
end
|
51
57
|
}
|
52
58
|
|
@@ -58,13 +64,6 @@ if ARGV.length > 0
|
|
58
64
|
exit 1
|
59
65
|
end
|
60
66
|
|
61
|
-
# Allow graceful shutdown
|
62
|
-
["INT", "TERM", "QUIT"].each { |sig|
|
63
|
-
Signal.trap(sig) {
|
64
|
-
exit(0)
|
65
|
-
}
|
66
|
-
}
|
67
|
-
|
68
67
|
# Check if the infiles exist and are readable
|
69
68
|
failure = false
|
70
69
|
infilenames.each { |f|
|
@@ -91,27 +90,43 @@ outfiles = outfilenames.collect { |path|
|
|
91
90
|
File.new(path, File::APPEND|File::CREAT|File::WRONLY)
|
92
91
|
}
|
93
92
|
|
94
|
-
#
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
puts(line) if debug and not line.nil?
|
106
|
-
end
|
93
|
+
# Allow graceful shutdown
|
94
|
+
["INT", "TERM", "QUIT"].each { |sig|
|
95
|
+
Signal.trap(sig) {
|
96
|
+
# Close all files
|
97
|
+
infiles.each { |i|
|
98
|
+
i.close unless i.closed?
|
99
|
+
}
|
100
|
+
outfiles.each { |o|
|
101
|
+
o.close unless o.closed?
|
102
|
+
}
|
103
|
+
exit(0)
|
107
104
|
}
|
108
|
-
sleep(1) if reads == 0
|
109
105
|
}
|
110
106
|
|
111
|
-
#
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
107
|
+
# daemonise the process
|
108
|
+
$0 = appname
|
109
|
+
fork do
|
110
|
+
Process.setsid
|
111
|
+
exit if fork
|
112
|
+
File.umask 0027 # default mode => 0750
|
113
|
+
STDIN.reopen "/dev/null"
|
114
|
+
STDOUT.reopen "/dev/null"
|
115
|
+
STDERR.reopen "/dev/null"
|
116
|
+
# Multiplex the IO streams
|
117
|
+
loop {
|
118
|
+
reads = 0
|
119
|
+
infiles.each { |i|
|
120
|
+
line = i.gets().chomp() if i.ready?
|
121
|
+
reads = reads.succ unless line.nil?
|
122
|
+
if line
|
123
|
+
outfiles.each { |o|
|
124
|
+
o.puts(line)
|
125
|
+
o.flush()
|
126
|
+
}
|
127
|
+
puts(line) if debug and not line.nil?
|
128
|
+
end
|
129
|
+
}
|
130
|
+
sleep(1) if reads == 0
|
131
|
+
}
|
132
|
+
end
|
data/lib/rec/state.rb
CHANGED
@@ -28,11 +28,24 @@ class State
|
|
28
28
|
state.release()
|
29
29
|
}
|
30
30
|
|
31
|
-
# shortcut action to generate a message on first event only
|
31
|
+
# shortcut action to generate a message on first event only, swallow the rest
|
32
32
|
Generate_first_only = Proc.new { |state|
|
33
|
-
|
33
|
+
state.generate(:alert) if @count == 1
|
34
34
|
}
|
35
35
|
|
36
|
+
# shortcut action to notify the admin immediately (eg. system is down)
|
37
|
+
# and wait (eg. for system to come up again)
|
38
|
+
Notify_urgently_first_only = Proc.new { |state|
|
39
|
+
Notify.urgent(state.generate(:alert)) if @count == 1
|
40
|
+
}
|
41
|
+
|
42
|
+
# shortcut action to notify urgently and release
|
43
|
+
# Good for a single event (eg. backup failed) requiring immediate action
|
44
|
+
Notify_urgently_and_release = Proc.new { |state|
|
45
|
+
Notify.urgent(state.generate(:alert))
|
46
|
+
state.release()
|
47
|
+
}
|
48
|
+
|
36
49
|
# A array of Timeouts. A Timeout struct has two elements:
|
37
50
|
# - timestamp at which to expire
|
38
51
|
# - key of the state to be expired
|
data/rulesets/rules.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#!/usr/bin/ruby
|
1
|
+
#!/usr/local/bin/ruby
|
2
2
|
# run with command like:
|
3
3
|
# rulesets/rules.rb < /var/log/mail.log 3>missed.log 2>control.log > newevents.log
|
4
4
|
# takes input from a log file and emits new events to newevents.log
|
@@ -10,10 +10,10 @@ include REC
|
|
10
10
|
|
11
11
|
# For better security, move the next few lines into a file readable only by the user
|
12
12
|
# running this script eg. /home/rec/alert.conf and then require that file
|
13
|
-
Notify.smtp_credentials("rec@gmail.com", "recret", "myfirm.com")
|
14
|
-
Notify.emailTo = "me@myfirm.com"
|
15
|
-
Notify.jabber_credentials("rec@gmail.com", "recret")
|
16
|
-
Notify.jabberTo = "me@myfirm.com"
|
13
|
+
#Notify.smtp_credentials("rec@gmail.com", "recret", "myfirm.com")
|
14
|
+
#Notify.emailTo = "me@myfirm.com"
|
15
|
+
#Notify.jabber_credentials("rec@gmail.com", "recret")
|
16
|
+
#Notify.jabberTo = "me@myfirm.com"
|
17
17
|
|
18
18
|
# load rulesets specified as arguments on the command line
|
19
19
|
while ARGV[0]
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 21
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 1.1.
|
9
|
+
- 3
|
10
|
+
version: 1.1.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Richard Kernahan
|
@@ -16,8 +16,22 @@ bindir: bin
|
|
16
16
|
cert_chain: []
|
17
17
|
|
18
18
|
date: 2012-09-30 00:00:00 Z
|
19
|
-
dependencies:
|
20
|
-
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: xmpp4r
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 1
|
29
|
+
segments:
|
30
|
+
- 0
|
31
|
+
- 5
|
32
|
+
version: "0.5"
|
33
|
+
type: :runtime
|
34
|
+
version_requirements: *id001
|
21
35
|
description: "\t\tSifts through your log files in real time, using stateful intelligence to determine\n\
|
22
36
|
\t\twhat is really important. REC can alert you (by email or IM) or it can simply condense\n\
|
23
37
|
\t\ta large log file into a much shorter and more meaningful log.\n\
|