Skip to content

Commit e7cb4a3

Browse files
authored
Fix 'Terminal has been closed' error on OH initial startup (#1922)
Signed-off-by: Andrew Fiddian-Green <software@whitebear.ch>
1 parent a918f48 commit e7cb4a3

2 files changed

Lines changed: 145 additions & 0 deletions

File tree

distributions/openhab/src/main/resources/bin/karaf

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,9 @@ init() {
178178
}
179179

180180
run() {
181+
# refresh OSGI cache if needed
182+
awaitOsgiCacheReady
183+
181184
OPTS="-Dkaraf.startLocalConsole=true -Dkaraf.startRemoteShell=true"
182185
MAIN=org.apache.karaf.main.Main
183186
if [ "x$CHECK_ROOT_INSTANCE_RUNNING" = "x" ]; then
@@ -378,6 +381,69 @@ run() {
378381
done
379382
}
380383

384+
awaitOsgiCacheReady() {
385+
case "$1" in
386+
""|console) ;;
387+
*) return 0 ;;
388+
esac
389+
390+
OSGI_CACHE_FOLDER="$KARAF_DATA/cache/org.eclipse.osgi"
391+
[ -d "${OSGI_CACHE_FOLDER}" ] && return 0
392+
393+
CACHE_REFRESH_LOCK="$KARAF_DATA/cache-refresh-lock"
394+
[ -e "${CACHE_REFRESH_LOCK}" ] && return 0
395+
: > "${CACHE_REFRESH_LOCK}" 2>/dev/null
396+
trap 'rm -f "${CACHE_REFRESH_LOCK}" 2>/dev/null' EXIT HUP INT TERM
397+
echo "Refreshing the cache..."
398+
399+
STARTLEVEL_FILE="$KARAF_DATA/openhab-start-level"
400+
STARTED_TARGET_LEVEL=10
401+
STOPPED_TARGET_LEVEL=0
402+
echo "${STOPPED_TARGET_LEVEL}" > "${STARTLEVEL_FILE}"
403+
404+
echo "Awaiting server load..."
405+
KARAF_HOME="" "${REALNAME}" server >/dev/null 2>&1 &
406+
407+
SECONDS_WAITED=0
408+
while :; do
409+
if [ -f "${STARTLEVEL_FILE}" ]; then
410+
LEVEL="$(cat "${STARTLEVEL_FILE}" 2>/dev/null)"
411+
if [ -n "${LEVEL}" ] && [ "${LEVEL}" -ge "${STARTED_TARGET_LEVEL}" ]; then
412+
break
413+
fi
414+
fi
415+
sleep 1
416+
SECONDS_WAITED=$((SECONDS_WAITED + 1))
417+
if [ "${SECONDS_WAITED}" -ge 60 ]; then
418+
echo "Wait timed out!"
419+
break
420+
fi
421+
done
422+
423+
echo "Awaiting server unload..."
424+
KARAF_HOME="" "${REALNAME}" stop >/dev/null 2>&1
425+
426+
SECONDS_WAITED=0
427+
while :; do
428+
if [ -f "${STARTLEVEL_FILE}" ]; then
429+
LEVEL="$(cat "${STARTLEVEL_FILE}" 2>/dev/null)"
430+
if [ -n "${LEVEL}" ] && [ "${LEVEL}" -eq "${STOPPED_TARGET_LEVEL}" ]; then
431+
break
432+
fi
433+
fi
434+
sleep 1
435+
SECONDS_WAITED=$((SECONDS_WAITED + 1))
436+
if [ "${SECONDS_WAITED}" -ge 30 ]; then
437+
echo "Wait timed out!"
438+
break
439+
fi
440+
done
441+
442+
rm -f "${CACHE_REFRESH_LOCK}"
443+
trap - EXIT HUP INT TERM
444+
return 0
445+
}
446+
381447
nothing() {
382448
# nothing to do here
383449
a=a

distributions/openhab/src/main/resources/bin/karaf.bat

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,85 @@ if "%KARAF_DATA%" == "" (
8585
set "KARAF_DATA=%KARAF_BASE%\data"
8686
)
8787

88+
if "%~1"=="" goto AWAIT_CACHE_READY
89+
if /i "%~1"=="console" goto AWAIT_CACHE_READY
90+
goto AFTER_CACHE_READY
91+
92+
:AWAIT_CACHE_READY
93+
set CACHE_FOLDER=%KARAF_DATA%\cache\org.eclipse.osgi
94+
if exist "%CACHE_FOLDER%\.*" goto AFTER_CACHE_READY
95+
96+
set CACHE_REFRESH_LOCK=%KARAF_DATA%\cache-refresh-lock
97+
if exist "%CACHE_REFRESH_LOCK%" goto AFTER_CACHE_READY
98+
type nul > "%CACHE_REFRESH_LOCK%"
99+
echo Refreshing the cache...
100+
101+
set STARTLEVEL_FILE=%KARAF_DATA%\openhab-start-level
102+
set STARTED_TARGET_LEVEL=10
103+
set STOPPED_TARGET_LEVEL=0
104+
> "%STARTLEVEL_FILE%" echo %STOPPED_TARGET_LEVEL%
105+
106+
set RUNHIDDEN=wscript //nologo "%TEMP%\runhidden.vbs"
107+
> "%TEMP%\runhidden.vbs" echo CreateObject("Wscript.Shell").Run WScript.Arguments(0), 0, False
108+
109+
echo Awaiting server load...
110+
set KARAF_HOME=
111+
%RUNHIDDEN% """%~dp0karaf.bat"" server"
112+
setlocal EnableDelayedExpansion
113+
set SECONDS_WAITED=0
114+
115+
:AWAIT_SERVER_STARTED
116+
set LEVEL=
117+
2>nul set /p LEVEL=<"%STARTLEVEL_FILE%"
118+
if defined LEVEL (
119+
set /a LEVEL_A=LEVEL >nul 2>&1
120+
if not errorlevel 1 (
121+
if !LEVEL_A! GEQ %STARTED_TARGET_LEVEL% goto SERVER_STARTED
122+
)
123+
)
124+
if !SECONDS_WAITED! GEQ 30 (
125+
echo Wait timed out!
126+
goto SERVER_STARTED
127+
)
128+
timeout /t 1 /nobreak >nul
129+
set /a SECONDS_WAITED=!SECONDS_WAITED!+1
130+
goto AWAIT_SERVER_STARTED
131+
132+
:SERVER_STARTED
133+
endlocal
134+
135+
echo Awaiting server unload...
136+
set KARAF_HOME=
137+
%RUNHIDDEN% """%~dp0karaf.bat"" stop"
138+
setlocal EnableDelayedExpansion
139+
set SECONDS_WAITED=0
140+
141+
:AWAIT_SERVER_STOPPED
142+
set LEVEL=
143+
2>nul set /p LEVEL=<"%STARTLEVEL_FILE%"
144+
if defined LEVEL (
145+
set /a LEVEL_A=LEVEL >nul 2>&1
146+
if not errorlevel 1 (
147+
if !LEVEL_A! EQU %STOPPED_TARGET_LEVEL% goto SERVER_STOPPED
148+
)
149+
)
150+
if !SECONDS_WAITED! GEQ 30 (
151+
echo Wait timed out!
152+
goto SERVER_STOPPED
153+
)
154+
timeout /t 1 /nobreak >nul
155+
set /a SECONDS_WAITED=!SECONDS_WAITED!+1
156+
goto AWAIT_SERVER_STOPPED
157+
158+
:SERVER_STOPPED
159+
endLocal
160+
del "%CACHE_REFRESH_LOCK%" 2>nul
161+
set KARAF_HOME=
162+
"%~dp0karaf.bat" console
163+
exit /b %ERRORLEVEL%
164+
165+
:AFTER_CACHE_READY
166+
88167
if not "%KARAF_ETC%" == "" (
89168
if not exist "%KARAF_ETC%" (
90169
call :warn KARAF_ETC is not valid: "%KARAF_ETC%"

0 commit comments

Comments
 (0)