[prev in list] [next in list] [prev in thread] [next in thread]
List: semsdev
Subject: [Semsdev] git:master: mobile-push DSM app
From: Stefan Sayer <stefan.sayer () googlemail ! com>
Date: 2012-08-09 15:32:45
Message-ID: 20120809153245.E04F5EF8074 () rimmer ! ryngle ! com
[Download RAW message or body]
Module: sems
Branch: master
Commit: 7d695472be13af48cbe0bdc64b9fb4e487ae8740
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sems/?a=commit;h=7d695472be13af48cbe0bdc64b9fb4e487ae8740
Author: Stefan Sayer <stefan.sayer@googlemail.com>
Committer: Stefan Sayer <stefan.sayer@googlemail.com>
Date: Mon Apr 16 15:48:12 2012 +0200
mobile-push DSM app
--
-- This DSM app
-- o plays early media from a file in the DB
-- o sends a HTTP request to a web server
-- o SUBSCRIBEs to registration state
-- o if registration becomes active (at least one active contact), it sends back \
"300 Multiple Choices"
-- o otherwise (timeout) it sends back "480 Not found"
-- Parameters (P-App-Param):
-- audio_id - indicating audio file in DB
-- expiration - subscription expiration/waiting time (default: 60)
-- caller - caller passed to notification web app
-- callee - callee passed to notification web app
-- domain - domain passed to notification web app
--
-- Example: P-App-Param: \
audio_id=rbt;expiration=30;caller=+43111111111;callee=+432222222222;domain=sip.sipwise.com
--
-- Example DB:
-- CREATE TABLE `audio_files` (
-- `id` varchar(20) DEFAULT NULL,
-- `data` mediumblob
-- ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
---
apps/mobile_push/etc/mobile_push.conf | 45 +++++++++
apps/mobile_push/mobile_push.dsm | 175 +++++++++++++++++++++++++++++++++
2 files changed, 220 insertions(+), 0 deletions(-)
diff --git a/apps/mobile_push/etc/mobile_push.conf \
b/apps/mobile_push/etc/mobile_push.conf new file mode 100644
index 0000000..088ec27
--- /dev/null
+++ b/apps/mobile_push/etc/mobile_push.conf
@@ -0,0 +1,45 @@
+
+# configuration for mobile_push app
+
+# DSM configuration
+diag_path=/usr/lib/sems/mobile_push
+load_diags=mobile_push
+register_apps=mobile_push
+mod_path=/usr/lib/sems/plug-in/
+preload_mods=mod_xml
+run_invite_event=yes
+set_param_variables=yes
+#run_system_dsms=
+
+# application configuration:
+
+# enable_rbt=[yes|no] - enable playing of ring-back tone from DB?
+enable_rbt=yes
+
+# database connection:
+db_url="mysql://root:frafos@localhost/provisioning"
+
+# play_looped=[yes|no] - loop file?
+play_looped=yes
+
+# mobile push web app server URL:
+push_server_url=http://127.0.0.1:8000/mobilepush/
+
+# use_post=[yes|no] - use HTTP POST? (or GET)
+use_post=no
+
+# subscription user/pwd (From in subscription)
+subscription_user=sub_user
+subscription_pwd=sub_pwd
+
+# proxy for subscription (outbound-proxy setting)
+#proxy=sip:127.0.0.1:5060
+
+# extra_3xx_uri_append - append extra string to Contact in 300 (e.g. port)
+# extra_3xx_uri_append=":5090"
+
+# use_subscription_id=[yes|no] - use an ID for SUBSCRIBE? (problems with kamailio :( \
) +use_subscription_id=no
+
+
+
diff --git a/apps/mobile_push/mobile_push.dsm b/apps/mobile_push/mobile_push.dsm
new file mode 100644
index 0000000..b88caa7
--- /dev/null
+++ b/apps/mobile_push/mobile_push.dsm
@@ -0,0 +1,175 @@
+--
+-- This DSM app
+-- o plays early media from a file in the DB
+-- o sends a HTTP request to a web server
+-- o SUBSCRIBEs to registration state
+-- o if registration becomes active (at least one active contact), it sends back \
"300 Multiple Choices" +-- o otherwise (timeout) it sends back "480 Not found"
+
+-- Parameters (P-App-Param):
+-- audio_id - indicating audio file in DB
+-- expiration - subscription expiration/waiting time (default: 60)
+-- caller - caller passed to notification web app
+-- callee - callee passed to notification web app
+-- domain - domain passed to notification web app
+--
+-- Example: P-App-Param: \
audio_id=rbt;expiration=30;caller=+43111111111;callee=+432222222222;domain=sip.sipwise.com
+--
+-- Example DB:
+-- CREATE TABLE `audio_files` (
+-- `id` varchar(20) DEFAULT NULL,
+-- `data` mediumblob
+-- ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+
+import(mod_utils);
+import(mod_dlg);
+import(mod_subscription);
+import(mod_xml);
+import(mod_mysql);
+import(mod_curl);
+
+initial state START;
+
+transition "DB exception" START - exception / {
+ log(1, "Error in initializing mobile push:");
+ logAll(1);
+ dlg.reply(500, "Server Internal Error");
+ stop(false);
+} -> END;
+
+transition "invite" START - invite / {
+ if test($config.enable_rbt=="yes") {
+ if test($audio_id != "") {
+ mysql.connect();
+ throwOnError();
+ -- play waiting file from DB
+ if test($config.play_looped=="yes") {
+ mysql.playDBAudioLooped(SELECT data FROM provisioning.audio_files WHERE \
id="$audio_id", rbt.wav); + } else {
+ mysql.playDBAudio(SELECT data FROM provisioning.audio_files WHERE \
id="$audio_id", rbt.wav); + }
+ throwOnError();
+ mysql.disconnect();
+ }
+ }
+
+ -- send 183 with early media
+ dlg.acceptInvite(183, "Progress");
+ -- no default 200 OK
+ set($connect_session=0);
+
+ -- start RTP processing
+ connectMedia();
+
+ -- create subscription to reg event
+ set($r.domain=@domain);
+ set($r.user=@user);
+ set($r.from_user=$config.subscription_user);
+ set($r.pwd=$config.subscription_pwd);
+ set($r.event="reg");
+ if test($config.proxy != "") {
+ set($r.proxy=$config.proxy);
+ }
+ if test($config.use_subscription_id == "yes") {
+ utils.getNewId(r.id);
+ }
+ if test($expiration != "") {
+ set($r.expires=$expiration);
+ } else {
+ set($r.expires=60);
+ }
+
+ subscription.create(r);
+
+ if test($r.handle == "") {
+ log(1, "Subscription creation failed!");
+ logVars(1);
+ dlg.reply(500, "Server Internal Error");
+ stop(false);
+ throw(subscription);
+ }
+
+ -- send HTTP request
+ if test($config.use_post=="yes") {
+ curl.postDiscardResult($config.push_server_url, $caller;$callee;$domain)
+ } else {
+ curl.getForm($config.push_server_url, $caller;$callee;$domain)
+ }
+
+ -- set Timer on our side, too (server subscription timing could be broken...)
+ setTimer(1, $r.expires);
+
+} -> WAITING;
+
+state WAITING;
+
+transition "subscription failed" WAITING - subscription(#status=="failed") / {
+ log(1, "Subscription failed:");
+ logParams(1);
+ logVars(1);
+ dlg.reply(500, "Server Internal Error");
+ stop(false);
+} -> END;
+
+function evaluateRegNotifyBody() {
+ xml.parseSIPMsgBody("SipSubscriptionBody", "substatus");
+ -- namespaces to be used:
+ set($substatus.ns="a=urn:ietf:params:xml:ns:reginfo")
+ -- look for an active contact
+ xml.evalXPath("/a:reginfo/a:registration/a:contact[@state='active']", \
"substatus"); + xml.XPathResultCount($active_contacts="substatus.xpath");
+};
+
+function releaseRegEvalObjects() {
+ freeObject("substatus");
+ freeObject("substatus.xpath");
+};
+
+function replyWith300() {
+ set($dlg.reply.hdrs="Contact: ");
+ append($dlg.reply.hdrs, @local_uri);
+ append($dlg.reply.hdrs, $config.extra_3xx_uri_append);
+ dlg.reply(300, "Multiple Choices");
+ stop(false);
+};
+
+transition "NOTIFY received, with body" WAITING - \
subscription(#status!="terminated"); test(#has_body=="true") / { + \
evaluateRegNotifyBody(); +
+ if test($active_contacts != 0) {
+ replyWith300();
+ subscription.remove($r.handle);
+ }
+
+ releaseRegEvalObjects();
+} -> WAITING;
+
+transition "NOTIFY received, no body" WAITING - subscription(#status!="terminated") \
/ { + log(3, "subscription active");
+ logParams(3);
+} -> WAITING;
+
+transition "NOTIFY received, terminated (but with body)" WAITING - \
subscription(#status=="terminated"); test(#has_body=="true") / { + \
evaluateRegNotifyBody(); +
+ if test($active_contacts != 0) {
+ replyWith300();
+ } else {
+ dlg.reply(480, "Not found");
+ stop(false);
+ }
+ releaseRegEvalObjects();
+} -> END;
+
+transition "NOTIFY received, subscription terminated" WAITING - \
subscription(#status=="terminated") / { + dlg.reply(480, "Not found");
+ stop(false);
+} -> END;
+
+transition "timer hit" WAITING - timer(#id==1) / {
+ subscription.remove($r.handle);
+ dlg.reply(480, "Not found");
+ stop(false);
+} -> END;
+
+state END;
\ No newline at end of file
_______________________________________________
Semsdev mailing list
Semsdev@lists.iptel.org
http://lists.iptel.org/mailman/listinfo/semsdev
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic