Private/Get-AtwsCacheInfo.ps1

Function Get-AtwsCacheInfo
{
  [CmdLetBinding()]
  
  Param
  (
    [String]
    $Prefix = 'Atws'
  )

  Begin
  {
    Write-Verbose -Message ('{0}: Trying to determine correct location for dynamic module cache.' -F $MyInvocation.MyCommand.Name)    
    
    $ModuleAutotask = Get-Module -Name Autotask
    $ModuleVersionFileName = 'ModuleVersionInfo.xml'
    $ModuleVersionInfo = New-Object -TypeName PSObject -Property @{
      APIversion = $AtwsConnection[$Prefix].GetWsdlVersion()
      ModuleVersion = $ModuleAutotask.Version.ToString()
      CI = ($AtwsConnection[$Prefix].getZoneInfo($AtwsConnection[$Prefix].Credentials.UserName)).CI
    }
    If ($ModuleAutotask.ModuleBase -like "$Env:ProgramFiles*")
    { 
      $ModuleBase = Split-Path $ModuleAutotask.ModuleBase -Parent
    }
    Else
    {
      $ModuleBase = '{0}\WindowsPowerShell\Modules\{1}' -F $Env:ProgramFiles, $ModuleAutotask.Name
    }

    $CentralCache = '{0}\Autotask.{1}\{2}' -F $ModuleBase, $Prefix, $ModuleVersionFileName

    Write-Verbose -Message ('{0}: Machine cache location is {1}. Loaded module version is {2} and API version is {3}.' -F $MyInvocation.MyCommand.Name, $CentralCache, $ModuleVersionInfo.ModuleVersion, $ModuleVersionInfo.APIversion)    
    
    $PersonalModules = '{0}\WindowsPowershell\Modules' -f $([environment]::GetFolderPath('MyDocuments'))
    $PersonalCache = '{0}\{1}\Autotask.{2}\{3}' -F $PersonalModules, $ModuleAutotask.Name, $Prefix, $ModuleVersionFileName
    
    Write-Verbose -Message ('{0}: Personal cache location is {1}. Loaded module version is {2} and API version is {3}.' -F $MyInvocation.MyCommand.Name, $CentralCache, $ModuleVersionInfo.ModuleVersion, $ModuleVersionInfo.APIversion)   
    
    $CacheDirty = $True
  }
  
  Process
  {
  
    If (Test-Path $PersonalCache)
    {
      Write-Verbose -Message ('{0}: A personal cache already exists for prefix {1}' -F $MyInvocation.MyCommand.Name, $Prefix)
      
      $CurrentVersionInfo = Import-Clixml -Path $PersonalCache
      $CachePath = $PersonalCache 
      If ($CurrentVersionInfo.APIversion -eq $ModuleVersionInfo.APIversion `
      -and $CurrentVersionInfo.ModuleVersion -eq $ModuleVersionInfo.ModuleVersion`
      -and $CurrentVersionInfo.CI -eq $ModuleVersionInfo.CI)
      {
        Write-Verbose -Message ('{0}: Personal cache is clean. Loading from personal cache.' -F $MyInvocation.MyCommand.Name)
                
        $CacheDirty = $False
      }
      Else
      {
        Write-Verbose -Message ('{0}: Personal cache exists, but is not up to date. Recreating cache.' -F $MyInvocation.MyCommand.Name)
      }
  
    }
    ElseIf (Test-Path $CentralCache)
    {
      Write-Verbose -Message ('{0}: There is no personal cache. Checking central cache location.' -F $MyInvocation.MyCommand.Name)
            
      $CurrentVersionInfo = Import-Clixml -Path $CentralCache
      Try 
      { 
        [io.file]::OpenWrite($CentralCache).close()
        $CentralPathWritable = $True
      }
      Catch 
      { 
        $CentralPathWritable = $False
      }

      If ($CurrentVersionInfo.APIversion -eq $ModuleVersionInfo.APIversion `
        -and $CurrentVersionInfo.ModuleVersion -eq $ModuleVersionInfo.ModuleVersion`
        -and $CurrentVersionInfo.CI -eq $ModuleVersionInfo.CI)
      {
        Write-Verbose -Message ('{0}: Central cache is clean. Loading from central cache.' -F $MyInvocation.MyCommand.Name)
                
        $CacheDirty = $False
        $CachePath = $CentralCache
        
      }
      ElseIf ($CentralPathWritable)
      {
        Write-Verbose -Message ('{0}: Central cache exists, but is not up to date. It is writable for current user. Recreating cache.' -F $MyInvocation.MyCommand.Name)
                
        $CachePath = $CentralCache
      }
      Else
      {
        Write-Verbose -Message ('{0}: Central cache exists, but is not up to date. It is NOT writable for current user. Using personal cache.' -F $MyInvocation.MyCommand.Name)
        Write-Warning -Message ('{0}: Central cache exists in location {1}, but is not up to date. It is NOT writable for current user. Using personal cache {1}.' -F $MyInvocation.MyCommand.Name, $CentralCache, $PersonalCache)
        $CachePath = $PersonalCache  
      }
  
    }
    Else
    {
      Write-Verbose -Message ('{0}: No cache exists, checking if a central cache location is writable.' -F $MyInvocation.MyCommand.Name)
            
      Try 
      { 
        $CacheDir = Split-Path $CentralCache -Parent
        $Null = New-Item -Path $CacheDir -ItemType Directory -Force -ErrorAction Stop
        $CachePath = $CentralCache
        
        Write-Verbose -Message ('{0}: A central cache location for all users will be created in {1}' -F $MyInvocation.MyCommand.Name, $CacheDir)
                
      }
      Catch 
      { 
        Write-Verbose -Message ('{0}: A personal cache location for current user will be created along {1}' -F $MyInvocation.MyCommand.Name, $PersonalCache)
                
        $CachePath = $PersonalCache
      }
      Finally
      {
        $CacheDirty = $True
      }
    }

    $CacheDir = Split-Path $CachePath -Parent
    If (-not (Test-Path $CacheDir))
    {
      $Null = New-Item -Path $CacheDir -ItemType Directory -Force -ErrorAction Stop
    }
  }
  
  End
  {
  

    $CacheInfo = New-Object -TypeName PSObject -Property @{
      CachePath = $CachePath
      CacheDir = $CacheDir
      CacheDirty = $CacheDirty
      ModuleVersion = $ModuleVersionInfo.ModuleVersion
      APIversion = $ModuleVersionInfo.APIversion 
      CI = $ModuleVersionInfo.CI
    }

    Return $CacheInfo
  }
}