catfriend 0.15 → 0.16
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/catfriend +20 -3
- data/lib/catfriend/dbus.rb +71 -0
- data/lib/catfriend/imap.rb +12 -5
- metadata +18 -5
data/bin/catfriend
CHANGED
@@ -8,6 +8,7 @@
|
|
8
8
|
# License:: MIT
|
9
9
|
require 'catfriend/filetokenstack'
|
10
10
|
require 'catfriend/imap'
|
11
|
+
require 'catfriend/dbus'
|
11
12
|
require 'net/imap'
|
12
13
|
require 'optparse'
|
13
14
|
|
@@ -99,6 +100,7 @@ def self.main args
|
|
99
100
|
work_accounts = false
|
100
101
|
foreground = false
|
101
102
|
Catfriend.verbose = false
|
103
|
+
done_action = false
|
102
104
|
begin
|
103
105
|
OptionParser.new do |opts|
|
104
106
|
opts.banner = "usage: #{APP_NAME} [options]"
|
@@ -112,8 +114,20 @@ def self.main args
|
|
112
114
|
opts.on("-v", "--verbose", "verbose output to console") do
|
113
115
|
Catfriend.verbose = true
|
114
116
|
end
|
117
|
+
|
118
|
+
opts.on("-s", "--stop", "shut down running server") do
|
119
|
+
done_action = true
|
120
|
+
dbus = DBus.new
|
121
|
+
if dbus.send_shutdown
|
122
|
+
puts "sent shutdown signal"
|
123
|
+
else
|
124
|
+
puts "could not send shutdown signal, no server running?"
|
125
|
+
end
|
126
|
+
end
|
115
127
|
end.parse!
|
116
128
|
|
129
|
+
return 0 if done_action
|
130
|
+
|
117
131
|
Catfriend.verbose = false unless foreground
|
118
132
|
|
119
133
|
servers = parse_config
|
@@ -121,10 +135,10 @@ def self.main args
|
|
121
135
|
raise ConfigError, "no servers to check" if servers.empty?
|
122
136
|
|
123
137
|
if foreground
|
124
|
-
|
138
|
+
main_loop servers
|
125
139
|
else
|
126
140
|
pid = fork do
|
127
|
-
|
141
|
+
main_loop servers
|
128
142
|
end
|
129
143
|
Process.detach pid
|
130
144
|
end
|
@@ -141,9 +155,12 @@ def self.main args
|
|
141
155
|
1
|
142
156
|
end
|
143
157
|
|
144
|
-
def self.
|
158
|
+
def self.main_loop servers
|
159
|
+
dbus = DBus.new servers
|
160
|
+
dbus.start
|
145
161
|
servers.each { |s| s.start }
|
146
162
|
servers.each { |s| s.join }
|
163
|
+
dbus.join
|
147
164
|
end
|
148
165
|
|
149
166
|
end ########################### end module
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'catfriend/thread'
|
2
|
+
require 'catfriend/server'
|
3
|
+
require 'dbus'
|
4
|
+
|
5
|
+
module Catfriend # {
|
6
|
+
|
7
|
+
SERVICE = "org.freedesktop.Catfriend"
|
8
|
+
PATH = "/org/freedesktop/Catfriend"
|
9
|
+
INTERFACE = "org.freedesktop.Catfriend.System"
|
10
|
+
|
11
|
+
class DBus
|
12
|
+
include Thread
|
13
|
+
|
14
|
+
class DBusObject < ::DBus::Object
|
15
|
+
def initialize(main, servers)
|
16
|
+
@main = main
|
17
|
+
@servers = servers
|
18
|
+
super PATH
|
19
|
+
end
|
20
|
+
|
21
|
+
dbus_interface INTERFACE do
|
22
|
+
dbus_method :stop do
|
23
|
+
Catfriend.whisper "received shutdown request"
|
24
|
+
@main.quit # this must be run from within method handler
|
25
|
+
@servers.each { |s| s.disconnect }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def initialize(servers = nil)
|
31
|
+
@servers = servers
|
32
|
+
end
|
33
|
+
|
34
|
+
def init
|
35
|
+
@bus = ::DBus::SessionBus.instance unless @bus
|
36
|
+
end
|
37
|
+
|
38
|
+
def send_shutdown
|
39
|
+
init
|
40
|
+
service = @bus.service(SERVICE)
|
41
|
+
object = service.object(PATH)
|
42
|
+
object.introspect
|
43
|
+
object.default_iface = INTERFACE
|
44
|
+
object.stop
|
45
|
+
true
|
46
|
+
rescue
|
47
|
+
false
|
48
|
+
end
|
49
|
+
|
50
|
+
def start_service
|
51
|
+
object = DBusObject.new(@main, @servers)
|
52
|
+
service = @bus.request_service(SERVICE)
|
53
|
+
service.export object
|
54
|
+
end
|
55
|
+
|
56
|
+
def run
|
57
|
+
init
|
58
|
+
if send_shutdown
|
59
|
+
Catfriend.whisper "shut down existing catfriend"
|
60
|
+
end
|
61
|
+
|
62
|
+
@main = ::DBus::Main.new
|
63
|
+
start_service
|
64
|
+
@main << @bus
|
65
|
+
@main.run
|
66
|
+
rescue => e
|
67
|
+
puts "dbus unknown error #{e.message}\n#{e.backtrace.join("\n")}"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
end # } end module
|
data/lib/catfriend/imap.rb
CHANGED
@@ -118,7 +118,6 @@ class ImapServer
|
|
118
118
|
end
|
119
119
|
|
120
120
|
def kill
|
121
|
-
@stopping = true
|
122
121
|
disconnect
|
123
122
|
super
|
124
123
|
end
|
@@ -136,7 +135,13 @@ class ImapServer
|
|
136
135
|
@imap = Net::IMAP.new(@host, args)
|
137
136
|
@imap.login(@user, @password)
|
138
137
|
@imap.select(@mailbox || "INBOX")
|
139
|
-
|
138
|
+
|
139
|
+
begin
|
140
|
+
# fetch raises an exception when the mailbox is empty
|
141
|
+
@imap.fetch('*', 'UID').first.seqno
|
142
|
+
rescue
|
143
|
+
0
|
144
|
+
end
|
140
145
|
end
|
141
146
|
|
142
147
|
def reconnect
|
@@ -151,10 +156,12 @@ class ImapServer
|
|
151
156
|
@message_count = new_count
|
152
157
|
end
|
153
158
|
|
154
|
-
def disconnect
|
159
|
+
def disconnect
|
160
|
+
@stopping = true
|
161
|
+
@imap.disconnect
|
162
|
+
end
|
155
163
|
|
156
|
-
private :connect, :
|
157
|
-
:check_loop, :run, :error, :notify_message
|
164
|
+
private :connect, :reconnect, :check_loop, :run, :error, :notify_message
|
158
165
|
|
159
166
|
attr_writer :host, :password, :id, :user, :no_ssl, :cert_file, :mailbox
|
160
167
|
attr_accessor :work_account
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: catfriend
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.16'
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-02-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: libnotify
|
16
|
-
requirement: &
|
16
|
+
requirement: &12342540 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,7 +21,18 @@ dependencies:
|
|
21
21
|
version: 0.7.1
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *12342540
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: ruby-dbus
|
27
|
+
requirement: &12340600 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0.7'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *12340600
|
25
36
|
description: E-mail checker with libnotify desktop notifications.
|
26
37
|
email:
|
27
38
|
- catfriend@chilon.net
|
@@ -32,11 +43,13 @@ extra_rdoc_files: []
|
|
32
43
|
files:
|
33
44
|
- LICENSE
|
34
45
|
- catfriend.example
|
46
|
+
- lib/catfriend/dbus.rb
|
35
47
|
- lib/catfriend/server.rb
|
36
48
|
- lib/catfriend/filetokenstack.rb
|
37
49
|
- lib/catfriend/thread.rb
|
38
50
|
- lib/catfriend/imap.rb
|
39
|
-
-
|
51
|
+
- !binary |-
|
52
|
+
YmluL2NhdGZyaWVuZA==
|
40
53
|
homepage: https://github.com/nuisanceofcats/catfriend
|
41
54
|
licenses:
|
42
55
|
- Expat
|