Skip to content

Commit

Permalink
Windows support
Browse files Browse the repository at this point in the history
  • Loading branch information
nuex committed Apr 6, 2014
1 parent 0d292ff commit 91481ad
Show file tree
Hide file tree
Showing 5 changed files with 339 additions and 16 deletions.
12 changes: 12 additions & 0 deletions bootstrap.cmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
:: A script to build relx on Windows
:: Requires rebar

:: Get dependencies, compile and escriptize relx
@cmd /c @rebar -r get-deps compile escriptize

:: Create a shortcut file for running the relx command
@set relx_cmd=relx.cmd
@echo @echo off > %relx_cmd%
@echo setlocal >> %relx_cmd%
@echo set relx=%%~f0 >> %relx_cmd%
@echo escript ^"%%relx:.cmd=%%^" %%* >> %relx_cmd%
75 changes: 75 additions & 0 deletions priv/templates/bin_windows.dtl
Original file line number Diff line number Diff line change
@@ -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
4 changes: 4 additions & 0 deletions priv/templates/erl_ini.dtl
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
[erlang]
Bindir={{ bin_dir }}
Progname=erl
Rootdir={{ output_dir }}
176 changes: 176 additions & 0 deletions priv/templates/extended_bin_windows.dtl
Original file line number Diff line number Diff line change
@@ -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
Loading

0 comments on commit 91481ad

Please sign in to comment.