On Wed, Mar 15, 2023 at 11:21 AM mayamatakeshi <mayamatakeshi@gmail.com> wrote:


On Wed, Mar 15, 2023 at 2:56 AM <jhayhoe@liquidweb.com> wrote:
I am looking to configure Kamailio and RTPEngine to play a wav file for any new calls during a scheduled asterisk server maintenance. I have set up the following within route{} to send the call to a early_media route based on a variable that I can set on the server using kamcmd.

route {
...
       if ($sht(config=>maint)=="1") {
            if (is_method("INVITE") && !has_totag()) {
                xlog ("L_INFO","Ongoing maintenance. Call-ID:$ci | Method: $rm");
                route(early_media);
            }
        }
...
}

route[early_media] {
    xlog("Maintenance: handling early_media\n");
    rtpengine_manage("direction=external direction=external");
    $var(body) = $(rb{re.subst,/(IP4.).*/\1##server IP redacted##/g});
    set_reply_body($var(body), "application/sdp");
    t_send_reply("183", "Session Progress");
    sleep(2);
    unblock_dtmf("all");
    play_media("file=/etc/kamailio/media/maintenance.wav");
    sleep(21);
    rtpengine_delete();
    t_reply("480","Temporarily Unavailable");
}

This mostly works as I hear the recorded message in place of the ringing tone when a call is processed by kamailio and then a busy signal is heard as part of the 480 reply at the end. The sleep's are in place to match the duration of the recorded message as otherwise the 480 is sent immediately following the start of the play_media. Feel free to let me know if there is a better solution to wait the duration of the media file and then proceed with processing instead of using sleep().

I don't have a solution, but just keep in mind that sleep will block the process for the duration of the timeout.
So the process will not do anything else during the sleep.

I think instead of sleep you could try async_sleep:
https://www.kamailio.org/docs/modules/devel/modules/async.html#async.f.async_sleep
 
Also, I think the sleep is not interruptible. So even if the caller CANCELs, the INVITE, the process will keep waiting for the timeout.