custom/oldsdk/Connect-CVServer.ps1

function Connect-CVServer {
<#
.SYNOPSIS
    Method to get CommServe authorization token.
 
.DESCRIPTION
    Method to get CommServe authorization token.
 
.PARAMETER Server
    The CommServe URL to connect to.
 
.PARAMETER User
    User name for login.
 
.PARAMETER Password
    Secure password for login.
 
.PARAMETER Credential
    Powershell credential object. Used as alternative to -User <user> -Password <password>
 
.EXAMPLE
    Connect-CVServer -Server <CVWebserver name> -User <admin>
 
.EXAMPLE
    Connect-CVServer -Server <CVWebserver name> -User <admin> -Password (ConvertTo-SecureString 'password' -AsPlainText -Force)
 
.EXAMPLE
    Connect-CVServer -Server <CVWebserver name> -User <admin> -Password (ConvertTo-SecureString 'password' -AsPlainText -Force) -Port [port]
 
.EXAMPLE
    $Credential= New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList 'admin',('plainTextPassword' | ConvertTo-SecureString -AsPlainText -Force)
    Connect-CVServer -Credential $Credential -Server <CVWebserver name>
 
.OUTPUTS
    Outputs <String> indicating success or failure of login attempt.
 
.NOTES
    Author: Gary Stoops
    Company: Commvault
#>

    [CmdletBinding(DefaultParameterSetName = 'Default')]
    Param (
        [Parameter(Mandatory = $True)]
        [ValidateNotNullorEmpty()]
        [String] $Server,

        [Parameter(Mandatory = $False, ParameterSetName = 'Default')]
        [ValidateNotNullorEmpty()]
        [String] $User,

        [Parameter(Mandatory = $False, ParameterSetName = 'Default')]
        [SecureString] ${Password},

        [Alias('PSCreds')]
        [Parameter(ParameterSetName = 'PSCredential')]
        [ValidateNotNull()]
        [PSCredential]
        [Credential()]
        $Credential = [PSCredential]::Empty        
    )
    
    begin { Write-Debug -Message "$($MyInvocation.MyCommand): begin"

        try {
            if ($Credential -ne [PSCredential]::Empty) {
                Write-Debug -Message "$($MyInvocation.MyCommand): extracting password from PSCredential object"
                $User = $Credential.UserName
                $Password = $Credential.Password
            }
            
            if ([String]::IsNullOrEmpty($User)) {
                $User = Read-Host 'User'
                if ($User.Length -eq 0) {
                    $errorRecord = New-Object ErrorRecord (
                        (New-Object Exception $CVPS_ERROR_ID.1000),
                        'CVPS_ERROR_ID.1000',
                        [ErrorCategory]::OperationStopped,
                        $User
                        )
                        throw $errorRecord
                }
            }
            
            if ($null -eq $Password -or $Password.Length -eq 0) {
                $Password = Read-Host 'Password' -AsSecureString
                if ($Password.Length -eq 0) {
                    $errorRecord = New-Object ErrorRecord (
                        (New-Object Exception $CVPS_ERROR_ID.1001),
                        'CVPS_ERROR_ID.1001',
                        [ErrorCategory]::OperationStopped,
                        $Password
                        )
                        throw $errorRecord
                }
            }
        }
        catch {
            $PSCmdlet.ThrowTerminatingError($_) 
        }
    }
        
    process { Write-Debug -Message "$($MyInvocation.MyCommand): process"

        try {
            $response = (GetSessionToken $Server $User $Password)

            if ($response.IsValid) {
                Write-Verbose $response.Content
                [System.Environment]::SetEnvironmentVariable('CVToken', $response.Content.token)
                $baseUrl = (PrepareBaseUrlForLogin $Server)
                [System.Environment]::SetEnvironmentVariable('WebServerUrl', $baseUrl)

                # $global:CVConnectionPool = @{
                # server = $Server
                # token = $response.Content.token
                # user = $User
                # }
        
                # $global:CVConnectionPool.GetEnumerator() | Where-Object -FilterScript {
                # $_.name -notmatch 'token' | Out-Null
                # }
            }
            else {
                if (HasProperty $response 'Content') {
                    Write-Host $response.Content
                    if (HasProperty $response.Content 'errList') {
                        Write-Host $response.Content.errList[0]
                    }
                }
            }
        }
        catch {
            $PSCmdlet.ThrowTerminatingError($_) 
        }
    }

    end { Write-Debug -Message "$($MyInvocation.MyCommand): end"
    }
}


function GetSessionToken {
    [CmdletBinding()]
    [OutputType([PSCustomObject])]
    param (
        [Parameter(Mandatory = $True)]
        [ValidateNotNullorEmpty()]
        [String] $Server,

        [Parameter(Mandatory = $True)]
        [ValidateNotNullorEmpty()]
        [String] $User,

        [Parameter(Mandatory = $True)]
        [ValidateNotNullorEmpty()]
        [SecureString] $SecurePassword
    )

    begin { Write-Debug -Message "$($MyInvocation.MyCommand): begin"

        try {
            $validateProperty = 'token'
            [PSCustomObject] $output = New-Object PSObject
            $output | Add-Member -NotePropertyName 'IsValid' -NotePropertyValue ([String]::IsNullOrEmpty($validateProperty))
        }
        catch {
            throw $_
        }
    }

    process { Write-Debug -Message "$($MyInvocation.MyCommand): process"
        try {
            $method = 'Post'
            $endpoint = 'Login'
            $header = @{Accept = 'application/json'}
            $encodedPassword = ConvertToBase64String(ConvertFromSecureString($SecurePassword))
            $creds = @{ 
                password = $encodedPassword
                username = $User
            }
            $body = (ConvertTo-Json $creds)
            $baseUrl = (PrepareBaseUrlForLogin $Server)
            $response = (ProcessRequest $header $body $baseUrl $endpoint $method)
            ValidateResponse $response $output $ValidateProperty
            Write-Output $output
        }
        catch {
            throw $_
        }
    }

    end { Write-Debug -Message "$($MyInvocation.MyCommand): end"
    }
}


function  PrepareBaseUrlForLogin ([String] $Server) {
    
    try {
        #$prefix = $REST_AUTH_URL_PREFIX_SECURE
        if ($server.ToLower().Contains("http"))
        {
            $server = $server + "/"
            Write-Output $server
        }
        else{
            $prefix = $REST_AUTH_URL_PREFIX
            $url = $prefix + $REST_BASE_URL
            
            #Remove whitespace
            $Server = $Server -split '\s+'
            Write-Output ($url.Replace("Server", $Server)).Replace(" ", "")
    
        }
    }
    catch {
        throw $_
    }
}
function ConvertFromSecureString ([SecureString] $SecureString) {
    
    try {
        if ($null -ne $SecureString) {
            $BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecureString)
            Write-Output ([System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR))
        }
    }
    catch {
        throw $_
    }
}


function ConvertToBase64String ([String] $PlainText) {
    
    try {
        if ($null -ne $PlainText) {
            Write-Output ([convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($PlainText)))
        }
    }
    catch {
        throw $_
    }
}

function HasProperty($Object, $PropertyName)
{
    $PropertyName -in $Object.PSobject.Properties.Name
}


$REST_AUTH_URL_PREFIX = 'http://';
$REST_DEFAULT_PORT = '81';
$REST_BASE_URL = 'Server/webconsole/api';
$REST_HTTP_STATUS_CODES = @(200, 201, 202, 203, 204, 205, 206, 206, 207, 208);
$WEBCONSOLE_ENDPOINT = 'Server/Webconsole/api';

$CVPS_ERROR_ID = @{
    202  = 'REST API response [Accepted] error: The request has been received but not yet acted upon'
    1000 = 'Empty or null user name: Please provide a user name for web service login'
    1001 = 'Empty or null secure password: Please provide secure password for web service login'
    1002 = 'Invalid CommServe session token: Please login to CommServe with Connect-CVServer'
}