import_otrs_controller.rb 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. # Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/
  2. class ImportOtrsController < ApplicationController
  3. def url_check
  4. return if setup_done_response
  5. # validate
  6. if !params[:url] || params[:url] !~ %r{^(http|https)://.+?$}
  7. render json: {
  8. result: 'invalid',
  9. message: 'Invalid!',
  10. }
  11. return
  12. end
  13. # connection test
  14. translation_map = {
  15. 'authentication failed' => 'Authentication failed!',
  16. 'getaddrinfo: nodename nor servname provided, or not known' => 'Hostname not found!',
  17. 'No route to host' => 'No route to host!',
  18. 'Connection refused' => 'Connection refused!',
  19. }
  20. # try connecting to otrs
  21. response = UserAgent.request(params[:url])
  22. if !response.success? && response.code.to_s !~ /^40.$/
  23. message_human = ''
  24. translation_map.each {|key, message|
  25. if response.error.to_s =~ /#{Regexp.escape(key)}/i
  26. message_human = message
  27. end
  28. }
  29. render json: {
  30. result: 'invalid',
  31. message_human: message_human,
  32. message: response.error.to_s,
  33. }
  34. return
  35. end
  36. message_human = 'Host found, but it seems to be no OTRS installation!'
  37. suffixes = ['/public.pl', '/otrs/public.pl']
  38. suffixes.each {|suffix|
  39. url = params[:url] + suffix + '?Action=ZammadMigrator'
  40. # strip multible / in url
  41. url.gsub!(%r{([^:])(/+/)}, '\\1/')
  42. response = UserAgent.request( url )
  43. #Setting.set('import_mode', true)
  44. Setting.set('import_backend', 'otrs')
  45. Setting.set('import_otrs_endpoint', url)
  46. Setting.set('import_otrs_endpoint_key', '01234567899876543210')
  47. if response.body =~ /zammad migrator/
  48. render json: {
  49. url: url,
  50. result: 'ok',
  51. }
  52. return # rubocop:disable Lint/NonLocalExitFromIterator
  53. elsif response.body =~ /(otrs\sag|otrs.com|otrs.org)/i
  54. message_human = 'Host found, but no OTRS migrator is installed!'
  55. end
  56. }
  57. # return result
  58. render json: {
  59. result: 'invalid',
  60. message_human: message_human,
  61. }
  62. end
  63. def import_start
  64. return if setup_done_response
  65. Setting.set('import_mode', true)
  66. welcome = Import::OTRS.connection_test
  67. if !welcome
  68. render json: {
  69. message: 'Migrator can\'t read OTRS output!',
  70. result: 'invalid',
  71. }
  72. return
  73. end
  74. # start migration
  75. Import::OTRS.delay.start
  76. render json: {
  77. result: 'ok',
  78. }
  79. end
  80. def import_status
  81. return if setup_done_response
  82. state = Import::OTRS.current_state
  83. render json: {
  84. data: state,
  85. result: 'in_progress',
  86. }
  87. end
  88. private
  89. def setup_done
  90. return false
  91. count = User.all.count()
  92. done = true
  93. if count <= 2
  94. done = false
  95. end
  96. done
  97. end
  98. def setup_done_response
  99. if !setup_done
  100. return false
  101. end
  102. render json: {
  103. setup_done: true,
  104. }
  105. true
  106. end
  107. end