Functions/Misc/Set-ibPSConfiguration.ps1

function Set-ibPSConfiguration {
    <#
    .SYNOPSIS
        Used to set ibPS specific configuration

    .DESCRIPTION
        This function is used to set ibPS specific configuration, such as the BloxOne CSP API Key, Region/URL and enabling/disabling development or debug mode

    .PARAMETER CSPAPIKey
        This is the BloxOneDDI API Key retrieves from the Cloud Services Portal

    .PARAMETER CSPRegion
        Optionally configure the the CSP Region to use (i.e EU for the EMEA instance). The region defaults to US if not defined. You only need to use -CSPRegion OR -CSPUrl.

    .PARAMETER CSPUrl
        Optionally configure the the CSP URL to use manually. The CSP URL defaults to https://csp.infoblox.com if not defined. You only need to use -CSPUrl OR -CSPRegion.

    .PARAMETER Persist
        Setting the -Persist parameter will save the configuration peremenantly for your user on this device. Without using this switch, the settings will only be saved for the duration of the PowerShell session.

    .PARAMETER DevelopmentMode
        Enabling development mode will expose additional functions to allow development of new cmdlets. Enabling development mode will always apply as a persistent setting until it is disabled. This is because in some cases it may require a restart of the PowerShell session to fully enable.

    .PARAMETER DebugMode
        Enabling Debug Mode will return additional debug data when using the module. Enabling debug mode will always apply as a persistent setting until it is disabled. This is because in some cases it may require a restart of the PowerShell session to fully enable.

    .PARAMETER Telemetry
        Disabling Telemetry will prevent the module sending diagnostic information to Google Analytics. None of the diagnostic information sent contains any sensitive information, only the name of the executed function, any error associated error categories and source platform information (OS/Version).

    .PARAMETER Branch
        Use the -Branch parameter to select the github branch to update with. This only works when installed from Github, not from PowerShell Gallery. You will additionally need to run Get-ibPSVersion -Update -Force after you have configured the new branch to force an update.

    .EXAMPLE
        PS> Set-ibPSConfiguration -CSPAPIKey 'longapikeygoeshere' -Persist
                                                                                                                  
        BloxOne API key has been stored permenantly for user on MAC-DSD984HG

    .EXAMPLE
        PS> Set-ibPSConfiguration -CSPRegion EU
                                                                                                                  
        BloxOne CSP URL (https://csp.eu.infoblox.com) has been stored for this session.
        You can make the CSP URL persistent for this user on this machine by using the -persist parameter.

    .EXAMPLE
        PS> Set-ibPSConfiguration -DebugMode Enabled -DevelopmentMode Enabled

    .FUNCTIONALITY
        ibPS
    #>

  param (
    [String]$CSPAPIKey,
    [ValidateSet("US","EU")]
    [String]$CSPRegion,
    [String]$CSPUrl,
    [Switch]$Persist,
    [ValidateSet('Enabled','Disabled')]
    [String]$DevelopmentMode,
    [ValidateSet('Enabled','Disabled')]
    [String]$DebugMode,
    [ValidateSet('Enabled','Disabled')]
    [String]$Telemetry,
    [ValidateSet("main", "dev")]
    [String]$Branch
  )

  if ($CSPRegion -and $CSPUrl) {
    Write-Error "-CSPRegion and -CSPUrl are mutually exclusive and will overwrite one another. You must use only one of these parameters."
    break
  } else {
    if ($CSPRegion -or $CSPUrl) {
      switch ($CSPRegion) {
        "US" {
            $CSPUrl = "https://csp.infoblox.com"
        }
        "EU" {
            $CSPUrl = "https://csp.eu.infoblox.com"
        }
      }
      if ($Persist) {
        $Platform = Detect-OS
        if ($Platform -eq "Windows") {
          [System.Environment]::SetEnvironmentVariable('B1CSPUrl',$CSPUrl,[System.EnvironmentVariableTarget]::User)
          $ENV:B1CSPUrl = $CSPUrl
          Write-Host "BloxOne CSP URL ($CSPUrl) has been stored permenantly for $env:USERNAME on $env:COMPUTERNAME." -ForegroundColor Green
        } elseif ($Platform -eq "Mac" -or $Platform -eq "Unix") {
          $ENV:B1CSPUrl = $CSPUrl
          if (!(Test-Path ~/.zshenv)) {
            touch ~/.zshenv
          }
          sed -i '' -e '/B1CSPUrl/d' ~/.zshenv
          echo "export B1CSPUrl=$CSPUrl" >> ~/.zshenv
          Write-Host "BloxOne CSP URL ($CSPUrl) has been stored permenantly for $env:USER on $(scutil --get LocalHostName)." -ForegroundColor Green
        }
      } else {
          $ENV:B1CSPUrl = $CSPUrl
          Write-Host "BloxOne CSP URL ($CSPUrl) has been stored for this session." -ForegroundColor Green
          Write-Host "You can make the CSP URL persistent for this user on this machine by using the -persist parameter." -ForegroundColor Gray
      }
    }
  }

  if ($CSPAPIKey) {
    $B1APIKey = $CSPAPIKey | ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString
    $Bytes = [System.Text.Encoding]::Unicode.GetBytes($B1APIKey)
    $Base64 = [Convert]::ToBase64String($Bytes)
    if ($Persist) {
      $Platform = Detect-OS
      if ($Platform -eq "Windows") {
        [System.Environment]::SetEnvironmentVariable('B1APIKey',$Base64,[System.EnvironmentVariableTarget]::User)
        $ENV:B1APIKey = $Base64
        Write-Host "BloxOne API key has been stored permenantly for $env:USERNAME on $env:COMPUTERNAME." -ForegroundColor Green
      } elseif ($Platform -eq "Mac" -or $Platform -eq "Unix") {
        $ENV:B1APIKey = $Base64
        if (!(Test-Path ~/.zshenv)) {
          touch ~/.zshenv
        }
        sed -i '' -e '/B1APIKey/d' ~/.zshenv
        echo "export B1APIKey=$Base64" >> ~/.zshenv
        Write-Host "BloxOne API key has been stored permenantly for $env:USER on $(scutil --get LocalHostName)." -ForegroundColor Green
      }
    } else {
        $ENV:B1APIKey = $Base64
        Write-Host "BloxOne API key has been stored for this session." -ForegroundColor Green
        Write-Host "You can make the API key persistent for this user on this machine by using the -persist parameter." -ForegroundColor Gray
    }
  }

  if ($DevelopmentMode) {
  $Platform = Detect-OS
  $ENV:IBPSDevelopment = $DevelopmentMode
  if ($Platform -eq "Windows") {
    [System.Environment]::SetEnvironmentVariable('IBPSDevelopment',$DevelopmentMode,[System.EnvironmentVariableTarget]::User)
  } elseif ($Platform -eq "Mac" -or $Platform -eq "Unix") {
    if (!(Test-Path ~/.zshenv)) {
      touch ~/.zshenv
    }
    sed -i '' -e '/IBPSDevelopment/d' ~/.zshenv
    echo "export IBPSDevelopment=$DevelopmentMode" >> ~/.zshenv
  }
  if ($DevelopmentMode -eq 'Enabled') {
    Write-Host "Enabling Development Mode.." -ForegroundColor Cyan
    $ModulePath = (Get-Module ibPS -ListAvailable).Path
    $Keys = (Test-ModuleManifest $ModulePath).ExportedCommands.Keys
    $Keys += DevelopmentFunctions
    Update-ModuleManifest $ModulePath -FunctionsToExport $Keys
    Import-Module $ModulePath -Force -DisableNameChecking
    Write-Host "Enabled Development Mode. A restart of the Powershell session is required for this to take effect." -ForegroundColor Green
  } elseif ($DevelopmentMode -eq 'Disabled') {
    Write-Host "Disabling Development Mode.." -ForegroundColor Cyan
    $ModulePath = (Get-Module ibPS -ListAvailable).Path
    $Keys = (Test-ModuleManifest $ModulePath).ExportedCommands.Keys | Where-Object {$_ -notin $(DevelopmentFunctions)}
    Update-ModuleManifest $ModulePath -FunctionsToExport $Keys
    Import-Module $ModulePath -Force -DisableNameChecking
    Write-Host "Disabled Development Mode. A restart of the Powershell session may be required for this to take effect." -ForegroundColor Green
  }
  }

  if ($DebugMode) {
    $Platform = Detect-OS
    if ($Platform -eq "Windows") {
      [System.Environment]::SetEnvironmentVariable('IBPSDebug',$DebugMode,[System.EnvironmentVariableTarget]::User)
    } elseif ($Platform -eq "Mac" -or $Platform -eq "Unix") {
      if (!(Test-Path ~/.zshenv)) {
        touch ~/.zshenv
      }
      sed -i '' -e '/IBPSDebug/d' ~/.zshenv
      echo "export IBPSDebug=$DebugMode" >> ~/.zshenv
    }
    $ENV:IBPSDebug = $DebugMode
    Write-Host "$($DebugMode) Debug Mode." -ForegroundColor Green
  }

  if ($Telemetry) {
    $Platform = Detect-OS
    if ($Platform -eq "Windows") {
      [System.Environment]::SetEnvironmentVariable('IBPSTelemetry',$Telemetry,[System.EnvironmentVariableTarget]::User)
    } elseif ($Platform -eq "Mac" -or $Platform -eq "Unix") {
      if (!(Test-Path ~/.zshenv)) {
        touch ~/.zshenv
      }
      sed -i '' -e '/IBPSTelemetry/d' ~/.zshenv
      echo "export IBPSTelemetry=$Telemetry" >> ~/.zshenv
    }
    $ENV:IBPSTelemetry = $Telemetry
    Write-Host "$($Telemetry) Telemetry." -ForegroundColor Green
  }

  if ($Branch) {
    $Platform = Detect-OS
    if ($Platform -eq "Windows") {
      [System.Environment]::SetEnvironmentVariable('IBPSBranch',$Branch,[System.EnvironmentVariableTarget]::User)
    } elseif ($Platform -eq "Mac" -or $Platform -eq "Unix") {
      if (!(Test-Path ~/.zshenv)) {
        touch ~/.zshenv
      }
      sed -i '' -e '/IBPSBranch/d' ~/.zshenv
      echo "export IBPSBranch=$Branch" >> ~/.zshenv
    }
    $ENV:IBPSBranch = $Branch
  }
}