Description

PS C:\FASTSearch\Shell\Operation\FS14> get-help .\fNctrl.ps1

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

SYNOPSIS
    Farm version of standard nctrl command: Run local and remote nctrl commands on the FS4SP s


SYNTAX
    C:\FASTSearch\Shell\Operation\FS14\fNctrl.ps1 [[-ncmd] <String>] [-thisNode <String>] [-co
    >] [<CommonParameters>]


DESCRIPTION
    Run local and remote nctrl commands on the selected FS4SP search nodes in a farm.
    The available nodes would be given by the deployment.xml file

    Makes it possible to control and administer your FS4SP farm from the admin node, stopping
    and all other commands possible to run with a standard nctrl command.

    The standard nctrl commands supported are:

    Commands:
      start [process 1] ... [process n]
         Start all or selected processes.
      stop [process 1] ... [process n]
         Stop all (including nctrl daemon) or selected processes.
      kill process 1 [process 2] ... [process n]
         Kill (SIGKILL/TerminateProcess) selected processes.
      restart [process 1] ... [process n]
         Restart selected processes.
      status
         List some general info on the system.
      add process
         Add another instance of type "process".
         The process must be configured for dynamic multiplication.
      remove process
         Remove a process from configuration. The process must
         support dynamic multiplication.
      suspend process 1 [process 2] ... [process n]
         Suspends (stops) the specified processes. The processes must
         be resumed to be restarted.
      resume process 1 [process 2] ... [process n]
         Resumes (starts) the previously suspended processes.
      reloadcfg
         Reloads the configuration for the running daemon from
         C:\FASTSearch\etc\NodeConf.xml


    .PARAMETER nctrl cmd
    First parameter (Position 0). Reads string an passes it on to local nctrl script

 

RELATED LINKS
    about_Remote
    Enable-PSRemoting
    Enable-WSManCredSSP

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

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

    C:\PS>Start indexer on row 0

    fNctrl "start indexer" -row 0

    -------------------------- EXAMPLE 2 --------------------------

    C:\PS>Get status on all nodes

    fNctrl status

    -------------------------- EXAMPLE 3 --------------------------

    C:\PS>Stop QR server on given host

    fNctrl.ps1 "stop qrserver" -thisNode <node>

 

Script

PowerShell
Edit|Remove
#Get input 
param 
( 
    [parameter(position=0)][ValidateNotNullOrEmpty()][string]$ncmd, 
    [string]$thisNode, 
    [string]$col, 
    [string]$row 
) 
 
set-strictmode -version latest 
 
$ErrorncmdPreference = "Stop" 
 
# Log level to color mapping 
$lc = @{ 
    VERBOSE="green"; 
    WARNING="yellow"; 
    ERROR="red"; 
    MESSAGE="blue"; 
} 
 
 
function PrintUsage()  
{ 
    write-host "" 
    write-host "Usage: .\fNctrl.ps1 'nctrl command' [-thisNode (node name)] [-col (num)] [-row (num)]" 
    write-host "  Parameters:" 
    write-host "    nctrl command – nctrl command to execute" 
    write-host "    thisNode      - Run ncmd one a specific node. The value of the parameter must be a valid hostname found in the deployment.xml file" 
    write-host "    col           - Run ncmd one a specific column number. The value of the parameter must be a valid column number." 
    write-host "    row           - Run ncmd one a specific row number. The value of the parameter must be a valid row number." 
    write-host "" 
} 
 
 
function ValidateInput() 
{ 
 
    if ($ncmd -eq "") 
    { 
        PrintUsage 
        log ERROR "Missing a value for nctrl command, parameter 1" 
        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" 
} 
 
 
function RunNcmd() 
{ 
    $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   
 
    if ($thisNode) 
    { 
        log VERBOSE "Running: nctrl $ncmd -> node: $thisNode" 
        $idx = $allHostList.add($thisNode)  
    } 
    elseif ($col) 
    { 
        log VERBOSE "Running: nctrl $ncmd -> 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 "Running: nctrl $ncmd -> 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 "Running: nctrl $ncmd -> All hosts" 
        foreach ($h in $deployment.deployment.host | foreach { $_.name })  
        {  
            $idx = $allHostList.add($h)  
        } 
    } 
 
    #run nctrl command to start/stop     
    $fullCmd = "nctrl " + $ncmd 
    foreach ($hostName in $allHostList)   { RunCmd $hostName $fullCmd } 
}     
 
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.ncmdPreferenceStopException] 
        { 
            log ERROR "Communication with remote machine: $hostName was interrupted / remote command failed, giving up." 
            log ERROR "The error was:" 
            log ERROR $_ 
            $comError = 1 
            break 
        } 
    } 
    if ($comError -eq 0) 
    { 
        if (!$-or !$started) 
        { 
            log ERROR "An unexpected error occurred - is PowerShell remoting enabled?, error $_" 
            exit 1 
        } 
        else 
        { 
            $started 
        } 
    } 
} 
 
#Main Begin 
 
# 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 + "\" 
} 
 
 
ValidateInput $thisnode 
 
RunNcmd $ncmd $thisnode $col $row 
 
#Main End 
 
<# 
.SYNOPSIS 
Farm version of standard nctrl command: Run local and remote nctrl commands on the FS4SP search nodes in a farm. 
 
.DESCRIPTION 
Run local and remote nctrl commands on the selected FS4SP search nodes in a farm. 
The available nodes would be given by the deployment.xml file  
 
Makes it possible to control and administer your FS4SP farm from the admin node, stopping starting FAST processes  
and all other commands possible to run with a standard nctrl command. 
 
The standard nctrl commands supported are: 
 
Commands: 
  start [process 1] ... [process n] 
     Start all or selected processes. 
  stop [process 1] ... [process n] 
     Stop all (including nctrl daemon) or selected processes. 
  kill process 1 [process 2] ... [process n] 
     Kill (SIGKILL/TerminateProcess) selected processes. 
  restart [process 1] ... [process n] 
     Restart selected processes. 
  status 
     List some general info on the system. 
  add process 
     Add another instance of type "process". 
     The process must be configured for dynamic multiplication. 
  remove process 
     Remove a process from configuration. The process must 
     support dynamic multiplication. 
  suspend process 1 [process 2] ... [process n] 
     Suspends (stops) the specified processes. The processes must 
     be resumed to be restarted. 
  resume process 1 [process 2] ... [process n] 
     Resumes (starts) the previously suspended processes. 
  reloadcfg 
     Reloads the configuration for the running daemon from 
     C:\FASTSearch\etc\NodeConf.xml 
 
 
.PARAMETER nctrl cmd 
First parameter (Position 0). Reads string an passes it on to local nctrl script 
 
.PARAMETER thisnode 
Specifies if this script should run ncmd one a specific node.  
The value of the parameter must be a valid hostname found in the deployment.xml file 
 
.PARAMETER col 
Specifies if this script should run ncmd 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 ncmd one a specific row number (not row number starts with 0).  
The value of the parameter must be a valid row number.  
 
 
.EXAMPLE 
Start indexer on row 0 
fNctrl "start indexer" –row 0 
 
.EXAMPLE 
Get status on all nodes 
fNctrl status 
 
 
.EXAMPLE 
Stop QR server on given host 
fNctrl.ps1 "stop qrserver" -thisNode <node> 
 
.INPUTS 
None.  You cannot pipe objects to fNctrl. 
 
.LINK 
about_Remote 
Enable-PSRemoting 
Enable-WSManCredSSP 
#>