]> git.cworth.org Git - sup/blob - bin/sup-add
split sup-import into sup-add and sup-import; merged poll.rb and sup-import code...
[sup] / bin / sup-add
1 #!/usr/bin/env ruby
2
3 require 'uri'
4 require 'rubygems'
5 require 'highline/import'
6 require 'trollop'
7 require "sup"
8
9 Thread.abort_on_exception = true # make debugging possible
10
11 $opts = Trollop::options do
12   version "sup-add (sup #{Redwood::VERSION})"
13   banner <<EOS
14 Adds a source to the Sup source list.
15
16 Usage:
17   sup-add [options] <source>+
18
19 where <source>+ is one or more source URIs or mbox filenames, e.g.
20 "imaps://my.imapserver.com", or "/var/spool/mail/me".
21
22 Options are:
23 EOS
24   opt :archive, "Automatically archive all new messages from these sources."
25   opt :unusual, "Do not automatically poll these sources for new messages."
26   opt :force_new, "Create a new account for this source, even if one already exists."
27 end
28
29 Trollop::die "require one or more sources" if ARGV.empty?
30
31 ## for sources that require login information, prompt the user for
32 ## that. also provide a list of previously-defined login info to
33 ## choose from, if any.
34 def get_login_info uri, sources
35   uri = URI(uri)
36   accounts = sources.map do |s|
37     next unless s.respond_to?(:username)
38     suri = URI(s.uri)
39     [suri.host, s.username, s.password]
40   end.compact.uniq.sort_by { |h, u, p| h == uri.host ? 0 : 1 }
41
42   username, password = nil, nil
43   unless accounts.empty? || $opts[:force_new]
44     say "Would you like to use the same account as for a previous source for #{uri}?"
45     choose do |menu|
46       accounts.each do |host, olduser, oldpw|
47         menu.choice("Use the account info for #{olduser}@#{host}") { username, password = olduser, oldpw }
48       end
49       menu.choice("Use a new account") { }
50       menu.prompt = "Account selection? "
51     end
52   end
53
54   unless username && password
55     username = ask("Username for #{uri.host}: ");
56     password = ask("Password for #{uri.host}: ") { |q| q.echo = false }
57     puts # why?
58   end
59
60   [username, password]
61 end
62
63 $terminal.wrap_at = :auto
64 Redwood::start
65 index = Redwood::Index.new
66 index.load
67
68 ARGV.each do |uri|
69   uri = "mbox://#{uri}" unless uri =~ %r!://!
70   if !$opts[:force_new] && index.source_for(uri) 
71     say "Already know about #{uri}; skipping."
72     next
73   end
74   source = 
75     case uri
76     when %r!^mbox\+ssh://!
77       say "For SSH connections, if you will use public key authentication, you may leave the username and password blank."
78       say ""
79       username, password = get_login_info uri, index.sources
80       Redwood::MBox::SSHLoader.new(uri, username, password, nil, !$opts[:unusual], $opts[:archive])
81     when %r!^imaps?://!
82       username, password = get_login_info uri, index.sources
83       Redwood::IMAP.new(uri, username, password, nil, !$opts[:unusual], $opts[:archive])
84     else
85       Redwood::MBox::Loader.new(uri, nil, !$opts[:unusual], $opts[:archive])
86     end
87   say "Adding #{source}..."
88   index.add_source source
89 end
90
91 say "Saving source list..."
92 index.save
93 Redwood::finish