ruby-managesieve 0.2.0 → 0.3.0

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.
Files changed (3) hide show
  1. data/bin/sievectl +82 -42
  2. data/lib/managesieve.rb +9 -4
  3. metadata +22 -15
data/bin/sievectl CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  #
3
3
  #--
4
- # Copyright (c) 2004, 2005 Andre Nathan <andre@digirati.com.br>
4
+ # Copyright (c) 2004-2006 Andre Nathan <andre@digirati.com.br>
5
5
  #
6
6
  # Permission to use, copy, modify, and distribute this software for any
7
7
  # purpose with or without fee is hereby granted, provided that the above
@@ -51,41 +51,51 @@
51
51
  # capabilities, list, show, activate, deactivate, add, addactive, delete
52
52
  #
53
53
  # Short forms for some actions are also accepted:
54
- # caps (capabilities), act (activate), deact (deactivate), addact (addactive),
55
- # del (delete)
54
+ # caps (capabilities), act (activate), deact (deactivate),
55
+ # addact (addactive), del (delete)
56
56
  #
57
57
  # Examples:
58
58
  # List server capabilities:
59
- # sievectl caps
59
+ # sievectl myaccount caps
60
60
  #
61
61
  # List available scripts:
62
- # sievectl list
62
+ # sievectl myaccount list
63
63
  #
64
64
  # Show contents of a script:
65
- # sievectl show scriptname
65
+ # sievectl myaccount show scriptname
66
66
  #
67
67
  # Add a script:
68
- # sievectl add scriptname script.txt
68
+ # sievectl myaccount add scriptname script.txt
69
69
  # or
70
- # sievectl add scriptname < script.txt
70
+ # sievectl myaccount add scriptname < script.txt
71
71
  # or
72
- # cat script.txt | sievectl add scriptname
72
+ # cat script.txt | sievectl myaccount add scriptname
73
73
  #
74
74
  # Delete a script:
75
- # sievectl del scriptname
75
+ # sievectl myaccount del scriptname
76
76
  #
77
77
  #--
78
- # $Id: sievectl,v 1.15 2005/01/21 14:45:30 andre Exp $
78
+ # $Id: sievectl,v 1.27 2006/08/30 18:06:21 andre Exp $
79
79
  #++
80
80
  #
81
81
 
82
82
  begin
83
83
  require 'rubygems'
84
84
  rescue LoadError
85
- nil
86
85
  end
87
-
88
86
  require 'managesieve'
87
+
88
+ $has_termios = true
89
+ begin
90
+ require_gem 'termios'
91
+ rescue LoadError
92
+ begin
93
+ require 'termios'
94
+ rescue LoadError
95
+ $has_termios = false
96
+ end
97
+ end
98
+
89
99
  require 'yaml'
90
100
 
91
101
  class ManageSieve # :nodoc:
@@ -111,16 +121,20 @@ class ManageSieve # :nodoc:
111
121
  end
112
122
  end
113
123
 
114
- class TemplateError # :nodoc:
124
+ class TemplateError < Exception # :nodoc:
115
125
  end
116
126
 
117
127
  class ConfigFile < File # :nodoc:
118
128
  def ConfigFile.open(name)
119
129
  begin
120
- file = super(name)
121
- conf = YAML::load(file)
122
- file.close
123
- return conf
130
+ conf = nil
131
+ super(name) do |file|
132
+ conf = YAML::load(file)
133
+ end
134
+ conf.each_key do |acct|
135
+ conf[acct].each_key { |k| conf[acct][k] = conf[acct][k].to_s }
136
+ end
137
+ conf
124
138
  rescue Errno::ENOENT
125
139
  ConfigFile::create_template(name)
126
140
  exit 0
@@ -136,7 +150,7 @@ class ConfigFile < File # :nodoc:
136
150
  __EOF__
137
151
 
138
152
  begin
139
- file = File::open(name, 'w+')
153
+ file = File.new(name, 'w', 0600)
140
154
  file.puts <<-__EOF__
141
155
  accountname:
142
156
  host: servername
@@ -197,8 +211,12 @@ class SieveCtl
197
211
  def add(script, file=nil, active=false)
198
212
  action = "add#{active ? 'active' : ''}"
199
213
  raise ArgumentError, "`#{action}' requires a script name" unless script
200
- data = file ? File.open(file).readlines : STDIN.readlines
201
- @manage_sieve.put_script(script, data.to_s)
214
+ data = file ? File.open(file).readlines.to_s : STDIN.readlines.to_s
215
+ unless @manage_sieve.have_space?(script, data.length)
216
+ raise SieveCommandError, "not enough space for script `#{script}' " +
217
+ "(#{data.length} bytes)"
218
+ end
219
+ @manage_sieve.put_script(script, data)
202
220
  activate script if active
203
221
  end
204
222
 
@@ -209,9 +227,9 @@ class SieveCtl
209
227
  end
210
228
  end
211
229
 
212
- def usage(quit=true) # :nodoc: #
213
- prog = File::basename $0
214
- STDERR.puts <<-__EOF__
230
+ def usage(quit=true, out=STDERR) # :nodoc: #
231
+ prog = File.basename $0
232
+ out.puts <<-__EOF__
215
233
  Usage: #{prog} <account> <action> [script name]
216
234
  Action is one of:
217
235
  capabilities, list, show, activate, deactivate, add, addactive, delete
@@ -223,7 +241,7 @@ end
223
241
 
224
242
  def help # :nodoc:
225
243
  prog = File::basename $0
226
- usage(false)
244
+ usage(false, STDOUT)
227
245
  puts <<-__EOF__
228
246
 
229
247
  Short forms for some actions are also accepted:
@@ -232,23 +250,23 @@ Short forms for some actions are also accepted:
232
250
 
233
251
  Examples:
234
252
  List server capabilities:
235
- #{prog} caps
253
+ #{prog} myaccount caps
236
254
 
237
255
  List available scripts:
238
- #{prog} list
256
+ #{prog} myaccount list
239
257
 
240
258
  Show contents of a script:
241
- #{prog} show scriptname
259
+ #{prog} myaccount show scriptname
242
260
 
243
261
  Add a script:
244
- #{prog} add scriptname script.txt
262
+ #{prog} myaccount add scriptname script.txt
245
263
  or
246
- #{prog} add scriptname < script.txt
264
+ #{prog} myaccount add scriptname < script.txt
247
265
  or
248
- cat script.txt | #{prog} add scriptname
266
+ cat script.txt | #{prog} myaccount add scriptname
249
267
 
250
268
  Delete a script:
251
- #{prog} del scriptname
269
+ #{prog} myaccount del scriptname
252
270
  __EOF__
253
271
  exit 0
254
272
  end
@@ -283,14 +301,36 @@ end
283
301
 
284
302
  info = conf[account]
285
303
 
286
- sievectl = SieveCtl.new(
287
- :host => info['host'],
288
- :port => info['port'],
289
- :user => info['user'],
290
- :euser => info['euser'],
291
- :password => info['password'],
292
- :auth => info['auth']
293
- )
304
+ if $has_termios and info['password'].nil?
305
+ oldt = Termios.tcgetattr(STDIN)
306
+ newt = oldt.dup
307
+ newt.lflag &= ~Termios::ECHO
308
+ Termios.tcsetattr(STDIN, Termios::TCSANOW, newt)
309
+ print 'Password: '
310
+ info['password'] = STDIN.gets
311
+ Termios.tcsetattr(STDIN, Termios::TCSANOW, oldt)
312
+ end
313
+
314
+ if info['password'].nil?
315
+ STDERR.puts "* Password not given."
316
+ exit 1
317
+ end
318
+
319
+ info['password'].chomp!
320
+
321
+ begin
322
+ sievectl = SieveCtl.new(
323
+ :host => info['host'],
324
+ :port => info['port'] || 2000,
325
+ :user => info['user'],
326
+ :euser => info['euser'] || info['user'],
327
+ :password => info['password'],
328
+ :auth => info['auth']
329
+ )
330
+ rescue SieveNetworkError => e
331
+ STDERR.puts "* #{e}"
332
+ exit 1
333
+ end
294
334
 
295
335
  begin
296
336
  case action
@@ -313,6 +353,6 @@ begin
313
353
  else
314
354
  usage
315
355
  end
316
- rescue SieveCommandError => e
317
- STDERR.puts "* #{e}"
356
+ rescue ArgumentError, SieveCommandError => e
357
+ STDERR.puts "* sievectl: #{e}"
318
358
  end
data/lib/managesieve.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  #
3
3
  #--
4
- # Copyright (c) 2004, 2005 Andre Nathan <andre@digirati.com.br>
4
+ # Copyright (c) 2004-2006 Andre Nathan <andre@digirati.com.br>
5
5
  #
6
6
  # Permission to use, copy, modify, and distribute this software for any
7
7
  # purpose with or without fee is hereby granted, provided that the above
@@ -25,7 +25,7 @@
25
25
  # See the ManageSieve class for documentation and examples.
26
26
  #
27
27
  #--
28
- # $Id: managesieve.rb,v 1.10 2005/01/17 11:25:56 andre Exp $
28
+ # $Id: managesieve.rb,v 1.13 2006/08/30 14:23:58 andre Exp $
29
29
  #++
30
30
  #
31
31
 
@@ -45,6 +45,7 @@ end
45
45
 
46
46
  class SieveAuthError < Exception; end
47
47
  class SieveCommandError < Exception; end
48
+ class SieveNetworkError < Exception; end
48
49
  class SieveResponseError < Exception; end
49
50
 
50
51
  #
@@ -249,7 +250,11 @@ class ManageSieve
249
250
 
250
251
  private
251
252
  def get_line # :nodoc:
252
- return @socket.readline.chomp
253
+ begin
254
+ return @socket.readline.chomp
255
+ rescue EOFError => e
256
+ raise SieveNetworkError, "Network error: #{e}"
257
+ end
253
258
  end
254
259
 
255
260
  private
@@ -270,7 +275,7 @@ class ManageSieve
270
275
  data = get_line
271
276
 
272
277
  # server ok
273
- m = /^OK$/.match(data)
278
+ m = /^OK(.*)?$/.match(data)
274
279
  yield :ok, m.captures.values_at(0, 3) and next if m
275
280
 
276
281
  # server error
metadata CHANGED
@@ -1,39 +1,46 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.8.1
2
+ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: ruby-managesieve
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.2.0
7
- date: 2005-01-21
6
+ version: 0.3.0
7
+ date: 2006-08-30 00:00:00 -03:00
8
8
  summary: A Ruby library for the MANAGESIEVE protocol
9
9
  require_paths:
10
- - lib
11
- author: Andre Nathan
10
+ - lib
12
11
  email: andre@digirati.com.br
13
12
  homepage: http://managesieve.rubyforge.org
14
13
  rubyforge_project: ruby-managesieve
15
- description: "ruby-managesieve is a pure-ruby implementation of the MANAGESIEVE protocol,
16
- allowing remote management of Sieve scripts from ruby."
14
+ description: ruby-managesieve is a pure-ruby implementation of the MANAGESIEVE protocol, allowing remote management of Sieve scripts from ruby.
17
15
  autorequire: managesieve
18
16
  default_executable:
19
17
  bindir: bin
20
18
  has_rdoc: true
21
19
  required_ruby_version: !ruby/object:Gem::Version::Requirement
22
20
  requirements:
23
- -
24
- - ">"
25
- - !ruby/object:Gem::Version
26
- version: 0.0.0
21
+ - - ">"
22
+ - !ruby/object:Gem::Version
23
+ version: 0.0.0
27
24
  version:
28
25
  platform: ruby
26
+ signing_key:
27
+ cert_chain:
28
+ post_install_message:
29
+ authors:
30
+ - Andre Nathan
29
31
  files:
30
- - lib/managesieve.rb
32
+ - lib/managesieve.rb
31
33
  test_files: []
34
+
32
35
  rdoc_options: []
36
+
33
37
  extra_rdoc_files: []
38
+
34
39
  executables:
35
- - sievectl
40
+ - sievectl
36
41
  extensions: []
42
+
37
43
  requirements:
38
- - A network connection and a MANAGESIEVE server.
39
- dependencies: []
44
+ - A network connection and a MANAGESIEVE server.
45
+ dependencies: []
46
+