aboutsummaryrefslogtreecommitdiffstats
path: root/priv/templates/extended_bin_windows
diff options
context:
space:
mode:
Diffstat (limited to 'priv/templates/extended_bin_windows')
-rw-r--r--priv/templates/extended_bin_windows207
1 files changed, 207 insertions, 0 deletions
diff --git a/priv/templates/extended_bin_windows b/priv/templates/extended_bin_windows
new file mode 100644
index 0000000..cb9f747
--- /dev/null
+++ b/priv/templates/extended_bin_windows
@@ -0,0 +1,207 @@
+:: This batch file handles managing an Erlang node as a Windows service.
+::
+:: Commands provided:
+::
+:: * install - install the release as a Windows service
+:: * start - start the service and Erlang node
+:: * stop - stop the service and Erlang node
+:: * restart - run the stop command and start command
+:: * uninstall - uninstall the service and kill a running node
+:: * ping - check if the node is running
+:: * console - start the Erlang release in a `werl` Windows shell
+:: * attach - connect to a running node and open an interactive console
+:: * list - display a listing of installed Erlang services
+:: * usage - display available commands
+
+:: Set variables that describe the release
+@set rel_name={{ rel_name }}
+@set rel_vsn={{ rel_vsn }}
+@set erts_vsn={{ erts_vsn }}
+@set erl_opts={{ erl_opts }}
+
+:: Discover the release root directory from the directory
+:: of this script
+@set script_dir=%~dp0
+@for %%A in ("%script_dir%\..") do @(
+ set release_root_dir=%%~fA
+)
+@set rel_dir=%release_root_dir%\releases\%rel_vsn%
+
+@call :find_erts_dir
+@call :find_sys_config
+@call :set_boot_script_var
+
+@set service_name=%rel_name%_%rel_vsn%
+@set bindir=%erts_dir%\bin
+@set vm_args=%rel_dir%\vm.args
+@set progname=erl.exe
+@set clean_boot_script=%release_root_dir%\bin\start_clean
+@set erlsrv="%bindir%\erlsrv.exe"
+@set epmd="%bindir%\epmd.exe"
+@set escript="%bindir%\escript.exe"
+@set werl="%bindir%\werl.exe"
+@set nodetool="%release_root_dir%\bin\nodetool"
+
+:: Extract node type and name from vm.args
+@for /f "usebackq tokens=1-2" %%I in (`findstr /b "\-name \-sname" "%vm_args%"`) do @(
+ set node_type=%%I
+ set node_name=%%J
+)
+
+:: Extract cookie from vm.args
+@for /f "usebackq tokens=1-2" %%I in (`findstr /b \-setcookie "%vm_args%"`) do @(
+ set cookie=%%J
+)
+
+:: Write the erl.ini file to set up paths relative to this script
+@call :write_ini
+
+:: If a start.boot file is not present, copy one from the named .boot file
+@if not exist "%rel_dir%\start.boot" (
+ copy "%rel_dir%\%rel_name%.boot" "%rel_dir%\start.boot" >nul
+)
+
+@if "%1"=="install" @goto install
+@if "%1"=="uninstall" @goto uninstall
+@if "%1"=="start" @goto start
+@if "%1"=="stop" @goto stop
+@if "%1"=="restart" @call :stop && @goto start
+@if "%1"=="upgrade" @goto relup
+@if "%1"=="downgrade" @goto relup
+@if "%1"=="console" @goto console
+@if "%1"=="ping" @goto ping
+@if "%1"=="list" @goto list
+@if "%1"=="attach" @goto attach
+@if "%1"=="" @goto usage
+@echo Unknown command: "%1"
+
+@goto :eof
+
+:: Find the ERTS dir
+:find_erts_dir
+@set possible_erts_dir=%release_root_dir%\erts-%erts_vsn%
+@if exist "%possible_erts_dir%" (
+ call :set_erts_dir_from_default
+) else (
+ call :set_erts_dir_from_erl
+)
+@goto :eof
+
+:: Set the ERTS dir from the passed in erts_vsn
+:set_erts_dir_from_default
+@set erts_dir=%possible_erts_dir%
+@set rootdir=%release_root_dir%
+@goto :eof
+
+:: Set the ERTS dir from erl
+:set_erts_dir_from_erl
+@for /f "delims=" %%i in ('where erl') do @(
+ set erl=%%i
+)
+@set dir_cmd="%erl%" -noshell -eval "io:format(\"~s\", [filename:nativename(code:root_dir())])." -s init stop
+@for /f %%i in ('%%dir_cmd%%') do @(
+ set erl_root=%%i
+)
+@set erts_dir=%erl_root%\erts-%erts_vsn%
+@set rootdir=%erl_root%
+@goto :eof
+
+:: Find the sys.config file
+:find_sys_config
+@set possible_sys=%rel_dir%\sys.config
+@if exist %possible_sys% (
+ set sys_config=-config %possible_sys%
+)
+@goto :eof
+
+:: set boot_script variable
+:set_boot_script_var
+@if exist "%rel_dir%\%rel_name%.boot" (
+ set boot_script=%rel_dir%\%rel_name%
+) else (
+ set boot_script=%rel_dir%\start
+)
+@goto :eof
+
+:: Write the erl.ini file
+:write_ini
+@set erl_ini=%erts_dir%\bin\erl.ini
+@set converted_bindir=%bindir:\=\\%
+@set converted_rootdir=%rootdir:\=\\%
+@echo [erlang] > "%erl_ini%"
+@echo Bindir=%converted_bindir% >> "%erl_ini%"
+@echo Progname=%progname% >> "%erl_ini%"
+@echo Rootdir=%converted_rootdir% >> "%erl_ini%"
+@goto :eof
+
+:: Display usage information
+:usage
+@echo usage: %~n0 ^(install^|uninstall^|start^|stop^|restart^|upgrade^|downgrade^|console^|ping^|list^|attach^)
+@goto :eof
+
+:: Install the release as a Windows service
+:: or install the specified version passed as argument
+:install
+@if "" == "%2" (
+ :: Install the service
+ set args=%erl_opts% -setcookie %cookie% ++ -rootdir \"%rootdir%\"
+ set start_erl=%erts_dir%\bin\start_erl.exe
+ set description=Erlang node %node_name% in %rootdir%
+ %erlsrv% add %service_name% %node_type% "%node_name%" -c "%description%" ^
+ -w "%rootdir%" -m "%start_erl%" -args "%args%" ^
+ -stopaction "init:stop()."
+) else (
+ :: relup and reldown
+ goto relup
+)
+@goto :eof
+
+:: Uninstall the Windows service
+:uninstall
+@%erlsrv% remove %service_name%
+@%epmd% -kill
+@goto :eof
+
+:: Start the Windows service
+:start
+@%erlsrv% start %service_name%
+@goto :eof
+
+:: Stop the Windows service
+:stop
+@%erlsrv% stop %service_name%
+@goto :eof
+
+:: Relup and reldown
+:relup
+@if "" == "%2" (
+ echo Missing package argument
+ echo Usage: %rel_name% %1 {package base name}
+ echo NOTE {package base name} MUST NOT include the .tar.gz suffix
+ set ERRORLEVEL=1
+ exit /b %ERRORLEVEL%
+)
+@%escript% "%rootdir%/bin/install_upgrade.escript" "%rel_name%" "%node_name%" "%cookie%" "%2"
+@goto :eof
+
+:: Start a console
+:console
+@start "%rel_name% console" %werl% -boot "%boot_script%" "%sys_config%" ^
+ -args_file "%vm_args%"
+@goto :eof
+
+:: Ping the running node
+:ping
+@%escript% %nodetool% ping %node_type% "%node_name%" -setcookie "%cookie%"
+@goto :eof
+
+:: List installed Erlang services
+:list
+@%erlsrv% list %service_name%
+@goto :eof
+
+:: Attach to a running node
+:attach
+@start "%node_name% attach" %werl% -boot "%clean_boot_script%" ^
+ -remsh %node_name% %node_type% console -setcookie %cookie%
+@goto :eof