Start-JCDashboard.ps1
<#PSScriptInfo .VERSION 1.0 .GUID 7917df3f-978f-4246-8e61-2fd55f1075f1 .AUTHOR Solution Architecture Team .COMPANYNAME JumpCloud .COPYRIGHT .TAGS .LICENSEURI .PROJECTURI .ICONURI .EXTERNALMODULEDEPENDENCIES .REQUIREDSCRIPTS .EXTERNALSCRIPTDEPENDENCIES .RELEASENOTES .PRIVATEDATA #> <# .DESCRIPTION Used to start the JumpCloud Dashboard instance. #> Function Start-JCDashboard { [CmdletBinding(HelpURI = "https://github.com/TheJumpCloud/support/wiki/Start-JCDashboard")] Param( [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true, HelpMessage = 'Please enter your JumpCloud API key. This can be found in the JumpCloud admin console within "API Settings" accessible from the drop down icon next to the admin email address in the top right corner of the JumpCloud admin console.')] [ValidateNotNullOrEmpty()] [ValidateLength(40, 40)] [System.String] $JumpCloudApiKey, [Parameter(HelpMessage = 'Include systems that have contacted the JumpCloud directory within this number of days')] [Int]$LastContactDays, [Parameter(HelpMessage = 'Refresh the components on the dashboard measured in seconds')] [Int]$RefreshInterval, #[Switch]$Beta, [Parameter(HelpMessage = 'Prevent the dashboard module from auto updating')] [Switch]$NoUpdate ) # Auto Update if (! $NoUpdate) { $Updated = Update-ModuleToLatest -Name:($MyInvocation.MyCommand.Module.Name) } ## Authentication if ($JumpCloudApiKey) { Connect-JCOnline -JumpCloudApiKey:($JumpCloudApiKey) -force } else { if ($JCAPIKEY.length -ne 40) { Connect-JCOnline } } ## Set Module Installed location if ($Updated -eq $true) { $InstalledModuleLocation = Get-InstalledModule JumpCloud.Dashboard | Select-Object -ExpandProperty InstalledLocation $Private = @( Get-ChildItem -Path "$InstalledModuleLocation/Private/*.ps1" -Recurse) Foreach ($Function in $Private) { Try { . $Function.FullName Write-Verbose "Imported $($Function.FullName)" } Catch { Write-Error -Message "Failed to import function $($Function.FullName): $_" } } } else { $InstalledModuleLocation = $PSScriptRoot } ## Gather org name ## Pulled from the global $JCSettings variable popuplated by Connect-JCOnline $OrgName = $JCSettings.SETTINGS.name ## Call API $SettingsURL = "$JCUrlBasePath" + '/api/settings' $hdrs = @{ 'Content-Type' = 'application/json' 'Accept' = 'application/json' 'X-API-KEY' = $JCAPIKEY } if ($JCOrgID) { $hdrs.Add('x-org-id', "$($JCOrgID)") } $APICall = Invoke-RestMethod -Method GET -Uri $SettingsURL -Headers $hdrs -UserAgent:(Get-JCUserAgent) ## Stop existing dashboards Get-UDDashboard | Stop-UDDashboard # ## Import Settings File $DashboardSettings = Get-Content -Raw -Path:($InstalledModuleLocation + '/' + 'DashboardSettings.json') | ConvertFrom-Json if ($LastContactDays) { $DashboardSettings.'2Get-UDsystems'.Settings.lastContactDays = $LastContactDays } if ($RefreshInterval) { $DashboardSettings.'1Get-UDSystemUsers'.Settings.refreshInterval = $RefreshInterval $DashboardSettings.'2Get-UDsystems'.Settings.refreshInterval = $RefreshInterval } ## Declare container variables for dashboard items $UDPages = @() #$UDSideNavItems = @() $Scripts = @() $Stylesheets = @() ## Get files from "Content-Pages" folder $PublishedFolder = Publish-UDFolder -Path:($InstalledModuleLocation + '/Private/' + 'Images') -RequestPath "/Images" if ($Beta) { # If Beta Selected Then Load All Content-Pages $ContentPagesFiles = Get-ChildItem -Path:($InstalledModuleLocation + '/Private/' + 'Content-Pages/*.ps1') -Recurse } else { $ContentPagesFiles = Get-ChildItem -Path:($InstalledModuleLocation + '/Private/' + 'Content-Pages/Default/*.ps1') -Recurse } ## Call functions to build dashboard ############################################################################################################## $Theme = Get-JCTheme $NavBarLinks = Get-JCNavBarLinks ############################################################################################################## [int]$ProgressCounter = 0 $ContentPagesFiles | ForEach-Object { ## Load functions from "Content-Pages" folder .($_.FullName) Write-Verbose "Loading $($_.BaseName)" ## Write progress logic $PageName = ($($_.BaseName) -split '-UD')[1] $ProgressCounter++ $PageProgressParams = @{ Activity = "Loading the $PageName dashboard components" Status = "Dashboard $ProgressCounter of $($ContentPagesFiles.count)" PercentComplete = ($ProgressCounter / $($ContentPagesFiles.count)) * 100 } Write-Progress @PageProgressParams ## Load the Page Settings $PageSettings = $($DashboardSettings."$($_.BaseName)".'Settings') ## Compile the parameters $commandParams = '' $($PageSettings).PSObject.Properties | ForEach-Object { $commandParams = $commandParams + '-' + "$($_.Name) " + "'$($_.Value)' " } Write-Debug $commandParams ## Run function to load the page $CommandResults = Invoke-Expression "$($_.BaseName) $commandParams" ## Add the output to the container variable $UDPages += $CommandResults.UDPage #$UDSideNavItems += $CommandResults.UDSideNavItem } # Build dashboard $Navigation = New-UDSideNav -None $Pages = $UDPages $Dashboard = New-UDDashboard ` -Title:("$($OrgName) Dashboard") ` -Theme:($Theme) ` -Pages:($Pages) ` -Navigation:($Navigation) ` -NavbarLinks:($NavBarLinks) ` -NavBarLogo:(New-UDImage -Url:('/images/jumpcloud.svg') -Height 42 -Width 56) # -Scripts:($Scripts) ` # -Stylesheets:($Stylesheets) ` # -Footer:($Footer) ## Start the dashboard Start-UDDashboard -Dashboard:($Dashboard) -Port:(8003) -ListenAddress:('127.0.0.1') -PublishedFolder $PublishedFolder -Force ## Opens the dashboard Start-Process -FilePath 'http://127.0.0.1:8003' } |