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().
Is there a way to instead send a CANCEL or a BYE instead of a 480 after the wav file is
played? I tried using t_cancel_callid("$ci", "$cs", "0") as
well as a dlg_bye("all") at the end of the early_media route and neither seemed
to send any headers out.