Added new UserAgent lib to handle ftp/http/https calls.

This commit is contained in:
Martin Edenhofer 2013-09-19 16:17:25 +02:00
parent c4a14dbf24
commit ad579d8237
2 changed files with 222 additions and 63 deletions

View file

@ -4,67 +4,34 @@ module Import::OTRS
def self.request(part) def self.request(part)
url = Setting.get('import_otrs_endpoint') + '/' + part + ';Key=' + Setting.get('import_otrs_endpoint_key') url = Setting.get('import_otrs_endpoint') + '/' + part + ';Key=' + Setting.get('import_otrs_endpoint_key')
puts 'GET: ' + url puts 'GET: ' + url
# response = Net::HTTP.get_response( URI.parse(url), { :use_ssl => true, :verify_mode => OpenSSL::SSL::VERIFY_NONE } ) response = UserAgent.request(
uri = URI.parse(url) url,
http = Net::HTTP.new(uri.host, uri.port) {
:user => Setting.get('import_otrs_user'),
if url =~ /https/i :password => Setting.get('import_otrs_password'),
http.use_ssl = true },
http.verify_mode = OpenSSL::SSL::VERIFY_NONE )
end if !response.success?
request = Net::HTTP::Get.new(uri.request_uri) puts "ERROR: #{response.error}"
# http basic auth (if needed)
user = Setting.get('import_otrs_user');
password = Setting.get('import_otrs_password');
if user && user != '' && password && password != ''
request.basic_auth user, password
end
begin
response = http.request(request)
# puts 'R:' + response.body.to_s
rescue Exception => e
puts "can't get #{url}"
puts e.inspect
return return
end end
if !response
raise "Can't connect to #{url}, got no response!"
end
if response.code.to_s != '200'
raise "Connection to #{url} failed, '#{response.code.to_s}'!"
end
return response return response
end end
def self.post(base, data) def self.post(base, data)
url = Setting.get('import_otrs_endpoint') + '/' + base url = Setting.get('import_otrs_endpoint') + '/' + base
data['Key'] = Setting.get('import_otrs_endpoint_key') data['Key'] = Setting.get('import_otrs_endpoint_key')
puts 'POST: ' + url puts 'POST: ' + url
uri = URI.parse(url) response = UserAgent.request(
http = Net::HTTP.new(uri.host, uri.port) url,
{
if url =~ /https/i :method => 'post',
http.use_ssl = true :user => Setting.get('import_otrs_user'),
http.verify_mode = OpenSSL::SSL::VERIFY_NONE :password => Setting.get('import_otrs_password'),
end },
request = Net::HTTP::Post.new(uri.request_uri) )
if !response.success?
# http basic auth (if needed) puts "ERROR: #{response.error}"
user = Setting.get('import_otrs_user'); return
password = Setting.get('import_otrs_password');
if user && user != '' && password && password != ''
request.basic_auth user, password
end
request.set_form_data(data)
response = http.request(request)
if !response
raise "Can't connect to #{url}, got no response!"
end
if response.code.to_s != '200'
raise "Connection to #{url} failed, '#{response.code.to_s}'!"
end end
return response return response
end end
@ -77,7 +44,7 @@ module Import::OTRS
def self.auth(username, password) def self.auth(username, password)
response = post( "public.pl", { :Action => 'Export', :Type => 'Auth', :User => username, :Pw => password } ) response = post( "public.pl", { :Action => 'Export', :Type => 'Auth', :User => username, :Pw => password } )
return if !response return if !response
return if response.code.to_s != '200' return if !response.success?
result = json(response) result = json(response)
return result return result
@ -86,7 +53,7 @@ module Import::OTRS
def self.session(session_id) def self.session(session_id)
response = post( "public.pl", { :Action => 'Export', :Type => 'SessionCheck', :SessionID => session_id } ) response = post( "public.pl", { :Action => 'Export', :Type => 'SessionCheck', :SessionID => session_id } )
return if !response return if !response
return if response.code.to_s != '200' return if !response.success?
result = json(response) result = json(response)
return result return result
@ -105,7 +72,7 @@ module Import::OTRS
response = request("public.pl?Action=Export") response = request("public.pl?Action=Export")
return if !response return if !response
return if response.code.to_s != '200' return if !response.success?
#self.ticket('156115') #self.ticket('156115')
#return #return
@ -189,7 +156,7 @@ module Import::OTRS
url = "public.pl?Action=Export;Type=TicketDiff;Limit=30" url = "public.pl?Action=Export;Type=TicketDiff;Limit=30"
response = request( url ) response = request( url )
return if !response return if !response
return if response.code.to_s != '200' return if !response.success?
result = json(response) result = json(response)
self._ticket_result(result) self._ticket_result(result)
end end
@ -201,7 +168,7 @@ module Import::OTRS
} }
response = request( url ) response = request( url )
return if !response return if !response
return if response.code.to_s != '200' return if !response.success?
result = json(response) result = json(response)
self._ticket_result(result) self._ticket_result(result)
@ -528,7 +495,7 @@ module Import::OTRS
def self.ticket_state def self.ticket_state
response = request( "public.pl?Action=Export;Type=State" ) response = request( "public.pl?Action=Export;Type=State" )
return if !response return if !response
return if response.code.to_s != '200' return if !response.success?
result = json(response) result = json(response)
# puts result.inspect # puts result.inspect
@ -585,7 +552,7 @@ module Import::OTRS
def self.ticket_priority def self.ticket_priority
response = request( "public.pl?Action=Export;Type=Priority" ) response = request( "public.pl?Action=Export;Type=Priority" )
return if !response return if !response
return if response.code.to_s != '200' return if !response.success?
result = json(response) result = json(response)
map = { map = {
@ -629,7 +596,7 @@ module Import::OTRS
def self.ticket_group def self.ticket_group
response = request( "public.pl?Action=Export;Type=Queue" ) response = request( "public.pl?Action=Export;Type=Queue" )
return if !response return if !response
return if response.code.to_s != '200' return if !response.success?
result = json(response) result = json(response)
map = { map = {
@ -673,7 +640,7 @@ module Import::OTRS
def self.user def self.user
response = request( "public.pl?Action=Export;Type=User" ) response = request( "public.pl?Action=Export;Type=User" )
return if !response return if !response
return if response.code.to_s != '200' return if !response.success?
result = json(response) result = json(response)
map = { map = {
:ChangeTime => :updated_at, :ChangeTime => :updated_at,
@ -739,7 +706,7 @@ module Import::OTRS
response = request( "public.pl?Action=Export;Type=Customer;Count=100;Offset=#{count}" ) response = request( "public.pl?Action=Export;Type=Customer;Count=100;Offset=#{count}" )
return if !response return if !response
count = count + 3000 count = count + 3000
return if response.code.to_s != '200' return if !response.success?
result = json(response) result = json(response)
map = { map = {
:ChangeTime => :updated_at, :ChangeTime => :updated_at,

192
lib/user_agent.rb Normal file
View file

@ -0,0 +1,192 @@
# Copyright (C) 2012-2013 Zammad Foundation, http://zammad-foundation.org/
require 'net/http'
require 'net/https'
require 'net/ftp'
require 'tempfile'
class UserAgent
=begin
http/https/ftp calls
result = UserAgent.request( 'ftp://host/some_dir/some_file.bin' )
result = UserAgent.request( 'http://host/some_dir/some_file.bin' )
result = UserAgent.request( 'https://host/some_dir/some_file.bin' )
result = UserAgent.request( 'http://host/some_dir/some_file.bin', { :method => 'post', :data => { :param1 => 123 } } )
returns
result # result object
=end
def self.request(url, options = {})
uri = URI.parse(url)
case uri.scheme.downcase
when /ftp/
ftp(uri, options)
when /http|https/
http(uri, options, 10)
end
end
private
def self.http(uri, options, count)
http = Net::HTTP.new(uri.host, uri.port)
if uri.scheme =~ /https/i
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
end
if !options[:method] || options[:method] =~ /^get$/i
request = Net::HTTP::Get.new(uri.request_uri)
# http basic auth (if needed)
if options[:user] && options[:user] != '' && options[:password] && options[:password] != ''
request.basic_auth user, password
end
begin
response = http.request(request)
rescue Exception => e
return Result.new(
:error => e.inspect,
:success => false,
:code => 0,
)
end
elsif options[:method] =~ /^post$/i
request = Net::HTTP::Post.new(uri.request_uri)
# http basic auth (if needed)
if options[:user] && options[:user] != '' && options[:password] && options[:password] != ''
request.basic_auth user, password
end
begin
request.set_form_data( options[:data] )
response = http.request(request)
rescue Exception => e
return Result.new(
:error => e.inspect,
:success => false,
:code => 0,
)
end
end
if !response
return Result.new(
:error => "Can't connect to #{uri.to_s}, got no response!",
:success => false,
:code => 0,
)
end
case response
when Net::HTTPNotFound
return Result.new(
:error => "No such file #{uri.to_s}, 404!",
:success => false,
:code => response.code,
)
when Net::HTTPClientError
return Result.new(
:error => "Client Error: #{response.inspect}!",
:success => false,
:code => response.code,
)
when Net::HTTPRedirection
raise "Too many redirections for the original URL, halting." if count <= 0
url = response["location"]
uri = URI.parse(url)
return http(uri, options, count - 1)
when Net::HTTPOK
return Result.new(
:body => response.body,
:success => true,
:code => response.code,
)
end
raise "Unknown method '#{option[:method]}'"
end
def self.ftp(uri,options)
host = uri.host
filename = File.basename(uri.path)
remote_dir = File.dirname(uri.path)
temp_file = Tempfile.new("download-#{filename}")
temp_file.binmode
begin
Net::FTP.open(host) do |ftp|
ftp.passive = true
if options[:user] && options[:password]
ftp.login( options[:user], options[:password] )
else
ftp.login
end
ftp.chdir(remote_dir) unless remote_dir == '.'
begin
ftp.getbinaryfile( filename, temp_file )
rescue => e
return Result.new(
:error => e.inspect,
:success => false,
:code => 550,
)
end
end
rescue => e
return Result.new(
:error => e.inspect,
:success => false,
)
end
contents = temp_file.read
temp_file.close
Result.new(
:body => contents,
:success => true,
:code => 200,
)
end
class Result
def initialize(options)
@success = options[:success]
@body = options[:body]
@code = options[:code]
@error = options[:error]
end
def error
@error
end
def success?
@success
end
def body
@body
end
def code
@code
end
end
end