Public/Config/Save-RMMConfig.ps1


<#
    Copyright (c) 2025-2026 Robert Faddes
    SPDX-License-Identifier: MPL-2.0
#>

function Save-RMMConfig {
    <#
    .SYNOPSIS
        Saves the current in-memory DattoRMM.Core configuration to disk.
 
    .DESCRIPTION
        Save-RMMConfig writes the current session's configuration (platform, page size, throttle profile, token expiry, etc.) to the persistent configuration file at $HOME/.DattoRMM.Core/config.json.
 
        For removing the config file and resetting to defaults, use Remove-RMMConfig.
 
    .EXAMPLE
        Save-RMMConfig
 
        Saves the current session's configuration to the config file.
 
    .INPUTS
        None. You cannot pipe objects to Save-RMMConfig.
 
    .OUTPUTS
        None. Writes to the config file.
 
    .NOTES
        Configuration is stored at: $HOME/.DattoRMM.Core/config.json
        Use Remove-RMMConfig to delete the config file and reset persistent settings.
        Current session values are not changed by Remove-RMMConfig.
 
    .LINK
        https://github.com/TheShadowTek/DattoRMM.Core/blob/main/docs/commands/Config/Save-RMMConfig.md
 
    .LINK
        Set-RMMConfig
 
    .LINK
        Remove-RMMConfig
 
    .LINK
        Get-RMMConfig
 
    .LINK
        about_DattoRMM.CoreThrottling
 
    .LINK
        about_DattoRMM.CoreConfiguration
    #>


    [CmdletBinding()]
    param()

    # Save current session config to file

    if ($null -eq $Script:RMMAuth) {

        throw "No active session. Please connect using Connect-DattoRMM before saving configuration."

    }

    $Config = @{
        'Platform' = $Script:SessionPlatform.ToString()
        'PageSize' = $Script:PageSize
        'ThrottleProfile' = $Script:RMMThrottle.Profile
        'TokenExpireHours' = $Script:TokenExpireHours
        'ApiMaxRetries' = $Script:ApiMethodRetry.MaxRetries
        'ApiRetryIntervalSeconds' = $Script:ApiMethodRetry.RetryIntervalSeconds
        'ApiTimeoutSeconds' = $Script:ApiMethodRetry.TimeoutSeconds
        'TokenRefreshBufferMinutes' = $Script:TokenRefreshBufferMinutes
    }

    $Success = Write-ConfigFile -Config $Config

    if ($Success) {

        # Sync Config* tracking variables to reflect what is now persisted
        $Script:ConfigPlatform = $Script:SessionPlatform
        $Script:ConfigPageSize = $Script:PageSize
        $Script:ConfigThrottleProfile = $Script:RMMThrottle.Profile
        $Script:ConfigTokenExpireHours = $Script:TokenExpireHours
        $Script:ConfigApiMaxRetries = $Script:ApiMethodRetry.MaxRetries
        $Script:ConfigApiRetryIntervalSeconds = $Script:ApiMethodRetry.RetryIntervalSeconds
        $Script:ConfigApiTimeoutSeconds = $Script:ApiMethodRetry.TimeoutSeconds
        $Script:ConfigTokenRefreshBufferMinutes = $Script:TokenRefreshBufferMinutes

        Write-Host "Configuration saved successfully." -ForegroundColor Green

    } else {

        throw "Failed to save configuration."

    }
}


# SIG # Begin signature block
# MIIF+wYJKoZIhvcNAQcCoIIF7DCCBegCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBjZr/HG/Mne4dG
# 1m68ikbpguFe+ueLe5a6owLPJkJEA6CCA04wggNKMIICMqADAgECAhB464iXHfI6
# gksEkDDTyrNsMA0GCSqGSIb3DQEBCwUAMD0xFjAUBgNVBAoMDVJvYmVydCBGYWRk
# ZXMxIzAhBgNVBAMMGkRhdHRvUk1NLkNvcmUgQ29kZSBTaWduaW5nMB4XDTI2MDMz
# MTAwMTMzMFoXDTI4MDMzMTAwMjMzMFowPTEWMBQGA1UECgwNUm9iZXJ0IEZhZGRl
# czEjMCEGA1UEAwwaRGF0dG9STU0uQ29yZSBDb2RlIFNpZ25pbmcwggEiMA0GCSqG
# SIb3DQEBAQUAA4IBDwAwggEKAoIBAQChn1EpMYQgl1RgWzQj2+wp2mvdfb3UsaBS
# nxEVGoQ0gj96tJ2MHAF7zsITdUjwaflKS1vE6wAlOg5EI1V79tJCMxzM0bFpOdR1
# L5F2HE/ovIAKNkHxFUF5qWU8vVeAsOViFQ4yhHpzLen0WLF6vhmc9eH23dLQy5fy
# tELZQEc2WbQFa4HMAitP/P9kHAu6CUx5s4woLIOyyR06jkr3l9vk0sxcbCxx7+dF
# RrsSLyPYPH+bUAB8+a0hs+6qCeteBuUfLvGzpMhpzKAsY82WZ3Rd9X38i32dYj+y
# dYx+nx+UEMDLjDJrZgnVa8as4RojqVLcEns5yb/XTjLxDc58VatdAgMBAAGjRjBE
# MA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQU
# H+B0vf97dYXqdUX1YMcWhFsY6fcwDQYJKoZIhvcNAQELBQADggEBAJmD4EEGNmcD
# 1JtFoRGxuLJaTHxDwBsjqcRQRE1VPZNGaiwIm8oSQdHVjQg0oIyK7SEb02cs6n6Y
# NZbwf7B7WZJ4aKYbcoLug1k1x9SoqwBmfElECeJTKXf6dkRRNmrAodpGCixR4wMH
# KXqwqP5F+5j7bdnQPiIVXuMesxc4tktz362ysph1bqKjDQSCBpwi0glEIH7bv5Ms
# Ey9Gl3fe+vYC5W06d2LYVebEfm9+7766hsOgpdDVgdtnN+e6uwIJjG/6PTG6TMDP
# y+pr5K6LyUVYJYcWWUTZRBqqwBHiLGekPbxrjEVfxUY32Pq4QfLzUH5hhUCAk4HN
# XpF9pOzFLMUxggIDMIIB/wIBATBRMD0xFjAUBgNVBAoMDVJvYmVydCBGYWRkZXMx
# IzAhBgNVBAMMGkRhdHRvUk1NLkNvcmUgQ29kZSBTaWduaW5nAhB464iXHfI6gksE
# kDDTyrNsMA0GCWCGSAFlAwQCAQUAoIGEMBgGCisGAQQBgjcCAQwxCjAIoAKAAKEC
# gAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwG
# CisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIJ9/HGCxsKE6nIWxrJ99/frvUtsZ
# f2GX+O7qJ4PU70hKMA0GCSqGSIb3DQEBAQUABIIBAHS1z7xug26w/HHzhrL4IZXE
# I1fid4irMCJFJwI0I0lu/Z1mtewFyEbP03EBff82deWsnyCUfrgaM1gF3RSplymb
# 7lk9t9qFsKCwVCEI9xjSR9xCNvY+P8EaIi+fZQqoRUL6CFQP4UqlSZVAJQuaqKPN
# uVk7Krr4HnQPjZ4xFFKQ+OaZG/oAGXfSbuftGJt3eEw/SuxhbUKmJuHgzl5oQQTg
# PsUT4qBnowoKVLqKtEfXb+og1wpbcuvqcJkoEz6XvwqmaGV2D9aY/6GFeHFTP4Tt
# GbqK01r3ifwwkAkcXLG1gMrOlGxD8qi3xe0OEv74DVlp/Z4YNZIT/9PFVerSM9Q=
# SIG # End signature block