lib/daemon/Start-IcingaPowerShellDaemon.psm1

function Start-IcingaPowerShellDaemon()
{
    param(
        [switch]$RunAsService
    );

    $ScriptBlock = {
        param($IcingaDaemonData);

        Use-Icinga -LibOnly -Daemon;

        try {
            $EnabledDaemons = Get-IcingaBackgroundDaemons;
            
            foreach ($daemon in $EnabledDaemons.Keys) {
                if (-Not (Test-IcingaFunction $daemon)) {
                    continue;
                }

                $daemonArgs = $EnabledDaemons[$daemon];
                &$daemon @daemonArgs;
            }
        } catch {
            # Todo: Add exception handling
        }

        while ($TRUE) {
            Start-Sleep -Seconds 1;
        }
    };

    $global:IcingaDaemonData.FrameworkRunningAsDaemon = $TRUE;
    $global:IcingaDaemonData.Add('BackgroundDaemon', [hashtable]::Synchronized(@{}));
    # Todo: Add config for active background tasks. Set it to 20 for the moment
    $global:IcingaDaemonData.IcingaThreadPool.Add('BackgroundPool', (New-IcingaThreadPool -MaxInstances 20));
    $global:IcingaDaemonData.Add('Config', (Read-IcingaPowerShellConfig));

    New-IcingaThreadInstance -Name "Icinga_PowerShell_Background_Daemon" -ThreadPool $IcingaDaemonData.IcingaThreadPool.BackgroundPool -ScriptBlock $ScriptBlock -Arguments @( $global:IcingaDaemonData ) -Start;

    if ($RunAsService) {
        while ($TRUE) {
            Start-Sleep -Seconds 100;
        }
    }
}