From ad579d82372f0aaa7894313c3d9ff7077263cfd4 Mon Sep 17 00:00:00 2001 From: Martin Edenhofer Date: Thu, 19 Sep 2013 16:17:25 +0200 Subject: [PATCH 1/3] Added new UserAgent lib to handle ftp/http/https calls. --- lib/import/otrs.rb | 93 +++++++--------------- lib/user_agent.rb | 192 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 222 insertions(+), 63 deletions(-) create mode 100644 lib/user_agent.rb diff --git a/lib/import/otrs.rb b/lib/import/otrs.rb index ed7ceb6d9..cbf4d5c21 100644 --- a/lib/import/otrs.rb +++ b/lib/import/otrs.rb @@ -4,67 +4,34 @@ module Import::OTRS def self.request(part) url = Setting.get('import_otrs_endpoint') + '/' + part + ';Key=' + Setting.get('import_otrs_endpoint_key') puts 'GET: ' + url -# response = Net::HTTP.get_response( URI.parse(url), { :use_ssl => true, :verify_mode => OpenSSL::SSL::VERIFY_NONE } ) - uri = URI.parse(url) - http = Net::HTTP.new(uri.host, uri.port) - - if url =~ /https/i - http.use_ssl = true - http.verify_mode = OpenSSL::SSL::VERIFY_NONE - end - request = Net::HTTP::Get.new(uri.request_uri) - - # 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 + response = UserAgent.request( + url, + { + :user => Setting.get('import_otrs_user'), + :password => Setting.get('import_otrs_password'), + }, + ) + if !response.success? + puts "ERROR: #{response.error}" return 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 end def self.post(base, data) url = Setting.get('import_otrs_endpoint') + '/' + base data['Key'] = Setting.get('import_otrs_endpoint_key') puts 'POST: ' + url - uri = URI.parse(url) - http = Net::HTTP.new(uri.host, uri.port) - - if url =~ /https/i - http.use_ssl = true - http.verify_mode = OpenSSL::SSL::VERIFY_NONE - end - request = Net::HTTP::Post.new(uri.request_uri) - - # 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 - - 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}'!" + response = UserAgent.request( + url, + { + :method => 'post', + :user => Setting.get('import_otrs_user'), + :password => Setting.get('import_otrs_password'), + }, + ) + if !response.success? + puts "ERROR: #{response.error}" + return end return response end @@ -77,7 +44,7 @@ module Import::OTRS def self.auth(username, password) response = post( "public.pl", { :Action => 'Export', :Type => 'Auth', :User => username, :Pw => password } ) return if !response - return if response.code.to_s != '200' + return if !response.success? result = json(response) return result @@ -86,7 +53,7 @@ module Import::OTRS def self.session(session_id) response = post( "public.pl", { :Action => 'Export', :Type => 'SessionCheck', :SessionID => session_id } ) return if !response - return if response.code.to_s != '200' + return if !response.success? result = json(response) return result @@ -105,7 +72,7 @@ module Import::OTRS response = request("public.pl?Action=Export") return if !response - return if response.code.to_s != '200' + return if !response.success? #self.ticket('156115') #return @@ -189,7 +156,7 @@ module Import::OTRS url = "public.pl?Action=Export;Type=TicketDiff;Limit=30" response = request( url ) return if !response - return if response.code.to_s != '200' + return if !response.success? result = json(response) self._ticket_result(result) end @@ -201,7 +168,7 @@ module Import::OTRS } response = request( url ) return if !response - return if response.code.to_s != '200' + return if !response.success? result = json(response) self._ticket_result(result) @@ -528,7 +495,7 @@ module Import::OTRS def self.ticket_state response = request( "public.pl?Action=Export;Type=State" ) return if !response - return if response.code.to_s != '200' + return if !response.success? result = json(response) # puts result.inspect @@ -585,7 +552,7 @@ module Import::OTRS def self.ticket_priority response = request( "public.pl?Action=Export;Type=Priority" ) return if !response - return if response.code.to_s != '200' + return if !response.success? result = json(response) map = { @@ -629,7 +596,7 @@ module Import::OTRS def self.ticket_group response = request( "public.pl?Action=Export;Type=Queue" ) return if !response - return if response.code.to_s != '200' + return if !response.success? result = json(response) map = { @@ -673,7 +640,7 @@ module Import::OTRS def self.user response = request( "public.pl?Action=Export;Type=User" ) return if !response - return if response.code.to_s != '200' + return if !response.success? result = json(response) map = { :ChangeTime => :updated_at, @@ -739,7 +706,7 @@ module Import::OTRS response = request( "public.pl?Action=Export;Type=Customer;Count=100;Offset=#{count}" ) return if !response count = count + 3000 - return if response.code.to_s != '200' + return if !response.success? result = json(response) map = { :ChangeTime => :updated_at, diff --git a/lib/user_agent.rb b/lib/user_agent.rb new file mode 100644 index 000000000..afad3aff3 --- /dev/null +++ b/lib/user_agent.rb @@ -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 From d6c49d08ad27537c610e143f50fb43e44e5cc74f Mon Sep 17 00:00:00 2001 From: Martin Edenhofer Date: Thu, 19 Sep 2013 16:18:55 +0200 Subject: [PATCH 2/3] Added new UserAgent lib to handle ftp/http/https calls. --- lib/rss.rb | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/lib/rss.rb b/lib/rss.rb index 083f04bce..081773b6b 100644 --- a/lib/rss.rb +++ b/lib/rss.rb @@ -7,14 +7,8 @@ module Rss begin puts 'fetch rss...' - response = Net::HTTP.get_response( URI.parse(url) ) - - # check if redirect is needed - if response.kind_of? Net::HTTPRedirection - url = response.header['location'] - response = Net::HTTP.get_response( URI.parse( url ) ) - end - if ! response.kind_of? Net::HTTPSuccess + response = UserAgent.request(url) + if !response.success? raise "Can't fetch '#{url}', http code: #{response.code.to_s}" return end @@ -42,4 +36,4 @@ module Rss return items end -end \ No newline at end of file +end From 4aed3e544e452c7ce322ee8ce9c4cc104ca4da82 Mon Sep 17 00:00:00 2001 From: Martin Edenhofer Date: Thu, 19 Sep 2013 16:18:55 +0200 Subject: [PATCH 3/3] Added new UserAgent lib to handle ftp/http/https calls. --- lib/geo_location/gmaps.rb | 8 ++++---- lib/rss.rb | 12 +++--------- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/lib/geo_location/gmaps.rb b/lib/geo_location/gmaps.rb index 707a40fb2..c286c9820 100644 --- a/lib/geo_location/gmaps.rb +++ b/lib/geo_location/gmaps.rb @@ -4,8 +4,8 @@ class GeoLocation::Gmaps def self.geocode(address) url = "http://maps.googleapis.com/maps/api/geocode/json?address=#{CGI::escape address}&sensor=true" - response = Net::HTTP.get_response( URI.parse(url) ) - return if ! response.kind_of? Net::HTTPSuccess + response = UserAgent.request(url) + return if !response.success? result = JSON.parse( response.body ) @@ -16,8 +16,8 @@ class GeoLocation::Gmaps def self.reverse_geocode(lat,lng) url = "http://maps.googleapis.com/maps/api/geocode/json?latlng=#{lat},#{lng}&sensor=true" - response = Net::HTTP.get_response( URI.parse(url) ) - return if ! response.kind_of? Net::HTTPSuccess + response = UserAgent.request(url) + return if !response.success? result = JSON.parse( response.body ) diff --git a/lib/rss.rb b/lib/rss.rb index 083f04bce..081773b6b 100644 --- a/lib/rss.rb +++ b/lib/rss.rb @@ -7,14 +7,8 @@ module Rss begin puts 'fetch rss...' - response = Net::HTTP.get_response( URI.parse(url) ) - - # check if redirect is needed - if response.kind_of? Net::HTTPRedirection - url = response.header['location'] - response = Net::HTTP.get_response( URI.parse( url ) ) - end - if ! response.kind_of? Net::HTTPSuccess + response = UserAgent.request(url) + if !response.success? raise "Can't fetch '#{url}', http code: #{response.code.to_s}" return end @@ -42,4 +36,4 @@ module Rss return items end -end \ No newline at end of file +end