diff options
Diffstat (limited to 'ambari-agent/conf/windows/createservice.ps1')
-rw-r--r-- | ambari-agent/conf/windows/createservice.ps1 | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/ambari-agent/conf/windows/createservice.ps1 b/ambari-agent/conf/windows/createservice.ps1 new file mode 100644 index 0000000000..f3936e2851 --- /dev/null +++ b/ambari-agent/conf/windows/createservice.ps1 @@ -0,0 +1,195 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License + +param( + [String] + [Parameter(Mandatory=$true )] + $username, + [String] + [Parameter(Mandatory=$true )] + $password, + [String] + [Parameter(Mandatory=$true )] + $servicename, + [String] + [Parameter(Mandatory=$true )] + $hdpResourcesDir, + [String] + [Parameter(Mandatory=$true )] + $servicecmdpath + ) + +function Invoke-Cmd ($command) +{ + Write-Output $command + $out = cmd.exe /C "$command" 2>&1 + Write-Output $out + return $out +} + +function Invoke-CmdChk ($command) +{ + Write-Output $command + $out = cmd.exe /C "$command" 2>&1 + Write-Output $out + if (-not ($LastExitCode -eq 0)) + { + throw "Command `"$out`" failed with exit code $LastExitCode " + } + return $out +} + +### Stops and deletes the Hadoop service. +function StopAndDeleteHadoopService( + [String] + [Parameter( Position=0, Mandatory=$true )] + $service +) +{ + Write-Output "Stopping $service" + $s = Get-Service $service -ErrorAction SilentlyContinue + + if( $s -ne $null ) + { + Stop-Service $service + $cmd = "sc.exe delete $service" + Invoke-Cmd $cmd + } +} + +# Convenience method for processing command-line credential objects +# Assumes $credentialsHash is a hash with one of the following being true: +# - keys "username" and "password"/"passwordBase64" are set to strings +# - key "credentialFilePath" is set to the path of a serialized PSCredential object +function Get-HadoopUserCredentials($credentialsHash) +{ + Write-Output "Using provided credentials for username $($credentialsHash["username"])" | Out-Null + $username = $credentialsHash["username"] + if($username -notlike "*\*") + { + $username = "$ENV:COMPUTERNAME\$username" + } + $securePassword = $credentialsHash["password"] | ConvertTo-SecureString -AsPlainText -Force + $creds = New-Object System.Management.Automation.PSCredential $username, $securePassword + return $creds +} + +### Creates and configures the service. +function CreateAndConfigureHadoopService( + [String] + [Parameter( Position=0, Mandatory=$true )] + $service, + [String] + [Parameter( Position=1, Mandatory=$true )] + $hdpResourcesDir, + [String] + [Parameter( Position=2, Mandatory=$true )] + $serviceBinDir, + [String] + [Parameter( Position=3, Mandatory=$true )] + $servicecmdpath, + [System.Management.Automation.PSCredential] + [Parameter( Position=4, Mandatory=$true )] + $serviceCredential +) +{ + if ( -not ( Get-Service "$service" -ErrorAction SilentlyContinue ) ) + { + Write-Output "Creating service `"$service`" as $serviceBinDir\$service.exe" + $xcopyServiceHost_cmd = "copy /Y `"$hdpResourcesDir\namenode.exe`" `"$serviceBinDir\$service.exe`"" + Invoke-CmdChk $xcopyServiceHost_cmd + + #HadoopServiceHost.exe will write to this log but does not create it + #Creating the event log needs to be done from an elevated process, so we do it here + if( -not ([Diagnostics.EventLog]::SourceExists( "$service" ))) + { + [Diagnostics.EventLog]::CreateEventSource( "$service", "" ) + } + Write-Output "Adding service $service" + if ($serviceCredential.Password.get_Length() -ne 0) + { + $s = New-Service -Name "$service" -BinaryPathName "$serviceBinDir\$service.exe" -Credential $serviceCredential -DisplayName "Apache Hadoop $service" + if ( $s -eq $null ) + { + throw "CreateAndConfigureHadoopService: Service `"$service`" creation failed" + } + } + else + { + # Separately handle case when password is not provided + # this path is used for creating services that run under (AD) Managed Service Account + # for them password is not provided and in that case service cannot be created using New-Service commandlet + $serviceUserName = $serviceCredential.UserName + $cred = $serviceCredential.UserName.Split("\") + + # Throw exception if domain is not specified + if (($cred.Length -lt 2) -or ($cred[0] -eq ".")) + { + throw "Environment is not AD or domain is not specified" + } + + $cmd="$ENV:WINDIR\system32\sc.exe create `"$service`" binPath= `"$serviceBinDir\$service.exe`" obj= $serviceUserName DisplayName= `"Apache Hadoop $service`" " + try + { + Invoke-CmdChk $cmd + } + catch + { + throw "CreateAndConfigureHadoopService: Service `"$service`" creation failed" + } + } + + $cmd="$ENV:WINDIR\system32\sc.exe failure $service reset= 30 actions= restart/5000" + Invoke-CmdChk $cmd + + $cmd="$ENV:WINDIR\system32\sc.exe config $service start= demand" + Invoke-CmdChk $cmd + + + Write-Output "Creating service config ${serviceBinDir}\$service.xml" + $cmd = "$servicecmdpath --service $service > `"$serviceBinDir\$service.xml`"" + Invoke-CmdChk $cmd + } + else + { + Write-Output "Service `"$service`" already exists, Removing `"$service`"" + StopAndDeleteHadoopService $service + CreateAndConfigureHadoopService $service $hdpResourcesDir $serviceBinDir $servicecmdpath $serviceCredential + } +} + + +try +{ + Write-Output "Creating credential object" + ### + ### Create the Credential object from the given username and password or the provided credentials file + ### + $serviceCredential = Get-HadoopUserCredentials -credentialsHash @{"username" = $username; "password" = $password} + $username = $serviceCredential.UserName + Write-Output "Username: $username" + + Write-Output "Creating service $service" + ### + ### Create Service + ### + CreateAndConfigureHadoopService $servicename $hdpResourcesDir $hdpResourcesDir $servicecmdpath $serviceCredential + Write-Output "Done" +} +catch +{ + Write-Output "Failure" + exit 1 +}
\ No newline at end of file |