import { Observable, Observer } from 'rxjs'; import { AjaxError } from 'rxjs/ajax'; import { Disposable, DisposableLifetimeManager } from './disposable'; import { NodeConnection, NodeRequestOptions } from './node-connection'; /** * PowerShell run options. */ export interface PowerShellOptions extends NodeRequestOptions { /** * Close the runspace after the call. * (default is false) */ close?: boolean; /** * Close the runspace on error. */ closeOnError?: boolean; /** * Timeout milliseconds to shutdown the session. * (default is null and forever) */ timeoutMs?: number; /** * Processing data progressively instead of waiting all result. */ partial?: boolean; /** * Specify the initial waiting time before starting polling of result of invoke script. */ waitTimeMs?: number; } /** * The node request options to control the underlying node connections in a powershell session */ export interface PowerShellSessionRequestOptions extends NodeRequestOptions { /** * Specify the session pool mode on the gateway. */ automatic?: boolean; } /** * PowerShell context object interface. */ export interface PowerShellContext { /** * The node name. */ nodeName: string; /** * The shared key name for runspace. */ key: string; /** * The array of referenced containers. */ lifetimes: DisposableLifetimeManager[]; /** * The request options for the powershell session */ requestOptions: PowerShellSessionRequestOptions; } /** * PowerShell command object. */ export interface PowerShellCommandWithoutState { /** * The name of PowerShell module. (optional, it uses default module if not specified.) */ module?: string; /** * The command name. */ command: string; /** * The parameters (arguments). */ parameters?: any; /** * Set if the command should be run in a local runspace. */ useInProcRunspace?: boolean; /** * The script string. */ script: string; } /** * PowerShell command object. */ export interface PowerShellCommand extends PowerShellCommandWithoutState { /** * The state of command object. */ state: string; } /** * PowerShell command queue item. */ export interface PowerShellCommandItem { /** * The command to execute. */ command: PowerShellCommand; /** * Options for how to handle the command (reserved) */ options?: PowerShellOptions; /** * Deferred object currently waiting for command run. */ observer: Observer; } /** * The PowerShellSession class. */ export declare class PowerShellSession implements Disposable { powerShell: PowerShell; private lifetime?; /** * Initializes a new instance of the PowerShellSession class. * * @param powerShell the PowerShell object. * @param lifetime the disposable lifetime manager object. */ constructor(powerShell: PowerShell); constructor(powerShell: PowerShell, lifetime: DisposableLifetimeManager); /** * Gets the node name of session. */ get nodeName(): string; /** * Dispose the session object. */ dispose(): void; } export interface FallbackError extends AjaxError { handlerError: { message: string; code: 'ManageAsDialogCancel'; }; } /** * Class containing methods related to PowerShell runspace creation/deletion/command using PowerShell Raw API plugin. * - It's auto holding the session as long as it's used within last 3 minutes. */ export declare class PowerShellRaw implements Disposable { private nodeConnection; private context; private static maxDeltaTimeInMs; private sessionId; private timestampInMs; private markDelete; private internalActive; private cancelPending; /** * Initializes a new instance of the PowerShellRaw class. * * @param nodeConnection The node connection service. * @param context The context of PowerShell run. */ constructor(nodeConnection: NodeConnection, context: PowerShellContext); /** * Gets active status of PowerShell execution. */ get active(): boolean; /** * Dispose the runspace. */ dispose(): void; /** * Runs the given command * * @param command The command to execute. * @param options the powershell options. */ runCommand(command: PowerShellCommand, options?: PowerShellOptions): Observable; /** * Close/Delete the session / runspace. */ close(): void; /** * Cancel the command. */ cancelCommand(): Observable; /** * Perform the JEA fallback, if applicable. * * @param error The error to handle * @param command The command * @param options The request options */ private fallbackToJea; private cancel; /** * Gets if timestamp was expired. */ private get _isExpired(); /** * Initiate command execution. It auto recycles old sessions. * * @param command the PowerShell command. */ private command; private checkCompleted; } /** * The PowerShell class. * * - Single instance of PowerShell class manages single runspace. * - It queues coming requests and process one at a time sequentially. * - If a command is slow and causing with multiple responses, it aggregates response into single Q result. * - A PowerShell instance should be created through create() function, and it's statically stored/managed into _map collection. * - In QueryCache operation, it can find the PowerShell instance to run PowerShell command by using find() function. * - Once all lifetime references are gone, it deletes the runspace. * - To dispose the PowerShell instance, it can use lifetime.dispose(). */ export declare class PowerShell { /** * Default PowerShell endpoint. */ static defaultPowerShellEndpoint: string; /** * SME PowerShell endpoint. */ static smePowerShellEndpoint: string; /** * WAC (v2) CredSSP PowerShell endpoint to control client role of CredSSP on the gateway. */ static wacCredSSPEndpoint: string; /** * Static collection of PowerShell objects. */ private static map; /** * Regular expression to match all the occurrences of a single quote */ private static escapeRegex; /** * The context of PowerShell object. */ private context; /** * The queue of PowerShell command requests. */ private queue; /** * The reference to PowerShellRaw class object. */ private raw; /** * Current data to aggregate from multiple data responses. */ private currentData; /** * Timestamp when last command started. */ private timestamp; /** * Create script as string. * (Notes: Use createCommand() function which is based on PowerShell module, * Update gulpfile.js to generate a PowerShell module to support Show script, JEA and localization.) * * @param resource the script text from legacy ps-code converter. * @param parameters the arguments. * @param flags (optional) the switch flags. */ static createScript(script: string, parameters?: any, flags?: string[]): string; /** * Create PowerShell request command. * (It creates a command object of JEA PowerShell request under restricted user role environment.) * * @param resource the script resource object with command and script data from new ps-code converter. * @param parameters the arguments. * @param flags (optional) the switch flags. * @return PowerShellCommand the PowerShell request command object. */ static createCommand(resource: { command: string; script: string; module?: string; }, parameters?: any, flags?: string[], resourceName?: string): PowerShellCommand; /** * Update the parameters in the PowerShellCommand object, and update the SmeSubmit part of the * script with these new parameters. * * @param command The PowerShellCommand instance to update. * @param parameters The new collection of parameters. * * Note: flags support can be added when it becomes necessary. */ static updateCommandParameters(command: PowerShellCommand, parameters?: any): void; /** * Find or create new PowerShell object. * * @param nodeName The node to connect to. * @param nodeConnection The node connection. * @param key The shared key to queue the requests to use the single runspace. * @param lifetime The lifetime container. * @param requestOptions the options to apply to every request in this session */ static create(nodeName: string, nodeConnection: NodeConnection): PowerShell; static create(nodeName: string, nodeConnection: NodeConnection, key: string, lifetime: DisposableLifetimeManager): PowerShell; static create(nodeName: string, nodeConnection: NodeConnection, key: string, lifetime: DisposableLifetimeManager, requestOptions: PowerShellSessionRequestOptions): PowerShell; /** * Find existing PowerShell object. Create call must be called before to create the PowerShell instance. * * @param nodeName The node name. * @param key The shared key to queue the requests to use the single runspace. */ static find(nodeName: string, key: string): PowerShell; /** * Gets the command object from string or PowerShellCommand. * * @param scriptOrCommand the script string or PowerShellCommand object. */ static getPowerShellCommand(scriptOrCommand: string | PowerShellCommand): PowerShellCommand; /** * Create new options with debugging endpoint if requested. * * @param options the PowerShell session request options. */ static newEndpointOptions(options: NodeRequestOptions): NodeRequestOptions; /** * Create the index name in map collection. * * @param nodeName The node name. * @param key The shared key to queue the requests to use the single runspace. */ private static indexName; /** * Adds jea prefix to the command name * * @param jeaPrefix The jea prefix originating from main.ts. * @param command The powershell command to run. */ private static addPowerShellPrefix; /** * Initializes a new instance of the PowerShell class. * (private constructor which shouldn't be called directly.) * * @param nodeConnection The node connection service. * @param key The shared key to queue the requests to use the single runspace. * @param lifetime The lifetime container. */ constructor(nodeName: string, nodeConnection: NodeConnection, key: string, lifetime: DisposableLifetimeManager, options: PowerShellSessionRequestOptions); /** * Gets node name from current context. */ get nodeName(): string; /** * Run PowerShell command. * * @param command The command. * @param options The options. * @return PromiseV The result of PowerShell command. */ run(scriptOrCommand: string | PowerShellCommand, options?: PowerShellOptions): Observable; /** * Cancel PowerShell command. */ cancel(): Observable; /** * Enqueue a command request. * * @param command The command. * @param options The options. */ private enqueue; /** * Dequeue a command request. */ private dequeue; /** * Collect response result and aggregate into single object. * * @param properties The properties of response object. * @param timeoutMs The timeout to cancel command. * @param observer The observer of powershell results. */ private collect; /** * Attach lifetime object to disposer when disposing. * * @param lifetime The lifetime object. */ private addLifetime; /** * Callback when disposing the container of view model. * If none, reference the PowerShell object. Dispose it. (Delete runspace) * * @param lifetime The lifetime object. */ private lifetimeDisposer; }