DSCResources/DCPP_USBConfiguration/DCPP_USBConfiguration.psm1

# Import the helper functions

Import-Module $PSScriptRoot\..\..\Misc\helper.psm1 -Verbose:$false

function Get-TargetResource
{
    [CmdletBinding()]
    [OutputType([System.Collections.Hashtable])]
    param
    (
        [parameter(Mandatory = $true)]
        [System.String]
        $Category
    )

    #Write-Verbose "Use this cmdlet to deliver information about command processing."

    #Write-Debug "Use this cmdlet to write debug information while troubleshooting."


    <#
    $returnValue = @{
        Category = [System.String]
        MultiCoreSupport = [System.String]
        IntelSpeedStep = [System.String]
        CStates = [System.String]
        IntelTurboBoost = [System.String]
        HyperThreadControl = [System.String]
        Password = [System.String]
        SecurePassword = [System.String]
        PathToKey = [System.String]
    }
 
    $returnValue
    #>

    
                   # Check if module DellBIOSprovider is already loaded. If not, load it.
   try{
    $bool = Confirm-DellPSDrive -verbose
    }
    catch 
    {
        write-Verbose $_
        $msg = "Get-TargetResource: $($_.Exception.Message)"
        Write-DellEventLog -Message $msg -EventID 1 -EntryType 'Error'
        write-Verbose "Exiting Get-TargetResource"
        return
    }
    if ($bool) {                      
        Write-Verbose "Dell PS-Drive DellSmbios is found."
    }
    else{
        $Message = “Get-TargetResource: Module DellBiosProvider was imported correctly."
        Write-DellEventLog -Message $Message -EventID 2 
    }

    $Get = get-childitem -path @("DellSmbios:\" + $Category)
     # Removing Verbose and Debug from output
    $PSBoundParameters.Remove("Verbose") | out-null
    $PSBoundParameters.Remove("Debug") | out-null

  
    $out = @{}   
    $Get | foreach-Object {$out.Add($_.Attribute, $_.CurrentValue)}
    $out.add('Category', $Category )
    $out

}


function Set-TargetResource
{
    [CmdletBinding()]
    param
    (
        [parameter(Mandatory = $true)]
        [System.String]
        $Category,

        [ValidateSet("Enabled","Disabled","EnabledWithNoUSBBoot")]
        [System.String]
        $UsbEmu,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPortsInternal,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPortsExternal,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Usb30,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $DisableDockingStationDevicesexceptvideo,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPortsSide,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPortsFront,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPortsRear1,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPortsRear2,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPortsRear3,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPortsRear4,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPortsRear5,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPortsRear6,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $USBPort06,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $USBPort07,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $USBPort08,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $USBPort09,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPortsSide1,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPortsSide2,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $USBPort12,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $USBPort13,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $USBPort14,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $USBPort15,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $USBPort16,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $USBPort17,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $USBPort18,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $USBPort19,        

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPortsFront1,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPortsFront2,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPortsFront3,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPortsFront4,        
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $USBPort24,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $USBPort25,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $USBPort26,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $USBPort27,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $USBPort28,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $USBPort29,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPortsRear,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $RearUSB3_0Ports,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPortsInternal2,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $ThunderboltPorts,
        
        [ValidateSet("NoSec","UserAuth","SecConn","DpOnly")]
        [System.String]
        $ThunderboltSecLvl,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $ThunderboltBoot,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $ThunderboltPreboot,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $AlwaysAllowDellDocks,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbRearDual,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbRearDual2Stack,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbRearQuad,    

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $FrontUsbPortCollection,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $RearUsb3Ports,        

        [System.String]
        $Password,

        [System.String]
        $SecurePassword,

        [System.String]
        $PathToKey
    )

    if (-not(CheckModuleLoaded)) {
        Write-Verbose -Message 'Required module DellBiosProvider does not exist. Exiting.'
        return $true
    }

    $DellPSDrive = get-psdrive -name Dellsmbios
    if ( !$DellPSDrive)
    {
        $Message = "Drive DellSmbios is not found. Exiting."
        Write-Verbose $Message
        Write-DellEventLog -Message $Message -EventID 3 -EntryType "Error"
        return $true
    }
    $attributes_desired = $PSBoundParameters
    $atts = $attributes_desired

    $pathToCategory = $DellPSDrive.Name + ':\' + $atts["Category"]
    
    Dir $pathToCategory -verbose

    $atts.Remove("Verbose") | out-null
    $atts.Remove("Category") | out-null
    $atts.Remove("Debug") | out-null
    $securePwd=$atts["SecurePassword"]
    $passwordSet=$atts["Password"]
    $atts.Remove("Password") | Out-Null
    $atts.Remove("SecurePassword") | Out-Null
    $pathToKey=$atts["PathToKey"]
    if(-Not [string]::IsNullOrEmpty($pathToKey))
    {  
        if(Test-Path $pathToKey)
        {
        $key=Get-Content $pathToKey
        }
        else
        {
        $key=""
        }
    }
    $atts.Remove("PathToKey") | Out-Null
    
    #foreach($a in Import-Csv((Get-DellBIOSEncryptionKey)))
    #{
   # $key+=$a
   # }
    $atts.Keys | foreach-object { 
                   # $atts[$_]
                    $path=""
                    if($($_) -eq "RearUSB3_0Ports")
                    {
                    $path = $pathToCategory + '\' + "RearUSB3.0Ports"
                    }                     

                    else
                    {
                    $path = $pathToCategory + '\' + $($_)
                    }                   
                    
                    $value = $atts[$_]
            if(-Not [string]::IsNullOrEmpty($securePwd))
            {                
            $pasvar=ConvertTo-SecureString $securePwd.ToString() -Key $key
            Set-Item  -path $path -value $value -verbose -ErrorVariable ev -ErrorAction SilentlyContinue -PasswordSecure $pasvar
            }

            elseif(-Not [string]::IsNullOrEmpty($passwordSet))
            {
            Set-Item  -path $path -value $value -verbose -ErrorVariable ev -ErrorAction SilentlyContinue -Password $passwordSet
            }

            else
            {
            Set-Item  -path $path -value $value -verbose -ErrorVariable ev -ErrorAction SilentlyContinue
            }
                    if ( $ev) { 
                        $cmdline = $ExecutionContext.InvokeCommand.ExpandString($ev.InvocationInfo.Line)
                        $Message = "An error occured in executing " + $cmdline + "`nError message: $($ev.ErrorDetails)"
                        Write-Verbose $Message
                        Write-DellEventLog -Message $Message -EventID 5 -EntryType "Error"
                    }
                    
                 }



}


function Test-TargetResource
{
    [CmdletBinding()]
    [OutputType([System.Boolean])]
    param
    (
        [parameter(Mandatory = $true)]
        [System.String]
        $Category,

        [ValidateSet("Enabled","Disabled","EnabledWithNoUSBBoot")]
        [System.String]
        $UsbEmu,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPortsInternal,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPortsExternal,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $Usb30,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $DisableDockingStationDevicesexceptvideo,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPortsSide,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPortsFront,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPortsRear1,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPortsRear2,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPortsRear3,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPortsRear4,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPortsRear5,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPortsRear6,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $USBPort06,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $USBPort07,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $USBPort08,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $USBPort09,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPortsSide1,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPortsSide2,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $USBPort12,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $USBPort13,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $USBPort14,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $USBPort15,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $USBPort16,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $USBPort17,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $USBPort18,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $USBPort19,        

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPortsFront1,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPortsFront2,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPortsFront3,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPortsFront4,        
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $USBPort24,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $USBPort25,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $USBPort26,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $USBPort27,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $USBPort28,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $USBPort29,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPortsRear,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $RearUSB3_0Ports,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbPortsInternal2,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $FrontUsbPortCollection,
        
        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $ThunderboltPorts,
        
        [ValidateSet("NoSec","UserAuth","SecConn","DpOnly")]
        [System.String]
        $ThunderboltSecLvl,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $ThunderboltBoot,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $ThunderboltPreboot,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $AlwaysAllowDellDocks,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbRearDual,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbRearDual2Stack,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $UsbRearQuad,    

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $FrontUsbPortCollection,

        [ValidateSet("Enabled","Disabled")]
        [System.String]
        $RearUsb3Ports,            

        [System.String]
        $Password,

        [System.String]
        $SecurePassword,

        [System.String]
        $PathToKey
    )

    $Get = Get-TargetResource $PSBoundParameters['Category'] -verbose

    New-DellEventLog
 
    $PSBoundParameters.Remove("Verbose") | out-null
    $PSBoundParameters.Remove("Debug") | out-null
    $PSBoundParameters.Remove("Category") | out-null
    $PSBoundParameters.Remove("Password") | out-null
    $PSBoundParameters.Remove("SecurePassword") | out-null

    $attributes_desired = $PSBoundParameters

    $bool = $true

    foreach ($config_att in  $PSBoundParameters.GetEnumerator())
    {
        if ($Get.ContainsKey($config_att.Key)) {
        
             $currentvalue=""
            if($config_att.Key -match "RearUSB3_0Ports")
            {
            $currentvalue = $Get["RearUSB3.0Ports"]
            }
            else
            {
                $currentvalue = $Get[$config_att.Key]
            } 
        
            $currentvalue_nospace = $currentvalue -replace " ", ""
            if ($config_att.Value -ne $currentvalue_nospace){
                $bool = $false
                $drift  = "`nCurrentValue: $currentvalue_nospace`nDesiredValue: $($config_att.value)"
                $message = "Configuration is drifted in category $Category for $($config_att.Key). $drift"
                write-verbose $message
                Write-DellEventLog -Message $message -EventID 4 -EntryType Warning
            
            }
            else {
                write-Debug "Configuration is same for $config_att."
            }
    }
    else
    {
        $message = "Unsupported attribute $($config_att)"
        Write-Verbose $message
    }
   }
   return $bool

}


Export-ModuleMember -Function *-TargetResource