monkey365.psm1

Set-StrictMode -Version Latest

$script:ScriptPath = $PSScriptRoot

# Import localized data
$LocalizedDataParams = @{
    BindingVariable = 'message';
    FileName = 'localized.psd1';
    BaseDirectory = (Join-Path $PSScriptRoot 'core/utils');
}

#Import localized data
Import-LocalizedData @LocalizedDataParams;

Function Get-MonkeySourceFile {
    [CmdletBinding()]
    Param (
        [Parameter(Mandatory=$True, ValueFromPipeline = $True)]
        [System.String]$RelativePath,

        [parameter(Mandatory=$false, HelpMessage="Enumerate Files")]
        [Switch]$Enumerate
    )
    Process{
        $path = Join-Path $PSScriptRoot $RelativePath
        IF($Enumerate.IsPresent){
            If (-not [System.IO.Directory]::Exists($path)) {
                return
            }
            #Enumerate files
            [System.IO.Directory]::EnumerateFiles(
                $path,
                '*',
                [System.IO.SearchOption]::AllDirectories
            ) | Sort-Object
        }
        Else{
            If ([System.IO.File]::Exists($path) -and ([System.IO.Path]::GetExtension($path) -eq '.ps1')) {
                return $path
            }
            throw "Source file not found: $RelativePath"
        }
    }
}

# Import core functions
$sourceFolders = @(
    'core/api/auth'
    'core/tenant'
    'core/collector'
    'core/utils'
    'core/subscription'
    'core/init'
    'core/import'
    'core/output'
    'core/tasks'
    'core/watcher'
)

$sourceFolders.ForEach({
    ForEach ($file in Get-MonkeySourceFile -RelativePath $_ -Enumerate) {
        If ([System.IO.Path]::GetExtension($file) -ne '.ps1') {
            continue
        }
        . $file
    }
})

$script:azure_plugins = @(Get-MonkeySupportedService -Azure)
$script:m365_plugins = @(Get-MonkeySupportedService -Microsoft365)

# Import core functions
$sourceFiles = @(
    'core/api/azure/resourcemanagement/api/Get-MonkeyRMObject.ps1'
    'core/api/azure/resourcemanagement/helpers/tenant/Get-MonkeyAzTenant.ps1'
    'core/api/azure/resourcemanagement/helpers/subscription/Get-MonkeyAzSubscription.ps1'
    'core/api/azure/resourcemanagement/helpers/subscription/Get-MonkeyAzClassicAdministrator.ps1'
    'core/api/azure/resourcemanagement/helpers/rbac/Get-MonkeyAzIAMPermission.ps1'
    'core/api/azure/resourcemanagement/helpers/rbac/Get-MonkeyAzRoleAssignmentForObject.ps1'
    'core/api/azure/resourcemanagement/helpers/rbac/Get-MonkeyAzRoleDefinitionObject.ps1'
    'core/api/azure/resourcemanagement/helpers/general/Get-MonkeyAzResourceGroup.ps1'
    'core/api/azure/resourcemanagement/helpers/general/Get-MonkeyAzResource.ps1'
    'core/api/azure/resourcemanagement/helpers/general/Get-MonkeyAzProviderOperation.ps1'
    'core/api/entraid/msgraph/api/Get-MonkeyMSGraphObject.ps1'
    'core/api/entraid/msgraph/helpers/general/Get-MonkeyMSGraphOrganization.ps1'
    'core/api/entraid/msgraph/helpers/general/Get-MonkeyMSGraphSuscribedSku.ps1'
    'core/api/entraid/msgraph/helpers/domain/Get-MonkeyMSGraphDomain.ps1'
    'core/api/entraid/msgraph/helpers/general/Test-CanRequestGroup.ps1'
    'core/api/entraid/msgraph/helpers/general/Test-CanRequestUser.ps1'
    'core/api/entraid/msgraph/helpers/general/Get-MonkeyMSGraphDirectoryObjectById.ps1'
    'core/api/entraid/msgraph/helpers/general/Get-MonkeyMSGraphProfilePhoto.ps1'
    'core/api/entraid/msgraph/helpers/users/Get-MonkeyMSGraphUser.ps1'
    'core/api/entraid/msgraph/helpers/groups/Get-MonkeyMSGraphGroup.ps1'
    'core/api/entraid/msgraph/helpers/groups/Get-MonkeyMSGraphGroupTransitiveMember.ps1'
    'core/api/entraid/msgraph/helpers/serviceprincipals/Get-MonkeyMSGraphServicePrincipal.ps1'
    'core/api/entraid/msgraph/helpers/directoryrole/Get-MonkeyMSGraphEntraDirectoryRole.ps1'
    'core/api/entraid/msgraph/helpers/directoryrole/Get-MonkeyMSGraphEntraRoleAssignment.ps1'
    'core/api/entraid/msgraph/helpers/directoryrole/Get-MonkeyMSGraphObjectDirectoryRole.ps1'
    'core/api/m365/exchangeonline/helpers/Get-PSExoModuleFile.ps1'
    'core/api/m365/exchangeonline/api/ConvertTo-ExoRestCommand.ps1'
    'core/api/m365/exchangeonline/api/Get-PSExoAdminApiObject.ps1'
    'core/api/m365/microsoftteams/api/Get-MonkeyTeamsObject.ps1'
    'core/api/m365/microsoftteams/helpers/service/Get-MonkeyTeamsServiceDiscovery.ps1'
    'core/api/m365/microsoftteams/helpers/service/Test-TeamsConnection.ps1'
    'core/api/m365/sharepointonline/csom/api/Invoke-MonkeyCSOMRequest.ps1'
    'core/api/m365/sharepointonline/csom/api/Invoke-MonkeyCSOMDefaultRequest.ps1'
    'core/api/m365/sharepointonline/csom/helpers/site/Get-MonkeyCSOMSite.ps1'
    'core/api/m365/sharepointonline/csom/helpers/site/Get-MonkeyCSOMSiteProperty.ps1'
    'core/api/m365/sharepointonline/utils/Test-IsUserSharepointAdministrator.ps1'
    'core/api/m365/sharepointonline/utils/Test-SiteConnection.ps1'
    'core/scan/Invoke-AzureScanner.ps1'
    'core/scan/Invoke-EntraIDScanner.ps1'
    'core/scan/Invoke-M365Scanner.ps1'
) | Select-Object -Unique

$sourceFiles.ForEach({. (Get-MonkeySourceFile -RelativePath $_)})
# Import Monkey365
. (Get-MonkeySourceFile -RelativePath 'Invoke-Monkey365.ps1')