Hadoop Generic PowerShell Write Action

Ambari.SCOM.Management.Module.BaseScriptedWriteAction (WriteActionModuleType)

This module allows you to execute PowerShell scripts from tasks.

Element properties:

TypeWriteActionModuleType
IsolationAny
AccessibilityInternal
RunAsAmbari.SCOM.Profile.Workflow
InputTypeSystem.BaseData

Member Modules:

ID Module Type TypeId RunAs 
Action WriteAction Microsoft.Windows.PowerShellWriteAction Default

Source Code:

<WriteActionModuleType ID="Ambari.SCOM.Management.Module.BaseScriptedWriteAction" RunAs="HDLibrary!Ambari.SCOM.Profile.Workflow" Accessibility="Internal">
<Configuration>
<IncludeSchemaTypes>
<SchemaType>Windows!Microsoft.Windows.PowerShellSchema</SchemaType>
</IncludeSchemaTypes>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="ScriptName" type="NonNullString"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="ScriptBody" type="NonNullString"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="Parameters" type="NamedParametersType"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="TimeoutSeconds" type="xsd:int"/>
</Configuration>
<OverrideableParameters/>
<ModuleImplementation>
<Composite>
<MemberModules>
<WriteAction ID="Action" TypeID="Windows!Microsoft.Windows.PowerShellWriteAction">
<ScriptName>$Config/ScriptName$</ScriptName>
<ScriptBody><Script>
$Config/ScriptBody$

## 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.

function TraceTaskExecution($message) {
Write-Host "[$((Get-Date).ToString('MM/dd/yyyy HH:mm:ss'))] $message"
}

function WaitForTasksCompletion($scheduledTasks) {
$tasks = [System.Collections.ArrayList] $scheduledTasks

while ($tasks.Count -gt 0) {
Start-Sleep -s $StatusPollingInterval

for ($taskIndex = 0; $taskIndex -lt $tasks.Count; ++$taskIndex) {
$response = (InvokeRestAPI $tasks[$taskIndex].href $Username $Password).Body

TraceTaskExecution "Task $($response.Tasks.command) for $($response.Tasks.role) on $($response.Tasks.host_name) is $($response.Tasks.status)."
if ($response.Tasks.status -ne 'COMPLETED') { continue }

if ($response.Tasks.exit_code -eq 0) {
$tasks.RemoveAt($taskIndex--)
} else {
throw "Task $($response.Tasks.command) for $($response.Tasks.role) on $($response.Tasks.host_name) failed: $($response.Tasks.stderr)."
}
}
}
}
## 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.

$UserAgent = $("{0} (PowerShell {1}; .NET CLR {2}; {3})" -f "SCOM MP",
$(if ($Host.Version) { $Host.Version } else { "1.0" }),
[Environment]::Version,
[Environment]::OSVersion.ToString().Replace("Microsoft Windows ", "Win"))

function InvokeRestAPI($uri, [string]$username, [string]$password, [string]$method = 'GET', [string]$requestBody = $null) {
# TODO: Remove prior to release!
#TraceTaskExecution "$method $uri $requestBody"
$request = [System.Net.HttpWebRequest]::Create($uri)
$request.Method = $method
$request.UserAgent = $UserAgent
$request.Timeout = 30000

$credentials = [Convert]::ToBase64String([Text.Encoding]::Default.GetBytes($username + ':' + $password));
$request.Headers.Add('Authorization', "Basic $credentials")

if ($requestBody) {
$requestData = [Text.Encoding]::UTF8.GetBytes($requestBody)
$request.ContentLength = $requestData.Length
$requestStream = $request.GetRequestStream()
$requestStream.Write($requestData, 0, $requestData.Length)
$requestStream.Close()
}

$response = $request.GetResponse()
if ([int]$response.StatusCode -lt 200 -or [int]$response.StatusCode -ge 300) {
throw "Ambari API response status is $($response.StatusCode) : $($response.StatusDescription)."
}
$reader = [IO.StreamReader] $response.GetResponseStream()
$jsonString = $reader.ReadToEnd()
$reader.Close()
$response.Close()

if ($jsonString) {
@{ StatusCode = [int]$response.StatusCode;
Body = ParseJsonString $jsonString }
} else {
@{ StatusCode = $response.StatusCode }
}
}

function JoinUri([string]$baseUri, [string]$segment) {
$baseUri.TrimEnd('/') + '/' + $segment.TrimStart('/')
}## 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.

try {
$JSONUtil = (Add-Type -Language JScript -MemberDefinition "static function parseJSON(json){return eval('('+json+')');}" -Name "JSONUtil" -PassThru)[1]
} catch {
TraceTaskExecution "Failed to create JSON parser: $_"
}

function ParseJsonString([string] $jsonString) {
$jsObject = $JSONUtil::parseJSON($jsonString)
ConvertJsObject([ref]$jsObject)
}

function ConvertJsObject([ref]$objRef) {
$obj = $objRef.Value
if ($obj -is [Microsoft.JScript.ArrayObject]) {
return ,(ConvertJsArrayObject([ref]$obj))
} elseif ($obj -is [Microsoft.JScript.JSObject]) {
return ConvertJsScriptObject([ref]$obj)
} else {
return $obj
}
}

function ConvertJsScriptObject([ref]$objRef) {
$obj = $objRef.Value
$result = @{}
foreach ($fieldName in $obj) {
$result[$fieldName] = ConvertJsObject([ref]$obj[$fieldName])
}
$result
}

function ConvertJsArrayObject([ref]$arrayRef) {
$array = $arrayRef.Value
$result = @()
foreach ($index in $array) {
$conv = ConvertJsObject([ref]$array[$index])
$result += $conv
}
return ,$result
}


Main
</Script></ScriptBody>
<SnapIns/>
<Parameters>$Config/Parameters$</Parameters>
<TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
<StrictErrorHandling>true</StrictErrorHandling>
</WriteAction>
</MemberModules>
<Composition>
<Node ID="Action"/>
</Composition>
</Composite>
</ModuleImplementation>
<InputType>System!System.BaseData</InputType>
</WriteActionModuleType>