@microsoft/windows-admin-center-sdk 2.186.0 → 2.297.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/angular/assets/strings/cs-CZ/strings.json +1 -1
- package/angular/assets/strings/de-DE/strings.json +1 -1
- package/angular/assets/strings/es-ES/strings.json +1 -1
- package/angular/assets/strings/fr-FR/strings.json +1 -1
- package/angular/assets/strings/hu-HU/strings.json +1 -1
- package/angular/assets/strings/it-IT/strings.json +1 -1
- package/angular/assets/strings/ja-JP/strings.json +1 -1
- package/angular/assets/strings/ko-KR/strings.json +1 -1
- package/angular/assets/strings/nl-NL/strings.json +1 -1
- package/angular/assets/strings/pl-PL/strings.json +1 -1
- package/angular/assets/strings/pt-BR/strings.json +1 -1
- package/angular/assets/strings/pt-PT/strings.json +1 -1
- package/angular/assets/strings/ru-RU/strings.json +1 -1
- package/angular/assets/strings/strings.json +1 -1
- package/angular/assets/strings/sv-SE/strings.json +1 -1
- package/angular/assets/strings/tr-TR/strings.json +1 -1
- package/angular/assets/strings/zh-CN/strings.json +1 -1
- package/angular/assets/strings/zh-TW/strings.json +1 -1
- package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.js +1103 -1209
- package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.js.map +1 -1
- package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.min.js +2 -2
- package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.min.js.map +1 -1
- package/angular/esm2015/src/controls/actions/actions.module.js +2 -2
- package/angular/esm2015/src/controls/actions/containers/action-bar/action-bar.component.js +2 -2
- package/angular/esm2015/src/controls/actions/items/action-button/action-button-renderer.component.js +5 -5
- package/angular/esm2015/src/controls/actions/items/action-dropdown/action-dropdown.component.js +31 -13
- package/angular/esm2015/src/controls/actions/items/action-item.component.js +7 -3
- package/angular/esm2015/src/controls/badge/badge-base.component.js +2 -13
- package/angular/esm2015/src/controls/badge/bugfixes-feature-badge.component.js +42 -70
- package/angular/esm2015/src/controls/badge/coming-soon-badge.component.js +42 -70
- package/angular/esm2015/src/controls/badge/credssp-enabled-badge.component.js +42 -70
- package/angular/esm2015/src/controls/badge/critical-badge.component.js +42 -70
- package/angular/esm2015/src/controls/badge/custom-badge.component.js +42 -70
- package/angular/esm2015/src/controls/badge/feedback-badge.component.js +42 -70
- package/angular/esm2015/src/controls/badge/improvement-feature-badge.component.js +42 -70
- package/angular/esm2015/src/controls/badge/new-badge.component.js +42 -70
- package/angular/esm2015/src/controls/badge/new-feature-badge.component.js +42 -70
- package/angular/esm2015/src/controls/badge/preview-badge.component.js +42 -70
- package/angular/esm2015/src/controls/badge/warning-badge.component.js +42 -70
- package/angular/esm2015/src/controls/breadcrumb/breadcrumb.component.js +6 -6
- package/angular/esm2015/src/controls/breadcrumb-header/breadcrumb-header.component.js +2 -2
- package/angular/esm2015/src/controls/data-table/data-table-column.component.js +5 -3
- package/angular/esm2015/src/controls/data-table/data-table.component.js +20 -26
- package/angular/esm2015/src/controls/data-table/extensions/data-table-column-picker-extension.js +2 -1
- package/angular/esm2015/src/controls/details/details.component.js +2 -2
- package/angular/esm2015/src/controls/dialog/base-dialog.component.js +1 -1
- package/angular/esm2015/src/controls/dialog/confirmation-dialog/confirmation-dialog.component.js +20 -30
- package/angular/esm2015/src/controls/dialog/dialog.service.js +7 -3
- package/angular/esm2015/src/controls/dropdown/dropdown.component.js +2 -2
- package/angular/esm2015/src/controls/form/form-field/array/array-form-field.component.js +50 -40
- package/angular/esm2015/src/controls/form/form-field/checklist/checklist-form-field.component.js +3 -3
- package/angular/esm2015/src/controls/form/form-field/combobox/combobox-form-field.component.js +14 -13
- package/angular/esm2015/src/controls/form/form-field/datetime/datetime-form-field.component.js +2 -2
- package/angular/esm2015/src/controls/form/form-field/form-field.component.js +16 -4
- package/angular/esm2015/src/controls/form/form-field/options-form-field/form-field-option.component.js +5 -3
- package/angular/esm2015/src/controls/form/form-field/ordered-list/ordered-list-form-field.component.js +25 -21
- package/angular/esm2015/src/controls/form/form-field/radio-group/classic/radio-group-form-field.component.js +5 -5
- package/angular/esm2015/src/controls/form/form-field/search/search-form-field.component.js +2 -2
- package/angular/esm2015/src/controls/form/form-field/tags/tags-form-field.component.js +2 -2
- package/angular/esm2015/src/controls/form/validation-alert/validation-alert.component.js +4 -10
- package/angular/esm2015/src/controls/form/validation-alert/validation-alert.js +1 -1
- package/angular/esm2015/src/controls/horizontal-bar-chart/stacked-horizontal-bar-chart.component.js +17 -1
- package/angular/esm2015/src/controls/icon/layered-icon/layered-icon.component.js +12 -1
- package/angular/esm2015/src/controls/icon/layered-icon/status/status-icon.component.js +53 -9
- package/angular/esm2015/src/controls/loading-wheel/loading-wheel.component.js +17 -1
- package/angular/esm2015/src/controls/master-view/master-view.component.js +34 -30
- package/angular/esm2015/src/controls/pivot/pivot-tab.component.js +1 -1
- package/angular/esm2015/src/controls/pivot/pivot.component.js +21 -9
- package/angular/esm2015/src/controls/property-grid/property-grid.component.js +13 -29
- package/angular/esm2015/src/controls/schema-form/schema-form-content.component.js +7 -4
- package/angular/esm2015/src/controls/settings/common-settings/common-settings.component.js +23 -35
- package/angular/esm2015/src/controls/settings/settings.component.js +28 -1
- package/angular/esm2015/src/controls/settings/settings.module.js +8 -3
- package/angular/esm2015/src/controls/tooltip/tooltip-host.component.js +16 -5
- package/angular/esm2015/src/controls/wizard/wizard.component.js +38 -6
- package/angular/esm2015/src/directives/clamp/clamp.directive.js +26 -7
- package/angular/esm2015/src/directives/discard/discard.directive.js +2 -2
- package/angular/esm2015/src/directives/markdown/markdown.directive.js +5 -18
- package/angular/esm2015/src/generated/strings.js +1 -1
- package/angular/esm2015/src/guards/experiment.guard.service.js +14 -1
- package/angular/esm2015/src/pipes/boolean-converter-pipe.js +11 -1
- package/angular/esm2015/src/pipes/byte-unit-converter-pipe.js +11 -1
- package/angular/esm2015/src/pipes/enum-converter-pipe.js +16 -1
- package/angular/esm2015/src/pipes/format-pipe.js +11 -1
- package/angular/esm2015/src/pipes/highlight-pipe.js +11 -1
- package/angular/esm2015/src/pipes/yesno-converter-pipe.js +11 -1
- package/angular/esm2015/src/service/gateway.service.js +8 -5
- package/angular/esm2015/src/service/notification.service.js +23 -1
- package/angular/fesm2015/microsoft-windows-admin-center-sdk-angular.js +1042 -1069
- package/angular/fesm2015/microsoft-windows-admin-center-sdk-angular.js.map +1 -1
- package/angular/package.json +0 -1
- package/angular/src/controls/actions/items/action-dropdown/action-dropdown.component.d.ts +2 -0
- package/angular/src/controls/actions/items/action-item.component.d.ts +11 -1
- package/angular/src/controls/badge/badge-base.component.d.ts +0 -4
- package/angular/src/controls/data-table/data-table-column.component.d.ts +2 -1
- package/angular/src/controls/data-table/data-table.component.d.ts +4 -0
- package/angular/src/controls/dialog/base-dialog.component.d.ts +1 -1
- package/angular/src/controls/form/form-field/form-field.component.d.ts +10 -1
- package/angular/src/controls/form/form-field/options-form-field/form-field-option.component.d.ts +5 -1
- package/angular/src/controls/form/validation-alert/validation-alert.component.d.ts +0 -4
- package/angular/src/controls/form/validation-alert/validation-alert.d.ts +0 -1
- package/angular/src/controls/horizontal-bar-chart/stacked-horizontal-bar-chart.component.d.ts +16 -0
- package/angular/src/controls/icon/layered-icon/layered-icon.component.d.ts +11 -0
- package/angular/src/controls/icon/layered-icon/status/status-icon.component.d.ts +13 -2
- package/angular/src/controls/loading-wheel/loading-wheel.component.d.ts +16 -0
- package/angular/src/controls/master-view/master-view.component.d.ts +1 -0
- package/angular/src/controls/pivot/pivot-tab.component.d.ts +0 -1
- package/angular/src/controls/pivot/pivot.component.d.ts +4 -0
- package/angular/src/controls/settings/common-settings/common-settings.component.d.ts +6 -5
- package/angular/src/controls/settings/settings.component.d.ts +27 -0
- package/angular/src/controls/settings/settings.module.d.ts +7 -6
- package/angular/src/controls/tooltip/tooltip-host.component.d.ts +1 -1
- package/angular/src/controls/wizard/wizard.component.d.ts +23 -0
- package/angular/src/directives/clamp/clamp.directive.d.ts +5 -0
- package/angular/src/directives/markdown/markdown.directive.d.ts +2 -3
- package/angular/src/generated/strings.d.ts +9 -0
- package/angular/src/guards/experiment.guard.service.d.ts +13 -0
- package/angular/src/pipes/boolean-converter-pipe.d.ts +10 -0
- package/angular/src/pipes/byte-unit-converter-pipe.d.ts +10 -0
- package/angular/src/pipes/enum-converter-pipe.d.ts +15 -0
- package/angular/src/pipes/format-pipe.d.ts +10 -0
- package/angular/src/pipes/highlight-pipe.d.ts +10 -0
- package/angular/src/pipes/yesno-converter-pipe.d.ts +10 -0
- package/angular/src/service/gateway.service.d.ts +3 -1
- package/angular/src/service/notification.service.d.ts +22 -0
- package/core/base/environment.d.ts +7 -0
- package/core/base/environment.js.map +1 -1
- package/core/base/versioned-object.js +2 -2
- package/core/base/versioned-object.js.map +1 -1
- package/core/data/cim-stream.js +8 -1
- package/core/data/cim-stream.js.map +1 -1
- package/core/data/core-environment.d.ts +4 -0
- package/core/data/core-environment.js +1 -0
- package/core/data/core-environment.js.map +1 -1
- package/core/data/crypto.js +10 -9
- package/core/data/crypto.js.map +1 -1
- package/core/data/file-transfer.js +5 -1
- package/core/data/file-transfer.js.map +1 -1
- package/core/data/gateway-connection.d.ts +11 -1
- package/core/data/gateway-connection.js +51 -9
- package/core/data/gateway-connection.js.map +1 -1
- package/core/data/http-constants.d.ts +5 -1
- package/core/data/http-constants.js +5 -1
- package/core/data/http-constants.js.map +1 -1
- package/core/data/net.d.ts +15 -11
- package/core/data/net.js +44 -41
- package/core/data/net.js.map +1 -1
- package/core/data/node-connection.d.ts +2 -2
- package/core/data/node-connection.js.map +1 -1
- package/core/data/powershell-stream.js +11 -3
- package/core/data/powershell-stream.js.map +1 -1
- package/core/data/powershell.d.ts +17 -1
- package/core/data/powershell.js +35 -9
- package/core/data/powershell.js.map +1 -1
- package/core/data/settings-manager.d.ts +9 -0
- package/core/data/settings-manager.js +18 -1
- package/core/data/settings-manager.js.map +1 -1
- package/core/generated/powershell-scripts.d.ts +5 -4
- package/core/generated/powershell-scripts.js +5 -4
- package/core/generated/powershell-scripts.js.map +1 -1
- package/core/host/host-core-manager.d.ts +36 -0
- package/core/host/host-core-manager.js +134 -0
- package/core/host/host-core-manager.js.map +1 -0
- package/core/host/host-core-message-type.d.ts +12 -0
- package/core/host/host-core-message-type.js +17 -0
- package/core/host/host-core-message-type.js.map +1 -0
- package/core/host/host-core-messages.d.ts +14 -0
- package/core/host/host-core-messages.js +3 -0
- package/core/host/host-core-messages.js.map +1 -0
- package/core/manifest/manifest-loader.d.ts +2 -1
- package/core/manifest/manifest-loader.js +27 -18
- package/core/manifest/manifest-loader.js.map +1 -1
- package/core/notification/notification.js +4 -0
- package/core/notification/notification.js.map +1 -1
- package/core/security/authorization-manager.d.ts +44 -0
- package/core/security/authorization-manager.js +111 -5
- package/core/security/authorization-manager.js.map +1 -1
- package/core/security/sign-on-manager.d.ts +109 -0
- package/core/security/sign-on-manager.js +119 -0
- package/core/security/sign-on-manager.js.map +1 -0
- package/core/security/tag-manager.js.map +1 -1
- package/core/shared/cluster-inventory/cluster-inventory-cache.js +3 -2
- package/core/shared/cluster-inventory/cluster-inventory-cache.js.map +1 -1
- package/core/shared/gateway-inventory/gateway-inventory-cache.d.ts +1 -1
- package/core/shared/gateway-inventory/gateway-inventory-cache.js +1 -1
- package/core/shared/gateway-inventory/gateway-inventory-cache.js.map +1 -1
- package/core/shared/server-inventory/server-inventory-cache.js +2 -1
- package/core/shared/server-inventory/server-inventory-cache.js.map +1 -1
- package/core/shared/tool-inventory/tool-inventory-cache.js +1 -1
- package/core/shared/tool-inventory/tool-inventory-cache.js.map +1 -1
- package/e2e/assets/strings/cs-CZ/strings.json +1 -1
- package/e2e/assets/strings/de-DE/strings.json +1 -1
- package/e2e/assets/strings/es-ES/strings.json +1 -1
- package/e2e/assets/strings/fr-FR/strings.json +1 -1
- package/e2e/assets/strings/hu-HU/strings.json +1 -1
- package/e2e/assets/strings/it-IT/strings.json +1 -1
- package/e2e/assets/strings/ja-JP/strings.json +1 -1
- package/e2e/assets/strings/ko-KR/strings.json +1 -1
- package/e2e/assets/strings/nl-NL/strings.json +1 -1
- package/e2e/assets/strings/pl-PL/strings.json +1 -1
- package/e2e/assets/strings/pt-BR/strings.json +1 -1
- package/e2e/assets/strings/pt-PT/strings.json +1 -1
- package/e2e/assets/strings/ru-RU/strings.json +1 -1
- package/e2e/assets/strings/strings.json +1 -1
- package/e2e/assets/strings/sv-SE/strings.json +1 -1
- package/e2e/assets/strings/tr-TR/strings.json +1 -1
- package/e2e/assets/strings/zh-CN/strings.json +1 -1
- package/e2e/assets/strings/zh-TW/strings.json +1 -1
- package/package.json +5 -5
- package/styles/css/fonts.css +2 -2
- package/styles/css/main.css +1 -1
- package/styles/fonts/ServMDL2/ServMDL2-4.62.woff +0 -0
- package/styles/fonts/ServMDL2/ServMDL2.json +238 -2039
- package/styles/fonts/ServMDL2/ServMDL2.scss +238 -2039
- package/tools/gulp-manifest-resource/index.js +3 -1
- package/tools/gulp-manifest-resource/index.js.map +1 -1
- package/tools/gulp-ps-cim/index.js +1 -1
- package/tools/gulp-ps-cim/index.js.map +1 -1
- package/tools/gulp-ps-cim/powershell-cim-config-schema.json +1 -1
- package/tools/gulp-ps-code/index.js +36 -2
- package/tools/gulp-ps-code/index.js.map +1 -1
- package/tools/gulp-ps-code/ps-code-convert.js +4 -8
- package/tools/gulp-ps-code/ps-code-convert.js.map +1 -1
- package/tools/gulp-ps-resjson/index.js +79 -74
- package/tools/gulp-ps-resjson/index.js.map +1 -1
- package/tools/module-template/build/pipelines/codeinspector.yml +27 -0
- package/tools/module-template/gulpfile.ts/common/lint.ts +3 -3
- package/tools/module-template/gulpfile.ts/common/pack.ts +14 -14
- package/tools/module-template/gulpfile.ts/common/ui-test-automation.ts +40 -0
- package/tools/module-template/gulpfile.ts/common/utilities.ts +10 -10
- package/tools/module-template/gulpfile.ts/common/validate.ts +14 -4
- package/tools/module-template/gulpfile.ts/index.ts +20 -8
- package/tools/wac-cli/src/upgrade/file-updater.d.ts +1 -0
- package/tools/wac-cli/src/upgrade/file-updater.js +7 -1
- package/tools/wac-cli/src/upgrade/file-updater.js.map +1 -1
- package/styles/fonts/ServMDL2/ServMDL2-4.33.woff +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../packages/core/data/powershell-stream.ts"],"names":[],"mappings":"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","file":"powershell-stream.js","sourcesContent":["\r\nimport { Observable, Observer, ReplaySubject, throwError } from 'rxjs';\r\nimport { catchError, filter, mergeMap, switchMap, take } from 'rxjs/operators';\r\nimport { LogLevel } from '../diagnostics/log-level';\r\nimport { Logging } from '../diagnostics/logging';\r\nimport { Strings } from '../generated/strings';\r\nimport { AuthorizationManager } from '../security/authorization-manager';\r\nimport { NodeRequestOptions } from './node-connection';\r\nimport { PowerShell, PowerShellCommand } from './powershell';\r\nimport {\r\n WebsocketStream,\r\n WebsocketStreamConnectionState,\r\n WebsocketStreamDataRequestState,\r\n WebsocketStreamDataState,\r\n WebsocketStreamDataTarget,\r\n WebsocketStreamHandler,\r\n WebsocketStreamProcessor\r\n} from './websocket-stream';\r\n\r\n/**\r\n * PowerShell result object including an error.\r\n */\r\nexport interface PowerShellResult {\r\n /**\r\n * The runspace pool instance ID.\r\n */\r\n sessionId: string;\r\n\r\n /**\r\n * Completed state.\r\n */\r\n completed: 'True' | 'False';\r\n\r\n /**\r\n * Progress data.\r\n */\r\n progress?: any[];\r\n\r\n /**\r\n * Results data.\r\n */\r\n results?: any[];\r\n\r\n /**\r\n * Errors data.\r\n */\r\n errors?: any[];\r\n\r\n /**\r\n * Warning data.\r\n */\r\n warning?: any[];\r\n}\r\n\r\n/**\r\n * PowerShell Stream options.\r\n */\r\nexport interface PowerShellStreamOptions extends NodeRequestOptions {\r\n /**\r\n * Partial data response.\r\n * (default is waiting for completion.)\r\n */\r\n partial?: boolean;\r\n\r\n /**\r\n * Close the session each time, so it gets priority.\r\n */\r\n close?: boolean;\r\n\r\n /**\r\n * Override Query ID so it can request cancel.\r\n */\r\n queryId?: string;\r\n\r\n /**\r\n * Buffering time period by milliseconds.\r\n */\r\n bufferTime?: number;\r\n\r\n /**\r\n * Buffering count.\r\n */\r\n bufferCount?: number;\r\n}\r\n\r\n/**\r\n * The request packet of Cim Stream to the gateway.\r\n */\r\nexport interface PowerShellStreamRequest {\r\n /**\r\n * The identification string (auto generated or supplied as queryId option.)\r\n */\r\n id: string;\r\n\r\n /**\r\n * The stream target\r\n */\r\n target: WebsocketStreamDataTarget;\r\n\r\n /**\r\n * The date request state.\r\n */\r\n requestState: WebsocketStreamDataRequestState;\r\n\r\n /**\r\n * The name of PowerShell module.\r\n */\r\n module: string;\r\n\r\n /**\r\n * The command.\r\n */\r\n command: string;\r\n\r\n /**\r\n * The parameters.\r\n */\r\n parameters: any;\r\n\r\n /**\r\n * The script.\r\n */\r\n script: string;\r\n\r\n /**\r\n * The Cim stream options.\r\n */\r\n options: PowerShellStreamOptions;\r\n}\r\n\r\n/**\r\n * Cim stream response.\r\n */\r\nexport interface PowerShellStreamResponse {\r\n /**\r\n * The identification string (auto generated.)\r\n */\r\n id: string;\r\n\r\n /**\r\n * Web socket data stream state.\r\n */\r\n state: WebsocketStreamDataState;\r\n\r\n /**\r\n * Index number of response for the original request.\r\n */\r\n index: number;\r\n\r\n /**\r\n * The PowerShell result.\r\n */\r\n response: PowerShellResult;\r\n}\r\n\r\nexport interface PowerShellStreamMonitorSetContext<T> {\r\n nodeName: string;\r\n command: PowerShellCommand;\r\n options?: PowerShellStreamOptions;\r\n data: T;\r\n}\r\n\r\n/**\r\n * Set of monitors for pre and post process of powershell stream.\r\n */\r\nexport interface PowerShellStreamMonitorSet<T> {\r\n name: string;\r\n preMonitor: (nodeName: string, command: PowerShellCommand, options?: PowerShellStreamOptions) =>\r\n Observable<PowerShellStreamMonitorSetContext<any>>;\r\n successMonitor: (result: T, context: PowerShellStreamMonitorSetContext<any>) => Observable<T>;\r\n errorMonitor: (error: any, context: PowerShellStreamMonitorSetContext<any>) => Observable<T>;\r\n}\r\n\r\n/**\r\n * PowerShell Processor interface.\r\n */\r\nclass PowerShellProcessor extends WebsocketStreamProcessor<PowerShellResult, PowerShellStreamOptions> {\r\n /**\r\n * * Holding result if waitCompleted option is specified for multiple instances.\r\n */\r\n public response?: PowerShellResult;\r\n}\r\n\r\n/**\r\n * PowerShell stream queue.\r\n */\r\ninterface PowerShellStreamQueue {\r\n /**\r\n * Number of active request.\r\n */\r\n outstandingCount: number;\r\n\r\n /**\r\n * Holding requests.\r\n */\r\n pendingRequests: PowerShellStreamRequest[];\r\n}\r\n\r\n/**\r\n * The PowerShell stream class.\r\n */\r\nexport class PowerShellStream implements WebsocketStreamHandler {\r\n /**\r\n * The collection of set of monitors.\r\n */\r\n private static monitorSets: PowerShellStreamMonitorSet<any>[] = [];\r\n\r\n private static maxRunPerNode = 5;\r\n private processors: Map<string /* id */, PowerShellProcessor> = new Map();\r\n private queues: Map<string /* nodeName */, PowerShellStreamQueue> = new Map();\r\n private strings = MsftSme.getStrings<Strings>().MsftSmeShell.Core.WebsocketStream.PowerShellStream;\r\n\r\n /**\r\n * Register the set of monitors.\r\n *\r\n * @param monitorSet The set of monitors.\r\n */\r\n public static registerMonitorSet(monitorSet: PowerShellStreamMonitorSet<any>): void {\r\n const found = PowerShellStream.monitorSets.find(monitors => monitors.name === monitorSet.name);\r\n if (found) {\r\n return;\r\n }\r\n\r\n PowerShellStream.monitorSets.push(monitorSet);\r\n }\r\n\r\n /**\r\n * Unregister the set of monitors.\r\n *\r\n * @param name The name of set of monitors.\r\n * @returns boolean true if unregistered the named set.\r\n */\r\n public static unregisterMonitors(name: string): boolean {\r\n const found = PowerShellStream.monitorSets.find(monitors => monitors.name === name);\r\n if (found) {\r\n PowerShellStream.monitorSets.remove(found);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Initializes a new instance of the PowerShellStream class.\r\n *\r\n * @param websocketStream the websocket stream object.\r\n * @param authorizationManager the authorization manager object.\r\n */\r\n constructor(private websocketStream: WebsocketStream, private authorizationManager: AuthorizationManager) {\r\n websocketStream.registerProcessor('SME-PowerShell', this);\r\n }\r\n\r\n /**\r\n * PowerShell script run.\r\n *\r\n * @param nodeName the node name.\r\n * @param script the script to run.\r\n * @param options the options for this request.\r\n * @return Observable<PowerShellResult> the query observable.\r\n */\r\n public run(\r\n nodeName: string,\r\n commandOrScript: string | PowerShellCommand,\r\n options?: PowerShellStreamOptions): Observable<PowerShellResult> {\r\n const command = PowerShell.getPowerShellCommand(commandOrScript);\r\n return this.monitorCreateRequest(nodeName, command, PowerShell.newEndpointOptions(options));\r\n }\r\n\r\n /**\r\n * Cancel active powershell script.\r\n * Result response comes back to the original query to end.\r\n *\r\n * @param nodeName the node name.\r\n * @param id the id of original request specified as options.queryId.\r\n */\r\n public cancel(nodeName: string, id: string, options?: PowerShellStreamOptions): void {\r\n const target = this.getTarget(nodeName, PowerShell.newEndpointOptions(options));\r\n const requestState = WebsocketStreamDataRequestState.Cancel;\r\n const request = <PowerShellStreamRequest>{ id, target, requestState, script: null };\r\n\r\n // remove from queue if not submitted yet.\r\n const queue = this.queues.get(target.nodeName);\r\n if (queue) {\r\n const pendingRequest = queue.pendingRequests.find(entry => entry.id === id);\r\n if (pendingRequest) {\r\n queue.pendingRequests.remove(pendingRequest);\r\n queue.outstandingCount--;\r\n const processor = this.processors.get(id);\r\n this.processors.delete(id);\r\n processor.complete();\r\n return;\r\n }\r\n }\r\n\r\n this.websocketStream.sendNext('SME-PowerShell', request);\r\n }\r\n\r\n /**\r\n * Reset data for connection cleanup.\r\n */\r\n public reset(): void {\r\n Logging.log({ level: LogLevel.Warning, message: this.strings.ResetError.message, source: 'PowerShellStream' });\r\n const processors: PowerShellProcessor[] = [];\r\n this.processors.forEach((value, key, map) => processors.push(value));\r\n this.processors.clear();\r\n processors.forEach((processor, key, map) => {\r\n processor.error(new Error(this.strings.ResetError.message));\r\n });\r\n }\r\n\r\n /**\r\n * Process the socket message.\r\n *\r\n * @param message the socket message.\r\n */\r\n public process(message: PowerShellStreamResponse): void {\r\n if (!message) {\r\n throw new Error(this.strings.NoContentError.message);\r\n }\r\n\r\n const processor = this.processors.get(message.id);\r\n if (!processor) {\r\n Logging.log({ level: LogLevel.Warning, message: this.strings.UnexpectedReceivedError.message, source: 'PowerShellStream' });\r\n return;\r\n }\r\n\r\n switch (message.state) {\r\n case WebsocketStreamDataState.Data:\r\n this.operationNext(processor, message.response);\r\n break;\r\n\r\n case WebsocketStreamDataState.Completed:\r\n this.operationComplete(processor, message.response);\r\n this.operationEnd(message.id);\r\n break;\r\n\r\n case WebsocketStreamDataState.Error:\r\n this.operationError(processor, { xhr: message });\r\n this.operationEnd(message.id);\r\n break;\r\n\r\n case WebsocketStreamDataState.Noop:\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the JEA powershell endpoint, if it exists\r\n *\r\n * @param nodeName The node name\r\n */\r\n public getJeaEndpoint(nodeName: string) {\r\n return this.authorizationManager.getJeaEndpoint(nodeName);\r\n }\r\n\r\n /**\r\n * Gets websocket stream connection state.\r\n */\r\n public getWebsocketStreamConnectionState(): WebsocketStreamConnectionState {\r\n return this.websocketStream.socketStateRaw;\r\n }\r\n\r\n /**\r\n * Gets WebSocket State.\r\n */\r\n public get websocketState(): ReplaySubject<WebsocketStreamConnectionState> {\r\n return this.websocketStream.socketState;\r\n }\r\n\r\n private operationNext(processor: PowerShellProcessor, response: PowerShellResult): boolean {\r\n const partial = processor.options && processor.options.partial;\r\n\r\n // buffering result.\r\n if (!partial) {\r\n if (!processor.response) {\r\n processor.response = response;\r\n } else {\r\n if (response.errors) {\r\n if (!processor.response.errors) {\r\n processor.response.errors = response.errors;\r\n } else {\r\n response.errors.forEach(value => processor.response.errors.push(value));\r\n }\r\n }\r\n\r\n if (response.progress) {\r\n if (!processor.response.progress) {\r\n processor.response.progress = response.progress;\r\n } else {\r\n response.progress.forEach(value => processor.response.progress.push(value));\r\n }\r\n }\r\n\r\n if (response.results) {\r\n if (!processor.response.results) {\r\n processor.response.results = response.results;\r\n } else {\r\n response.results.forEach(value => processor.response.results.push(value));\r\n }\r\n }\r\n }\r\n } else {\r\n processor.next(response);\r\n }\r\n\r\n return !partial;\r\n }\r\n\r\n private operationComplete(processor: PowerShellProcessor, response: PowerShellResult): void {\r\n if (this.operationNext(processor, response)) {\r\n processor.next(processor.response);\r\n }\r\n\r\n processor.complete();\r\n }\r\n\r\n private operationError(processor: PowerShellProcessor, error: any): void {\r\n processor.error(error);\r\n }\r\n\r\n private operationEnd(id: string): void {\r\n const processor = this.processors.get(id);\r\n this.processors.delete(id);\r\n const queue = this.queues.get(processor.target.nodeName);\r\n if (--queue.outstandingCount === 0) {\r\n this.queues.delete(processor.target.nodeName);\r\n }\r\n\r\n if (queue.pendingRequests.length > 0) {\r\n // if there is queued item, then send request.\r\n const request = queue.pendingRequests.shift();\r\n this.websocketStream.sendNext('SME-PowerShell', request);\r\n }\r\n }\r\n\r\n private createRequest<T>(\r\n nodeName: string,\r\n command: PowerShellCommand,\r\n options?: PowerShellStreamOptions): Observable<T> {\r\n // publish object is created two ways.\r\n // 1) socket is connected so submit the request immediately with simple observable.\r\n // (if-block and this is the most of cases.)\r\n // 2) socket is not connected so wait for the socket to ready and submit request with\r\n // complex observable. Initial connect and re-connection takes this observable.\r\n // (else-block and this is a few cases.)\r\n let publish: Observable<T>;\r\n const endpoint = this.authorizationManager.getJeaEndpoint(nodeName);\r\n const newOptions = {...(options || {})};\r\n if (endpoint) {\r\n newOptions.powerShellEndpoint = endpoint;\r\n }\r\n\r\n if (this.websocketStream.socketStateRaw === WebsocketStreamConnectionState.Connected) {\r\n publish = this.createRequestSimple(nodeName, command, newOptions);\r\n } else {\r\n publish = this.websocketStream.socketState\r\n .pipe(\r\n filter(state => state === WebsocketStreamConnectionState.Connected\r\n || state === WebsocketStreamConnectionState.Failed\r\n || state === WebsocketStreamConnectionState.NotConfigured),\r\n take(1),\r\n mergeMap(state => {\r\n if (state === WebsocketStreamConnectionState.Connected) {\r\n return this.createRequestSimple<T>(nodeName, command, newOptions);\r\n }\r\n\r\n return throwError(new Error(this.strings.ConnectionError.message));\r\n }));\r\n }\r\n\r\n return publish\r\n .pipe(\r\n catchError((error, caught) => {\r\n // retry if reset connection of socket was observed.\r\n if (error && error.message === this.strings.ResetError.message) {\r\n return <Observable<T>>this.monitorCreateRequest(nodeName, command, newOptions);\r\n }\r\n\r\n if ((!options || options.noAuth !== true) && this.authorizationManager.canHandleStreamFailure(error.xhr)) {\r\n return this.authorizationManager.handleStreamFailure(nodeName, options, error.xhr)\r\n .pipe(switchMap(updatedOptions =>\r\n <Observable<T>>this.monitorCreateRequest(nodeName, command, updatedOptions)));\r\n }\r\n\r\n return throwError(error);\r\n }));\r\n }\r\n\r\n private createRequestSimple<T>(\r\n nodeName: string,\r\n command: PowerShellCommand,\r\n options?: PowerShellStreamOptions): Observable<T> {\r\n return Observable.create(observer => {\r\n const target = this.getTarget(nodeName, options);\r\n const requestState = WebsocketStreamDataRequestState.Normal;\r\n const id = this.sendRequest(observer, target, requestState, command, options);\r\n return () => {\r\n const processor = this.processors.get(id);\r\n if (processor) {\r\n processor.end = true;\r\n if (!processor.closed && !processor.closing) {\r\n this.cancel(processor.target.nodeName, id);\r\n }\r\n }\r\n };\r\n });\r\n }\r\n\r\n private sendRequest(\r\n observer: Observer<any>,\r\n target: WebsocketStreamDataTarget,\r\n requestState: WebsocketStreamDataRequestState,\r\n command: PowerShellCommand,\r\n options?: PowerShellStreamOptions): string {\r\n const id = (options && options.queryId) || MsftSme.getUniqueId();\r\n const request = <PowerShellStreamRequest>{\r\n ...{\r\n id,\r\n target,\r\n requestState,\r\n options\r\n },\r\n ...command\r\n };\r\n const processor = new PowerShellProcessor(observer, target, options);\r\n const queue = this.queues.get(target.nodeName);\r\n this.processors.set(id, processor);\r\n\r\n // During a send request, if caller provides 'options.close' as true,\r\n // we shouldn't manage the request via a queue and on Gateway, we should create a\r\n // new, one time use Runspace, which is disposed after use, instead of using one from the pool.\r\n // As currently this is not handled on Gateway, just ignore the 'options.close' for now.\r\n /*\r\n if (options && options.close) {\r\n // disposing session.\r\n this.websocketStream.sendNext('SME-PowerShell', request);\r\n return id;\r\n }\r\n */\r\n\r\n if (++queue.outstandingCount > PowerShellStream.maxRunPerNode) {\r\n queue.pendingRequests.push(request);\r\n return id;\r\n }\r\n\r\n this.websocketStream.sendNext('SME-PowerShell', request);\r\n return id;\r\n }\r\n\r\n private getTarget(nodeName: string, options: PowerShellStreamOptions): WebsocketStreamDataTarget {\r\n if (!this.queues.has(nodeName)) {\r\n const queue = <PowerShellStreamQueue>{ outstandingCount: 0, pendingRequests: [] };\r\n this.queues.set(nodeName, queue);\r\n }\r\n\r\n return this.websocketStream.getTarget(this.authorizationManager, nodeName, options.powerShellEndpoint);\r\n }\r\n\r\n private monitorCreateRequest<T>(\r\n nodeName: string,\r\n command: PowerShellCommand,\r\n options?: PowerShellStreamOptions): Observable<T> {\r\n let monitored: (nodeName: string, command: PowerShellCommand, options?: PowerShellStreamOptions) => Observable<T>\r\n = (nodeName1: string, command1: PowerShellCommand, options1?: PowerShellStreamOptions) =>\r\n this.createRequest(nodeName1, command1, options1);\r\n for (const monitorSet of PowerShellStream.monitorSets) {\r\n monitored = this.monitor<T>(monitored, monitorSet);\r\n }\r\n\r\n return monitored(nodeName, command, options);\r\n }\r\n\r\n private monitor<T>(\r\n target: (nodeName: string, command: PowerShellCommand, options?: PowerShellStreamOptions) => Observable<T>,\r\n monitorSet: PowerShellStreamMonitorSet<T>)\r\n : (nodeName: string, command: PowerShellCommand, options?: PowerShellStreamOptions) => Observable<T> {\r\n\r\n return function(nodeName: string, command: PowerShellCommand, options?: PowerShellStreamOptions): Observable<T> {\r\n let context: PowerShellStreamMonitorSetContext<any>;\r\n return monitorSet.preMonitor(nodeName, command, options)\r\n .pipe(\r\n switchMap(packet => {\r\n context = packet;\r\n return target(packet.nodeName, packet.command, packet.options);\r\n }),\r\n catchError((error: any, caught: any) => monitorSet.errorMonitor(error, context)),\r\n switchMap(response => monitorSet.successMonitor(response, context))\r\n );\r\n };\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../packages/core/data/powershell-stream.ts"],"names":[],"mappings":"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","file":"powershell-stream.js","sourcesContent":["\r\nimport { Observable, Observer, ReplaySubject, throwError } from 'rxjs';\r\nimport { catchError, filter, mergeMap, switchMap, take } from 'rxjs/operators';\r\nimport { LogLevel } from '../diagnostics/log-level';\r\nimport { Logging } from '../diagnostics/logging';\r\nimport { Strings } from '../generated/strings';\r\nimport { AuthorizationManager } from '../security/authorization-manager';\r\nimport { NodeRequestOptions } from './node-connection';\r\nimport { PowerShell, PowerShellCommand } from './powershell';\r\nimport {\r\n WebsocketStream,\r\n WebsocketStreamConnectionState,\r\n WebsocketStreamDataRequestState,\r\n WebsocketStreamDataState,\r\n WebsocketStreamDataTarget,\r\n WebsocketStreamHandler,\r\n WebsocketStreamProcessor\r\n} from './websocket-stream';\r\n\r\n/**\r\n * PowerShell result object including an error.\r\n */\r\nexport interface PowerShellResult {\r\n /**\r\n * The runspace pool instance ID.\r\n */\r\n sessionId: string;\r\n\r\n /**\r\n * Completed state.\r\n */\r\n completed: 'True' | 'False';\r\n\r\n /**\r\n * Progress data.\r\n */\r\n progress?: any[];\r\n\r\n /**\r\n * Results data.\r\n */\r\n results?: any[];\r\n\r\n /**\r\n * Errors data.\r\n */\r\n errors?: any[];\r\n\r\n /**\r\n * Warning data.\r\n */\r\n warning?: any[];\r\n}\r\n\r\n/**\r\n * PowerShell Stream options.\r\n */\r\nexport interface PowerShellStreamOptions extends NodeRequestOptions {\r\n /**\r\n * Partial data response.\r\n * (default is waiting for completion.)\r\n */\r\n partial?: boolean;\r\n\r\n /**\r\n * Close the session each time, so it gets priority.\r\n */\r\n close?: boolean;\r\n\r\n /**\r\n * Override Query ID so it can request cancel.\r\n */\r\n queryId?: string;\r\n\r\n /**\r\n * Buffering time period by milliseconds.\r\n */\r\n bufferTime?: number;\r\n\r\n /**\r\n * Buffering count.\r\n */\r\n bufferCount?: number;\r\n}\r\n\r\n/**\r\n * The request packet of Cim Stream to the gateway.\r\n */\r\nexport interface PowerShellStreamRequest {\r\n /**\r\n * The identification string (auto generated or supplied as queryId option.)\r\n */\r\n id: string;\r\n\r\n /**\r\n * The stream target\r\n */\r\n target: WebsocketStreamDataTarget;\r\n\r\n /**\r\n * The date request state.\r\n */\r\n requestState: WebsocketStreamDataRequestState;\r\n\r\n /**\r\n * The name of PowerShell module.\r\n */\r\n module: string;\r\n\r\n /**\r\n * The command.\r\n */\r\n command: string;\r\n\r\n /**\r\n * The parameters.\r\n */\r\n parameters: any;\r\n\r\n /**\r\n * The script.\r\n */\r\n script: string;\r\n\r\n /**\r\n * The Cim stream options.\r\n */\r\n options: PowerShellStreamOptions;\r\n}\r\n\r\n/**\r\n * Cim stream response.\r\n */\r\nexport interface PowerShellStreamResponse {\r\n /**\r\n * The identification string (auto generated.)\r\n */\r\n id: string;\r\n\r\n /**\r\n * Web socket data stream state.\r\n */\r\n state: WebsocketStreamDataState;\r\n\r\n /**\r\n * Index number of response for the original request.\r\n */\r\n index: number;\r\n\r\n /**\r\n * The PowerShell result.\r\n */\r\n response: PowerShellResult;\r\n}\r\n\r\nexport interface PowerShellStreamMonitorSetContext<T> {\r\n nodeName: string;\r\n command: PowerShellCommand;\r\n options?: PowerShellStreamOptions;\r\n data: T;\r\n}\r\n\r\n/**\r\n * Set of monitors for pre and post process of powershell stream.\r\n */\r\nexport interface PowerShellStreamMonitorSet<T> {\r\n name: string;\r\n preMonitor: (nodeName: string, command: PowerShellCommand, options?: PowerShellStreamOptions) =>\r\n Observable<PowerShellStreamMonitorSetContext<any>>;\r\n successMonitor: (result: T, context: PowerShellStreamMonitorSetContext<any>) => Observable<T>;\r\n errorMonitor: (error: any, context: PowerShellStreamMonitorSetContext<any>) => Observable<T>;\r\n}\r\n\r\n/**\r\n * PowerShell Processor interface.\r\n */\r\nclass PowerShellProcessor extends WebsocketStreamProcessor<PowerShellResult, PowerShellStreamOptions> {\r\n /**\r\n * * Holding result if waitCompleted option is specified for multiple instances.\r\n */\r\n public response?: PowerShellResult;\r\n}\r\n\r\n/**\r\n * PowerShell stream queue.\r\n */\r\ninterface PowerShellStreamQueue {\r\n /**\r\n * Number of active request.\r\n */\r\n outstandingCount: number;\r\n\r\n /**\r\n * Holding requests.\r\n */\r\n pendingRequests: PowerShellStreamRequest[];\r\n}\r\n\r\n/**\r\n * The PowerShell stream class.\r\n */\r\nexport class PowerShellStream implements WebsocketStreamHandler {\r\n /**\r\n * The collection of set of monitors.\r\n */\r\n private static monitorSets: PowerShellStreamMonitorSet<any>[] = [];\r\n\r\n private static maxRunPerNode = 5;\r\n private processors: Map<string /* id */, PowerShellProcessor> = new Map();\r\n private queues: Map<string /* nodeName */, PowerShellStreamQueue> = new Map();\r\n private strings = MsftSme.getStrings<Strings>().MsftSmeShell.Core.WebsocketStream.PowerShellStream;\r\n\r\n /**\r\n * Register the set of monitors.\r\n *\r\n * @param monitorSet The set of monitors.\r\n */\r\n public static registerMonitorSet(monitorSet: PowerShellStreamMonitorSet<any>): void {\r\n const found = PowerShellStream.monitorSets.find(monitors => monitors.name === monitorSet.name);\r\n if (found) {\r\n return;\r\n }\r\n\r\n PowerShellStream.monitorSets.push(monitorSet);\r\n }\r\n\r\n /**\r\n * Unregister the set of monitors.\r\n *\r\n * @param name The name of set of monitors.\r\n * @returns boolean true if unregistered the named set.\r\n */\r\n public static unregisterMonitors(name: string): boolean {\r\n const found = PowerShellStream.monitorSets.find(monitors => monitors.name === name);\r\n if (found) {\r\n PowerShellStream.monitorSets.remove(found);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Initializes a new instance of the PowerShellStream class.\r\n *\r\n * @param websocketStream the websocket stream object.\r\n * @param authorizationManager the authorization manager object.\r\n */\r\n constructor(private websocketStream: WebsocketStream, private authorizationManager: AuthorizationManager) {\r\n websocketStream.registerProcessor('SME-PowerShell', this);\r\n }\r\n\r\n /**\r\n * PowerShell script run.\r\n *\r\n * @param nodeName the node name.\r\n * @param script the script to run.\r\n * @param options the options for this request.\r\n * @return Observable<PowerShellResult> the query observable.\r\n */\r\n public run(\r\n nodeName: string,\r\n commandOrScript: string | PowerShellCommand,\r\n options?: PowerShellStreamOptions): Observable<PowerShellResult> {\r\n const command = PowerShell.getPowerShellCommand(commandOrScript);\r\n return this.monitorCreateRequest(nodeName, command, PowerShell.newEndpointOptions(options));\r\n }\r\n\r\n /**\r\n * Cancel active powershell script.\r\n * Result response comes back to the original query to end.\r\n *\r\n * @param nodeName the node name.\r\n * @param id the id of original request specified as options.queryId.\r\n */\r\n public cancel(nodeName: string, id: string, options?: PowerShellStreamOptions): void {\r\n const target = this.getTarget(nodeName, PowerShell.newEndpointOptions(options));\r\n const requestState = WebsocketStreamDataRequestState.Cancel;\r\n const request = <PowerShellStreamRequest>{ id, target, requestState, script: null };\r\n\r\n // remove from queue if not submitted yet.\r\n const queue = this.queues.get(target.nodeName);\r\n if (queue) {\r\n const pendingRequest = queue.pendingRequests.find(entry => entry.id === id);\r\n if (pendingRequest) {\r\n queue.pendingRequests.remove(pendingRequest);\r\n queue.outstandingCount--;\r\n const processor = this.processors.get(id);\r\n this.processors.delete(id);\r\n processor.complete();\r\n return;\r\n }\r\n }\r\n\r\n this.websocketStream.sendNext('SME-PowerShell', request);\r\n }\r\n\r\n /**\r\n * Reset data for connection cleanup.\r\n */\r\n public reset(): void {\r\n Logging.log({ level: LogLevel.Warning, message: this.strings.ResetError.message, source: 'PowerShellStream' });\r\n const processors: PowerShellProcessor[] = [];\r\n this.processors.forEach((value, key, map) => processors.push(value));\r\n this.processors.clear();\r\n processors.forEach((processor, key, map) => {\r\n processor.error(new Error(this.strings.ResetError.message));\r\n });\r\n }\r\n\r\n /**\r\n * Process the socket message.\r\n *\r\n * @param message the socket message.\r\n */\r\n public process(message: PowerShellStreamResponse): void {\r\n if (!message) {\r\n throw new Error(this.strings.NoContentError.message);\r\n }\r\n\r\n const processor = this.processors.get(message.id);\r\n if (!processor) {\r\n Logging.log({ level: LogLevel.Warning, message: this.strings.UnexpectedReceivedError.message, source: 'PowerShellStream' });\r\n return;\r\n }\r\n\r\n switch (message.state) {\r\n case WebsocketStreamDataState.Data:\r\n this.operationNext(processor, message.response);\r\n break;\r\n\r\n case WebsocketStreamDataState.Completed:\r\n this.operationComplete(processor, message.response);\r\n this.operationEnd(message.id);\r\n break;\r\n\r\n case WebsocketStreamDataState.Error:\r\n this.operationError(processor, { xhr: message });\r\n this.operationEnd(message.id);\r\n break;\r\n\r\n case WebsocketStreamDataState.Noop:\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the JEA powershell endpoint, if it exists\r\n *\r\n * @param nodeName The node name\r\n */\r\n public getJeaEndpoint(nodeName: string) {\r\n return this.authorizationManager.getJeaEndpoint(nodeName);\r\n }\r\n\r\n /**\r\n * Gets websocket stream connection state.\r\n */\r\n public getWebsocketStreamConnectionState(): WebsocketStreamConnectionState {\r\n return this.websocketStream.socketStateRaw;\r\n }\r\n\r\n /**\r\n * Gets WebSocket State.\r\n */\r\n public get websocketState(): ReplaySubject<WebsocketStreamConnectionState> {\r\n return this.websocketStream.socketState;\r\n }\r\n\r\n private operationNext(processor: PowerShellProcessor, response: PowerShellResult): boolean {\r\n const partial = processor.options && processor.options.partial;\r\n\r\n // buffering result.\r\n if (!partial) {\r\n if (!processor.response) {\r\n processor.response = response;\r\n } else {\r\n if (response.errors) {\r\n if (!processor.response.errors) {\r\n processor.response.errors = response.errors;\r\n } else {\r\n response.errors.forEach(value => processor.response.errors.push(value));\r\n }\r\n }\r\n\r\n if (response.progress) {\r\n if (!processor.response.progress) {\r\n processor.response.progress = response.progress;\r\n } else {\r\n response.progress.forEach(value => processor.response.progress.push(value));\r\n }\r\n }\r\n\r\n if (response.results) {\r\n if (!processor.response.results) {\r\n processor.response.results = response.results;\r\n } else {\r\n response.results.forEach(value => processor.response.results.push(value));\r\n }\r\n }\r\n }\r\n } else {\r\n processor.next(response);\r\n }\r\n\r\n return !partial;\r\n }\r\n\r\n private operationComplete(processor: PowerShellProcessor, response: PowerShellResult): void {\r\n if (this.operationNext(processor, response)) {\r\n processor.next(processor.response);\r\n }\r\n\r\n processor.complete();\r\n }\r\n\r\n private operationError(processor: PowerShellProcessor, error: any): void {\r\n processor.error(error);\r\n }\r\n\r\n private operationEnd(id: string): void {\r\n const processor = this.processors.get(id);\r\n this.processors.delete(id);\r\n const queue = this.queues.get(processor.target.nodeName);\r\n if (--queue.outstandingCount === 0) {\r\n this.queues.delete(processor.target.nodeName);\r\n }\r\n\r\n if (queue.pendingRequests.length > 0) {\r\n // if there is queued item, then send request.\r\n const request = queue.pendingRequests.shift();\r\n this.websocketStream.sendNext('SME-PowerShell', request);\r\n }\r\n }\r\n\r\n private createRequest<T>(\r\n nodeName: string,\r\n command: PowerShellCommand,\r\n options?: PowerShellStreamOptions): Observable<T> {\r\n // publish object is created two ways.\r\n // 1) socket is connected so submit the request immediately with simple observable.\r\n // (if-block and this is the most of cases.)\r\n // 2) socket is not connected so wait for the socket to ready and submit request with\r\n // complex observable. Initial connect and re-connection takes this observable.\r\n // (else-block and this is a few cases.)\r\n let publish: Observable<T>;\r\n const endpoint = this.authorizationManager.getJeaEndpoint(nodeName);\r\n const newOptions = {...(options || {})};\r\n if (endpoint) {\r\n newOptions.powerShellEndpoint = endpoint;\r\n }\r\n\r\n if (this.websocketStream.socketStateRaw === WebsocketStreamConnectionState.Connected) {\r\n publish = this.createRequestSimple(nodeName, command, newOptions);\r\n } else {\r\n publish = this.websocketStream.socketState\r\n .pipe(\r\n filter(state => state === WebsocketStreamConnectionState.Connected\r\n || state === WebsocketStreamConnectionState.Failed\r\n || state === WebsocketStreamConnectionState.NotConfigured),\r\n take(1),\r\n mergeMap(state => {\r\n if (state === WebsocketStreamConnectionState.Connected) {\r\n return this.createRequestSimple<T>(nodeName, command, newOptions);\r\n }\r\n\r\n return throwError(new Error(this.strings.ConnectionError.message));\r\n }));\r\n }\r\n\r\n return publish\r\n .pipe(\r\n catchError((error, caught) => {\r\n // retry if reset connection of socket was observed.\r\n if (error && error.message === this.strings.ResetError.message) {\r\n return <Observable<T>>this.monitorCreateRequest(nodeName, command, newOptions);\r\n }\r\n\r\n if ((!options || options.noAuth !== true) && !this.authorizationManager.signOnManager.isSignOnTokenEnabled) {\r\n if (this.authorizationManager.canHandleStreamFailure(error.xhr)) {\r\n return this.authorizationManager.handleStreamFailure(nodeName, options, error.xhr)\r\n .pipe(switchMap(updatedOptions =>\r\n <Observable<T>>this.monitorCreateRequest(nodeName, command, updatedOptions)));\r\n }\r\n }\r\n\r\n if (this.authorizationManager.signOnManager.isSignOnTokenEnabled) {\r\n if (this.authorizationManager.signOnManager.canHandleStreamUnauthorizedLogin(error.xhr)) {\r\n return this.authorizationManager.signOnManager.handleStreamUnauthorizedLogin(options, error.xhr)\r\n .pipe(switchMap(updatedOptions =>\r\n <Observable<T>>this.monitorCreateRequest(nodeName, command, updatedOptions)));\r\n }\r\n }\r\n\r\n return throwError(error);\r\n }));\r\n }\r\n\r\n private createRequestSimple<T>(\r\n nodeName: string,\r\n command: PowerShellCommand,\r\n options?: PowerShellStreamOptions): Observable<T> {\r\n return Observable.create(observer => {\r\n const target = this.getTarget(nodeName, options);\r\n const requestState = WebsocketStreamDataRequestState.Normal;\r\n const id = this.sendRequest(observer, target, requestState, command, options);\r\n return () => {\r\n const processor = this.processors.get(id);\r\n if (processor) {\r\n processor.end = true;\r\n if (!processor.closed && !processor.closing) {\r\n this.cancel(processor.target.nodeName, id);\r\n }\r\n }\r\n };\r\n });\r\n }\r\n\r\n private sendRequest(\r\n observer: Observer<any>,\r\n target: WebsocketStreamDataTarget,\r\n requestState: WebsocketStreamDataRequestState,\r\n command: PowerShellCommand,\r\n options?: PowerShellStreamOptions): string {\r\n const id = (options && options.queryId) || MsftSme.getUniqueId();\r\n const request = <PowerShellStreamRequest>{\r\n ...{\r\n id,\r\n target,\r\n requestState,\r\n options\r\n },\r\n ...command\r\n };\r\n const processor = new PowerShellProcessor(observer, target, options);\r\n const queue = this.queues.get(target.nodeName);\r\n this.processors.set(id, processor);\r\n\r\n // During a send request, if caller provides 'options.close' as true,\r\n // we shouldn't manage the request via a queue and on Gateway, we should create a\r\n // new, one time use Runspace, which is disposed after use, instead of using one from the pool.\r\n // As currently this is not handled on Gateway, just ignore the 'options.close' for now.\r\n /*\r\n if (options && options.close) {\r\n // disposing session.\r\n this.websocketStream.sendNext('SME-PowerShell', request);\r\n return id;\r\n }\r\n */\r\n\r\n if (++queue.outstandingCount > PowerShellStream.maxRunPerNode) {\r\n queue.pendingRequests.push(request);\r\n return id;\r\n }\r\n\r\n this.websocketStream.sendNext('SME-PowerShell', request);\r\n return id;\r\n }\r\n\r\n private getTarget(nodeName: string, options: PowerShellStreamOptions): WebsocketStreamDataTarget {\r\n if (!this.queues.has(nodeName)) {\r\n const queue = <PowerShellStreamQueue>{ outstandingCount: 0, pendingRequests: [] };\r\n this.queues.set(nodeName, queue);\r\n }\r\n\r\n return this.websocketStream.getTarget(this.authorizationManager, nodeName, options.powerShellEndpoint);\r\n }\r\n\r\n private monitorCreateRequest<T>(\r\n nodeName: string,\r\n command: PowerShellCommand,\r\n options?: PowerShellStreamOptions): Observable<T> {\r\n let monitored: (nodeName: string, command: PowerShellCommand, options?: PowerShellStreamOptions) => Observable<T>\r\n = (nodeName1: string, command1: PowerShellCommand, options1?: PowerShellStreamOptions) =>\r\n this.createRequest(nodeName1, command1, options1);\r\n for (const monitorSet of PowerShellStream.monitorSets) {\r\n monitored = this.monitor<T>(monitored, monitorSet);\r\n }\r\n\r\n return monitored(nodeName, command, options);\r\n }\r\n\r\n private monitor<T>(\r\n target: (nodeName: string, command: PowerShellCommand, options?: PowerShellStreamOptions) => Observable<T>,\r\n monitorSet: PowerShellStreamMonitorSet<T>)\r\n : (nodeName: string, command: PowerShellCommand, options?: PowerShellStreamOptions) => Observable<T> {\r\n\r\n return function(nodeName: string, command: PowerShellCommand, options?: PowerShellStreamOptions): Observable<T> {\r\n let context: PowerShellStreamMonitorSetContext<any>;\r\n return monitorSet.preMonitor(nodeName, command, options)\r\n .pipe(\r\n switchMap(packet => {\r\n context = packet;\r\n return target(packet.nodeName, packet.command, packet.options);\r\n }),\r\n catchError((error: any, caught: any) => monitorSet.errorMonitor(error, context)),\r\n switchMap(response => monitorSet.successMonitor(response, context))\r\n );\r\n };\r\n }\r\n}\r\n"]}
|
|
@@ -62,7 +62,7 @@ export interface PowerShellContext {
|
|
|
62
62
|
/**
|
|
63
63
|
* PowerShell command object.
|
|
64
64
|
*/
|
|
65
|
-
export interface
|
|
65
|
+
export interface PowerShellCommandWithoutState {
|
|
66
66
|
/**
|
|
67
67
|
* The name of PowerShell module. (optional, it uses default module if not specified.)
|
|
68
68
|
*/
|
|
@@ -80,6 +80,15 @@ export interface PowerShellCommand {
|
|
|
80
80
|
*/
|
|
81
81
|
script: string;
|
|
82
82
|
}
|
|
83
|
+
/**
|
|
84
|
+
* PowerShell command object.
|
|
85
|
+
*/
|
|
86
|
+
export interface PowerShellCommand extends PowerShellCommandWithoutState {
|
|
87
|
+
/**
|
|
88
|
+
* The state of command object.
|
|
89
|
+
*/
|
|
90
|
+
state: string;
|
|
91
|
+
}
|
|
83
92
|
/**
|
|
84
93
|
* PowerShell command queue item.
|
|
85
94
|
*/
|
|
@@ -304,6 +313,13 @@ export declare class PowerShell {
|
|
|
304
313
|
* @param key The shared key to queue the requests to use the single runspace.
|
|
305
314
|
*/
|
|
306
315
|
private static indexName;
|
|
316
|
+
/**
|
|
317
|
+
* Adds jea prefix to the command name
|
|
318
|
+
*
|
|
319
|
+
* @param jeaPrefix The jea prefix originating from main.ts.
|
|
320
|
+
* @param command The powershell command to run.
|
|
321
|
+
*/
|
|
322
|
+
private static addPowerShellPrefix;
|
|
307
323
|
/**
|
|
308
324
|
* Initializes a new instance of the PowerShell class.
|
|
309
325
|
* (private constructor which shouldn't be called directly.)
|
package/core/data/powershell.js
CHANGED
|
@@ -336,10 +336,16 @@ export class PowerShell {
|
|
|
336
336
|
* @return PowerShellCommand the PowerShell request command object.
|
|
337
337
|
*/
|
|
338
338
|
static createCommand(resource, parameters, flags, resourceName) {
|
|
339
|
-
// step1:
|
|
340
|
-
|
|
339
|
+
// step1: Add Jea prefix dynamically
|
|
340
|
+
const powerShellPrefix = MsftSme.self().Init.powerShellPrefix;
|
|
341
|
+
let command = resource.command;
|
|
342
|
+
if (powerShellPrefix && resource && resource.command) {
|
|
343
|
+
command = PowerShell.addPowerShellPrefix(powerShellPrefix, resource.command);
|
|
344
|
+
}
|
|
345
|
+
// step2: Adding parameters converter from JSON to PowerShell.
|
|
346
|
+
// step3: Surround full content into SmeSubmit function.
|
|
341
347
|
let script = 'function cvt($o){return ConvertFrom-Json $o}\n function SmeSubmit{\n' + resource.script + '}\nSmeSubmit';
|
|
342
|
-
//
|
|
348
|
+
// step4: Adding localized resources strings overriding Import-LocalizedData as function.
|
|
343
349
|
if (resourceName) {
|
|
344
350
|
const strings = MsftSme.getStrings()[resourceName];
|
|
345
351
|
if (strings && strings['PowerShell']) {
|
|
@@ -356,7 +362,7 @@ export class PowerShell {
|
|
|
356
362
|
script = 'function Import-LocalizedData{$script:strings=@{\n' + lines.join('') + '}}' + script;
|
|
357
363
|
}
|
|
358
364
|
}
|
|
359
|
-
//
|
|
365
|
+
// step5: Adding each parameter with using converter.
|
|
360
366
|
for (const parameter in parameters) {
|
|
361
367
|
if (parameters.hasOwnProperty(parameter)) {
|
|
362
368
|
const value = parameters[parameter];
|
|
@@ -368,7 +374,7 @@ export class PowerShell {
|
|
|
368
374
|
}
|
|
369
375
|
}
|
|
370
376
|
}
|
|
371
|
-
//
|
|
377
|
+
// step6: Adding switch parameters.
|
|
372
378
|
const flagParameters = {};
|
|
373
379
|
if (flags) {
|
|
374
380
|
for (let i = 0; i < flags.length; i++) {
|
|
@@ -378,9 +384,10 @@ export class PowerShell {
|
|
|
378
384
|
}
|
|
379
385
|
return {
|
|
380
386
|
module: resource.module,
|
|
381
|
-
command
|
|
387
|
+
command,
|
|
382
388
|
parameters: Object.assign(Object.assign({}, flagParameters), parameters),
|
|
383
|
-
script
|
|
389
|
+
script,
|
|
390
|
+
state: 'ready'
|
|
384
391
|
};
|
|
385
392
|
}
|
|
386
393
|
static create(nodeName, nodeConnection, key, lifetime, requestOptions) {
|
|
@@ -415,13 +422,17 @@ export class PowerShell {
|
|
|
415
422
|
static getPowerShellCommand(scriptOrCommand) {
|
|
416
423
|
return typeof scriptOrCommand === 'string' ?
|
|
417
424
|
{
|
|
418
|
-
script: scriptOrCommand
|
|
425
|
+
script: scriptOrCommand,
|
|
426
|
+
command: null,
|
|
427
|
+
module: null,
|
|
428
|
+
state: 'ready'
|
|
419
429
|
}
|
|
420
430
|
: {
|
|
421
431
|
script: scriptOrCommand.script,
|
|
422
432
|
command: scriptOrCommand.command,
|
|
423
433
|
module: scriptOrCommand.module || MsftSme.self().Init.powerShellModuleName,
|
|
424
|
-
parameters: scriptOrCommand.parameters
|
|
434
|
+
parameters: scriptOrCommand.parameters,
|
|
435
|
+
state: 'ready'
|
|
425
436
|
};
|
|
426
437
|
}
|
|
427
438
|
/**
|
|
@@ -446,6 +457,21 @@ export class PowerShell {
|
|
|
446
457
|
static indexName(nodeName, key) {
|
|
447
458
|
return nodeName + ':' + key;
|
|
448
459
|
}
|
|
460
|
+
/**
|
|
461
|
+
* Adds jea prefix to the command name
|
|
462
|
+
*
|
|
463
|
+
* @param jeaPrefix The jea prefix originating from main.ts.
|
|
464
|
+
* @param command The powershell command to run.
|
|
465
|
+
*/
|
|
466
|
+
static addPowerShellPrefix(powerShellPrefix, command) {
|
|
467
|
+
const hyphenSeparatorIndex = command.indexOf('-');
|
|
468
|
+
const verb = command.substring(0, hyphenSeparatorIndex);
|
|
469
|
+
const target = command.substring(hyphenSeparatorIndex + 1);
|
|
470
|
+
if (target.indexOf(powerShellPrefix) === 0) {
|
|
471
|
+
throw new Error('Command already contains prefix');
|
|
472
|
+
}
|
|
473
|
+
return verb + '-' + powerShellPrefix + target;
|
|
474
|
+
}
|
|
449
475
|
/**
|
|
450
476
|
* Gets node name from current context.
|
|
451
477
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../packages/core/data/powershell.ts"],"names":[],"mappings":"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","file":"powershell.js","sourcesContent":["\r\nimport { empty, Observable, Observer, throwError } from 'rxjs';\r\nimport { AjaxError } from 'rxjs/ajax';\r\nimport { catchError, expand, mergeMap, tap } from 'rxjs/operators';\r\nimport { LogLevel } from '../diagnostics/log-level';\r\nimport { Logging } from '../diagnostics/logging';\r\nimport { SmeWebTelemetry } from '../diagnostics/sme-web-telemetry';\r\nimport { TelemetryEventStates } from '../diagnostics/sme-web-telemetry-models';\r\nimport { Strings } from '../generated/strings';\r\nimport { Disposable, DisposableLifetimeManager, Disposer } from './disposable';\r\nimport { headerConstants, HttpStatusCode } from './http-constants';\r\nimport { Net } from './net';\r\nimport { NodeConnection, NodeRequestOptions } from './node-connection';\r\n\r\n/**\r\n * PowerShell run options.\r\n */\r\nexport interface PowerShellOptions extends NodeRequestOptions {\r\n /**\r\n * Close the runspace after the call.\r\n * (default is false)\r\n */\r\n close?: boolean;\r\n\r\n /**\r\n * Close the runspace on error.\r\n */\r\n closeOnError?: boolean;\r\n\r\n /**\r\n * Timeout milliseconds to shutdown the session.\r\n * (default is null and forever)\r\n */\r\n timeoutMs?: number;\r\n\r\n /**\r\n * Processing data progressively instead of waiting all result.\r\n */\r\n partial?: boolean;\r\n\r\n /**\r\n * Specify the initial waiting time before starting polling of result of invoke script.\r\n */\r\n waitTimeMs?: number;\r\n}\r\n\r\n/**\r\n * The node request options to control the underlying node connections in a powershell session\r\n */\r\nexport interface PowerShellSessionRequestOptions extends NodeRequestOptions {\r\n /**\r\n * Specify the session pool mode on the gateway.\r\n */\r\n automatic?: boolean;\r\n}\r\n\r\n/**\r\n * PowerShell context object interface.\r\n */\r\nexport interface PowerShellContext {\r\n /**\r\n * The node name.\r\n */\r\n nodeName: string;\r\n\r\n /**\r\n * The shared key name for runspace.\r\n */\r\n key: string;\r\n\r\n /**\r\n * The array of referenced containers.\r\n */\r\n lifetimes: DisposableLifetimeManager[];\r\n\r\n /**\r\n * The request options for the powershell session\r\n */\r\n requestOptions: PowerShellSessionRequestOptions;\r\n}\r\n\r\n/**\r\n * PowerShell command object.\r\n */\r\nexport interface PowerShellCommand {\r\n /**\r\n * The name of PowerShell module. (optional, it uses default module if not specified.)\r\n */\r\n module?: string;\r\n\r\n /**\r\n * The command name.\r\n */\r\n command: string;\r\n\r\n /**\r\n * The parameters (arguments).\r\n */\r\n parameters?: any;\r\n\r\n /**\r\n * The script string.\r\n */\r\n script: string;\r\n}\r\n\r\n/**\r\n * PowerShell command queue item.\r\n */\r\nexport interface PowerShellCommandItem {\r\n /**\r\n * The command to execute.\r\n */\r\n command: PowerShellCommand;\r\n\r\n /**\r\n * Options for how to handle the command (reserved)\r\n */\r\n options?: PowerShellOptions;\r\n\r\n /**\r\n * Deferred object currently waiting for command run.\r\n */\r\n observer: Observer<any>;\r\n}\r\n\r\ninterface PowerShellCommandPacket extends PowerShellCommand {\r\n\r\n /**\r\n * The invocation mode with Net.powerShellApiInvokeCommand API.\r\n * Default is WorkItem which uses WebSocket communication.\r\n * Polling mode uses pooled runspaces on the gateway and the gateway will recycle and shutdown them automatically.\r\n */\r\n invokeMode?: 'WorkItem' | 'Polling';\r\n\r\n /**\r\n * Specify the initial waiting time before starting polling of result of invoke script.\r\n */\r\n waitTimeMs?: number;\r\n}\r\n\r\n/**\r\n * The PowerShellSession class.\r\n */\r\nexport class PowerShellSession implements Disposable {\r\n /**\r\n * Initializes a new instance of the PowerShellSession class.\r\n *\r\n * @param powerShell the PowerShell object.\r\n * @param lifetime the disposable lifetime manager object.\r\n */\r\n public constructor(powerShell: PowerShell);\r\n public constructor(powerShell: PowerShell, lifetime: DisposableLifetimeManager);\r\n public constructor(public powerShell: PowerShell, private lifetime?: DisposableLifetimeManager) {\r\n }\r\n\r\n /**\r\n * Gets the node name of session.\r\n */\r\n public get nodeName(): string {\r\n return this.powerShell.nodeName;\r\n }\r\n\r\n /**\r\n * Dispose the session object.\r\n */\r\n public dispose(): void {\r\n if (this.lifetime) {\r\n this.lifetime.dispose();\r\n }\r\n }\r\n}\r\n\r\nexport interface FallbackError extends AjaxError {\r\n handlerError: {\r\n message: string;\r\n code: 'ManageAsDialogCancel';\r\n };\r\n}\r\n\r\n/**\r\n * Class containing methods related to PowerShell runspace creation/deletion/command using PowerShell Raw API plugin.\r\n * - It's auto holding the session as long as it's used within last 3 minutes.\r\n */\r\nexport class PowerShellRaw implements Disposable {\r\n // 3 minutes holding time.\r\n private static maxDeltaTimeInMs: number = 3 * 60 * 1000;\r\n private sessionId: string;\r\n private timestampInMs = 0;\r\n private markDelete = false;\r\n private internalActive = false;\r\n private cancelPending = false;\r\n\r\n /**\r\n * Initializes a new instance of the PowerShellRaw class.\r\n *\r\n * @param nodeConnection The node connection service.\r\n * @param context The context of PowerShell run.\r\n */\r\n constructor(private nodeConnection: NodeConnection, private context: PowerShellContext) {\r\n }\r\n\r\n /**\r\n * Gets active status of PowerShell execution.\r\n */\r\n public get active(): boolean {\r\n return this.internalActive;\r\n }\r\n\r\n /**\r\n * Dispose the runspace.\r\n */\r\n public dispose(): void {\r\n if (!this.active) {\r\n // only close sessions that have been created.\r\n // If a result was cached a component may not\r\n // execute a command and still dispose the session\r\n // when the component is destroyed.\r\n if (this.sessionId) {\r\n this.close();\r\n }\r\n } else {\r\n this.markDelete = true;\r\n }\r\n }\r\n\r\n /**\r\n * Runs the given command\r\n *\r\n * @param command The command to execute.\r\n * @param options the powershell options.\r\n */\r\n public runCommand(command: PowerShellCommand, options?: PowerShellOptions): Observable<any> {\r\n // take the timestamp only success/healthy case.\r\n // error session would be auto-deleted after expiration time.\r\n this.internalActive = true;\r\n return this.command(command, options)\r\n .pipe(\r\n catchError((error) => this.fallbackToJea(error, command, options)),\r\n expand((data: any, index: number) => {\r\n this.timestampInMs = Date.now();\r\n if (this.checkCompleted(data)) {\r\n return empty();\r\n }\r\n\r\n if (this.cancelPending) {\r\n // submit cancel request.\r\n // after set active state to false and complete the observable.\r\n this.cancelPending = false;\r\n return this.cancel()\r\n .pipe(\r\n catchError((error, caught) => {\r\n this.internalActive = false;\r\n return empty();\r\n }),\r\n mergeMap(x => {\r\n this.internalActive = false;\r\n return empty();\r\n }));\r\n }\r\n\r\n const url = Net.powerShellApiRetrieveOutput.format(this.sessionId);\r\n return this.nodeConnection.get(this.context.nodeName, url, this.context.requestOptions)\r\n .pipe(\r\n catchError((error) => {\r\n SmeWebTelemetry.tracePowershellEvent(command, TelemetryEventStates.Error, {response: error.response});\r\n return this.fallbackToJea(error, command, options); }\r\n ));\r\n }));\r\n }\r\n\r\n /**\r\n * Close/Delete the session / runspace.\r\n */\r\n public close(): void {\r\n if (this.context.requestOptions.automatic) {\r\n return;\r\n }\r\n\r\n if (this.sessionId) {\r\n const sessionUri: string = Net.powerShellApiSessions.format(this.sessionId);\r\n this.sessionId = null;\r\n this.nodeConnection.deleteQuick(this.context.nodeName, sessionUri, <NodeRequestOptions>this.context.requestOptions);\r\n return;\r\n }\r\n\r\n Logging.log({\r\n level: LogLevel.Verbose,\r\n source: 'PowerShell/close',\r\n message: MsftSme.getStrings<Strings>().MsftSmeShell.Core.Error.PowerShellUnableSessionClose.message\r\n });\r\n }\r\n\r\n /**\r\n * Cancel the command.\r\n */\r\n public cancelCommand(): Observable<any> {\r\n if (this.internalActive) {\r\n this.cancelPending = true;\r\n }\r\n\r\n return empty();\r\n }\r\n\r\n /**\r\n * Perform the JEA fallback, if applicable.\r\n *\r\n * @param error The error to handle\r\n * @param command The command\r\n * @param options The request options\r\n */\r\n private fallbackToJea(error: FallbackError, command: PowerShellCommand, options: PowerShellOptions): Observable<any> {\r\n const authError = Net.isUnauthorized(error) || error.status === HttpStatusCode.BadRequest;\r\n const responseEndpoint = error && error.xhr && error.xhr.getResponseHeader(headerConstants.POWERSHELL_ENDPOINT);\r\n let requestEndpoint = (options && options.powerShellEndpoint);\r\n requestEndpoint = requestEndpoint || (this.context.requestOptions && this.context.requestOptions.powerShellEndpoint);\r\n const cancel = error.handlerError && error.handlerError.code && error.handlerError.code === 'ManageAsDialogCancel';\r\n const credSSP = (options && options.authenticationMechanism === 'Credssp');\r\n\r\n if (!cancel && authError && responseEndpoint && requestEndpoint !== responseEndpoint && !credSSP) {\r\n this.context.requestOptions.powerShellEndpoint = responseEndpoint;\r\n return this.command(command, options)\r\n .pipe(tap(() => {\r\n // The JEA request went through - persist this context in authorization manager.\r\n this.nodeConnection.saveJeaContext(this.context.nodeName, responseEndpoint);\r\n }));\r\n }\r\n\r\n // close on error if sessionId is available.\r\n if (options && options.closeOnError) {\r\n if (!this.sessionId) {\r\n this.sessionId = error && error.xhr && error.xhr.response && error.xhr.response.sessionId;\r\n }\r\n\r\n if (this.sessionId) {\r\n this.close();\r\n }\r\n }\r\n\r\n this.internalActive = false;\r\n return throwError(error);\r\n }\r\n\r\n private cancel(): Observable<any> {\r\n if (this.sessionId && this.internalActive) {\r\n const cancelUri: string = Net.powerShellApiCancelCommand.format(this.sessionId);\r\n return this.nodeConnection.post(this.context.nodeName, cancelUri, null, this.context.requestOptions);\r\n }\r\n\r\n Logging.log({\r\n level: LogLevel.Warning,\r\n source: 'PowerShell',\r\n message: MsftSme.getStrings<Strings>().MsftSmeShell.Core.Error.PowerShellUnableCancelCommand.message\r\n });\r\n return empty();\r\n }\r\n\r\n /**\r\n * Gets if timestamp was expired.\r\n */\r\n private get _isExpired(): boolean {\r\n const now = Date.now();\r\n return this.timestampInMs !== 0 && (now - this.timestampInMs) > PowerShellRaw.maxDeltaTimeInMs;\r\n }\r\n\r\n /**\r\n * Initiate command execution. It auto recycles old sessions.\r\n *\r\n * @param command the PowerShell command.\r\n */\r\n private command(command: PowerShellCommand, options?: PowerShellOptions): Observable<any> {\r\n const commandPacket: PowerShellCommandPacket = { ...command };\r\n const polling = !!this.context.requestOptions.automatic;\r\n if (polling) {\r\n commandPacket.invokeMode = 'Polling';\r\n }\r\n\r\n if (options && options.waitTimeMs) {\r\n commandPacket.waitTimeMs = options.waitTimeMs;\r\n }\r\n\r\n const data = Net.createPropertiesJSONString(commandPacket);\r\n const newOptions: NodeRequestOptions = <NodeRequestOptions>{\r\n ...this.context.requestOptions,\r\n ...{\r\n logAudit: options && options.logAudit,\r\n logTelemetry: options && options.logTelemetry\r\n }\r\n };\r\n\r\n const endpoint = options && options.powerShellEndpoint;\r\n if (endpoint) {\r\n newOptions.powerShellEndpoint = endpoint;\r\n }\r\n\r\n const token = options && options.authToken;\r\n if (token) {\r\n newOptions.authToken = token;\r\n }\r\n\r\n const authenticationMechanism = options && options.authenticationMechanism;\r\n if (authenticationMechanism) {\r\n newOptions.authenticationMechanism = authenticationMechanism;\r\n }\r\n\r\n let commandResponse: Observable<any>;\r\n if (polling) {\r\n this.sessionId = null;\r\n commandResponse = this.nodeConnection.post(this.context.nodeName, Net.powerShellApiInvokeCommand, data, newOptions);\r\n } else if (this.sessionId == null || this._isExpired) {\r\n this.sessionId = null;\r\n const generatedName = this.context.key ? this.context.key + '-newSession' : 'instantSession';\r\n const sessionUri: string = Net.powerShellApiSessions.format(generatedName);\r\n commandResponse = this.nodeConnection.put(this.context.nodeName, sessionUri, data, newOptions);\r\n } else {\r\n const executeUri: string = Net.powerShellApiExecuteCommand.format(this.sessionId);\r\n commandResponse = this.nodeConnection.post(this.context.nodeName, executeUri, data, newOptions);\r\n }\r\n return commandResponse.pipe(catchError((error) => {\r\n SmeWebTelemetry.tracePowershellEvent(command, TelemetryEventStates.Error, {response: error.response});\r\n return throwError(error);\r\n }));\r\n }\r\n\r\n private checkCompleted(data: any): boolean {\r\n const properties: any = Net.getItemProperties(data);\r\n if (properties.sessionId) {\r\n // keep the PS session GUID\r\n this.sessionId = properties.sessionId;\r\n }\r\n\r\n if (properties.completed.toLowerCase() === 'true') {\r\n this.internalActive = false;\r\n if (this.markDelete) {\r\n this.close();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * The PowerShell class.\r\n *\r\n * - Single instance of PowerShell class manages single runspace.\r\n * - It queues coming requests and process one at a time sequentially.\r\n * - If a command is slow and causing with multiple responses, it aggregates response into single Q result.\r\n * - A PowerShell instance should be created through create() function, and it's statically stored/managed into _map collection.\r\n * - In QueryCache operation, it can find the PowerShell instance to run PowerShell command by using find() function.\r\n * - Once all lifetime references are gone, it deletes the runspace.\r\n * - To dispose the PowerShell instance, it can use lifetime.dispose().\r\n */\r\nexport class PowerShell {\r\n /**\r\n * Default PowerShell endpoint.\r\n */\r\n public static defaultPowerShellEndpoint = 'http://schemas.microsoft.com/powershell/microsoft.powershell';\r\n\r\n /**\r\n * SME PowerShell endpoint.\r\n */\r\n public static smePowerShellEndpoint = 'http://schemas.microsoft.com/powershell/microsoft.sme.powershell';\r\n\r\n /**\r\n * SME CredSSP PowerShell endpoint to control client role of CredSSP on the gateway.\r\n */\r\n\r\n public static smeCredSSPEndpoint = 'http://schemas.microsoft.com/powershell/microsoft.sme.credssp';\r\n\r\n /**\r\n * Static collection of PowerShell objects.\r\n */\r\n private static map: MsftSme.StringMap<PowerShell> = {};\r\n\r\n /**\r\n * Regular expression to match all the occurrences of a single quote\r\n */\r\n private static escapeRegex = new RegExp('\\'', 'g');\r\n\r\n /**\r\n * The context of PowerShell object.\r\n */\r\n private context: PowerShellContext;\r\n\r\n /**\r\n * The queue of PowerShell command requests.\r\n */\r\n private queue: PowerShellCommandItem[] = [];\r\n\r\n /**\r\n * The reference to PowerShellRaw class object.\r\n */\r\n private raw: PowerShellRaw;\r\n\r\n /**\r\n * Current data to aggregate from multiple data responses.\r\n */\r\n private currentData: any;\r\n\r\n /**\r\n * Timestamp when last command started.\r\n */\r\n private timestamp: number;\r\n\r\n /**\r\n * Create script as string.\r\n * (Notes: Use createCommand() function which is based on PowerShell module,\r\n * Update gulpfile.js to generate a PowerShell module to support Show script, JEA and localization.)\r\n *\r\n * @param resource the script text from legacy ps-code converter.\r\n * @param parameters the arguments.\r\n * @param flags (optional) the switch flags.\r\n */\r\n public static createScript(\r\n script: string,\r\n parameters?: any,\r\n flags?: string[]): string {\r\n script = 'function cvt ($o) { return ConvertFrom-Json $o }\\n function SmeSubmit {\\n' + script + '}\\n SmeSubmit';\r\n for (const parameter in parameters) {\r\n if (parameters.hasOwnProperty(parameter)) {\r\n const value = parameters[parameter];\r\n\r\n if (value == null) {\r\n script += ' -{0} $null'.format(parameter);\r\n } else {\r\n script += ' -{0} (cvt \\'{1}\\')'.format(\r\n parameter,\r\n JSON.stringify(value).replace(PowerShell.escapeRegex, '\\'\\''));\r\n }\r\n }\r\n }\r\n\r\n if (flags) {\r\n for (let i = 0; i < flags.length; i++) {\r\n script += ' -{0}'.format(flags[i]);\r\n }\r\n }\r\n\r\n return script;\r\n }\r\n\r\n /**\r\n * Create PowerShell request command.\r\n * (It creates a command object of JEA PowerShell request under restricted user role environment.)\r\n *\r\n * @param resource the script resource object with command and script data from new ps-code converter.\r\n * @param parameters the arguments.\r\n * @param flags (optional) the switch flags.\r\n * @return PowerShellCommand the PowerShell request command object.\r\n */\r\n public static createCommand(\r\n resource: { command: string, script: string, module?: string },\r\n parameters?: any,\r\n flags?: string[],\r\n resourceName?: string): PowerShellCommand {\r\n // step1: Adding parameters converter from JSON to PowerShell.\r\n // step2: Surround full content into SmeSubmit function.\r\n let script = 'function cvt($o){return ConvertFrom-Json $o}\\n function SmeSubmit{\\n' + resource.script + '}\\nSmeSubmit';\r\n\r\n // step3: Adding localized resources strings overriding Import-LocalizedData as function.\r\n if (resourceName) {\r\n const strings = MsftSme.getStrings<any>()[resourceName];\r\n if (strings && strings['PowerShell']) {\r\n const items = strings['PowerShell'];\r\n const keys = Object.keys(items);\r\n const rightSingleQuotationMark = '\\u2019';\r\n const lines = keys.map(key =>\r\n (key + '=\\''\r\n + items[key]\r\n .split(rightSingleQuotationMark)\r\n .join('\\'\\'')\r\n .split('\\'')\r\n .join('\\'\\'')\r\n + '\\'\\n'));\r\n script = 'function Import-LocalizedData{$script:strings=@{\\n' + lines.join('') + '}}' + script;\r\n }\r\n }\r\n\r\n // step4: Adding each parameter with using converter.\r\n for (const parameter in parameters) {\r\n if (parameters.hasOwnProperty(parameter)) {\r\n const value = parameters[parameter];\r\n\r\n if (value == null) {\r\n script += ' -{0} $null'.format(parameter);\r\n } else {\r\n script += ' -{0} (cvt \\'{1}\\')'.format(\r\n parameter,\r\n JSON.stringify(value).replace(PowerShell.escapeRegex, '\\'\\''));\r\n }\r\n }\r\n }\r\n\r\n // step5: Adding switch parameters.\r\n const flagParameters = {};\r\n if (flags) {\r\n for (let i = 0; i < flags.length; i++) {\r\n script += ' -{0}'.format(flags[i]);\r\n flagParameters[flags[i]] = true;\r\n }\r\n }\r\n\r\n return <PowerShellCommand>{\r\n module: resource.module,\r\n command: resource.command,\r\n parameters: { ...flagParameters, ...parameters },\r\n script\r\n };\r\n }\r\n\r\n /**\r\n * Find or create new PowerShell object.\r\n *\r\n * @param nodeName The node to connect to.\r\n * @param nodeConnection The node connection.\r\n * @param key The shared key to queue the requests to use the single runspace.\r\n * @param lifetime The lifetime container.\r\n * @param requestOptions the options to apply to every request in this session\r\n */\r\n public static create(nodeName: string, nodeConnection: NodeConnection): PowerShell;\r\n public static create(nodeName: string, nodeConnection: NodeConnection, key: string, lifetime: DisposableLifetimeManager): PowerShell;\r\n public static create(\r\n nodeName: string,\r\n nodeConnection: NodeConnection,\r\n key: string,\r\n lifetime: DisposableLifetimeManager,\r\n requestOptions: PowerShellSessionRequestOptions): PowerShell;\r\n public static create(\r\n nodeName: string,\r\n nodeConnection: NodeConnection,\r\n key?: string,\r\n lifetime?: DisposableLifetimeManager,\r\n requestOptions?: PowerShellSessionRequestOptions): PowerShell {\r\n let ps: PowerShell;\r\n if (key && lifetime) {\r\n ps = PowerShell.map[PowerShell.indexName(nodeName, key)];\r\n if (ps) {\r\n ps.addLifetime(lifetime);\r\n return ps;\r\n }\r\n }\r\n\r\n ps = new PowerShell(nodeName, nodeConnection, key, lifetime, requestOptions);\r\n if (key && lifetime) {\r\n PowerShell.map[PowerShell.indexName(nodeName, key)] = ps;\r\n }\r\n\r\n return ps;\r\n }\r\n\r\n /**\r\n * Find existing PowerShell object. Create call must be called before to create the PowerShell instance.\r\n *\r\n * @param nodeName The node name.\r\n * @param key The shared key to queue the requests to use the single runspace.\r\n */\r\n public static find(nodeName: string, key: string): PowerShell {\r\n return PowerShell.map[PowerShell.indexName(nodeName, key)];\r\n }\r\n\r\n /**\r\n * Gets the command object from string or PowerShellCommand.\r\n *\r\n * @param scriptOrCommand the script string or PowerShellCommand object.\r\n */\r\n public static getPowerShellCommand(scriptOrCommand: string | PowerShellCommand): PowerShellCommand {\r\n return typeof scriptOrCommand === 'string' ?\r\n <PowerShellCommand>{\r\n script: <string>scriptOrCommand\r\n }\r\n : <PowerShellCommand>{\r\n script: scriptOrCommand.script,\r\n command: scriptOrCommand.command,\r\n module: scriptOrCommand.module || MsftSme.self().Init.powerShellModuleName,\r\n parameters: scriptOrCommand.parameters\r\n };\r\n }\r\n\r\n /**\r\n * Create new options with debugging endpoint if requested.\r\n *\r\n * @param options the PowerShell session request options.\r\n */\r\n public static newEndpointOptions(options: NodeRequestOptions): NodeRequestOptions {\r\n // if there is no endpoint but configured with powerShellEndpoint, set debugging endpoint.\r\n const newOptions = { ...(options || {}) };\r\n if (!newOptions.powerShellEndpoint && MsftSme.self().Init.powerShellEndpoint) {\r\n newOptions.powerShellEndpoint = MsftSme.self().Init.powerShellEndpoint;\r\n }\r\n\r\n return newOptions;\r\n }\r\n\r\n /**\r\n * Create the index name in map collection.\r\n *\r\n * @param nodeName The node name.\r\n * @param key The shared key to queue the requests to use the single runspace.\r\n */\r\n private static indexName(nodeName: string, key: string): string {\r\n return nodeName + ':' + key;\r\n }\r\n\r\n /**\r\n * Initializes a new instance of the PowerShell class.\r\n * (private constructor which shouldn't be called directly.)\r\n *\r\n * @param nodeConnection The node connection service.\r\n * @param key The shared key to queue the requests to use the single runspace.\r\n * @param lifetime The lifetime container.\r\n */\r\n constructor(\r\n nodeName: string,\r\n nodeConnection: NodeConnection,\r\n key: string,\r\n lifetime: DisposableLifetimeManager,\r\n options: PowerShellSessionRequestOptions) {\r\n this.context = {\r\n nodeName: nodeName,\r\n key: key,\r\n lifetimes: [],\r\n requestOptions: PowerShell.newEndpointOptions(options)\r\n };\r\n this.timestamp = 0;\r\n this.raw = new PowerShellRaw(nodeConnection, this.context);\r\n if (key && lifetime) {\r\n lifetime.registerForDispose(new Disposer(() => this.lifetimeDisposer(lifetime)));\r\n this.context.lifetimes.push(lifetime);\r\n }\r\n }\r\n\r\n /**\r\n * Gets node name from current context.\r\n */\r\n public get nodeName(): string {\r\n return this.context.nodeName;\r\n }\r\n\r\n /**\r\n * Run PowerShell command.\r\n *\r\n * @param command The command.\r\n * @param options The options.\r\n * @return PromiseV The result of PowerShell command.\r\n */\r\n public run(scriptOrCommand: string | PowerShellCommand, options?: PowerShellOptions): Observable<any> {\r\n const command = PowerShell.getPowerShellCommand(scriptOrCommand);\r\n if (this.context.lifetimes.length === 0) {\r\n // no disposer is assigned, force to close the session after every query.\r\n const timeoutMs: number = options && options.timeoutMs;\r\n\r\n if (options) {\r\n options.timeoutMs = timeoutMs;\r\n options.close = true;\r\n } else {\r\n options = { timeoutMs: timeoutMs, close: true };\r\n }\r\n }\r\n\r\n // queue the request.\r\n const observable = this.enqueue(command, options);\r\n return observable;\r\n }\r\n\r\n /**\r\n * Cancel PowerShell command.\r\n */\r\n public cancel(): Observable<any> {\r\n return this.raw.cancelCommand();\r\n }\r\n\r\n /**\r\n * Enqueue a command request.\r\n *\r\n * @param command The command.\r\n * @param options The options.\r\n */\r\n private enqueue(command: PowerShellCommand, options?: PowerShellOptions): Observable<any> {\r\n return Observable.create((observer: Observer<any>) => {\r\n this.queue.push(<PowerShellCommandItem>{ observer, command, options });\r\n this.dequeue();\r\n });\r\n }\r\n\r\n /**\r\n * Dequeue a command request.\r\n */\r\n private dequeue(): boolean {\r\n if (this.raw.active) {\r\n return false;\r\n }\r\n\r\n const item: PowerShellCommandItem = this.queue.shift();\r\n if (item) {\r\n this.currentData = null;\r\n this.timestamp = Date.now();\r\n this.raw.runCommand(item.command, item.options).subscribe(\r\n data => {\r\n const properties: any = Net.getItemProperties(data);\r\n this.collect(\r\n properties,\r\n item.options && item.options.timeoutMs,\r\n item.options && item.options.partial ? item.observer : null);\r\n },\r\n error => {\r\n if (item.options && item.options.close) {\r\n this.raw.close();\r\n }\r\n\r\n item.observer.error(error);\r\n this.timestamp = 0;\r\n this.dequeue();\r\n },\r\n () => {\r\n if (item.options && item.options.close) {\r\n this.raw.close();\r\n }\r\n\r\n if (!item.options || !item.options.partial) {\r\n item.observer.next(this.currentData);\r\n }\r\n\r\n item.observer.complete();\r\n this.timestamp = 0;\r\n this.dequeue();\r\n });\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Collect response result and aggregate into single object.\r\n *\r\n * @param properties The properties of response object.\r\n * @param timeoutMs The timeout to cancel command.\r\n * @param observer The observer of powershell results.\r\n */\r\n private collect(properties: any, timeoutMs: number, observer: Observer<any>): void {\r\n if (timeoutMs && this.timestamp && (Date.now() - this.timestamp > timeoutMs)) {\r\n // force to cancel the command because of unexpected longer execution.\r\n this.raw.cancelCommand();\r\n this.timestamp = 0;\r\n return;\r\n }\r\n\r\n if (observer) {\r\n // return partial data if observer is not null.\r\n observer.next(properties);\r\n this.currentData = properties;\r\n return;\r\n }\r\n\r\n if (this.currentData != null && this.currentData.results && properties.results) {\r\n let array: any[];\r\n if (MsftSme.getTypeOf(this.currentData.results) === 'array') {\r\n array = this.currentData.results;\r\n } else {\r\n array = [this.currentData.results];\r\n }\r\n\r\n if (MsftSme.getTypeOf(properties.results) === 'array') {\r\n properties.results.forEach((x: any) => {\r\n array.push(x);\r\n });\r\n } else {\r\n array.push(properties.results);\r\n }\r\n\r\n this.currentData.results = array;\r\n return;\r\n }\r\n\r\n this.currentData = properties;\r\n }\r\n\r\n /**\r\n * Attach lifetime object to disposer when disposing.\r\n *\r\n * @param lifetime The lifetime object.\r\n */\r\n private addLifetime(lifetime: DisposableLifetimeManager): void {\r\n const found: DisposableLifetimeManager = MsftSme.find(\r\n this.context.lifetimes, (value: DisposableLifetimeManager) => value === lifetime);\r\n if (!found) {\r\n this.context.lifetimes.push(lifetime);\r\n lifetime.registerForDispose(new Disposer(() => this.lifetimeDisposer(lifetime)));\r\n }\r\n }\r\n\r\n /**\r\n * Callback when disposing the container of view model.\r\n * If none, reference the PowerShell object. Dispose it. (Delete runspace)\r\n *\r\n * @param lifetime The lifetime object.\r\n */\r\n private lifetimeDisposer(lifetime: DisposableLifetimeManager): void {\r\n const found: DisposableLifetimeManager = MsftSme.find(\r\n this.context.lifetimes, (value: DisposableLifetimeManager) => value === lifetime);\r\n if (found) {\r\n MsftSme.remove(this.context.lifetimes, lifetime);\r\n if (this.context.lifetimes.length === 0) {\r\n // cancel queue command requests.\r\n this.queue.forEach((value: PowerShellCommandItem, index: number, array: PowerShellCommandItem[]) => {\r\n value.observer.next(null);\r\n value.observer.complete();\r\n });\r\n\r\n // delete from the map collection and delete the runspace/session.\r\n delete PowerShell.map[PowerShell.indexName(this.context.nodeName, this.context.key)];\r\n this.raw.dispose();\r\n }\r\n }\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../packages/core/data/powershell.ts"],"names":[],"mappings":"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","file":"powershell.js","sourcesContent":["\r\nimport { empty, Observable, Observer, throwError } from 'rxjs';\r\nimport { AjaxError } from 'rxjs/ajax';\r\nimport { catchError, expand, mergeMap, tap } from 'rxjs/operators';\r\nimport { LogLevel } from '../diagnostics/log-level';\r\nimport { Logging } from '../diagnostics/logging';\r\nimport { SmeWebTelemetry } from '../diagnostics/sme-web-telemetry';\r\nimport { TelemetryEventStates } from '../diagnostics/sme-web-telemetry-models';\r\nimport { Strings } from '../generated/strings';\r\nimport { Disposable, DisposableLifetimeManager, Disposer } from './disposable';\r\nimport { headerConstants, HttpStatusCode } from './http-constants';\r\nimport { Net } from './net';\r\nimport { NodeConnection, NodeRequestOptions } from './node-connection';\r\n\r\n/**\r\n * PowerShell run options.\r\n */\r\nexport interface PowerShellOptions extends NodeRequestOptions {\r\n /**\r\n * Close the runspace after the call.\r\n * (default is false)\r\n */\r\n close?: boolean;\r\n\r\n /**\r\n * Close the runspace on error.\r\n */\r\n closeOnError?: boolean;\r\n\r\n /**\r\n * Timeout milliseconds to shutdown the session.\r\n * (default is null and forever)\r\n */\r\n timeoutMs?: number;\r\n\r\n /**\r\n * Processing data progressively instead of waiting all result.\r\n */\r\n partial?: boolean;\r\n\r\n /**\r\n * Specify the initial waiting time before starting polling of result of invoke script.\r\n */\r\n waitTimeMs?: number;\r\n}\r\n\r\n/**\r\n * The node request options to control the underlying node connections in a powershell session\r\n */\r\nexport interface PowerShellSessionRequestOptions extends NodeRequestOptions {\r\n /**\r\n * Specify the session pool mode on the gateway.\r\n */\r\n automatic?: boolean;\r\n}\r\n\r\n/**\r\n * PowerShell context object interface.\r\n */\r\nexport interface PowerShellContext {\r\n /**\r\n * The node name.\r\n */\r\n nodeName: string;\r\n\r\n /**\r\n * The shared key name for runspace.\r\n */\r\n key: string;\r\n\r\n /**\r\n * The array of referenced containers.\r\n */\r\n lifetimes: DisposableLifetimeManager[];\r\n\r\n /**\r\n * The request options for the powershell session\r\n */\r\n requestOptions: PowerShellSessionRequestOptions;\r\n}\r\n\r\n/**\r\n * PowerShell command object.\r\n */\r\n export interface PowerShellCommandWithoutState {\r\n /**\r\n * The name of PowerShell module. (optional, it uses default module if not specified.)\r\n */\r\n module?: string;\r\n\r\n /**\r\n * The command name.\r\n */\r\n command: string;\r\n\r\n /**\r\n * The parameters (arguments).\r\n */\r\n parameters?: any;\r\n\r\n /**\r\n * The script string.\r\n */\r\n script: string;\r\n}\r\n\r\n\r\n/**\r\n * PowerShell command object.\r\n */\r\nexport interface PowerShellCommand extends PowerShellCommandWithoutState {\r\n /**\r\n * The state of command object.\r\n */\r\n state: string;\r\n}\r\n\r\n/**\r\n * PowerShell command queue item.\r\n */\r\nexport interface PowerShellCommandItem {\r\n /**\r\n * The command to execute.\r\n */\r\n command: PowerShellCommand;\r\n\r\n /**\r\n * Options for how to handle the command (reserved)\r\n */\r\n options?: PowerShellOptions;\r\n\r\n /**\r\n * Deferred object currently waiting for command run.\r\n */\r\n observer: Observer<any>;\r\n}\r\n\r\ninterface PowerShellCommandPacket extends PowerShellCommand {\r\n\r\n /**\r\n * The invocation mode with Net.powerShellApiInvokeCommand API.\r\n * Default is WorkItem which uses WebSocket communication.\r\n * Polling mode uses pooled runspaces on the gateway and the gateway will recycle and shutdown them automatically.\r\n */\r\n invokeMode?: 'WorkItem' | 'Polling';\r\n\r\n /**\r\n * Specify the initial waiting time before starting polling of result of invoke script.\r\n */\r\n waitTimeMs?: number;\r\n}\r\n\r\n/**\r\n * The PowerShellSession class.\r\n */\r\nexport class PowerShellSession implements Disposable {\r\n /**\r\n * Initializes a new instance of the PowerShellSession class.\r\n *\r\n * @param powerShell the PowerShell object.\r\n * @param lifetime the disposable lifetime manager object.\r\n */\r\n public constructor(powerShell: PowerShell);\r\n public constructor(powerShell: PowerShell, lifetime: DisposableLifetimeManager);\r\n public constructor(public powerShell: PowerShell, private lifetime?: DisposableLifetimeManager) {\r\n }\r\n\r\n /**\r\n * Gets the node name of session.\r\n */\r\n public get nodeName(): string {\r\n return this.powerShell.nodeName;\r\n }\r\n\r\n /**\r\n * Dispose the session object.\r\n */\r\n public dispose(): void {\r\n if (this.lifetime) {\r\n this.lifetime.dispose();\r\n }\r\n }\r\n}\r\n\r\nexport interface FallbackError extends AjaxError {\r\n handlerError: {\r\n message: string;\r\n code: 'ManageAsDialogCancel';\r\n };\r\n}\r\n\r\n/**\r\n * Class containing methods related to PowerShell runspace creation/deletion/command using PowerShell Raw API plugin.\r\n * - It's auto holding the session as long as it's used within last 3 minutes.\r\n */\r\nexport class PowerShellRaw implements Disposable {\r\n // 3 minutes holding time.\r\n private static maxDeltaTimeInMs: number = 3 * 60 * 1000;\r\n private sessionId: string;\r\n private timestampInMs = 0;\r\n private markDelete = false;\r\n private internalActive = false;\r\n private cancelPending = false;\r\n\r\n /**\r\n * Initializes a new instance of the PowerShellRaw class.\r\n *\r\n * @param nodeConnection The node connection service.\r\n * @param context The context of PowerShell run.\r\n */\r\n constructor(private nodeConnection: NodeConnection, private context: PowerShellContext) {\r\n }\r\n\r\n /**\r\n * Gets active status of PowerShell execution.\r\n */\r\n public get active(): boolean {\r\n return this.internalActive;\r\n }\r\n\r\n /**\r\n * Dispose the runspace.\r\n */\r\n public dispose(): void {\r\n if (!this.active) {\r\n // only close sessions that have been created.\r\n // If a result was cached a component may not\r\n // execute a command and still dispose the session\r\n // when the component is destroyed.\r\n if (this.sessionId) {\r\n this.close();\r\n }\r\n } else {\r\n this.markDelete = true;\r\n }\r\n }\r\n\r\n /**\r\n * Runs the given command\r\n *\r\n * @param command The command to execute.\r\n * @param options the powershell options.\r\n */\r\n public runCommand(command: PowerShellCommand, options?: PowerShellOptions): Observable<any> {\r\n // take the timestamp only success/healthy case.\r\n // error session would be auto-deleted after expiration time.\r\n this.internalActive = true;\r\n return this.command(command, options)\r\n .pipe(\r\n catchError((error) => this.fallbackToJea(error, command, options)),\r\n expand((data: any, index: number) => {\r\n this.timestampInMs = Date.now();\r\n if (this.checkCompleted(data)) {\r\n return empty();\r\n }\r\n\r\n if (this.cancelPending) {\r\n // submit cancel request.\r\n // after set active state to false and complete the observable.\r\n this.cancelPending = false;\r\n return this.cancel()\r\n .pipe(\r\n catchError((error, caught) => {\r\n this.internalActive = false;\r\n return empty();\r\n }),\r\n mergeMap(x => {\r\n this.internalActive = false;\r\n return empty();\r\n }));\r\n }\r\n\r\n const url = Net.powerShellApiRetrieveOutput.format(this.sessionId);\r\n return this.nodeConnection.get(this.context.nodeName, url, this.context.requestOptions)\r\n .pipe(\r\n catchError((error) => {\r\n SmeWebTelemetry.tracePowershellEvent(command, TelemetryEventStates.Error, { response: error.response });\r\n return this.fallbackToJea(error, command, options);\r\n }\r\n ));\r\n }));\r\n }\r\n\r\n /**\r\n * Close/Delete the session / runspace.\r\n */\r\n public close(): void {\r\n if (this.context.requestOptions.automatic) {\r\n return;\r\n }\r\n\r\n if (this.sessionId) {\r\n const sessionUri: string = Net.powerShellApiSessions.format(this.sessionId);\r\n this.sessionId = null;\r\n this.nodeConnection.deleteQuick(this.context.nodeName, sessionUri, <NodeRequestOptions>this.context.requestOptions);\r\n return;\r\n }\r\n\r\n Logging.log({\r\n level: LogLevel.Verbose,\r\n source: 'PowerShell/close',\r\n message: MsftSme.getStrings<Strings>().MsftSmeShell.Core.Error.PowerShellUnableSessionClose.message\r\n });\r\n }\r\n\r\n /**\r\n * Cancel the command.\r\n */\r\n public cancelCommand(): Observable<any> {\r\n if (this.internalActive) {\r\n this.cancelPending = true;\r\n }\r\n\r\n return empty();\r\n }\r\n\r\n /**\r\n * Perform the JEA fallback, if applicable.\r\n *\r\n * @param error The error to handle\r\n * @param command The command\r\n * @param options The request options\r\n */\r\n private fallbackToJea(error: FallbackError, command: PowerShellCommand, options: PowerShellOptions): Observable<any> {\r\n const authError = Net.isUnauthorized(error) || error.status === HttpStatusCode.BadRequest;\r\n const responseEndpoint = error && error.xhr && error.xhr.getResponseHeader(headerConstants.POWERSHELL_ENDPOINT);\r\n let requestEndpoint = (options && options.powerShellEndpoint);\r\n requestEndpoint = requestEndpoint || (this.context.requestOptions && this.context.requestOptions.powerShellEndpoint);\r\n const cancel = error.handlerError && error.handlerError.code && error.handlerError.code === 'ManageAsDialogCancel';\r\n const credSSP = (options && options.authenticationMechanism === 'Credssp');\r\n\r\n if (!cancel && authError && responseEndpoint && requestEndpoint !== responseEndpoint && !credSSP) {\r\n this.context.requestOptions.powerShellEndpoint = responseEndpoint;\r\n return this.command(command, options)\r\n .pipe(tap(() => {\r\n // The JEA request went through - persist this context in authorization manager.\r\n this.nodeConnection.saveJeaContext(this.context.nodeName, responseEndpoint);\r\n }));\r\n }\r\n\r\n // close on error if sessionId is available.\r\n if (options && options.closeOnError) {\r\n if (!this.sessionId) {\r\n this.sessionId = error && error.xhr && error.xhr.response && error.xhr.response.sessionId;\r\n }\r\n\r\n if (this.sessionId) {\r\n this.close();\r\n }\r\n }\r\n\r\n this.internalActive = false;\r\n return throwError(error);\r\n }\r\n\r\n private cancel(): Observable<any> {\r\n if (this.sessionId && this.internalActive) {\r\n const cancelUri: string = Net.powerShellApiCancelCommand.format(this.sessionId);\r\n return this.nodeConnection.post(this.context.nodeName, cancelUri, null, this.context.requestOptions);\r\n }\r\n\r\n Logging.log({\r\n level: LogLevel.Warning,\r\n source: 'PowerShell',\r\n message: MsftSme.getStrings<Strings>().MsftSmeShell.Core.Error.PowerShellUnableCancelCommand.message\r\n });\r\n return empty();\r\n }\r\n\r\n /**\r\n * Gets if timestamp was expired.\r\n */\r\n private get _isExpired(): boolean {\r\n const now = Date.now();\r\n return this.timestampInMs !== 0 && (now - this.timestampInMs) > PowerShellRaw.maxDeltaTimeInMs;\r\n }\r\n\r\n /**\r\n * Initiate command execution. It auto recycles old sessions.\r\n *\r\n * @param command the PowerShell command.\r\n */\r\n private command(command: PowerShellCommand, options?: PowerShellOptions): Observable<any> {\r\n const commandPacket: PowerShellCommandPacket = { ...command };\r\n const polling = !!this.context.requestOptions.automatic;\r\n if (polling) {\r\n commandPacket.invokeMode = 'Polling';\r\n }\r\n\r\n if (options && options.waitTimeMs) {\r\n commandPacket.waitTimeMs = options.waitTimeMs;\r\n }\r\n\r\n const data = Net.createPropertiesJSONString(commandPacket);\r\n const newOptions: NodeRequestOptions = <NodeRequestOptions>{\r\n ...this.context.requestOptions,\r\n ...{\r\n logAudit: options && options.logAudit,\r\n logTelemetry: options && options.logTelemetry\r\n }\r\n };\r\n\r\n const endpoint = options && options.powerShellEndpoint;\r\n if (endpoint) {\r\n newOptions.powerShellEndpoint = endpoint;\r\n }\r\n\r\n const token = options && options.authToken;\r\n if (token) {\r\n newOptions.authToken = token;\r\n }\r\n\r\n const authenticationMechanism = options && options.authenticationMechanism;\r\n if (authenticationMechanism) {\r\n newOptions.authenticationMechanism = authenticationMechanism;\r\n }\r\n\r\n let commandResponse: Observable<any>;\r\n if (polling) {\r\n this.sessionId = null;\r\n commandResponse = this.nodeConnection.post(this.context.nodeName, Net.powerShellApiInvokeCommand, data, newOptions);\r\n } else if (this.sessionId == null || this._isExpired) {\r\n this.sessionId = null;\r\n const generatedName = this.context.key ? this.context.key + '-newSession' : 'instantSession';\r\n const sessionUri: string = Net.powerShellApiSessions.format(generatedName);\r\n commandResponse = this.nodeConnection.put(this.context.nodeName, sessionUri, data, newOptions);\r\n } else {\r\n const executeUri: string = Net.powerShellApiExecuteCommand.format(this.sessionId);\r\n commandResponse = this.nodeConnection.post(this.context.nodeName, executeUri, data, newOptions);\r\n }\r\n return commandResponse.pipe(catchError((error) => {\r\n SmeWebTelemetry.tracePowershellEvent(command, TelemetryEventStates.Error, { response: error.response });\r\n return throwError(error);\r\n }));\r\n }\r\n\r\n private checkCompleted(data: any): boolean {\r\n const properties: any = Net.getItemProperties(data);\r\n if (properties.sessionId) {\r\n // keep the PS session GUID\r\n this.sessionId = properties.sessionId;\r\n }\r\n\r\n if (properties.completed.toLowerCase() === 'true') {\r\n this.internalActive = false;\r\n if (this.markDelete) {\r\n this.close();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * The PowerShell class.\r\n *\r\n * - Single instance of PowerShell class manages single runspace.\r\n * - It queues coming requests and process one at a time sequentially.\r\n * - If a command is slow and causing with multiple responses, it aggregates response into single Q result.\r\n * - A PowerShell instance should be created through create() function, and it's statically stored/managed into _map collection.\r\n * - In QueryCache operation, it can find the PowerShell instance to run PowerShell command by using find() function.\r\n * - Once all lifetime references are gone, it deletes the runspace.\r\n * - To dispose the PowerShell instance, it can use lifetime.dispose().\r\n */\r\nexport class PowerShell {\r\n /**\r\n * Default PowerShell endpoint.\r\n */\r\n public static defaultPowerShellEndpoint = 'http://schemas.microsoft.com/powershell/microsoft.powershell';\r\n\r\n /**\r\n * SME PowerShell endpoint.\r\n */\r\n public static smePowerShellEndpoint = 'http://schemas.microsoft.com/powershell/microsoft.sme.powershell';\r\n\r\n /**\r\n * SME CredSSP PowerShell endpoint to control client role of CredSSP on the gateway.\r\n */\r\n\r\n public static smeCredSSPEndpoint = 'http://schemas.microsoft.com/powershell/microsoft.sme.credssp';\r\n\r\n /**\r\n * Static collection of PowerShell objects.\r\n */\r\n private static map: MsftSme.StringMap<PowerShell> = {};\r\n\r\n /**\r\n * Regular expression to match all the occurrences of a single quote\r\n */\r\n private static escapeRegex = new RegExp('\\'', 'g');\r\n\r\n /**\r\n * The context of PowerShell object.\r\n */\r\n private context: PowerShellContext;\r\n\r\n /**\r\n * The queue of PowerShell command requests.\r\n */\r\n private queue: PowerShellCommandItem[] = [];\r\n\r\n /**\r\n * The reference to PowerShellRaw class object.\r\n */\r\n private raw: PowerShellRaw;\r\n\r\n /**\r\n * Current data to aggregate from multiple data responses.\r\n */\r\n private currentData: any;\r\n\r\n /**\r\n * Timestamp when last command started.\r\n */\r\n private timestamp: number;\r\n\r\n /**\r\n * Create script as string.\r\n * (Notes: Use createCommand() function which is based on PowerShell module,\r\n * Update gulpfile.js to generate a PowerShell module to support Show script, JEA and localization.)\r\n *\r\n * @param resource the script text from legacy ps-code converter.\r\n * @param parameters the arguments.\r\n * @param flags (optional) the switch flags.\r\n */\r\n public static createScript(\r\n script: string,\r\n parameters?: any,\r\n flags?: string[]): string {\r\n script = 'function cvt ($o) { return ConvertFrom-Json $o }\\n function SmeSubmit {\\n' + script + '}\\n SmeSubmit';\r\n for (const parameter in parameters) {\r\n if (parameters.hasOwnProperty(parameter)) {\r\n const value = parameters[parameter];\r\n\r\n if (value == null) {\r\n script += ' -{0} $null'.format(parameter);\r\n } else {\r\n script += ' -{0} (cvt \\'{1}\\')'.format(\r\n parameter,\r\n JSON.stringify(value).replace(PowerShell.escapeRegex, '\\'\\''));\r\n }\r\n }\r\n }\r\n\r\n if (flags) {\r\n for (let i = 0; i < flags.length; i++) {\r\n script += ' -{0}'.format(flags[i]);\r\n }\r\n }\r\n\r\n return script;\r\n }\r\n\r\n /**\r\n * Create PowerShell request command.\r\n * (It creates a command object of JEA PowerShell request under restricted user role environment.)\r\n *\r\n * @param resource the script resource object with command and script data from new ps-code converter.\r\n * @param parameters the arguments.\r\n * @param flags (optional) the switch flags.\r\n * @return PowerShellCommand the PowerShell request command object.\r\n */\r\n public static createCommand(\r\n resource: { command: string, script: string, module?: string },\r\n parameters?: any,\r\n flags?: string[],\r\n resourceName?: string): PowerShellCommand {\r\n // step1: Add Jea prefix dynamically\r\n const powerShellPrefix = MsftSme.self().Init.powerShellPrefix;\r\n let command = resource.command;\r\n if (powerShellPrefix && resource && resource.command) {\r\n command = PowerShell.addPowerShellPrefix(powerShellPrefix, resource.command);\r\n }\r\n\r\n // step2: Adding parameters converter from JSON to PowerShell.\r\n // step3: Surround full content into SmeSubmit function.\r\n let script = 'function cvt($o){return ConvertFrom-Json $o}\\n function SmeSubmit{\\n' + resource.script + '}\\nSmeSubmit';\r\n\r\n // step4: Adding localized resources strings overriding Import-LocalizedData as function.\r\n if (resourceName) {\r\n const strings = MsftSme.getStrings<any>()[resourceName];\r\n if (strings && strings['PowerShell']) {\r\n const items = strings['PowerShell'];\r\n const keys = Object.keys(items);\r\n const rightSingleQuotationMark = '\\u2019';\r\n const lines = keys.map(key =>\r\n (key + '=\\''\r\n + items[key]\r\n .split(rightSingleQuotationMark)\r\n .join('\\'\\'')\r\n .split('\\'')\r\n .join('\\'\\'')\r\n + '\\'\\n'));\r\n script = 'function Import-LocalizedData{$script:strings=@{\\n' + lines.join('') + '}}' + script;\r\n }\r\n }\r\n\r\n // step5: Adding each parameter with using converter.\r\n for (const parameter in parameters) {\r\n if (parameters.hasOwnProperty(parameter)) {\r\n const value = parameters[parameter];\r\n\r\n if (value == null) {\r\n script += ' -{0} $null'.format(parameter);\r\n } else {\r\n script += ' -{0} (cvt \\'{1}\\')'.format(\r\n parameter,\r\n JSON.stringify(value).replace(PowerShell.escapeRegex, '\\'\\''));\r\n }\r\n }\r\n }\r\n\r\n // step6: Adding switch parameters.\r\n const flagParameters = {};\r\n if (flags) {\r\n for (let i = 0; i < flags.length; i++) {\r\n script += ' -{0}'.format(flags[i]);\r\n flagParameters[flags[i]] = true;\r\n }\r\n }\r\n\r\n return <PowerShellCommand>{\r\n module: resource.module,\r\n command,\r\n parameters: { ...flagParameters, ...parameters },\r\n script,\r\n state: 'ready'\r\n };\r\n }\r\n\r\n /**\r\n * Find or create new PowerShell object.\r\n *\r\n * @param nodeName The node to connect to.\r\n * @param nodeConnection The node connection.\r\n * @param key The shared key to queue the requests to use the single runspace.\r\n * @param lifetime The lifetime container.\r\n * @param requestOptions the options to apply to every request in this session\r\n */\r\n public static create(nodeName: string, nodeConnection: NodeConnection): PowerShell;\r\n public static create(nodeName: string, nodeConnection: NodeConnection, key: string, lifetime: DisposableLifetimeManager): PowerShell;\r\n public static create(\r\n nodeName: string,\r\n nodeConnection: NodeConnection,\r\n key: string,\r\n lifetime: DisposableLifetimeManager,\r\n requestOptions: PowerShellSessionRequestOptions): PowerShell;\r\n public static create(\r\n nodeName: string,\r\n nodeConnection: NodeConnection,\r\n key?: string,\r\n lifetime?: DisposableLifetimeManager,\r\n requestOptions?: PowerShellSessionRequestOptions): PowerShell {\r\n let ps: PowerShell;\r\n if (key && lifetime) {\r\n ps = PowerShell.map[PowerShell.indexName(nodeName, key)];\r\n if (ps) {\r\n ps.addLifetime(lifetime);\r\n return ps;\r\n }\r\n }\r\n\r\n ps = new PowerShell(nodeName, nodeConnection, key, lifetime, requestOptions);\r\n if (key && lifetime) {\r\n PowerShell.map[PowerShell.indexName(nodeName, key)] = ps;\r\n }\r\n\r\n return ps;\r\n }\r\n\r\n /**\r\n * Find existing PowerShell object. Create call must be called before to create the PowerShell instance.\r\n *\r\n * @param nodeName The node name.\r\n * @param key The shared key to queue the requests to use the single runspace.\r\n */\r\n public static find(nodeName: string, key: string): PowerShell {\r\n return PowerShell.map[PowerShell.indexName(nodeName, key)];\r\n }\r\n\r\n /**\r\n * Gets the command object from string or PowerShellCommand.\r\n *\r\n * @param scriptOrCommand the script string or PowerShellCommand object.\r\n */\r\n public static getPowerShellCommand(scriptOrCommand: string | PowerShellCommand): PowerShellCommand {\r\n return typeof scriptOrCommand === 'string' ?\r\n {\r\n script: <string>scriptOrCommand,\r\n command: null,\r\n module: null,\r\n state: 'ready'\r\n }\r\n : {\r\n script: scriptOrCommand.script,\r\n command: scriptOrCommand.command,\r\n module: scriptOrCommand.module || MsftSme.self().Init.powerShellModuleName,\r\n parameters: scriptOrCommand.parameters,\r\n state: 'ready'\r\n };\r\n }\r\n\r\n /**\r\n * Create new options with debugging endpoint if requested.\r\n *\r\n * @param options the PowerShell session request options.\r\n */\r\n public static newEndpointOptions(options: NodeRequestOptions): NodeRequestOptions {\r\n // if there is no endpoint but configured with powerShellEndpoint, set debugging endpoint.\r\n const newOptions = { ...(options || {}) };\r\n if (!newOptions.powerShellEndpoint && MsftSme.self().Init.powerShellEndpoint) {\r\n newOptions.powerShellEndpoint = MsftSme.self().Init.powerShellEndpoint;\r\n }\r\n\r\n return newOptions;\r\n }\r\n\r\n /**\r\n * Create the index name in map collection.\r\n *\r\n * @param nodeName The node name.\r\n * @param key The shared key to queue the requests to use the single runspace.\r\n */\r\n private static indexName(nodeName: string, key: string): string {\r\n return nodeName + ':' + key;\r\n }\r\n\r\n /**\r\n * Adds jea prefix to the command name\r\n *\r\n * @param jeaPrefix The jea prefix originating from main.ts.\r\n * @param command The powershell command to run.\r\n */\r\n private static addPowerShellPrefix(powerShellPrefix: string, command: string): string {\r\n const hyphenSeparatorIndex = command.indexOf('-');\r\n const verb = command.substring(0, hyphenSeparatorIndex);\r\n const target = command.substring(hyphenSeparatorIndex + 1);\r\n if (target.indexOf(powerShellPrefix) === 0) {\r\n throw new Error('Command already contains prefix');\r\n }\r\n\r\n return verb + '-' + powerShellPrefix + target;\r\n }\r\n\r\n /**\r\n * Initializes a new instance of the PowerShell class.\r\n * (private constructor which shouldn't be called directly.)\r\n *\r\n * @param nodeConnection The node connection service.\r\n * @param key The shared key to queue the requests to use the single runspace.\r\n * @param lifetime The lifetime container.\r\n */\r\n constructor(\r\n nodeName: string,\r\n nodeConnection: NodeConnection,\r\n key: string,\r\n lifetime: DisposableLifetimeManager,\r\n options: PowerShellSessionRequestOptions) {\r\n this.context = {\r\n nodeName: nodeName,\r\n key: key,\r\n lifetimes: [],\r\n requestOptions: PowerShell.newEndpointOptions(options)\r\n };\r\n this.timestamp = 0;\r\n this.raw = new PowerShellRaw(nodeConnection, this.context);\r\n if (key && lifetime) {\r\n lifetime.registerForDispose(new Disposer(() => this.lifetimeDisposer(lifetime)));\r\n this.context.lifetimes.push(lifetime);\r\n }\r\n }\r\n\r\n /**\r\n * Gets node name from current context.\r\n */\r\n public get nodeName(): string {\r\n return this.context.nodeName;\r\n }\r\n\r\n /**\r\n * Run PowerShell command.\r\n *\r\n * @param command The command.\r\n * @param options The options.\r\n * @return PromiseV The result of PowerShell command.\r\n */\r\n public run(scriptOrCommand: string | PowerShellCommand, options?: PowerShellOptions): Observable<any> {\r\n const command = PowerShell.getPowerShellCommand(scriptOrCommand);\r\n if (this.context.lifetimes.length === 0) {\r\n // no disposer is assigned, force to close the session after every query.\r\n const timeoutMs: number = options && options.timeoutMs;\r\n\r\n if (options) {\r\n options.timeoutMs = timeoutMs;\r\n options.close = true;\r\n } else {\r\n options = { timeoutMs: timeoutMs, close: true };\r\n }\r\n }\r\n\r\n // queue the request.\r\n const observable = this.enqueue(command, options);\r\n return observable;\r\n }\r\n\r\n /**\r\n * Cancel PowerShell command.\r\n */\r\n public cancel(): Observable<any> {\r\n return this.raw.cancelCommand();\r\n }\r\n\r\n /**\r\n * Enqueue a command request.\r\n *\r\n * @param command The command.\r\n * @param options The options.\r\n */\r\n private enqueue(command: PowerShellCommand, options?: PowerShellOptions): Observable<any> {\r\n return Observable.create((observer: Observer<any>) => {\r\n this.queue.push(<PowerShellCommandItem>{ observer, command, options });\r\n this.dequeue();\r\n });\r\n }\r\n\r\n /**\r\n * Dequeue a command request.\r\n */\r\n private dequeue(): boolean {\r\n if (this.raw.active) {\r\n return false;\r\n }\r\n\r\n const item: PowerShellCommandItem = this.queue.shift();\r\n if (item) {\r\n this.currentData = null;\r\n this.timestamp = Date.now();\r\n this.raw.runCommand(item.command, item.options).subscribe(\r\n data => {\r\n const properties: any = Net.getItemProperties(data);\r\n this.collect(\r\n properties,\r\n item.options && item.options.timeoutMs,\r\n item.options && item.options.partial ? item.observer : null);\r\n },\r\n error => {\r\n if (item.options && item.options.close) {\r\n this.raw.close();\r\n }\r\n\r\n item.observer.error(error);\r\n this.timestamp = 0;\r\n this.dequeue();\r\n },\r\n () => {\r\n if (item.options && item.options.close) {\r\n this.raw.close();\r\n }\r\n\r\n if (!item.options || !item.options.partial) {\r\n item.observer.next(this.currentData);\r\n }\r\n\r\n item.observer.complete();\r\n this.timestamp = 0;\r\n this.dequeue();\r\n });\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Collect response result and aggregate into single object.\r\n *\r\n * @param properties The properties of response object.\r\n * @param timeoutMs The timeout to cancel command.\r\n * @param observer The observer of powershell results.\r\n */\r\n private collect(properties: any, timeoutMs: number, observer: Observer<any>): void {\r\n if (timeoutMs && this.timestamp && (Date.now() - this.timestamp > timeoutMs)) {\r\n // force to cancel the command because of unexpected longer execution.\r\n this.raw.cancelCommand();\r\n this.timestamp = 0;\r\n return;\r\n }\r\n\r\n if (observer) {\r\n // return partial data if observer is not null.\r\n observer.next(properties);\r\n this.currentData = properties;\r\n return;\r\n }\r\n\r\n if (this.currentData != null && this.currentData.results && properties.results) {\r\n let array: any[];\r\n if (MsftSme.getTypeOf(this.currentData.results) === 'array') {\r\n array = this.currentData.results;\r\n } else {\r\n array = [this.currentData.results];\r\n }\r\n\r\n if (MsftSme.getTypeOf(properties.results) === 'array') {\r\n properties.results.forEach((x: any) => {\r\n array.push(x);\r\n });\r\n } else {\r\n array.push(properties.results);\r\n }\r\n\r\n this.currentData.results = array;\r\n return;\r\n }\r\n\r\n this.currentData = properties;\r\n }\r\n\r\n /**\r\n * Attach lifetime object to disposer when disposing.\r\n *\r\n * @param lifetime The lifetime object.\r\n */\r\n private addLifetime(lifetime: DisposableLifetimeManager): void {\r\n const found: DisposableLifetimeManager = MsftSme.find(\r\n this.context.lifetimes, (value: DisposableLifetimeManager) => value === lifetime);\r\n if (!found) {\r\n this.context.lifetimes.push(lifetime);\r\n lifetime.registerForDispose(new Disposer(() => this.lifetimeDisposer(lifetime)));\r\n }\r\n }\r\n\r\n /**\r\n * Callback when disposing the container of view model.\r\n * If none, reference the PowerShell object. Dispose it. (Delete runspace)\r\n *\r\n * @param lifetime The lifetime object.\r\n */\r\n private lifetimeDisposer(lifetime: DisposableLifetimeManager): void {\r\n const found: DisposableLifetimeManager = MsftSme.find(\r\n this.context.lifetimes, (value: DisposableLifetimeManager) => value === lifetime);\r\n if (found) {\r\n MsftSme.remove(this.context.lifetimes, lifetime);\r\n if (this.context.lifetimes.length === 0) {\r\n // cancel queue command requests.\r\n this.queue.forEach((value: PowerShellCommandItem, index: number, array: PowerShellCommandItem[]) => {\r\n value.observer.next(null);\r\n value.observer.complete();\r\n });\r\n\r\n // delete from the map collection and delete the runspace/session.\r\n delete PowerShell.map[PowerShell.indexName(this.context.nodeName, this.context.key)];\r\n this.raw.dispose();\r\n }\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -94,6 +94,15 @@ export declare class CommonAdminSettings extends VersionedObject {
|
|
|
94
94
|
private sessionsExpirationMinutesCache;
|
|
95
95
|
get sessionsExpirationMinutes(): number;
|
|
96
96
|
set sessionsExpirationMinutes(value: number);
|
|
97
|
+
private credentialsExpirationTimeInMsCache;
|
|
98
|
+
/**
|
|
99
|
+
* Get stored manage as credentials expiration time in milliseconds
|
|
100
|
+
*/
|
|
101
|
+
get credentialsExpirationTimeInMs(): number;
|
|
102
|
+
/**
|
|
103
|
+
* Store manage as credentials expiration time in milliseconds
|
|
104
|
+
*/
|
|
105
|
+
set credentialsExpirationTimeInMs(value: number);
|
|
97
106
|
set updateRescheduled(value: boolean);
|
|
98
107
|
constructor(objectWrapper: PlainVersionedObject, handlers: VersionedObjectHandlers, gatewayService: GatewayConnection);
|
|
99
108
|
/**
|
|
@@ -151,6 +151,22 @@ export class CommonAdminSettings extends VersionedObject {
|
|
|
151
151
|
this.sessionsExpirationMinutesCache = undefined;
|
|
152
152
|
MsftSme.self().Init.sessionExpiration = undefined;
|
|
153
153
|
}
|
|
154
|
+
/**
|
|
155
|
+
* Get stored manage as credentials expiration time in milliseconds
|
|
156
|
+
*/
|
|
157
|
+
get credentialsExpirationTimeInMs() {
|
|
158
|
+
if (MsftSme.isNullOrUndefined(this.credentialsExpirationTimeInMsCache)) {
|
|
159
|
+
this.credentialsExpirationTimeInMsCache = this.getProperty(CommonAdminSettings.propertyNames.credentialsExpirationTimeInMs);
|
|
160
|
+
}
|
|
161
|
+
return this.credentialsExpirationTimeInMsCache;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Store manage as credentials expiration time in milliseconds
|
|
165
|
+
*/
|
|
166
|
+
set credentialsExpirationTimeInMs(value) {
|
|
167
|
+
this.setProperty(CommonAdminSettings.propertyNames.credentialsExpirationTimeInMs, value);
|
|
168
|
+
this.credentialsExpirationTimeInMsCache = undefined;
|
|
169
|
+
}
|
|
154
170
|
set updateRescheduled(value) {
|
|
155
171
|
this.setProperty(CommonAdminSettings.propertyNames.updateRescheduled, value);
|
|
156
172
|
}
|
|
@@ -188,7 +204,8 @@ CommonAdminSettings.propertyNames = {
|
|
|
188
204
|
autoExtensionsUpdate: 'autoExtensionsUpdate',
|
|
189
205
|
scheduledUpdateTime: 'scheduledUpdateTime',
|
|
190
206
|
updateRescheduled: 'updateRescheduled',
|
|
191
|
-
sessionsExpirationMinutes: 'sessionsExpirationMinutes'
|
|
207
|
+
sessionsExpirationMinutes: 'sessionsExpirationMinutes',
|
|
208
|
+
credentialsExpirationTimeInMs: 'credentialsExpirationTimeInMs'
|
|
192
209
|
};
|
|
193
210
|
/**
|
|
194
211
|
* Manager for the settings. Provides an api for managing user and application settings.
|