Added auto restart of zammad after changing object attributes.

This commit is contained in:
Martin Edenhofer 2016-05-26 23:40:10 +02:00
parent eae8ead41c
commit 39feeccc88
8 changed files with 126 additions and 26 deletions

View file

@ -334,6 +334,7 @@ test:browser:twitter_ff:
- twitter
script:
- export BROWSER_URL=http://$IP:$BROWSER_PORT
- export APP_RESTART_CMD="script/build/test_shutdown.sh $RAILS_ENV $BROWSER_PORT $WS_PORT && script/build/test_startup.sh $RAILS_ENV $BROWSER_PORT $WS_PORT"
- RAILS_ENV=test rake db:create
- cp contrib/auto_wizard_test.json auto_wizard.json
- script/bootstrap.sh
@ -350,6 +351,7 @@ test:browser:facebook_ff:
- facebook
script:
- export BROWSER_URL=http://$IP:$BROWSER_PORT
- export APP_RESTART_CMD="script/build/test_shutdown.sh $RAILS_ENV $BROWSER_PORT $WS_PORT && script/build/test_startup.sh $RAILS_ENV $BROWSER_PORT $WS_PORT"
- RAILS_ENV=test rake db:create
- cp contrib/auto_wizard_test.json auto_wizard.json
- script/bootstrap.sh
@ -365,6 +367,7 @@ test:browser:autowizard_ff:
- browser-ff
script:
- export BROWSER_URL=http://$IP:$BROWSER_PORT
- export APP_RESTART_CMD="script/build/test_shutdown.sh $RAILS_ENV $BROWSER_PORT $WS_PORT && script/build/test_startup.sh $RAILS_ENV $BROWSER_PORT $WS_PORT"
- RAILS_ENV=test rake db:create
- cp contrib/auto_wizard_example.json auto_wizard.json
- script/bootstrap.sh
@ -381,6 +384,7 @@ test:browser:core:ff_1_mysql:
- mysql
script:
- export BROWSER_URL=http://$IP:$BROWSER_PORT
- export APP_RESTART_CMD="script/build/test_shutdown.sh $RAILS_ENV $BROWSER_PORT $WS_PORT && script/build/test_startup.sh $RAILS_ENV $BROWSER_PORT $WS_PORT"
- unset MAILBOX_AUTO1
- unset MAILBOX_AUTO2
- unset MAILBOX_MANUAL1
@ -401,6 +405,7 @@ test:browser:core:ff_2_mysql:
- mysql
script:
- export BROWSER_URL=http://$IP:$BROWSER_PORT
- export APP_RESTART_CMD="script/build/test_shutdown.sh $RAILS_ENV $BROWSER_PORT $WS_PORT && script/build/test_startup.sh $RAILS_ENV $BROWSER_PORT $WS_PORT"
- unset MAILBOX_AUTO1
- unset MAILBOX_AUTO2
- unset MAILBOX_MANUAL1
@ -421,6 +426,7 @@ test:browser:core:ff_3_mysql:
- mysql
script:
- export BROWSER_URL=http://$IP:$BROWSER_PORT
- export APP_RESTART_CMD="script/build/test_shutdown.sh $RAILS_ENV $BROWSER_PORT $WS_PORT && script/build/test_startup.sh $RAILS_ENV $BROWSER_PORT $WS_PORT"
- script/build/test_slice_tests.sh 3
- RAILS_ENV=test rake db:create
- script/bootstrap.sh
@ -437,6 +443,7 @@ test:browser:core:ff_4_mysql:
- mysql
script:
- export BROWSER_URL=http://$IP:$BROWSER_PORT
- export APP_RESTART_CMD="script/build/test_shutdown.sh $RAILS_ENV $BROWSER_PORT $WS_PORT && script/build/test_startup.sh $RAILS_ENV $BROWSER_PORT $WS_PORT"
- unset MAILBOX_AUTO1
- unset MAILBOX_AUTO2
- unset MAILBOX_MANUAL1
@ -457,6 +464,7 @@ test:browser:core:ff_5_mysql:
- mysql
script:
- export BROWSER_URL=http://$IP:$BROWSER_PORT
- export APP_RESTART_CMD="script/build/test_shutdown.sh $RAILS_ENV $BROWSER_PORT $WS_PORT && script/build/test_startup.sh $RAILS_ENV $BROWSER_PORT $WS_PORT"
- unset MAILBOX_AUTO1
- unset MAILBOX_AUTO2
- unset MAILBOX_MANUAL1
@ -477,6 +485,7 @@ test:browser:core:ff_1_postgresql:
- postgresql
script:
- export BROWSER_URL=http://$IP:$BROWSER_PORT
- export APP_RESTART_CMD="script/build/test_shutdown.sh $RAILS_ENV $BROWSER_PORT $WS_PORT && script/build/test_startup.sh $RAILS_ENV $BROWSER_PORT $WS_PORT"
- unset MAILBOX_AUTO1
- unset MAILBOX_AUTO2
- unset MAILBOX_MANUAL1
@ -497,6 +506,7 @@ test:browser:core:ff_2_postgresql:
- postgresql
script:
- export BROWSER_URL=http://$IP:$BROWSER_PORT
- export APP_RESTART_CMD="script/build/test_shutdown.sh $RAILS_ENV $BROWSER_PORT $WS_PORT && script/build/test_startup.sh $RAILS_ENV $BROWSER_PORT $WS_PORT"
- unset MAILBOX_AUTO1
- unset MAILBOX_AUTO2
- unset MAILBOX_MANUAL1
@ -517,6 +527,7 @@ test:browser:core:ff_3_postgresql:
- postgresql
script:
- export BROWSER_URL=http://$IP:$BROWSER_PORT
- export APP_RESTART_CMD="script/build/test_shutdown.sh $RAILS_ENV $BROWSER_PORT $WS_PORT && script/build/test_startup.sh $RAILS_ENV $BROWSER_PORT $WS_PORT"
- script/build/test_slice_tests.sh 3
- RAILS_ENV=test rake db:create
- script/bootstrap.sh
@ -533,6 +544,7 @@ test:browser:core:ff_4_postgresql:
- postgresql
script:
- export BROWSER_URL=http://$IP:$BROWSER_PORT
- export APP_RESTART_CMD="script/build/test_shutdown.sh $RAILS_ENV $BROWSER_PORT $WS_PORT && script/build/test_startup.sh $RAILS_ENV $BROWSER_PORT $WS_PORT"
- unset MAILBOX_AUTO1
- unset MAILBOX_AUTO2
- unset MAILBOX_MANUAL1
@ -553,6 +565,7 @@ test:browser:core:ff_5_postgresql:
- postgresql
script:
- export BROWSER_URL=http://$IP:$BROWSER_PORT
- export APP_RESTART_CMD="script/build/test_shutdown.sh $RAILS_ENV $BROWSER_PORT $WS_PORT && script/build/test_startup.sh $RAILS_ENV $BROWSER_PORT $WS_PORT"
- unset MAILBOX_AUTO1
- unset MAILBOX_AUTO2
- unset MAILBOX_MANUAL1
@ -573,6 +586,7 @@ test:browser:core:chrome_1_mysql:
- mysql
script:
- export BROWSER_URL=http://$IP:$BROWSER_PORT
- export APP_RESTART_CMD="script/build/test_shutdown.sh $RAILS_ENV $BROWSER_PORT $WS_PORT && script/build/test_startup.sh $RAILS_ENV $BROWSER_PORT $WS_PORT"
- unset MAILBOX_AUTO1
- unset MAILBOX_AUTO2
- unset MAILBOX_MANUAL1
@ -593,6 +607,7 @@ test:browser:core:chrome_2_mysql:
- mysql
script:
- export BROWSER_URL=http://$IP:$BROWSER_PORT
- export APP_RESTART_CMD="script/build/test_shutdown.sh $RAILS_ENV $BROWSER_PORT $WS_PORT && script/build/test_startup.sh $RAILS_ENV $BROWSER_PORT $WS_PORT"
- unset MAILBOX_AUTO1
- unset MAILBOX_AUTO2
- unset MAILBOX_MANUAL1
@ -613,6 +628,7 @@ test:browser:core:chrome_3_mysql:
- mysql
script:
- export BROWSER_URL=http://$IP:$BROWSER_PORT
- export APP_RESTART_CMD="script/build/test_shutdown.sh $RAILS_ENV $BROWSER_PORT $WS_PORT && script/build/test_startup.sh $RAILS_ENV $BROWSER_PORT $WS_PORT"
- unset MAILBOX_AUTO1
- unset MAILBOX_AUTO2
- unset MAILBOX_MANUAL1
@ -633,6 +649,7 @@ test:browser:core:chrome_4_mysql:
- mysql
script:
- export BROWSER_URL=http://$IP:$BROWSER_PORT
- export APP_RESTART_CMD="script/build/test_shutdown.sh $RAILS_ENV $BROWSER_PORT $WS_PORT && script/build/test_startup.sh $RAILS_ENV $BROWSER_PORT $WS_PORT"
- unset MAILBOX_AUTO1
- unset MAILBOX_AUTO2
- unset MAILBOX_MANUAL1
@ -653,6 +670,7 @@ test:browser:core:chrome_5_mysql:
- mysql
script:
- export BROWSER_URL=http://$IP:$BROWSER_PORT
- export APP_RESTART_CMD="script/build/test_shutdown.sh $RAILS_ENV $BROWSER_PORT $WS_PORT && script/build/test_startup.sh $RAILS_ENV $BROWSER_PORT $WS_PORT"
- unset MAILBOX_AUTO1
- unset MAILBOX_AUTO2
- unset MAILBOX_MANUAL1
@ -673,6 +691,7 @@ test:browser:core:chrome_1_postgresql:
- postgresql
script:
- export BROWSER_URL=http://$IP:$BROWSER_PORT
- export APP_RESTART_CMD="script/build/test_shutdown.sh $RAILS_ENV $BROWSER_PORT $WS_PORT && script/build/test_startup.sh $RAILS_ENV $BROWSER_PORT $WS_PORT"
- unset MAILBOX_AUTO1
- unset MAILBOX_AUTO2
- unset MAILBOX_MANUAL1
@ -693,6 +712,7 @@ test:browser:core:chrome_2_postgresql:
- postgresql
script:
- export BROWSER_URL=http://$IP:$BROWSER_PORT
- export APP_RESTART_CMD="script/build/test_shutdown.sh $RAILS_ENV $BROWSER_PORT $WS_PORT && script/build/test_startup.sh $RAILS_ENV $BROWSER_PORT $WS_PORT"
- unset MAILBOX_AUTO1
- unset MAILBOX_AUTO2
- unset MAILBOX_MANUAL1
@ -713,6 +733,7 @@ test:browser:core:chrome_3_postgresql:
- postgresql
script:
- export BROWSER_URL=http://$IP:$BROWSER_PORT
- export APP_RESTART_CMD="script/build/test_shutdown.sh $RAILS_ENV $BROWSER_PORT $WS_PORT && script/build/test_startup.sh $RAILS_ENV $BROWSER_PORT $WS_PORT"
- unset MAILBOX_AUTO1
- unset MAILBOX_AUTO2
- unset MAILBOX_MANUAL1
@ -733,6 +754,7 @@ test:browser:core:chrome_4_postgresql:
- postgresql
script:
- export BROWSER_URL=http://$IP:$BROWSER_PORT
- export APP_RESTART_CMD="script/build/test_shutdown.sh $RAILS_ENV $BROWSER_PORT $WS_PORT && script/build/test_startup.sh $RAILS_ENV $BROWSER_PORT $WS_PORT"
- unset MAILBOX_AUTO1
- unset MAILBOX_AUTO2
- unset MAILBOX_MANUAL1
@ -753,6 +775,7 @@ test:browser:core:chrome_5_postgresql:
- postgresql
script:
- export BROWSER_URL=http://$IP:$BROWSER_PORT
- export APP_RESTART_CMD="script/build/test_shutdown.sh $RAILS_ENV $BROWSER_PORT $WS_PORT && script/build/test_startup.sh $RAILS_ENV $BROWSER_PORT $WS_PORT"
- unset MAILBOX_AUTO1
- unset MAILBOX_AUTO2
- unset MAILBOX_MANUAL1

View file

@ -1,4 +1,5 @@
class Widget extends App.Controller
errorCount: 0
constructor: ->
super
@ -13,8 +14,10 @@ class Widget extends App.Controller
@maintanaceAppVersion(data)
if data.type is 'config_changed'
@maintanaceConfigChanged(data)
if data.type is 'restart'
@maintanaceRestart(data)
if data.type is 'restart_auto'
@maintanaceRestartAuto(data)
if data.type is 'restart_manual'
@maintanaceRestartManual(data)
'maintenance'
)
@ -41,12 +44,12 @@ class Widget extends App.Controller
return if !@authenticate(true)
@navigate '#logout'
#App.Event.trigger('maintenance', {type:'restart'})
maintanaceRestart: (data) =>
return if @messageRestart
@messageRestart = new App.SessionMessage(
head: 'Restarting...'
message: 'Zammad is restarting... waiting...'
#App.Event.trigger('maintenance', {type:'restart_auto'})
maintanaceRestartAuto: (data) =>
return if @messageRestartAuto
@messageRestartAuto = new App.SessionMessage(
head: 'Zammad is restarting...'
message: 'Some system settings have changed, Zammad is restarting. Please wait until Zammad is back again.'
keyboard: false
backdrop: false
buttonClose: false
@ -54,12 +57,24 @@ class Widget extends App.Controller
small: true
forceReload: true
)
@disconnectClient()
@checkAvailability()
# disconnect
# try if backend is reachable again
# reload app
#App.Event.trigger('maintenance', {type:'restart_manual'})
maintanaceRestartManual: (data) =>
return if @messageRestartManual
@messageRestartManual = new App.SessionMessage(
head: 'Zammad need a restart!'
message: 'Some system settings have changed, please restart all Zammad processes! If you want to do this automatically, set environment variable APP___RESTART___CMD="/path/to/your___app___script.sh restart".'
keyboard: false
backdrop: false
buttonClose: false
buttonSubmit: false
small: true
forceReload: true
)
@disconnectClient()
@checkAvailability()
maintanaceConfigChanged: (data) =>
return if @messageConfigChanged
@ -94,4 +109,21 @@ class Widget extends App.Controller
)
@delay(message, 2000)
checkAvailability: (delay) =>
delay = =>
@ajax(
id: 'check_availability'
type: 'get'
url: "#{@apiPath}/available"
success: (data) =>
if @errorCount is 0
@checkAvailability()
return
@windowReload()
error: =>
@errorCount += 1
@checkAvailability()
)
@delay(delay, 2000)
App.Config.set('maintenance', Widget, 'Widgets')

View file

@ -273,6 +273,12 @@ class SessionsController < ApplicationController
)
end
def available
render json: {
app_version: AppVersion.get
}
end
def list
return if deny_if_not_role(Z_ROLENAME_ADMIN)
assets = {}

View file

@ -591,9 +591,18 @@ returns
execute_count += 1
}
# sent reload to clients
# sent maintenance message to clients
if execute_count != 0
AppVersion.set(true)
if ENV['APP_RESTART_CMD']
AppVersion.set(true, 'restart_auto')
pid = fork do
sleep 5
system(ENV['APP_RESTART_CMD'])
Process.exit!(true)
end
else
AppVersion.set(true, 'restart_manual')
end
end
true
end
@ -611,6 +620,10 @@ returns
raise 'Spaces in name are not allowed'
elsif name !~ /^[a-z0-9_]+$/
raise 'Only letters from a-z, numbers from 0-9, and _ are allowed'
elsif name !~ /[a-z]/
raise 'At least one letters is needed'
elsif name =~ /^(destroy|true|false|integer|select|drop|create|alter|index|table)$/i
raise "#{name} is a reserved word, please choose a different one"
end
true
end

View file

@ -12,6 +12,8 @@ Zammad::Application.routes.draw do
match api_path + '/signshow', to: 'sessions#show', via: [:get, :post]
match api_path + '/signout', to: 'sessions#destroy', via: [:get, :delete]
match api_path + '/available', to: 'sessions#available', via: :get
match api_path + '/sessions/switch/:id', to: 'sessions#switch_to_user', via: :get
match api_path + '/sessions/switch_back', to: 'sessions#switch_back_to_user', via: :get
match api_path + '/sessions', to: 'sessions#list', via: :get

View file

@ -24,22 +24,33 @@ set new app version and if browser reload is required
AppVersion.set(true) # true == reload is required / false == no reload is required
send also reload type to clients
AppVersion.set(true, 'restart_auto')
=end
def self.set(reload_required = false)
def self.set(reload_required = false, type = false)
return false if !Setting.find_by(name: 'app_version')
version = "#{Time.zone.now.strftime('%Y%m%d%H%M%S')}:#{reload_required}"
Setting.set('app_version', version)
# broadcast to clients
Sessions.broadcast(event_data)
Sessions.broadcast(event_data(type), 'public')
end
=begin
get event data
AppVersion.event_data
AppVersion.event_data(type)
types:
app_version -> new app version
restart_manual -> app needs restart
restart_auto -> app is restarting
config_changed -> config has changed
returnes
@ -53,11 +64,11 @@ returnes
=end
def self.event_data
def self.event_data(type = 'app_version')
{
event: 'maintenance',
data: {
type: 'app_version',
type: type,
app_version: get,
}
}

View file

@ -355,7 +355,7 @@ returns
broadcase also to not authenticated client
Sessions.broadcast(data, 'public')
Sessions.broadcast(data, 'public') # public|authenticated
broadcase also not to sender
@ -363,7 +363,7 @@ broadcase also not to sender
=end
def self.broadcast(data, recipient = 'autenticated', sender_user_id = nil)
def self.broadcast(data, recipient = 'authenticated', sender_user_id = nil)
# list all current clients
recipients = []

View file

@ -68,9 +68,16 @@ class AdminObjectManagerTest < TestCase
click(css: '#content .tab-pane.active div.js-execute')
watch_for(
css: '.modal',
value: 'New Version',
value: 'restart',
)
watch_for_disappear(
css: '.modal',
timeout: 26,
)
sleep 5
watch_for(
css: '#content',
)
click(css: '.modal button.js-submit')
# create new ticket
ticket = ticket_create(
@ -126,10 +133,16 @@ class AdminObjectManagerTest < TestCase
click(css: '#content .tab-pane.active div.js-execute')
watch_for(
css: '.modal',
value: 'New Version',
value: 'restart',
)
watch_for_disappear(
css: '.modal',
timeout: 26,
)
click(css: '.modal button.js-submit')
sleep 5
watch_for(
css: '#content',
)
match_not(
css: '#content',
value: 'Database Update required',