123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- # Copyright (C) 2012-2023 Zammad Foundation, https://zammad-foundation.org/
- class ImportOtrsController < ApplicationController
- def url_check
- return if setup_done_response
- # validate
- if !params[:url] || params[:url] !~ %r{^(http|https)://.+?$}
- render json: {
- result: 'invalid',
- message: __('The provided URL is invalid.'),
- }
- return
- end
- # connection test
- translation_map = {
- 'authentication failed' => __('Authentication failed.'),
- 'getaddrinfo: nodename nor servname provided, or not known' => __('The hostname could not be found.'),
- 'No route to host' => __('There is no route to this host.'),
- 'Connection refused' => __('The connection was refused.'),
- }
- response = UserAgent.request(params[:url])
- if !response.success? && response.code.to_s !~ %r{^40.$}
- message_human = ''
- translation_map.each do |key, message|
- if response.error.to_s.match?(%r{#{Regexp.escape(key)}}i)
- message_human = message
- end
- end
- render json: {
- result: 'invalid',
- message_human: message_human,
- message: response.error.to_s,
- }
- return
- end
- result = {}
- if response.body.include?('zammad migrator')
- migrator_response = JSON.parse(response.body)
- if migrator_response['Success'] == 1
- # set url and key for import endpoint
- url = migrator_response['URL']
- key = migrator_response['Key']
- # get first part url, used for import_otrs_endpoint
- if !url || !key
- url_parts = params[:url].split(';')
- if !url_parts[1] # in case of & instead of ;
- url_parts = params[:url].split('&')
- end
- key_parts = url_parts[1].split('=')
- if !key_parts[1]
- render json: {
- result: 'invalid',
- message_human: __('Import API key could not be extracted from URL.')
- }
- return
- end
- if !url
- url = url_parts[0]
- end
- if !key
- key = key_parts[1]
- end
- end
- Setting.set('import_backend', 'otrs')
- Setting.set('import_otrs_endpoint', url)
- Setting.set('import_otrs_endpoint_key', key)
- result = {
- result: 'ok',
- url: params[:url],
- }
- else
- result = {
- result: 'invalid',
- message_human: migrator_response['Error']
- }
- end
- elsif response.body.match?(%r{(otrs\sag|otrs\.com|otrs\.org)}i)
- result = {
- result: 'invalid',
- message_human: __('Host found, but no OTRS migrator is installed!')
- }
- else
- result = {
- result: 'invalid',
- message_human: __('Host found, but it seems to be no OTRS installation!'),
- }
- end
- render json: result
- end
- def import_start
- return if setup_done_response
- Setting.set('import_mode', true)
- welcome = Import::OTRS.connection_test
- if !welcome
- render json: {
- message: __('Migrator can\'t read OTRS output!'),
- result: 'invalid',
- }
- return
- end
- # start migration
- AsyncOtrsImportJob.perform_later
- render json: {
- result: 'ok',
- }
- end
- def import_check
- Import::OTRS::Requester.list
- issues = []
- # check count of dynamic fields
- dynamic_field_count = 0
- dynamic_fields = Import::OTRS::Requester.load('DynamicField')
- dynamic_fields.each do |dynamic_field|
- next if dynamic_field['ValidID'].to_i != 1
- dynamic_field_count += 1
- end
- if dynamic_field_count > 20
- issues.push 'otrsDynamicFields'
- end
- # check if process exsists
- sys_configs = Import::OTRS::Requester.load('SysConfig')
- sys_configs.each do |sys_config|
- next if sys_config['Key'] != 'Process'
- issues.push 'otrsProcesses'
- end
- result = 'ok'
- if issues.present?
- result = 'failed'
- end
- render json: {
- result: result,
- issues: issues,
- }
- end
- def import_status
- result = Import::OTRS.status_bg
- if result[:result] == 'import_done'
- Setting.reload
- end
- render json: result
- end
- private
- def setup_done
- count = User.all.count
- done = true
- if count <= 2
- done = false
- end
- done
- end
- def setup_done_response
- if !setup_done
- return false
- end
- render json: {
- setup_done: true,
- }
- true
- end
- end
|