##// END OF EJS Templates
remove trailing white-spaces from extra/mail_handler/rdm-mailhandler.rb...
Toshi MARUYAMA -
r9158:be04f1dd6270
parent child
Show More
@@ -1,187 +1,187
1 1 #!/usr/bin/env ruby
2 2
3 3 # == Synopsis
4 4 #
5 5 # Reads an email from standard input and forward it to a Redmine server
6 6 # through a HTTP request.
7 7 #
8 8 # == Usage
9 9 #
10 10 # rdm-mailhandler [options] --url=<Redmine URL> --key=<API key>
11 11 #
12 12 # == Arguments
13 #
13 #
14 14 # -u, --url URL of the Redmine server
15 15 # -k, --key Redmine API key
16 #
16 #
17 17 # General options:
18 18 # --unknown-user=ACTION how to handle emails from an unknown user
19 19 # ACTION can be one of the following values:
20 20 # ignore: email is ignored (default)
21 21 # accept: accept as anonymous user
22 22 # create: create a user account
23 23 # --no-permission-check disable permission checking when receiving
24 24 # the email
25 25 # --key-file=PATH path to a file that contains the Redmine
26 26 # API key (use this option instead of --key
27 27 # if you don't the key to appear in the
28 28 # command line)
29 29 # --no-check-certificate do not check server certificate
30 30 # -h, --help show this help
31 31 # -v, --verbose show extra information
32 32 # -V, --version show version information and exit
33 #
33 #
34 34 # Issue attributes control options:
35 35 # -p, --project=PROJECT identifier of the target project
36 36 # -s, --status=STATUS name of the target status
37 37 # -t, --tracker=TRACKER name of the target tracker
38 38 # --category=CATEGORY name of the target category
39 39 # --priority=PRIORITY name of the target priority
40 40 # -o, --allow-override=ATTRS allow email content to override attributes
41 41 # specified by previous options
42 42 # ATTRS is a comma separated list of attributes
43 #
43 #
44 44 # == Examples
45 45 # No project specified. Emails MUST contain the 'Project' keyword:
46 #
46 #
47 47 # rdm-mailhandler --url http://redmine.domain.foo --key secret
48 #
48 #
49 49 # Fixed project and default tracker specified, but emails can override
50 50 # both tracker and priority attributes using keywords:
51 #
51 #
52 52 # rdm-mailhandler --url https://domain.foo/redmine --key secret \\
53 53 # --project foo \\
54 54 # --tracker bug \\
55 55 # --allow-override tracker,priority
56 56
57 57 require 'net/http'
58 58 require 'net/https'
59 59 require 'uri'
60 60 require 'getoptlong'
61 61 require 'rdoc/usage'
62 62
63 63 module Net
64 64 class HTTPS < HTTP
65 65 def self.post_form(url, params, headers, options={})
66 66 request = Post.new(url.path)
67 67 request.form_data = params
68 68 request.basic_auth url.user, url.password if url.user
69 69 request.initialize_http_header(headers)
70 70 http = new(url.host, url.port)
71 71 http.use_ssl = (url.scheme == 'https')
72 72 if options[:no_check_certificate]
73 73 http.verify_mode = OpenSSL::SSL::VERIFY_NONE
74 74 end
75 75 http.start {|h| h.request(request) }
76 76 end
77 77 end
78 78 end
79 79
80 80 class RedmineMailHandler
81 81 VERSION = '0.1'
82
82
83 83 attr_accessor :verbose, :issue_attributes, :allow_override, :unknown_user, :no_permission_check, :url, :key, :no_check_certificate
84 84
85 85 def initialize
86 86 self.issue_attributes = {}
87
87
88 88 opts = GetoptLong.new(
89 89 [ '--help', '-h', GetoptLong::NO_ARGUMENT ],
90 90 [ '--version', '-V', GetoptLong::NO_ARGUMENT ],
91 91 [ '--verbose', '-v', GetoptLong::NO_ARGUMENT ],
92 92 [ '--url', '-u', GetoptLong::REQUIRED_ARGUMENT ],
93 93 [ '--key', '-k', GetoptLong::REQUIRED_ARGUMENT],
94 94 [ '--key-file', GetoptLong::REQUIRED_ARGUMENT],
95 95 [ '--project', '-p', GetoptLong::REQUIRED_ARGUMENT ],
96 96 [ '--status', '-s', GetoptLong::REQUIRED_ARGUMENT ],
97 97 [ '--tracker', '-t', GetoptLong::REQUIRED_ARGUMENT],
98 98 [ '--category', GetoptLong::REQUIRED_ARGUMENT],
99 99 [ '--priority', GetoptLong::REQUIRED_ARGUMENT],
100 100 [ '--allow-override', '-o', GetoptLong::REQUIRED_ARGUMENT],
101 101 [ '--unknown-user', GetoptLong::REQUIRED_ARGUMENT],
102 102 [ '--no-permission-check', GetoptLong::NO_ARGUMENT],
103 103 [ '--no-check-certificate', GetoptLong::NO_ARGUMENT]
104 104 )
105 105
106 106 opts.each do |opt, arg|
107 107 case opt
108 108 when '--url'
109 109 self.url = arg.dup
110 110 when '--key'
111 111 self.key = arg.dup
112 112 when '--key-file'
113 113 begin
114 114 self.key = File.read(arg).strip
115 115 rescue Exception => e
116 116 $stderr.puts "Unable to read the key from #{arg}: #{e.message}"
117 117 exit 1
118 118 end
119 119 when '--help'
120 120 usage
121 121 when '--verbose'
122 122 self.verbose = true
123 123 when '--version'
124 124 puts VERSION; exit
125 125 when '--project', '--status', '--tracker', '--category', '--priority'
126 126 self.issue_attributes[opt.gsub(%r{^\-\-}, '')] = arg.dup
127 127 when '--allow-override'
128 128 self.allow_override = arg.dup
129 129 when '--unknown-user'
130 130 self.unknown_user = arg.dup
131 131 when '--no-permission-check'
132 132 self.no_permission_check = '1'
133 133 when '--no-check-certificate'
134 134 self.no_check_certificate = true
135 135 end
136 136 end
137
137
138 138 RDoc.usage if url.nil?
139 139 end
140
140
141 141 def submit(email)
142 142 uri = url.gsub(%r{/*$}, '') + '/mail_handler'
143
143
144 144 headers = { 'User-Agent' => "Redmine mail handler/#{VERSION}" }
145
146 data = { 'key' => key, 'email' => email,
145
146 data = { 'key' => key, 'email' => email,
147 147 'allow_override' => allow_override,
148 148 'unknown_user' => unknown_user,
149 149 'no_permission_check' => no_permission_check}
150 150 issue_attributes.each { |attr, value| data["issue[#{attr}]"] = value }
151
151
152 152 debug "Posting to #{uri}..."
153 153 response = Net::HTTPS.post_form(URI.parse(uri), data, headers, :no_check_certificate => no_check_certificate)
154 154 debug "Response received: #{response.code}"
155
155
156 156 case response.code.to_i
157 157 when 403
158 warn "Request was denied by your Redmine server. " +
158 warn "Request was denied by your Redmine server. " +
159 159 "Make sure that 'WS for incoming emails' is enabled in application settings and that you provided the correct API key."
160 160 return 77
161 161 when 422
162 162 warn "Request was denied by your Redmine server. " +
163 163 "Possible reasons: email is sent from an invalid email address or is missing some information."
164 164 return 77
165 165 when 400..499
166 166 warn "Request was denied by your Redmine server (#{response.code})."
167 167 return 77
168 168 when 500..599
169 169 warn "Failed to contact your Redmine server (#{response.code})."
170 170 return 75
171 171 when 201
172 172 debug "Proccessed successfully"
173 173 return 0
174 174 else
175 175 return 1
176 176 end
177 177 end
178
178
179 179 private
180
180
181 181 def debug(msg)
182 182 puts msg if verbose
183 183 end
184 184 end
185 185
186 186 handler = RedmineMailHandler.new
187 187 exit(handler.submit(STDIN.read))
General Comments 0
You need to be logged in to leave comments. Login now