Public/Commands/New-JCDeploymentTemplate.ps1

Function New-JCDeploymentTemplate() {
    [CmdletBinding()]

    param
    (
    )

    begin {
        $Banner = @'
       __ ______ __ __
      / /__ __ ____ ___ ____ / ____// /____ __ __ ____/ /
 __ / // / / // __ __ \ / __ \ / / / // __ \ / / / // __ /
/ /_/ // /_/ // / / / / // /_/ // /___ / // /_/ // /_/ // /_/ /
\____/ \____//_/ /_/ /_// ____/ \____//_/ \____/ \____/ \____/
                       /_/
                              CSV Command Deployment Template

'@

        $Date = Get-Date -Format MMddyyTHHmmss
        $fileName = 'JCDeployment_' + $Date + '.csv'
        Write-Debug $fileName

        $Heading1 = 'The CSV file:'
        $Heading2 = 'Will be created within the directory:'

        If (!(Get-PSCallStack | Where-Object { $_.Command -match 'Pester' })) { Clear-Host }

        Write-Host $Banner -ForegroundColor Green
        Write-Host $Heading1 -NoNewline
        Write-Host " $fileName`n" -ForegroundColor Yellow
        Write-Host $Heading2 -NoNewline
        Write-Host " $pwd" -ForegroundColor Yellow
        Write-Host ""


        while ($ConfirmFile -ne 'Y' -and $ConfirmFile -ne 'N') {
            $ConfirmFile = Read-Host  "Enter Y to confirm or N to change $fileName output location" #Confirm .csv file location creation
        }

        if ($ConfirmFile -eq 'Y') {

            $ExportLocation = $pwd
        }

        elseif ($ConfirmFile -eq 'N') {
            $ExportLocation = Read-Host "Enter the full path to the folder you wish to create $fileName in"

            while (-not(Test-Path -Path $ExportLocation -PathType Container)) {
                Write-Host -BackgroundColor Yellow -ForegroundColor Red "The location $ExportLocation does not exist. Try another"
                $ExportLocation = Read-Host "Enter the full path to the folder you wish to create $fileName in"

            }
            Write-Host ""
            Write-Host -BackgroundColor Green -ForegroundColor Black "The .csv file $fileName will be created within the $ExportLocation directory"
            Pause

        }

    }

    process {
        $CSV = [ordered]@{
            SystemID = $null
        }

        $Done = $false

        while ($Done -eq $false) {

            If ((Get-PSCallStack).Command -notlike '*Pester*') { Clear-Host }

            Write-Host $Banner -ForegroundColor Green

            Write-Host "Enter a column heading for each of the system specific unique variable within the deployment command. `n" -ForegroundColor Yellow

            Write-Host "Global variables within the script DO NOT need to be added as column headings." -ForegroundColor Red

            Write-Host "`n================ CURRENT DEPLOYMENT CSV TEMPLATE ================= `n"

            foreach ($heading in $CSV.GetEnumerator()) {
                Write-Host "$($heading.name)," -ForegroundColor Green -NoNewline

            }

            Write-Host "`n`n================================================================== `n"


            if ($CSV.count -gt 1) {
                Write-Host "Enter 'D' when DONE `n" -ForegroundColor Yellow
                Write-Host "Enter 'C' to CLEAR the CURRENT DEPLOYMENT CSV TEMPLATE and start over`n" -ForegroundColor Yellow
            }

            $VariableName = Read-Host "ENTER the name of the system specific unique variables: "

            switch ($VariableName) {
                'D' { $Done = $true }
                'C' {
                    $CSV = [ordered]@{
                        SystemID = $null
                    }
                }
                Default {
                    try {
                        if ($VariableName -ne "") {
                            $CSV.add($VariableName, $null)
                        }

                    } catch {
                        Write-Verbose $_.ErrorDetails
                    }
                }
            }

        }

        $CSVheader = New-Object psobject -Property $Csv
    }


    end {
        $ExportPath = Test-Path ("$ExportLocation/$FileName")
        if (!$ExportPath ) {
            Write-Host ""
            $CSVheader | Export-Csv -path "$ExportLocation/$FileName" -NoTypeInformation
            Write-Host 'Creating file'  -NoNewline
            Write-Host " $fileName" -ForegroundColor Yellow -NoNewline
            Write-Host ' in the location' -NoNewline
            Write-Host " $ExportLocation" -ForegroundColor Yellow
        } else {
            Write-Host ""
            Write-Warning "The file $fileName already exists do you want to overwrite it?" -WarningAction Inquire
            Write-Host ""
            $CSVheader | Export-Csv -path "$ExportLocation/$FileName" -NoTypeInformation
            Write-Host 'Creating file '  -NoNewline
            Write-Host $FileName -ForegroundColor Yellow -NoNewline
            Write-Host ' in the location' -NoNewline
            Write-Host " $ExportLocation" -ForegroundColor Yellow
        }

        Write-Host ""
        Write-Host "Do you want to open the file" -NoNewLine
        Write-Host " $FileName`?`n" -ForegroundColor Yellow

        while ($Open -ne 'Y' -and $Open -ne 'N') {
            $Open = Read-Host  "Enter Y for Yes or N for No"
        }

        if ($Open -eq 'Y') {
            Invoke-Item -path "$ExportLocation/$FileName"

            $Open = $null

        }
        if ($Open -eq 'N') { $Open = $null }

        Write-Host "`nDo you want to export existing system information to CSV?" -ForegroundColor Yellow

        Write-Host "`n(You will need to populate the SystemID column of $FileName with target system JumpCloud SystemIDs)`n"

        while ($ConfirmSystem -ne 'Y' -and $ConfirmSystem -ne 'N') {
            $ConfirmSystem = Read-Host  "Enter Y for Yes or N for No"
        }

        if ($ConfirmSystem -eq 'Y') {


            $ExistingSystems = Get-JCSystem -returnProperties hostname, displayName, os, version | Select-Object hostname, displayName, os, version, @{Name = 'SystemID'; Expression = { $_._id } }, lastContact

            $SystemsCSV = 'JCSystems_' + $date + '.csv'

            $ExistingSystems | Export-Csv -path "$ExportLocation/$SystemsCSV" -NoTypeInformation

            Write-Host "`nCreating file "  -NoNewline
            Write-Host "$SystemsCSV" -ForegroundColor Yellow -NoNewline
            Write-Host ' with all existing systems in the location' -NoNewline
            Write-Host " $ExportLocation`n" -ForegroundColor Yellow

            Write-Host "Do you want to open the file" -NoNewLine

            Write-Host " $SystemsCSV `?`n" -ForegroundColor Yellow

            while ($Open -ne 'Y' -and $Open -ne 'N') {
                $Open = Read-Host  "Enter Y for Yes or N for No"
            }

            if ($Open -eq 'Y') {
                Invoke-Item -path "$ExportLocation/$SystemsCSV"
                $Open = $null
            }
            if ($Open -eq 'N') { $Open = $null }

        }

        Write-Host "`nDo you want to export JumpCloud Command information to CSV?" -ForegroundColor Yellow

        Write-Host "`n(You will need the JumpCloud CommandID to use the Invoke-JCDeployment command)`n"

        while ($ConfirmCommand -ne 'Y' -and $ConfirmCommand -ne 'N') {
            $ConfirmCommand = Read-Host  "Enter Y for Yes or N for No"
        }

        if ($ConfirmCommand -eq 'Y') {


            $ExistingCommands = Get-JCCommand | Select-Object Name, CommandType, @{Name = 'CommandID'; Expression = { $_._id } }

            $CommandsCSV = 'JCCommands_' + $date + '.csv'

            $ExistingCommands | Export-Csv -path "$ExportLocation/$CommandsCSV" -NoTypeInformation

            Write-Host "`nCreating file "  -NoNewline
            Write-Host $CommandsCSV -ForegroundColor Yellow -NoNewline
            Write-Host ' with all existing commands in the location' -NoNewline
            Write-Host " $ExportLocation`n" -ForegroundColor Yellow

            Write-Host "Do you want to open the file" -NoNewLine

            Write-Host " $CommandsCSV `?`n" -ForegroundColor Yellow

            while ($Open -ne 'Y' -and $Open -ne 'N') {
                $Open = Read-Host  "Enter Y for Yes or N for No"
            }

            if ($Open -eq 'Y') {
                Invoke-Item -path "$ExportLocation/$CommandsCSV"
                $Open = $null

            }
            if ($Open -eq 'N') { $Open = $null }

        }

    }

}