omnibot 0.0.11 → 0.0.12
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/README.md +5 -1
- data/examples/config.yaml +1 -1
- data/lib/omnibot.rb +1 -0
- data/lib/omnibot/amqpconsumer.rb +2 -1
- data/lib/omnibot/launcher.rb +23 -11
- data/lib/omnibot/loggedcommand.rb +1 -1
- data/lib/omnibot/mailchecker.rb +32 -12
- data/lib/omnibot/periodiccommand.rb +6 -3
- data/lib/omnibot/version.rb +1 -1
- metadata +21 -10
data/README.md
CHANGED
@@ -4,6 +4,8 @@ OmniBot
|
|
4
4
|
Simple XMPP bot for server monitoring.
|
5
5
|
Works with AMQP for sending messages at server side.
|
6
6
|
Sends notifications to a user via XMPP.
|
7
|
+
Checks e-mail and extracts attachments to a specified
|
8
|
+
directory.
|
7
9
|
|
8
10
|
Dependencies
|
9
11
|
------------
|
@@ -12,6 +14,8 @@ Dependencies
|
|
12
14
|
* amqp
|
13
15
|
* xmpp4r
|
14
16
|
* eventmachine
|
17
|
+
* mail
|
18
|
+
* sqlite3
|
15
19
|
|
16
20
|
Installation
|
17
21
|
------------
|
@@ -28,4 +32,4 @@ Send messages to omnibot by AMQP by running:
|
|
28
32
|
Support
|
29
33
|
-------
|
30
34
|
|
31
|
-
Tested
|
35
|
+
Tested with ruby 1.8.6 and 1.9.2, rabbitmq as an AMQP server, at OS X 10.6 and Debian Linux.
|
data/examples/config.yaml
CHANGED
data/lib/omnibot.rb
CHANGED
data/lib/omnibot/amqpconsumer.rb
CHANGED
@@ -4,6 +4,7 @@ module OmniBot
|
|
4
4
|
class AMQPConsumer
|
5
5
|
|
6
6
|
attr_accessor :handlers
|
7
|
+
attr_accessor :db
|
7
8
|
|
8
9
|
def send_message message
|
9
10
|
begin
|
@@ -39,7 +40,7 @@ module OmniBot
|
|
39
40
|
handler.start
|
40
41
|
end
|
41
42
|
|
42
|
-
rescue
|
43
|
+
rescue => e
|
43
44
|
OmniLog::error "Sending message error: #{e.message}\ntrace:\n#{Helpers::backtrace e}\nExiting..."
|
44
45
|
AMQP.stop{ EM.stop }
|
45
46
|
end
|
data/lib/omnibot/launcher.rb
CHANGED
@@ -9,22 +9,32 @@ module OmniBot
|
|
9
9
|
raise 'No config file found, checked command line and ~/.omnibot.yaml'
|
10
10
|
end
|
11
11
|
|
12
|
+
def ensure_omnidir
|
13
|
+
path = ENV['HOME']+'/.omnibot'
|
14
|
+
FileUtils.mkdir path unless File.directory? path unless File.directory? path
|
15
|
+
path
|
16
|
+
end
|
17
|
+
|
12
18
|
def get_log_path config
|
13
19
|
return config['logpath'] unless (config['logpath'] or '').empty?
|
14
|
-
|
15
|
-
return 'omnibot.log'
|
20
|
+
ensure_omnidir + '/omnibot.log'
|
16
21
|
end
|
17
22
|
|
18
|
-
def
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
+
def get_db
|
24
|
+
db = SQLite3::Database.new(ensure_omnidir + '/omnibot.sqlite3')
|
25
|
+
if db.execute("select * from sqlite_master where type='table' and name='received_messages'").empty?
|
26
|
+
db.execute <<-SQL
|
27
|
+
create table received_messages (
|
28
|
+
account TEXT,
|
29
|
+
message TEXT,
|
30
|
+
date TEXT
|
31
|
+
);
|
32
|
+
SQL
|
23
33
|
end
|
24
|
-
|
34
|
+
db
|
25
35
|
end
|
26
36
|
|
27
|
-
def provide_handlers config
|
37
|
+
def provide_handlers config, db
|
28
38
|
periodic_commands = ([config['periodiccommands']].flatten or [])
|
29
39
|
|
30
40
|
mails = ([config['mails']].flatten or [])
|
@@ -42,7 +52,7 @@ module OmniBot
|
|
42
52
|
end +
|
43
53
|
mail_triggers.map do |trigger|
|
44
54
|
mail = mails.find { |m| m['user'] == trigger['for'] }
|
45
|
-
MailChecker.new mail, trigger
|
55
|
+
MailChecker.new mail, trigger, db
|
46
56
|
end
|
47
57
|
end
|
48
58
|
|
@@ -56,8 +66,10 @@ module OmniBot
|
|
56
66
|
OmniLog::log = Logger.new(log_path)
|
57
67
|
OmniLog::log.level = Logger::DEBUG
|
58
68
|
|
69
|
+
db = get_db
|
59
70
|
consumer = AMQPConsumer.new config
|
60
|
-
consumer.
|
71
|
+
consumer.db = db
|
72
|
+
consumer.handlers = provide_handlers(config, db)
|
61
73
|
consumer.start
|
62
74
|
|
63
75
|
OmniLog::log.close
|
@@ -7,7 +7,7 @@ module OmniBot
|
|
7
7
|
@jabber_messenger.call "#{banner} command #{command} failed with an error #{$?}:\n" + body
|
8
8
|
end
|
9
9
|
if body.strip != ''
|
10
|
-
@jabber_messenger.call "#{banner} command #{
|
10
|
+
@jabber_messenger.call "#{banner} command #{command} succeeded with:\n" + body
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
data/lib/omnibot/mailchecker.rb
CHANGED
@@ -5,7 +5,6 @@ module OmniBot
|
|
5
5
|
include LoggedCommand
|
6
6
|
|
7
7
|
def on_first_timer
|
8
|
-
OmniLog::debug "Okay, it's near of midnight"
|
9
8
|
on_periodic_timer
|
10
9
|
@timer_provider.add_periodic_timer(3600) { on_periodic_timer }
|
11
10
|
end
|
@@ -18,27 +17,47 @@ module OmniBot
|
|
18
17
|
end
|
19
18
|
|
20
19
|
def match_conditions m
|
21
|
-
%w{ subject from to cc date}.any? { |condition| match_condition m, condition }
|
20
|
+
@conditions.empty? || %w{ subject from to cc date}.any? { |condition| match_condition m, condition }
|
22
21
|
end
|
23
22
|
|
24
23
|
def on_periodic_timer
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
24
|
+
begin
|
25
|
+
OmniLog::info "Checking mail #{@address}"
|
26
|
+
is_new_mail = false
|
27
|
+
Mail.all.each do |m|
|
28
|
+
rows = @db.execute "select message from received_messages where account=? and message=?", @address, m.message_id
|
29
|
+
|
30
|
+
if rows.empty?
|
31
|
+
is_new_mail = true
|
32
|
+
OmniLog::info "New message from #{m.from} about #{m.subject}; id #{m.message_id}"
|
33
|
+
if match_conditions m
|
34
|
+
handle_message(m)
|
35
|
+
end
|
36
|
+
@db.execute "insert into received_messages values(?, ?, ?)", @address, m.message_id, m.date.to_s
|
37
|
+
end
|
38
|
+
end
|
39
|
+
OmniLog::info "No new mail" unless is_new_mail
|
40
|
+
rescue => e
|
41
|
+
OmniLog::error "MailChecker error: #{e.message}\ntrace:\n#{Helpers::backtrace e}"
|
29
42
|
end
|
30
43
|
end
|
31
44
|
|
32
45
|
def handle_message m
|
33
46
|
OmniLog::info "Matched " + m.inspect.to_s
|
34
|
-
attached = m.attachments.find { |a| a.mime_type =~ /application\/x-zip.*/ }
|
47
|
+
attached = m.attachments.find { |a| a.mime_type =~ /application\/(zip|x-zip|rar|x-rar).*/ }
|
35
48
|
if attached
|
36
49
|
Dir.mktmpdir('omniatt') do |tmpdir|
|
37
50
|
filename = tmpdir + '/' + attached.filename
|
38
51
|
OmniLog::info "Writing attachment to #{filename}"
|
39
52
|
File.open(filename,'w') { |f| f.write attached.read }
|
40
53
|
Dir.chdir(@unpack_to) do
|
41
|
-
|
54
|
+
if filename =~ /\.zip$/
|
55
|
+
system("unzip -oq '#{filename}'")
|
56
|
+
elsif filename =~ /\.rar$/
|
57
|
+
system("unrar x -y '#{filename}'")
|
58
|
+
else
|
59
|
+
raise "Wrong filetype"
|
60
|
+
end
|
42
61
|
raise "Error extracting file #{filename} to #{@unpack_to}" if $? != 0
|
43
62
|
end
|
44
63
|
|
@@ -66,13 +85,14 @@ module OmniBot
|
|
66
85
|
attr_writer :timer_provider
|
67
86
|
attr_writer :startup_pause
|
68
87
|
|
69
|
-
def initialize mail_config, trigger_config
|
88
|
+
def initialize mail_config, trigger_config, db
|
70
89
|
@startup_pause = 0
|
71
90
|
@mail_config = mail_config
|
72
|
-
@
|
91
|
+
@db = db
|
92
|
+
@conditions = (trigger_config['if'] or {})
|
73
93
|
@unpack_to = trigger_config['unpack_to']
|
74
94
|
@command_post = trigger_config['command_post']
|
75
|
-
@
|
95
|
+
@address = trigger_config['for']
|
76
96
|
|
77
97
|
mailhash = yaml_to_mailhash(mail_config)
|
78
98
|
Mail.defaults do
|
@@ -84,7 +104,7 @@ module OmniBot
|
|
84
104
|
end
|
85
105
|
|
86
106
|
def to_s
|
87
|
-
"Mail checker for #{@
|
107
|
+
"Mail checker for #{@address}"
|
88
108
|
end
|
89
109
|
|
90
110
|
def start
|
@@ -6,14 +6,17 @@ module OmniBot
|
|
6
6
|
include OmniBot::LoggedCommand
|
7
7
|
|
8
8
|
def on_first_timer
|
9
|
-
OmniLog::debug "Okay, it's near of midnight"
|
10
9
|
on_periodic_timer
|
11
10
|
@timer_provider.add_periodic_timer(24*3600) { on_periodic_timer }
|
12
11
|
end
|
13
12
|
|
14
13
|
def on_periodic_timer
|
15
|
-
|
16
|
-
|
14
|
+
begin
|
15
|
+
OmniLog::info "Reporting command #{@command}"
|
16
|
+
jabber_logged_command 'Periodic command', @command
|
17
|
+
rescue => e
|
18
|
+
OmniLog::error "PeriodicCommand error: #{e.message}\ntrace:\n#{Helpers::backtrace e}"
|
19
|
+
end
|
17
20
|
end
|
18
21
|
|
19
22
|
public
|
data/lib/omnibot/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: omnibot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.12
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2011-10-28 00:00:00.000000000Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: xmpp4r
|
16
|
-
requirement: &
|
16
|
+
requirement: &70295142817300 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70295142817300
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: eventmachine
|
27
|
-
requirement: &
|
27
|
+
requirement: &70295142815520 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70295142815520
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: amqp
|
38
|
-
requirement: &
|
38
|
+
requirement: &70295142814260 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70295142814260
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: mail
|
49
|
-
requirement: &
|
49
|
+
requirement: &70295142813420 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,7 +54,18 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70295142813420
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: sqlite3
|
60
|
+
requirement: &70295142812580 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
type: :runtime
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *70295142812580
|
58
69
|
description: Works with AMQP for sending messages at server side.Sends notifications
|
59
70
|
to an user via XMPP.Can monitor system by performing daily commands.
|
60
71
|
email: theirix@gmail.com
|
@@ -99,7 +110,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
99
110
|
version: '0'
|
100
111
|
segments:
|
101
112
|
- 0
|
102
|
-
hash:
|
113
|
+
hash: 1612202538999953127
|
103
114
|
requirements:
|
104
115
|
- AMQP-compatible server (for example, RabbitMQ)
|
105
116
|
rubyforge_project: nowarning
|