ps/Modules/Alkami.PowerShell.IIS/Public/Uninstall-Provider.ps1
2023-05-30 22:51:22 -07:00

210 lines
7.6 KiB
PowerShell

function Uninstall-Provider {
<#
.SYNOPSIS
This function is used in conjunction with Alkami.Installer.Provider to uninstall legacy providers from the appropriate locations.
.DESCRIPTION
This function is used in conjunction with Alkami.Installer.Provider to uninstall legacy providers from the appropriate locations.
This function will only attempt to remove the file that matches the provider name in the alkamimanifest.xml
It will stop the following services and restart them if they were running at the time of install:
* BankService - WCF Service
* SchedulerService - WCF Service
* CoreService - WCF Service
* SecurityManagementService - WCF Service
* NagConfigurationService - WCF Service
* Nag - Windows Service
* Radium - Windows Service
.PARAMETER ProviderAssemblyInfo
[string] The provider's configured assembly info.
.PARAMETER ProviderName
[string] The provider's configured name. This is not required, it will be used for display purposes only as of Alkami.PowerShell.IIS v3.1.1
.INPUTS
Required is the ProviderAssemblyInfo and the SourcePath.
.OUTPUTS
This function will only Write-Information
.EXAMPLE
Uninstall-Provider -ProviderAssemblyInfo Alkami.App.Providers.Core.Dynamic -SourcePath C:\ProgramData\chocolatey\lib\Alkami.App.Providers.Core.Dynamic
Uninstall-Provider output may be verbose from the underlying calls being made.
#>
[CmdletBinding()]
param(
[Parameter(Mandatory = $false)]
[AllowNull()]
[string]$ProviderAssemblyInfo = $null,
[Parameter(Mandatory = $false)]
[AllowNull()]
[string]$ProviderName = $null,
[Parameter(Mandatory = $false)]
[AllowNull()]
[string[]]$ProviderTargets = @('BankService','CoreService', 'NotificationService','SecurityManagementService','Radium','Nag','NagConfigurationService','SchedulerService')
)
process {
$loglead = (Get-LogLeadName)
if (!(Test-IsAdmin)){
throw "You are not running as administrator. Can not continue."
}
## If it's a developer machine we can install anything
## Don't install on MIC or WEB servers, only APP servers.
$isDeveloperMachine = (Test-IsDeveloperMachine)
$isAppServer = (Test-IsAppServer)
$isEitherAppOrDeveloper = $isDeveloperMachine -or $isAppServer
if (!$isEitherAppOrDeveloper) {
Write-Warning "$loglead : Can only install providers on app tier machines or developer machines"
return;
}
Write-Information "$loglead : $ProviderName being uninstalled by $($env:username) on $($env:computername) at $(Get-Date)"
## These are the folders we will be copying into.
## Folders missing from this list include Notification and NagConfiguration service which may need access to providers as well.
## As ORB is moving away from a provider-centric module approach to a microservice centric approach, this should be acceptable.
$folderTargets = @()
$orbPath = (Get-OrbPath) ## Cache the lookup
## If the following services are in any status other than Stopped, we want to stop, then restart them on a NON-PROD machine.
## Production servers are always deployed to when out-of-pool, so the services are already, in theory, stopped.
$isRadiumRunning = $false
$radiumServiceName = @(Get-ServiceNamesByFragment 'Radium')[0]
if ($ProviderTargets -contains 'Radium') {
if ($radiumServiceName -ne 'Not installed') {
$isRadiumRunning = (Get-Service -Name $radiumServiceName).Status -ne 'Stopped'
$folderTargets += (Join-Path $orbPath Radium)
}
}
$isNagRunning = $false
$nagServiceName = @(Get-ServiceNamesByFragment 'Alkami Nag')[0]
if ($ProviderTargets -contains 'Nag') {
if ($nagServiceName -ne 'Not installed') {
$isNagRunning = (Get-Service -Name $nagServiceName).Status -ne 'Stopped'
$folderTargets += (Join-Path $orbPath Nag)
}
}
$isBankRunning = $false
if ($ProviderTargets -contains 'BankService') {
$isBankRunning = Test-IISAppPoolByName BankService
$folderTargets += (Join-Path (Join-Path $orbPath BankService) bin)
}
$isSchedulerRunning = $false
if ($ProviderTargets -contains "SchedulerService") {
$isBankRunning = Test-IISAppPoolByName SchedulerService
$folderTargets += (Join-Path (Join-Path $orbPath SchedulerService) bin)
}
$isCoreRunning = $false
if ($ProviderTargets -contains 'CoreService') {
$isCoreRunning = Test-IISAppPoolByName CoreService
## CoreService is included because occasionally it may use other providers.
$folderTargets += (Join-Path (Join-Path $orbPath CoreService) bin)
}
$isNagConfigRunning = $false
if ($ProviderTargets -contains 'NagConfigurationService') {
$isNagConfigRunning = Test-IISAppPoolByName NagConfigurationService
$folderTargets += (Join-Path (Join-Path $orbPath NagConfigurationService) bin)
}
$isNotifyRunning = $false
if ($ProviderTargets -contains 'NotificationService') {
$isNotifyRunning = Test-IISAppPoolByName NotificationService
$folderTargets += (Join-Path (Join-Path $orbPath NotificationService) bin)
}
$isSecMgmtRunning = $false
if ($ProviderTargets -contains 'SecurityManagementService') {
$isSecMgmtRunning = Test-IISAppPoolByName SecurityManagementService
$folderTargets += (Join-Path (Join-Path $orbPath SecurityManagementService) bin)
}
if ($isRadiumRunning) {
Stop-AlkamiService -ServiceName $radiumServiceName
}
if ($isNagRunning) {
Stop-AlkamiService -ServiceName $nagServiceName
}
if ($isBankRunning) {
Stop-IISAppPoolByName BankService
Remove-DotNetTemporaryFiles Bank
}
if ($isSchedulerRunning) {
Stop-IISAppPoolByName -Name SchedulerService
Remove-DotNetTemporaryFiles -Name SchedulerService
}
if ($isCoreRunning) {
Stop-IISAppPoolByName CoreService
Remove-DotNetTemporaryFiles CoreService
}
if ($isNagConfigRunning) {
Stop-IISAppPoolByName NagConfigurationService
Remove-DotNetTemporaryFiles NagConfigurationService
}
if ($isNotifyRunning) {
Stop-IISAppPoolByName NotificationService
Remove-DotNetTemporaryFiles NotificationService
}
if ($isSecMgmtRunning) {
Stop-IISAppPoolByName SecurityManagementService
Remove-DotNetTemporaryFiles securityManagement
}
foreach($targetFolder in $folderTargets) {
## Only remove the package file we intended to have in ORB in the first place. Anything else will not be loaded, or may be shared with another project already.
## If we attempt to delete every file in the package, we may inadvertently break other application components from running.
$targetFile = (Join-Path $targetFolder "$ProviderAssemblyInfo.dll")
if (Test-Path $targetFile) {
Write-Verbose "$loglead : Removing $targetFile"
Write-Information '.';
Remove-FileSystemItem -Path $targetFile | Out-Null
} else {
Write-Verbose "$loglead : Did not find $targetFile to remove from $targetFolder"
}
}
if ($isBankRunning) {
Start-IISAppPoolByName BankService
}
if ($isSchedulerRunning) {
Start-IISAppPoolByName SchedulerService
}
if ($isCoreRunning) {
Start-IISAppPoolByName CoreService
}
if ($isNagConfigRunning) {
Start-IISAppPoolByName NagConfigurationService
}
if ($isNotifyRunning) {
Start-IISAppPoolByName NotificationService
}
if ($isSecMgmtRunning) {
Start-IISAppPoolByName SecurityManagementService
}
if ($isRadiumRunning) {
Start-Service -Name $radiumServiceName
}
if ($isNagRunning) {
Start-Service -Name $nagServiceName
}
}
}