1 if($PSVersionTable.PSVersion.Major -lt 2) {
2     Write-Warning "This script requires PowerShell 2.0 or better; you have version $($Host.Version)."
3     return
4 }
5 
6 $SCRIPTS_HOME = (Get-ChildItem $MyInvocation.MyCommand.Path).Directory.FullName
7 $RESOLVED_JBOSS_HOME = (Get-ChildItem $MyInvocation.MyCommand.Path).Directory.Parent.FullName
8 
9 
10 # A collection of functions that are used by the other scripts
11 
Set-Env()12 Function Set-Env {
13   $key = $args[0]
14   $value = $args[1]
15   Set-Content -Path env:$key -Value $value
16 }
17 
Get-Envnull18 Function Get-Env {
19   $key = $args[0]
20   if( Test-Path env:$key ) {
21     return (Get-ChildItem env:$key).Value
22   }
23   return $args[1]
24 }
Get-Env-Boolean()25 Function Get-Env-Boolean{
26   $key = $args[0]
27   if( Test-Path env:$key ) {
28     return (Get-ChildItem env:$key).Value -eq 'true'
29   }
30   return $args[1]
31 }
32 
33 $global:SECMGR = Get-Env-Boolean SECMGR $false
34 $global:DEBUG_MODE=Get-Env DEBUG $false
35 $global:DEBUG_PORT=Get-Env DEBUG_PORT 8787
36 $global:RUN_IN_BACKGROUND=$false
37 $GC_LOG=Get-Env GC_LOG
38 #module opts that are passed to jboss modules
39 $global:MODULE_OPTS = @()
40 
Get-String()41 Function Get-String {
42   $value = ''
43   foreach($k in $args) {
44     $value += $k
45   }
46   return $value
47 }
48 
String-To-Array($value)49 Function String-To-Array($value) {
50   $res = @()
51   if (!$value){
52   	return $res
53   }
54   $tmpArr = $value.split()
55 
56   foreach ($str in $tmpArr) {
57     if ($str) {
58 	  $res += $str
59 	}
60   }
61   return $res
62 }
63 
Display-Environmentnull64 Function Display-Environment {
65 Param(
66    [string[]]$javaOpts
67 ) #end param
68 
69 if (-Not $javaOpts){
70 	$javaOpts = Get-Java-Opts
71 }
72 
73 # Display our environment
74 Write-Host "================================================================================="
75 Write-Host ""
76 Write-Host "  JBoss Bootstrap Environment"
77 Write-Host ""
78 Write-Host "  JBOSS_HOME: $JBOSS_HOME"
79 Write-Host ""
80 Write-Host "  JAVA: $JAVA"
81 Write-Host ""
82 Write-Host "  MODULE_OPTS: $MODULE_OPTS"
83 Write-Host ""
84 Write-Host "  JAVA_OPTS: $javaOpts"
85 Write-Host ""
86 Write-Host "================================================================================="
87 Write-Host ""
88 
89 }
90 
91 #todo: bit funky at the moment, should probably be done via global variable
Get-Java-Optsnull92 Function Get-Java-Opts {
93 	if($PRESERVE_JAVA_OPTS -ne 'true') { # if not perserve, then check for enviroment variable and use that
94 		if( (Test-Path env:JAVA_OPTS)) {
95 			$ops = Get-Env JAVA_OPTS
96 			# This is Powershell, so split the incoming string on a space into array
97 			return String-To-Array -value $ops
98 			Write-Host "JAVA_OPTS already set in environment; overriding default settings with values: $JAVA_OPTS"
99 		}
100 	}
101 	return $JAVA_OPTS
102 }
103 
Display-Array($array)104 Function Display-Array($array){
105 	for ($i=0; $i -lt $array.length; $i++) {
106 		$v =  "$i " + $array[$i]
107 		Write-Host $v
108 	}
109 }
110 
111 
Get-Java-Argumentsnull112 Function Get-Java-Arguments {
113 Param(
114    [Parameter(Mandatory=$true)]
115    [string]$entryModule,
116    [string]$logFileProperties = "$JBOSS_CONFIG_DIR/logging.properties",
117    [string]$logFile = "$JBOSS_LOG_DIR/server.log",
118    [string[]]$serverOpts
119 
120 
121 ) #end param
122   $JAVA_OPTS = Get-Java-Opts #takes care of looking at defind settings and/or using env:JAVA_OPTS
123 
124   $PROG_ARGS = @()
125   if ($JAVA_OPTS -ne $null){
126   	$PROG_ARGS += $JAVA_OPTS
127   }
128   if ($logFile){
129   	$PROG_ARGS += "-Dorg.jboss.boot.log.file=$logFile"
130   }
131   if ($logFileProperties){
132   	$PROG_ARGS += "-Dlogging.configuration=file:$logFileProperties"
133   }
134   $PROG_ARGS += "-Djboss.home.dir=$JBOSS_HOME"
135   $PROG_ARGS += "-Djboss.server.base.dir=$global:JBOSS_BASE_DIR"
136   $PROG_ARGS += "-Djboss.server.config.dir=$global:JBOSS_CONFIG_DIR"
137 
138   if ($GC_LOG -eq $true){
139     if ($PROG_ARGS -notcontains "-verbose:gc"){
140         Rotate-GC-Logs
141 		if (-not(Test-Path $JBOSS_LOG_DIR)) {
142 			$dir = New-Item $JBOSS_LOG_DIR -type directory -ErrorAction SilentlyContinue
143 		}
144         $PROG_ARGS += "-verbose:gc"
145         $PROG_ARGS += "-XX:+PrintGCDetails"
146         $PROG_ARGS += "-XX:+PrintGCDateStamps"
147         $PROG_ARGS += "-XX:+UseGCLogFileRotation"
148         $PROG_ARGS += "-XX:NumberOfGCLogFiles=5"
149         $PROG_ARGS += "-XX:GCLogFileSize=3M"
150         $PROG_ARGS += "-XX:-TraceClassUnloading"
151         $PROG_ARGS += "-Xloggc:$JBOSS_LOG_DIR\gc.log"
152     }
153   }
154   $global:FINAL_JAVA_OPTS = $PROG_ARGS
155 
156   $PROG_ARGS += "-jar"
157   $PROG_ARGS += "$JBOSS_HOME\jboss-modules.jar"
158   if ($MODULE_OPTS -ne $null){
159   	$PROG_ARGS += $MODULE_OPTS
160   }
161   $PROG_ARGS += "-mp"
162   $PROG_ARGS += "$JBOSS_MODULEPATH"
163   $PROG_ARGS += $entryModule
164   if ($serverOpts -ne $null){
165   	$PROG_ARGS += $serverOpts
166   }
167   return $PROG_ARGS
168 }
169 
Process-Script-Parameters()170 Function Process-Script-Parameters {
171 Param(
172    [Parameter(Mandatory=$false)]
173    [string[]]$Params
174 
175 ) #end param
176     $res = @()
177 	for($i=0; $i -lt $Params.Count; $i++){
178 		$arg = $Params[$i]
179 		if ($arg -eq '--debug'){
180 			$global:DEBUG_MODE=$true
181 			if ($args[$i+1] -match '\d+'){ #port number can only follow --debug
182 				$global:DEBUG_PORT = $Params[$i+1]
183 				$i++
184 				continue
185 			}
186 		}elseif ($arg -contains '-Djava.security.manager'){
187 			Write-Warning "ERROR: The use of -Djava.security.manager has been removed. Please use the -secmgr command line argument or SECMGR=true environment variable."
188 			exit
189 		}elseif ($arg -eq '-secmgr'){
190 			$global:SECMGR = $true
191 		}elseif ($arg -eq '--background'){
192 			$global:RUN_IN_BACKGROUND = $true
193 		}else{
194 			$res+=$arg
195 		}
196 	}
197 	return $res
198 }
199 
Start-WildFly-Process()200 Function Start-WildFly-Process {
201  Param(
202    [Parameter(Mandatory=$true)]
203    [string[]] $programArguments,
204    [boolean] $runInBackground = $false
205 
206 ) #end param
207 
208 	if(($JBOSS_PIDFILE -ne '') -and (Test-Path $JBOSS_PIDFILE)) {
209 		$processId = gc $JBOSS_PIDFILE
210 		if ($processId -ne $null){
211 			$proc = Get-Process -Id $processId -ErrorAction SilentlyContinue
212 		}
213 		if ($proc -ne $null){
214 			Write-Warning "Looks like a server process is already running. If it isn't then, remove the $JBOSS_PIDFILE and try again"
215 			return
216 		}else{
217 			Remove-Item $JBOSS_PIDFILE
218 		}
219 	}
220 
221 	if($runInBackground) {
222 		$process = Start-Process -FilePath $JAVA -ArgumentList $programArguments -NoNewWindow -RedirectStandardOutput $global:CONSOLE_LOG -WorkingDirectory $JBOSS_HOME -PassThru
223 		$processId = $process.Id;
224 		echo "Started process in background, process id: $processId"
225 		if ($JBOSS_PIDFILE -ne $null){
226 			$processId >> $JBOSS_PIDFILE
227 		}
228 	} else {
229 		try{
230 			pushd $JBOSS_HOME
231 			& $JAVA $programArguments
232 			if ($LastExitCode -eq 10){ # :shutdown(restart=true) was called
233 			    Write-Host "Restarting application server..."
234 				Start-WildFly-Process -programArguments $programArguments
235 			}
236 
237 		}finally{
238 			popd
239 		}
240 	}
241 	Env-Clean-Up
242 }
243 
Set-Global-Variables()244 Function Set-Global-Variables {
245 PARAM(
246 [Parameter(Mandatory=$true)]
247    [string]$baseDir
248 )
249 
250 	# determine the default base dir, if not set
251 	$global:JBOSS_BASE_DIR = $baseDir;
252 
253 	# determine the default log dir, if not set
254 	$global:JBOSS_LOG_DIR = Get-Env JBOSS_LOG_DIR $JBOSS_BASE_DIR\log
255 
256 	# determine the default configuration dir, if not set
257 	$global:JBOSS_CONFIG_DIR = Get-Env JBOSS_CONFIG_DIR $JBOSS_BASE_DIR\configuration
258 
259 	$global:CONSOLE_LOG = $JBOSS_LOG_DIR + '\console.log'
260 }
261 
Set-Global-Variables-Standalonenull262 Function Set-Global-Variables-Standalone {
263 	$dir = Get-Env JBOSS_BASE_DIR $JBOSS_HOME\standalone
264 	Set-Global-Variables -baseDir $dir
265 }
266 
Set-Global-Variables-Domainnull267 Function Set-Global-Variables-Domain {
268 	$dir = Get-Env JBOSS_BASE_DIR $JBOSS_HOME\domain
269 	Set-Global-Variables -baseDir $dir
270 }
271 
Env-Clean-Upnull272 Function Env-Clean-Up {
273 	[Environment]::SetEnvironmentVariable("JBOSS_HOME", $null, "Process")
274 }
275 
Rotate-GC-Logs()276 Function Rotate-GC-Logs {
277 	mv -ErrorAction SilentlyContinue $JBOSS_LOG_DIR/gc.log.0 $JBOSS_LOG_DIR/backupgc.log.0
278 	mv -ErrorAction SilentlyContinue $JBOSS_LOG_DIR/gc.log.1 $JBOSS_LOG_DIR/backupgc.log.1
279 	mv -ErrorAction SilentlyContinue $JBOSS_LOG_DIR/gc.log.2 $JBOSS_LOG_DIR/backupgc.log.2
280 	mv -ErrorAction SilentlyContinue $JBOSS_LOG_DIR/gc.log.3 $JBOSS_LOG_DIR/backupgc.log.3
281 	mv -ErrorAction SilentlyContinue $JBOSS_LOG_DIR/gc.log.4 $JBOSS_LOG_DIR/backupgc.log.4
282 	mv -ErrorAction SilentlyContinue $JBOSS_LOG_DIR/gc.log.*.current $JBOSS_LOG_DIR/backupgc.log.current
283 }
284 
Check-For-GC-Log()285 Function Check-For-GC-Log {
286 	if (GC_LOG){
287 		$args = (,'-verbose:gc',"-Xloggc:$JBOSS_LOG_DIR/gc.log","-XX:+PrintGCDetails","-XX:+PrintGCDateStamps","-XX:+UseGCLogFileRotation","-XX:NumberOfGCLogFiles=5","-XX:GCLogFileSize=3M","-XX:-TraceClassUnloading",'-version')
288 		$OutputVariable = (&$JAVA $args )  | Out-String
289 	}
290 }
291 
292 # Setup JBOSS_HOME
293 if((Test-Path env:JBOSS_HOME) -and (Test-Path (Get-Item env:JBOSS_HOME))) {# checks if env variable jboss is set and is valid folder
294   $SANITIZED_JBOSS_HOME = (Get-Item env:JBOSS_HOME).FullName
295   if($SANITIZED_JBOSS_HOME -ne $RESOLVED_JBOSS_HOME) {
296     echo "WARNING JBOSS_HOME may be pointing to a different installation - unpredictable results may occur."
297     echo ""
298   }
299   $JBOSS_HOME=$SANITIZED_JBOSS_HOME
300 } else {
301     # get the full path (without any relative bits)
302     $JBOSS_HOME=$RESOLVED_JBOSS_HOME
303 }
304 
305 # Setup the JVM
306 if (!(Test-Path env:JAVA)) {
307   if( Test-Path env:JAVA_HOME) {
308 	$JAVA_HOME = (Get-ChildItem env:JAVA_HOME).Value
309 	$JAVA = $JAVA_HOME + "\bin\java.exe"
310   } else {
311     $JAVA = 'java'
312   }
313 }
314 
315 # determine the default module path, if not set
316 $JBOSS_MODULEPATH = Get-Env JBOSS_MODULEPATH $JBOSS_HOME\modules
317 
318 Set-Global-Variables-Standalone
319 
320 # Determine the default JBoss PID file
321 $JBOSS_PIDFILE = Get-Env JBOSS_PIDFILE $SCRIPTS_HOME\process.pid
322 
323 [Environment]::SetEnvironmentVariable("JBOSS_HOME", $JBOSS_HOME, "Process")