catfriend 0.15 → 0.16

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.
@@ -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
- start_servers servers
138
+ main_loop servers
125
139
  else
126
140
  pid = fork do
127
- start_servers servers
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.start_servers servers
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
@@ -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
- return @imap.fetch('*', 'UID').first.seqno
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 ; @imap.disconnect ; end
159
+ def disconnect
160
+ @stopping = true
161
+ @imap.disconnect
162
+ end
155
163
 
156
- private :connect, :disconnect, :reconnect,
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.15'
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-01-12 00:00:00.000000000 Z
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: &12249920 !ruby/object:Gem::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: *12249920
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
- - bin/catfriend
51
+ - !binary |-
52
+ YmluL2NhdGZyaWVuZA==
40
53
  homepage: https://github.com/nuisanceofcats/catfriend
41
54
  licenses:
42
55
  - Expat