Description

PS C:\> Get-Help .\FS4SP.ps1

NAME
    C:\FASTSearch\Shell\Operation\FS14\FS4SP.ps1

SYNOPSIS
    Performs FASTSearch start & stop.


SYNTAX
    C:\FASTSearch\Shell\Operation\FS14\FS4SP.ps1 [[-action] <String>] [-thisNode <String>] [-adminNode] [-col <String>]
     [-row <String>] [-retries <Int32>] [<CommonParameters>]


DESCRIPTION
    Performs start or stop of the FASTSearch system. Action (starting or stopping) is governed by the -action parameter
    .

    When the FASTSearch system spans multiple nodes, PowerShell Remoting must be enabled, and CredSSP Authentication mu
    st be configured.


RELATED LINKS
    about_Remote
    Enable-PSRemoting
    Enable-WSManCredSSP

REMARKS
    To see the examples, type: "get-help C:\FASTSearch\Shell\Operation\FS14\FS4SP.ps1 -examples".
    For more information, type: "get-help C:\FASTSearch\Shell\Operation\FS14\FS4SP.ps1 -detailed".
    For technical information, type: "get-help C:\FASTSearch\Shell\Operation\FS14\FS4SP.ps1 -full".

    -------------------------- EXAMPLE 1 --------------------------

    C:\PS>FS4SP -action "start"

 

Script

PowerShell
Edit|Remove
#Get input 
param 
( 
    [parameter(position=0)][ValidateNotNullOrEmpty()][string]$action, 
    [string]$thisNode, 
    [switch]$adminNode = $false, 
    [string]$col, 
    [string]$row, 
    [int]$retries = 3 
) 
 
set-strictmode -version latest 
 
$ErrorActionPreference = "Stop" 
 
# Log level to color mapping 
$lc = @{ 
    VERBOSE="green"; 
    WARNING="yellow"; 
    ERROR="red"; 
    MESSAGE="blue"; 
} 
 
 
function PrintUsage()  
{ 
    write-host "" 
    write-host "Usage: .\FS4SP.ps1 -action [start|stop] [-thisNode (node name)] [-adminNode][-col (num)] [-row (num)] [-retries (number of retries when failing)] " 
    write-host "  Parameters:" 
    write-host "    start        – start all nodes in the FS4SP farm, starting with admin node, ending with QR server node" 
    write-host "    stop         – stop all nodes in the FS4SP farm, starting with QR server node ending with admin node" 
    write-host "    thisNode     - only run action one a specific node. The value of the parameter must be a valid hostname found in the deployment.xml file" 
    write-host "    adminNode    - when True, action will be performed on admin node only, else all nodes in the system.  Defaults to False" 
    write-host "    col          - only run action one a specific column number. The value of the parameter must be a valid column number." 
    write-host "    row          - only run action one a specific row number. The value of the parameter must be a valid row number." 
    write-host "    retries      - the number of times to retry if interrupted due to intermittent failures." 
    write-host "" 
} 
 
 
function ValidateInput() 
{ 
    # $action must be start or stop 
    if ($action -ne "start" -and $action -ne "stop") 
    { 
        PrintUsage 
        log ERROR "-action parameter must be set to start or stop" 
        exit 1 
    } 
 
    $conf = [xml](Get-Content "$FAST\etc\hostconfiguration.xml") 
    $conf = $conf.properties.property 
    $adminserver = ($conf | Where-Object { $_.name -eq "adminserver" })."#text" 
    $myname = ($conf | Where-Object { $_.name -eq "hostname" })."#text" 
    if ($myname -ne $adminserver) 
    { 
        log ERROR "This script can only be run at $adminserver" 
        exit 1 
    } 
 
    # Check if powershell remoting is available 
    $deployment = [xml](Get-Content "$FAST\etc\config_data\deployment\deployment.xml") 
    if (!$deployment.deployment) 
    { 
        log ERROR "Unable to read deployment descriptor from $FAST\etc\config_data\deployment\deployment.xml" 
        exit 1 
    } 
 
    $hosts = @($deployment.deployment.host | foreach { $_.name }) 
    if ($hosts.length -gt 1) 
    { 
        $badremoting = $false 
        $strhosts = [string]::join(","$hosts) 
        $res = Get-WSManCredSSP 
        if ($res[0] -eq "The machine is not configured to allow delegating fresh credentials.") 
        { 
            log ERROR "The machine is not configured to allow delegating fresh credentials, backup will fail." 
            $badremoting = $true 
        } 
        else 
        { 
            if ($hosts | Where-Object { $res[0].ToLower().IndexOf($_.ToLower()) -eq -1 }) 
            { 
                log ERROR "Fresh credentials forwarding not enabled for all hosts, backup will fail." 
                $badremoting = $true 
            } 
        } 
        if ($res[1] -eq "This computer is not configured to receive credentials from a remote client computer.") 
        { 
            log ERROR "This computer is not configured to receive credentials from a remote client computer, backup will fail." 
            $badremoting = $true 
        } 
        if ($badremoting) 
        { 
            log ERROR "On the nodes $strhosts, please run the following commands:" 
            log ERROR "  Enable-PSRemoting" 
            log ERROR "  Enable-WSManCredSSP -Role Server" 
            log ERROR "On this node, please run the following command:" 
            log ERROR "  Enable-WSManCredSSP -Role client -DelegateComputer $strhosts" 
            exit 1 
        } 
    } 
 
    if ($thisNode) 
    { 
        $valid = $false 
        foreach ($h in $hosts)  
        { 
            if ($thisNode -eq $h) 
            { 
                $valid = $true 
                break 
            } 
        } 
        if (!$valid)  
        { 
            PrintUsage 
            log ERROR "-thisNode parameter must be valid hostname found in the deployment.xml file" 
            log MESSAGE "     Valid hostnames in deployment.xml file:" 
            foreach ($h in $hosts)  
            { 
                log MESSAGE "     $h"  
            } 
            exit 1 
        } 
    } 
 
    log VERBOSE "Testing PowerShell Remoting availability." 
    try 
    { 
        Invoke-Command -ComputerName $hosts -ScriptBlock { Get-Culture } | Out-Null 
    } 
    catch  
    { 
        log ERROR "PowerShell remoting failed.  Please ensure that PowerShell remoting is enabled, that credentials forwarding is enabled and configured, that you are running with administrative privileges and that the username and password is correct." 
        exit 1 
    } 
} 
 
function log([string] $level, [string] $message) { 
    $date = get-date -uformat "%G-%m-%d %T" 
    write-host "[$date] " -nonewline 
    write-host -foregroundcolor $lc[$level$level.padright(7) -nonewline 
    write-host " $message" 
} 
 
# Validate FASTSEARCH is set and we can access crawleradmin.exe 
$FAST = "$env:FASTSEARCH" 
if (!$FAST) { 
    log ERROR "Environment variable FASTSEARCH not set, cannot find installation" 
    exit 1 
} 
 
if (!($FAST.EndsWith("\"))) 
{ 
    $FAST = $FAST + "\" 
} 
 
 
function RunAction() 
{ 
    $cmd1 = "" 
    $cmd2 = "" 
     
    switch ($action) 
    { 
        "start" {$cmd1 = "net start fastsearchservice";  break;} 
        "stop"  {$cmd1 = "net stop fastsearchmonitoring"$cmd2 = "net stop fastsearchservice";  break;} 
    } 
 
    $conf     = [xml](Get-Content "$FAST\etc\hostconfiguration.xml") 
    $conf     = $conf.properties.property 
    $hostName = ($conf | where-object { $_.name -eq "hostname" })."#text" 
 
    # Get a list of all nodes in the system 
    $deployment = [xml](Get-Content "$FAST\etc\config_data\deployment\deployment.xml") 
     
    $allHostList   = New-Object System.Collections.ArrayList   
    $adminHostList = New-Object System.Collections.ArrayList   
    $queryHostList = New-Object System.Collections.ArrayList  
 
    if ($adminNode) 
    { 
        log VERBOSE "Initiating $action of FS4SP, admin node: $hostName" 
        $idx = $allHostList.add($hostName)  
    } 
    elseif ($thisNode) 
    { 
        log VERBOSE "Initiating $action of FS4SP, node: $thisNode" 
        $idx = $allHostList.add($thisNode)  
    } 
    elseif ($col) 
    { 
        log VERBOSE "Initiating $action of FS4SP, column: $col" 
        foreach ($h in $deployment.deployment.host | where-object {(get-member "searchengine" -inputobject $_-and ($_.searchengine.column -eq $col)} | foreach { $_.name })  
        {  
            $idx = $allHostList.add($h)  
        } 
        if ($allHostList.count -eq 0) 
        { 
            PrintUsage 
            log ERROR "-col parameter must be valid column number in the FS4SP configuration" 
            exit 1 
        } 
    } 
    elseif ($row) 
    { 
        log VERBOSE "Initiating $action of FS4SP, row: $row" 
        foreach ($h in $deployment.deployment.host | where-object {(get-member "searchengine" -inputobject $_-and ($_.searchengine.row -eq $row)} | foreach { $_.name })  
        {  
            $idx = $allHostList.add($h) 
        }     
        if ($allHostList.count -eq 0) 
        { 
            PrintUsage 
            log ERROR "-col parameter must be valid column number in the FS4SP configuration" 
            exit 1 
        } 
    } 
    else 
    { 
        log VERBOSE "Initiating Full $action of FS4SP" 
        foreach ($h in $deployment.deployment.host | foreach { $_.name })  
        {  
            $idx = $allHostList.add($h)  
        } 
        foreach ($h in $deployment.deployment.host | where-object { $_ | get-member -name "admin" } | foreach { $_.name })  
        {  
            $idx = $adminHostList.add($h)  
        } 
        foreach ($h in $deployment.deployment.host | where-object { $_ | get-member -name "query" } | foreach { $_.name })  
        {  
            $idx = $queryHostList.add($h)  
        } 
    } 
 
    # Remove admin host name from list of all hosts and host running qrserver 
    foreach ($h in $adminHostList) 
    { 
        $allHostList.Remove($h) 
        $queryHostList.Remove($h) 
    } 
 
    # Remove qrserver host name from list of all hosts 
    foreach ($h in $queryHostList) 
    { 
        $allHostList.Remove($h) 
    } 
 
    #run command to start/stop     
    if ($action -eq "start")  
    { 
        foreach ($hostName in $adminHostList) { RunCmd $hostName $cmd1 } 
        foreach ($hostName in $allHostList)   { RunCmd $hostName $cmd1 } 
        foreach ($hostName in $queryHostList) { RunCmd $hostName $cmd1 } 
    } 
    else 
    { 
        foreach ($hostName in $queryHostList) { RunCmd $hostName $cmd1; RunCmd $hostName $cmd2 } 
        foreach ($hostName in $allHostList)   { RunCmd $hostName $cmd1; RunCmd $hostName $cmd2 } 
        foreach ($hostName in $adminHostList) { RunCmd $hostName $cmd1; RunCmd $hostName $cmd2 } 
    } 
}     
 
function RunCmd() 
{ 
    param 
    ( 
        [string[]]$hostName, 
        [string[]]$cmd 
    ) 
 
    $comError = 0 
    while ($true) 
    { 
        try 
        { 
            $started = @(invoke-command -computername $hostName  -ArgumentList ($cmd-ScriptBlock { 
                param ($cmd) 
                Invoke-Expression $cmd  
            }) 
            break 
        } 
        catch [System.Management.Automation.ActionPreferenceStopException] 
        { 
            if ($retries -gt 0) 
            { 
                log WARNING "Communication with remote machine: $hostName was interrupted / remote command failed, retrying $retries more time(s)." 
                $retries-- 
            } 
            else 
            { 
                log ERROR "Communication with remote machine: $hostName was interrupted / remote command failed, giving up." 
                log ERROR "The error was:" 
                log ERROR $_ 
                $comError = 1 
                exit 1 
            } 
        } 
    } 
    if ($comError -eq 0) 
    { 
        if (!$-or !$started) 
        { 
            log ERROR "An unexpected error occurred - is PowerShell remoting enabled?" 
            exit 1 
        } 
 
        $status = $started | Where-Object {$_.Contains("successfully")} 
        if (!$status) 
        { 
            log ERROR ("$cmd failed on node: $hostName ") 
            log ERROR ("$started") 
            exit 1 
        } 
        else 
        { 
            log VERBOSE "On: $hostName - $status" 
        } 
    } 
} 
 
#Main Begin 
 
ValidateInput $action $adminNode $retries $thisnode 
 
RunAction $action $retries $adminNode $col $row 
 
#Main End 
 
<# 
.SYNOPSIS 
Performs FASTSearch start & stop. 
 
.DESCRIPTION 
Performs start or stop of the FASTSearch system. Action (starting or stopping) is governed by the -action parameter. 
 
When the FASTSearch system spans multiple nodes, PowerShell Remoting must be enabled, and CredSSP Authentication must be configured. 
 
.PARAMETER action 
Specifies is we are stopping or starting the FAS4SP nodes. 
start – start all nodes in the FS4SP farm, starting with admin node, ending with QR server node 
stop – stop all nodes in the FS4SP farm, starting with QR server node ending with admin node 
 
.PARAMETER thisnode 
Specifies if this script should run action (start/stop) one specific node.  
The value of the parameter must be a valid hostname found in the deployment.xml file 
 
.PARAMETER adminNode 
Specifies if this script should run action (start/stop) on admin node only or on all nodes. Default value is on all nodes 
 
.PARAMETER col 
Specifies if this script should run action (start/stop) one a specific column number (not col number starts with 0).  
The value of the parameter must be a valid column number.  
 
.PARAMETER row 
Specifies if this script should run action (start/stop) one a specific row number (not row number starts with 0).  
The value of the parameter must be a valid row number.  
 
.PARAMETER retries 
The number of times to retry if a start/stop on remote machines is interrupted due to intermittent failures.  Defaults to 3. 
 
 
.EXAMPLE 
FS4SP -action "start" 
 
.EXAMPLE 
FS4SP -action "stop" -adminNode "true" 
 
.EXAMPLE 
FS4SP -action "stop" -row 0 
 
.INPUTS 
None.  You cannot pipe objects to FS4SP. 
 
.LINK 
about_Remote 
Enable-PSRemoting 
Enable-WSManCredSSP 
#>