route[HANDLE_MESSAGE] { if (!is_method("MESSAGE")) return; if (isflagset(FLAG_INTERNALLY_SOURCED) || src_ip == myself) return; xlog("L_INFO", "$ci|log|MESSAGE from $fu to $tu\n"); route(AUTH); $xavp(regcfg=>match_received) = $su; if($avp(is_registered) != "true") { sl_send_reply("403", "Forbidden"); exit; } else { if($hdr(Content-Type) == "text/plain") { route(MESSAGE_INBOUND); } else { xlog("L_WARN", "$ci|end|dropping MESSAGE $hdr(Content-Type)\n"); sl_send_reply("200", "OK"); exit; } } } route[MESSAGE_INBOUND] { route(AUTH_HEADERS_JSON); $var(Payload) = $_s({"Event-Category" : "message", "Event-Name" : "inbound", "Call-ID" : "$ci", "Message-ID" : "$ci", "Route-Type" : "on-net", "Route-ID" : "sip", "From" : "$fU@$fd", "To" : "$tU@$td", "Request" : "$rU@$rd", "Caller-ID-Number" : "$fU", "Callee-ID-Number" : "$tU", "Body" : "$rb", "Custom-SIP-Headers" : $var(headers_json), "Msg-ID" : "$uuid(g)"}); $var(exchange) = "sms"; $var(RoutingKey) = $_s(message.inbound.sip.$(ci{kz.encode})); xlog("L_INFO", "$ci|msg|sending inbound message $var(RoutingKey) => $var(Payload)\n"); kazoo_publish($var(exchange), $var(RoutingKey), $var(Payload)); sl_send_reply("200", "OK"); exit; } event_route[kazoo:consumer-event-message-route] { $var(uri_username) = ""; kazoo_json($kzE, "Endpoints[0].To-Username", "$var(uri_username)"); $var(x) = $(kzE{kz.json,Endpoints[0].To-Username}); xlog("L_INFO", "$(kzE{kz.json,Call-ID})|log|received message route for $(kzE{kz.json,Endpoints[0].To-DID})\n"); if( $var(uri_username) != "" ) { $var(from_uri) = "sip:" + $(kzE{kz.json,Caller-ID-Number}) + "@" + $(kzE{kz.json,Endpoints[0].To-Realm}); $var(to_uri) = "sip:" + $(kzE{kz.json,Endpoints[0].To-Username}) + "@" + $(kzE{kz.json,Endpoints[0].To-Realm}); } else { $var(from_uri) = "sip:" + $(kzE{kz.json,Caller-ID-Number}) + $(kzE{kz.json,Endpoints[0].To-Realm}); $var(to_uri) = $(kzE{kz.json,Endpoints[0].Route}); } $uac_req(method)="MESSAGE"; $uac_req(body)= $kzE; $uac_req(hdrs)="X-TM-Local: MESSAGE_ROUTE\r\nX-KAZOO-AOR: " + $var(to_uri)+ "\r\nContent-Type: text/plain\r\n"; $uac_req(turi) = $var(to_uri); $uac_req(ruri) = $var(to_uri); $uac_req(furi) = $var(from_uri); $uac_req(ouri) = "sip:127.0.0.1:5090;transport=tcp"; $uac_req(callid) = $(kzE{kz.json,Call-ID}); xlog("L_INFO", "$(kzE{kz.json,Call-ID})|log|sending message from $var(from_uri) to $var(to_uri) \n"); uac_req_send(); } route[MESSAGE_ROUTE] { remove_hf_re("^X-"); route(ROUTE_TO_AOR); $var(JObj) = $rb; set_body("$(var(JObj){kz.json,Body})", "text/plain"); $avp(message_id) = $(var(JObj){kz.json,Message-ID}); $avp(msg_id) = $(var(JObj){kz.json,Msg-ID}); $avp(server_id) = $(var(JObj){kz.json,Server-ID}); t_on_reply("MESSAGE_REPLY"); t_on_failure("MESSAGE_FAULT"); t_relay(); } onreply_route[MESSAGE_REPLY] { xlog("L_INFO", "$ci|log|sending success delivery message to $avp(server_id)\n"); $var(Payload) = $_s({"Event-Category" : "message", "Event-Name" : "delivery", "Call-ID" : "$ci", "Message-ID" : "$avp(message_id)" , "Delivery-Result-Code" : "sip:$T_reply_code", "Msg-ID" : "$avp(msg_id)" , "Status" : "Success"}); $var(RK) = "message.delivery." + $(ci{kz.encode}); kazoo_publish("sms", $var(RK), $var(Payload)); } failure_route[MESSAGE_FAULT] { xlog("L_INFO", "$ci|log|sending failure delivery message to $avp(server_id)\n"); $var(Payload) = $_s({"Event-Category" : "message", "Event-Name" : "delivery", "Call-ID" : "$ci", "Message-ID" : "$avp(message_id)" , "Delivery-Result-Code" : "sip:$T_reply_code", "Msg-ID" : "$avp(msg_id)" , "Status" : "Failure"}); $var(RK) = "message.delivery." + $(ci{kz.encode}); kazoo_publish("sms", $var(RK), $var(Payload)); } route[MESSAGE_BINDINGS] { $var(key) = "kamailio@MY_HOSTNAME"; $var(payload) = $_s({"name": "sms", "exchange": "sms", "type": "topic", "queue": "MSG-QUEUE-MY_HOSTNAME", "routing": "message.route.$(var(key){kz.encode}).*", "no_ack": false, "federate": true }); kazoo_subscribe("$var(payload)"); } # vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab