aboutsummaryrefslogtreecommitdiffstats
path: root/priv
diff options
context:
space:
mode:
authorJordan Wilberding <[email protected]>2014-04-07 10:50:10 +0200
committerJordan Wilberding <[email protected]>2014-04-07 10:50:10 +0200
commit5561818c5620066899a6bf74ae59a873d94d8aef (patch)
tree2614d3b766862978523eb49e6dd3f6e71c73c21a /priv
parent0d292ff4c1be173a775628c09d1ac9991fdd8e67 (diff)
parent879108a2aa4e463df1b14830661c0820fcdccb11 (diff)
downloadrelx-5561818c5620066899a6bf74ae59a873d94d8aef.tar.gz
relx-5561818c5620066899a6bf74ae59a873d94d8aef.tar.bz2
relx-5561818c5620066899a6bf74ae59a873d94d8aef.zip
Merge pull request #159 from nuex/windows
Windows Support
Diffstat (limited to 'priv')
-rw-r--r--priv/templates/bin_windows.dtl75
-rw-r--r--priv/templates/erl_ini.dtl4
-rw-r--r--priv/templates/extended_bin_windows.dtl176
3 files changed, 255 insertions, 0 deletions
diff --git a/priv/templates/bin_windows.dtl b/priv/templates/bin_windows.dtl
new file mode 100644
index 0000000..170d957
--- /dev/null
+++ b/priv/templates/bin_windows.dtl
@@ -0,0 +1,75 @@
+:: This is a simple start batch file that runs the release in an Erlang shell
+
+:: 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 }}
+
+:: Set the root release directory based on the location of this batch file
+@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
+
+@set rootdir=%release_root_dir%
+@set bindir=%erts_dir%\bin
+@set progname=erl
+@set erl=%bindir%\erl
+
+cd %rootdir%
+
+:: Write the erl.ini file
+@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%"
+
+:: Start the release in an `erl` shell
+@%erl% %erl_opts% %sys_config% -boot "%rel_dir%\%rel_name%" %*
+
+@goto :eof
+
+:: Find the ERTS dir
+:find_erts_dir
+@set erts_dir=%release_root_dir%\erts-%erts_vsn%
+@if exist %erts_dir% (
+ @goto :set_erts_dir_from_default
+) else (
+ @goto :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=%erts_dir%
+@set root_dir=%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
diff --git a/priv/templates/erl_ini.dtl b/priv/templates/erl_ini.dtl
new file mode 100644
index 0000000..b2ce5bc
--- /dev/null
+++ b/priv/templates/erl_ini.dtl
@@ -0,0 +1,4 @@
+[erlang]
+Bindir={{ bin_dir }}
+Progname=erl
+Rootdir={{ output_dir }}
diff --git a/priv/templates/extended_bin_windows.dtl b/priv/templates/extended_bin_windows.dtl
new file mode 100644
index 0000000..1f94675
--- /dev/null
+++ b/priv/templates/extended_bin_windows.dtl
@@ -0,0 +1,176 @@
+:: 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
+
+@set bindir=%erts_dir%\bin
+@set vm_args=%rel_dir%\vm.args
+@set progname=erl.exe
+@set boot_script=%rel_dir%\%rel_name%
+@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"=="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
+
+:: 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^|console^|ping^|list^|attach^)
+@goto :eof
+
+:: Install the release as a Windows service
+:install
+@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 %rel_name% %node_type% "%node_name%" -c "%description%" ^
+ -w "%rootdir%" -m "%start_erl%" -args "%args%" ^
+ -stopaction "init:stop()."
+@goto :eof
+
+:: Uninstall the Windows service
+:uninstall
+@%erlsrv% remove %rel_name%
+@%epmd% -kill
+@goto :eof
+
+:: Start the Windows service
+:start
+@%erlsrv% start %rel_name%
+@goto :eof
+
+:: Stop the Windows service
+:stop
+@%erlsrv% stop %rel_name%
+@goto :eof
+
+:: Start a console
+:console
+@start "%rel_name% console" %werl% -boot "%boot_script%" "%sys_config%" ^
+ -args_file "%vm_args%" %node_type% %node_name%
+@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 %rel_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