net/sems: SIP Express Media Server (new port)

SEMS is an open-source SIP media server, implementing a B2BUA,
voicemail, IVRs, announcements, etc. It is designed to be
complementary to SIP proxy-only tools like Kamailio, OpenSIPS, etc.

This adds a new port for the SEMS SIP media server, which provides a
number of functions (Voicemail, conferencing, B2BUA, etc.) in conjunction
with a SIP router like Kamailio or OpenSIPS.

The most recent release (1.6.0) is both old and has a significant number
of issues on FreeBSD, so this corresponds to the current development
branch, which should hopefully become 1.7 in not too very long. I've
added one other patch (from SEMS pull request 57) that is required to
make message-waiting notifications behave in a useful way but has yet
to be merged upstream.

WWW: https://github.com/sems-server/sems/

PR:		240048
Reviewed by:	koobs (ports)
Approved by:	koobs (ports)
Differential Revision:	D21410
This commit is contained in:
Nathan Whitehorn 2019-08-27 03:15:35 +00:00
parent eb0b62e96e
commit d0170de30a
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=509981
10 changed files with 696 additions and 2 deletions

2
GIDs
View File

@ -190,7 +190,7 @@ mastodon:*:244:
fcron:*:247:
# free: 248
# free: 249
# free: 250
sems:*:250:
# free: 251
# free: 252
_adsuck:*:253:

2
UIDs
View File

@ -195,7 +195,7 @@ mastodon:*:244:244::0:0:Mastodon User:/usr/local/www/mastodon:/bin/sh
fcron:*:247:247::0:0:fcron pseudo-user:/nonexistent:/usr/sbin/nologin
# free: 248
# free: 249
# free: 250
sems:*:250:250::0:0:SIP Express Media Server:/nonexistent:/usr/sbin/nologin
# free: 251
# free: 252
_adsuck:*:253:253::0:0:Adsuck ad blocking user:/nonexistent:/usr/sbin/nologin

View File

@ -1358,6 +1358,7 @@
SUBDIR += sdl_net
SUBDIR += seda
SUBDIR += self-service-password
SUBDIR += sems
SUBDIR += sendemail
SUBDIR += sendsms
SUBDIR += sendsnpp

48
net/sems/Makefile Normal file
View File

@ -0,0 +1,48 @@
# Created by: Nathan Whitehon <nwhitehorn@freebsd.org>
# $FreeBSD$
PORTNAME= sems
DISTVERSION= ${SEMS_VERSION}.g20190822
CATEGORIES= net
MAINTAINER= nwhitehorn@FreeBSD.org
COMMENT= SIP Express Media Server
LICENSE= GPLv2
LICENSE_FILE= ${WRKSRC}/doc/COPYING
LIB_DEPENDS= libopus.so:audio/opus \
libcodec2.so:audio/codec2 \
libevent.so:devel/libevent \
librtmp.so:multimedia/librtmp \
libilbc.so:net/ilbc \
libgsm.so:audio/gsm \
libsamplerate.so:audio/libsamplerate \
libspeex.so:audio/speex \
libspandsp.so:comms/spandsp
USES= cmake python:2.7,run shebangfix
SHEBANG_GLOB= sems-*
USE_GITHUB= yes
GH_ACCOUNT= sems-server
GH_TAGNAME= 7400051
CFLAGS+= -Wno-reorder
CMAKE_ARGS= -DSEMS_CFG_PREFIX=${PREFIX} -DSEMS_AUDIO_PREFIX=${PREFIX}/lib \
-DSEMS_EXEC_PREFIX=${PREFIX} -DSEMS_DOC_PREFIX=${PREFIX}/share/doc
CMAKE_ON= SEMS_USE_SPANDSP SEMS_USE_LIBSAMPLERATE SEMS_USE_OPUS
USE_RC_SUBR= sems
USERS= sems
GROUPS= sems
SEMS_VERSION= 1.7.0
PLIST_SUB= SEMS_VERSION=${SEMS_VERSION}
post-install:
cd ${STAGEDIR}${ETCDIR} && ${FIND} . \
-type f -exec ${MV} {} {}.sample \;
.include <bsd.port.mk>

3
net/sems/distinfo Normal file
View File

@ -0,0 +1,3 @@
TIMESTAMP = 1566533104
SHA256 (sems-server-sems-1.7.0.g20190822-7400051_GH0.tar.gz) = 0648e863c79363985e59174728f29a7b6c431fc76343fb004ed7c548aef7fcf0
SIZE (sems-server-sems-1.7.0.g20190822-7400051_GH0.tar.gz) = 5200119

View File

@ -0,0 +1,21 @@
--- core/CMakeLists.txt.orig 2019-08-22 14:04:22.265669000 -0700
+++ core/CMakeLists.txt 2019-08-22 14:05:02.760870000 -0700
@@ -12,15 +12,12 @@
INCLUDE_DIRECTORIES (ampi)
INCLUDE_DIRECTORIES (amci)
-ADD_LIBRARY (sems_core STATIC ${sems_core_SRCS})
-ADD_LIBRARY (sems_sip STATIC ${sems_sip_SRCS})
+ADD_EXECUTABLE (sems sems.cpp ${sems_core_SRCS} ${sems_sip_SRCS})
+ADD_EXECUTABLE(sems_tests ${sems_tests_SRCS} ${sems_core_SRCS} ${sems_sip_SRCS})
-ADD_EXECUTABLE (sems sems.cpp)
-ADD_EXECUTABLE(sems_tests ${sems_tests_SRCS})
-
FOREACH (EXE_TARGET sems sems_tests)
- TARGET_LINK_LIBRARIES(${EXE_TARGET} ${CMAKE_DL_LIBS} sems_core sems_sip event event_pthreads -rdynamic)
+ TARGET_LINK_LIBRARIES(${EXE_TARGET} ${CMAKE_DL_LIBS} event event_pthreads -rdynamic)
IF(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
TARGET_LINK_LIBRARIES(${EXE_TARGET} execinfo)

265
net/sems/files/patch-mwi-57 Normal file
View File

@ -0,0 +1,265 @@
diff --git a/apps/mwi/etc/mwi.conf b/apps/mwi/etc/mwi.conf
index 13fcce62c..ef7e5182b 100644
--- apps/mwi/etc/mwi.conf
+++ apps/mwi/etc/mwi.conf
@@ -1,2 +1,13 @@
-# Presence Server:
-presence_server=127.0.0.1
\ No newline at end of file
+# use domain instead of presence_server
+use_domain=yes
+
+# Presence Server, not used if use_domain is true
+#presence_server=127.0.0.1
+
+# the from user for publish requests, not used if empty
+from_user=mwi-publisher
+# the to user for publish requests, not used if empty
+#to_user=
+
+# give a preset route set, not used if empty
+#route_set="sip:127.0.0.1"
diff --git a/apps/mwi/mwi.cpp b/apps/mwi/mwi.cpp
index 4e7035011..47b808be0 100644
--- apps/mwi/mwi.cpp
+++ apps/mwi/mwi.cpp
@@ -1,12 +1,13 @@
/*
Copyright (C) Anton Zagorskiy amberovsky@gmail.com
Oyster-Telecom Laboratory
-
+
Published under BSD License
*/
-
+
#include "AmPlugIn.h"
#include "AmSession.h"
+#include "AmConfig.h"
#include "AmConfigReader.h"
#include "AmUtils.h"
#include "log.h"
@@ -18,9 +19,9 @@ AmDynInvoke* MWI::MessageStorage = 0;
EXPORT_PLUGIN_CLASS_FACTORY(MWI, MOD_NAME);
-MWI::MWI(const string& name)
- : AmDynInvokeFactory(name) {
- _instance = this;
+MWI::MWI(const string& name) : AmDynInvokeFactory(name)
+{
+ _instance = this;
};
MWI::~MWI() { };
@@ -28,10 +29,10 @@ MWI::~MWI() { };
int MWI::onLoad()
{
- AmDynInvokeFactory* ms_fact =
+ AmDynInvokeFactory* ms_fact =
AmPlugIn::instance()->getFactory4Di("msg_storage");
- if(!ms_fact || !(MessageStorage = ms_fact->getInstance())) {
+ if (!ms_fact || !(MessageStorage = ms_fact->getInstance())) {
ERROR("could not load msg_storage. Load a msg_storage implementation module.\n");
return -1;
};
@@ -41,21 +42,38 @@ int MWI::onLoad()
es_args.push(this);
es_args.push("publish");
MessageStorage->invoke("events_subscribe",es_args,ret);
-
+
AmConfigReader cfg;
- if(cfg.loadFile(AmConfig::ModConfigPath + "mwi.conf")) {
- ERROR("can not load configuration file\n");
- return -1;
+
+ use_domain = true;
+ from_user = "mwi-publisher";
+ to_user = "";
+ route_set = "";
+ presence_server = "";
+
+ if(cfg.loadFile(AmConfig::ModConfigPath + string(MOD_NAME ".conf"))) {
+ INFO(MOD_NAME "configuration file (%s) not found, "
+ "assuming default configuration is fine\n",
+ (AmConfig::ModConfigPath + string(MOD_NAME ".conf")).c_str());
+
+ return 0;
};
-
- presence_server = cfg.getParameter("presence_server");
- if (presence_server.length())
- DBG("set presence server '%s'\n", presence_server.c_str());
- else {
- ERROR("parameter 'presence_server' did not found in the configuration file\n");
- return -1;
- }
-
+
+ use_domain = cfg.getParameter("use_domain", "yes") == "yes";
+ from_user = cfg.getParameter("from_user", from_user);
+ to_user = cfg.getParameter("to_user", to_user);
+ route_set = cfg.getParameter("route_set", route_set);
+
+ if (!use_domain) {
+ presence_server = cfg.getParameter("presence_server", presence_server);
+ if (presence_server.length() == 0) {
+ ERROR("use domain set to false, but parameter 'presence_server' not found in the configuration file\n");
+ return -1;
+ }
+
+ DBG("set presence server '%s'\n", presence_server.c_str());
+ }
+
DBG("MWI module loaded.\n");
return 0;
};
@@ -66,54 +84,80 @@ void MWI::publish(const string& user, const string& domain)
int new_msgs = 0;
int all_msgs = 0;
string headers, body;
-
+
AmArg di_args, ret;
di_args.push(domain.c_str());
di_args.push(user.c_str());
-
+
MessageStorage->invoke("userdir_open",di_args,ret);
-
+
if (!ret.size() || !isArgInt(ret.get(0))) {
ERROR("userdir_open for user '%s' domain '%s' returned no (valid) result.\n", user.c_str(), domain.c_str());
return;
};
-
+
all_msgs = ret.get(1).size();
for (size_t i = 0; i < ret.get(1).size(); i++) {
AmArg& elem = ret.get(1).get(i);
-
- if (elem.get(2).asInt()) // skip empty messages
+
+ if (elem.get(2).asInt()) { // skip empty messages
new_msgs += elem.get(1).asInt();
- else
+ }
+ else {
all_msgs--;
+ }
};
-
+
DBG("Found %d new and %d old messages\n", new_msgs, all_msgs - new_msgs);
string vm_buf = int2str(new_msgs) + "/" + int2str(all_msgs - new_msgs);
headers = "Event: message-summary\r\n";
headers += "Subscription-State: active\r\n";
-
- if (new_msgs > 0)
+
+ if (new_msgs > 0) {
body = "Messages-Waiting: yes\r\n";
- else
+ }
+ else {
body = "Messages-Waiting: no\r\n";
+ }
body += "Message-Account: sip:" + user + "@" + domain + "\r\n";
body += "Voice-Message: " + vm_buf + " (" + vm_buf + ")\r\n";
AmMimeBody sms_body;
sms_body.addPart("application/simple-message-summary");
- sms_body.setPayload((const unsigned char*)body.c_str(),body.length());
+ sms_body.setPayload((const unsigned char*) body.c_str(), body.length());
+
+ string from_uri = "sip:";
+ string to_uri = "sip:";
+
+ if (from_user.length() != 0) {
+ from_uri += from_user + "@";
+ }
+
+ if (to_user.length() != 0) {
+ to_uri += to_user + "@";
+ }
+
+ if (use_domain) {
+ from_uri += domain;
+ to_uri += domain;
+ }
+ else {
+ from_uri += presence_server;
+ to_uri += presence_server;
+ }
AmSipDialog tmp_d(NULL);
- tmp_d.setLocalParty(string("<sip:mwi-publisher@") + presence_server + ">");
- tmp_d.setRemoteParty(domain.c_str());
- tmp_d.setRouteSet("sip:" + presence_server);
tmp_d.setRemoteUri("sip:" + user + "@" + domain);
- tmp_d.setCallid(AmSession::getNewId() + "@" + presence_server);
+ tmp_d.setLocalParty("<" + from_uri + ">");
+ tmp_d.setRemoteParty("<" + to_uri + ">");
+ if (route_set.length() != 0) {
+ tmp_d.setRouteSet(route_set);
+ }
+ tmp_d.setCallid(AmSession::getNewId() + "@" + AmConfig::SIP_Ifs[tmp_d.getOutboundIf()].getIP());
tmp_d.setLocalTag(AmSession::getNewId());
- tmp_d.sendRequest(SIP_METH_NOTIFY, &sms_body, headers);
+ tmp_d.sendRequest(SIP_METH_PUBLISH, &sms_body, headers);
};
void MWI::invoke(const string& method, const AmArg& args, AmArg& ret)
@@ -125,6 +169,7 @@ void MWI::invoke(const string& method, const AmArg& args, AmArg& ret)
publish(user, domain);
ret.push(0);
}
- else
- throw AmDynInvoke::NotImplemented(method);
+ else {
+ throw AmDynInvoke::NotImplemented(method);
+ }
};
diff --git a/apps/mwi/mwi.h b/apps/mwi/mwi.h
index c1d7f1d65..0ec8ca46e 100644
--- apps/mwi/mwi.h
+++ apps/mwi/mwi.h
@@ -1,7 +1,7 @@
/*
Copyright (C) Anton Zagorskiy amberovsky@gmail.com
Oyster-Telecom Laboratory
-
+
Published under BSD License
*/
@@ -16,15 +16,21 @@ class MWI : public AmDynInvokeFactory, public AmDynInvoke
private:
static MWI* _instance;
static AmDynInvoke* MessageStorage;
-
+
+ bool use_domain;
+
+ string from_user;
+ string to_user;
+
+ string route_set;
string presence_server;
-
+
typedef struct
{
unsigned int new_msgs;
unsigned int saved_msgs;
} msg_info_struct;
-
+
void getMsgInfo (const string& name, const string& domain, msg_info_struct& msg_info);
void publish (const string& name, const string& domain);

35
net/sems/files/sems.in Normal file
View File

@ -0,0 +1,35 @@
#!/bin/sh
#
# $FreeBSD$
#
# PROVIDE: sems
# REQUIRE: LOGIN
# KEYWORD: shutdown
#
# Add the following line to /etc/rc.conf to enable this service
# at system startup:
#
# sems_enable (bool): Set to NO by default.
# Set it to YES to enable sems.
#
. /etc/rc.subr
name=sems
rcvar=sems_enable
load_rc_config ${name}
: ${sems_enable:=NO}
: ${sems_config:=%%PREFIX%%/etc/sems/sems.conf}
command="%%PREFIX%%/sbin/sems"
pidfile=/var/run/sems/sems.pid
start_precmd="sems_precmd"
sems_precmd()
{
install -d -o sems /var/run/sems
}
command_args="-P $pidfile -f $sems_config -u sems -g sems"
run_rc_command $1

5
net/sems/pkg-descr Normal file
View File

@ -0,0 +1,5 @@
SEMS is an open-source SIP media server, implementing a B2BUA,
voicemail, IVRs, announcements, etc. It is designed to be
complementary to SIP proxy-only tools like Kamailio, OpenSIPS, etc.
WWW: https://github.com/sems-server

316
net/sems/pkg-plist Normal file
View File

@ -0,0 +1,316 @@
@sample %%ETCDIR%%/default.template.sample
@sample %%ETCDIR%%/etc/ann_b2b.conf.sample
@sample %%ETCDIR%%/etc/announce_transfer.conf.sample
@sample %%ETCDIR%%/etc/announcement.conf.sample
@sample %%ETCDIR%%/etc/annrecorder.conf.sample
@sample %%ETCDIR%%/etc/app_mapping.conf.sample
@sample %%ETCDIR%%/etc/auth_b2b.sbcprofile.conf.sample
@sample %%ETCDIR%%/etc/call_timer.sbcprofile.conf.sample
@sample %%ETCDIR%%/etc/callback.conf.sample
@sample %%ETCDIR%%/etc/cc_call_timer.conf.sample
@sample %%ETCDIR%%/etc/cc_pcalls.conf.sample
@sample %%ETCDIR%%/etc/cc_syslog_cdr.conf.sample
@sample %%ETCDIR%%/etc/click2dial.conf.sample
@sample %%ETCDIR%%/etc/codecfilter.sbcprofile.conf.sample
@sample %%ETCDIR%%/etc/conference.conf.sample
@sample %%ETCDIR%%/etc/dsm.conf.sample
@sample %%ETCDIR%%/etc/dsm_in_prompts.conf.sample
@sample %%ETCDIR%%/etc/dsm_out_prompts.conf.sample
@sample %%ETCDIR%%/etc/early_announce.conf.sample
@sample %%ETCDIR%%/etc/echo.conf.sample
@sample %%ETCDIR%%/etc/mod_regex.conf.sample
@sample %%ETCDIR%%/etc/monitoring.conf.sample
@sample %%ETCDIR%%/etc/msg_storage.conf.sample
@sample %%ETCDIR%%/etc/mwi.conf.sample
@sample %%ETCDIR%%/etc/precoded_announce.conf.sample
@sample %%ETCDIR%%/etc/prepaid.sbcprofile.conf.sample
@sample %%ETCDIR%%/etc/refuse.sbcprofile.conf.sample
@sample %%ETCDIR%%/etc/reg_agent.conf.sample
@sample %%ETCDIR%%/etc/replytranslate.sbcprofile.conf.sample
@sample %%ETCDIR%%/etc/rtmp.conf.sample
@sample %%ETCDIR%%/etc/sbc.conf.sample
@sample %%ETCDIR%%/etc/src_ipmap.conf.sample
@sample %%ETCDIR%%/etc/sst_b2b.sbcprofile.conf.sample
@sample %%ETCDIR%%/etc/stats.conf.sample
@sample %%ETCDIR%%/etc/symmetricrtp.sbcprofile.conf.sample
@sample %%ETCDIR%%/etc/transparent.sbcprofile.conf.sample
@sample %%ETCDIR%%/etc/voicebox.conf.sample
@sample %%ETCDIR%%/etc/voicemail.conf.sample
@sample %%ETCDIR%%/etc/webconference.conf.sample
@sample %%ETCDIR%%/sems.conf.sample
lib/sems/audio/annrecorder/beep.wav
lib/sems/audio/annrecorder/bye.wav
lib/sems/audio/annrecorder/confirm.wav
lib/sems/audio/annrecorder/greeting_set.wav
lib/sems/audio/annrecorder/to_record.wav
lib/sems/audio/annrecorder/welcome.wav
lib/sems/audio/annrecorder/your_prompt.wav
lib/sems/audio/beep.wav
lib/sems/audio/conference/beep.wav
lib/sems/audio/conference/first_participant.wav
lib/sems/audio/default_en.wav
lib/sems/audio/precoded_announce/test.predef
lib/sems/audio/voicebox/0.wav
lib/sems/audio/voicebox/1.wav
lib/sems/audio/voicebox/10.wav
lib/sems/audio/voicebox/11.wav
lib/sems/audio/voicebox/12.wav
lib/sems/audio/voicebox/13.wav
lib/sems/audio/voicebox/14.wav
lib/sems/audio/voicebox/15.wav
lib/sems/audio/voicebox/16.wav
lib/sems/audio/voicebox/17.wav
lib/sems/audio/voicebox/18.wav
lib/sems/audio/voicebox/19.wav
lib/sems/audio/voicebox/2.wav
lib/sems/audio/voicebox/20.wav
lib/sems/audio/voicebox/3.wav
lib/sems/audio/voicebox/30.wav
lib/sems/audio/voicebox/4.wav
lib/sems/audio/voicebox/40.wav
lib/sems/audio/voicebox/5.wav
lib/sems/audio/voicebox/50.wav
lib/sems/audio/voicebox/6.wav
lib/sems/audio/voicebox/60.wav
lib/sems/audio/voicebox/7.wav
lib/sems/audio/voicebox/70.wav
lib/sems/audio/voicebox/8.wav
lib/sems/audio/voicebox/80.wav
lib/sems/audio/voicebox/9.wav
lib/sems/audio/voicebox/90.wav
lib/sems/audio/voicebox/and.wav
lib/sems/audio/voicebox/bye.wav
lib/sems/audio/voicebox/first_new_msg.wav
lib/sems/audio/voicebox/first_saved_msg.wav
lib/sems/audio/voicebox/in_your_voicebox.wav
lib/sems/audio/voicebox/msg_deleted.wav
lib/sems/audio/voicebox/msg_end_menu.wav
lib/sems/audio/voicebox/msg_menu.wav
lib/sems/audio/voicebox/msg_saved.wav
lib/sems/audio/voicebox/new_msg.wav
lib/sems/audio/voicebox/new_msgs.wav
lib/sems/audio/voicebox/next_new_msg.wav
lib/sems/audio/voicebox/next_saved_msg.wav
lib/sems/audio/voicebox/no_more_msg.wav
lib/sems/audio/voicebox/no_msg.wav
lib/sems/audio/voicebox/pin_prompt.wav
lib/sems/audio/voicebox/saved_msg.wav
lib/sems/audio/voicebox/saved_msgs.wav
lib/sems/audio/voicebox/x1.wav
lib/sems/audio/voicebox/x2.wav
lib/sems/audio/voicebox/x3.wav
lib/sems/audio/voicebox/x4.wav
lib/sems/audio/voicebox/x5.wav
lib/sems/audio/voicebox/x6.wav
lib/sems/audio/voicebox/x7.wav
lib/sems/audio/voicebox/x8.wav
lib/sems/audio/voicebox/x9.wav
lib/sems/audio/voicebox/you_have.wav
lib/sems/audio/voicemail/beep.wav
lib/sems/audio/voicemail/default_en.wav
lib/sems/audio/webconference/0.wav
lib/sems/audio/webconference/1.wav
lib/sems/audio/webconference/2.wav
lib/sems/audio/webconference/3.wav
lib/sems/audio/webconference/4.wav
lib/sems/audio/webconference/5.wav
lib/sems/audio/webconference/6.wav
lib/sems/audio/webconference/7.wav
lib/sems/audio/webconference/8.wav
lib/sems/audio/webconference/9.wav
lib/sems/audio/webconference/beep.wav
lib/sems/audio/webconference/entering_conference.wav
lib/sems/audio/webconference/first_participant.wav
lib/sems/audio/webconference/pin_prompt.wav
lib/sems/audio/webconference/wrong_pin.wav
lib/sems/dsm/early_dbprompt.dsm
lib/sems/dsm/inbound_call.dsm
lib/sems/dsm/mobile_push.dsm
lib/sems/dsm/mod_conference.so
lib/sems/dsm/mod_dlg.so
lib/sems/dsm/mod_groups.so
lib/sems/dsm/mod_regex.so
lib/sems/dsm/mod_sbc.so
lib/sems/dsm/mod_subscription.so
lib/sems/dsm/mod_sys.so
lib/sems/dsm/mod_uri.so
lib/sems/dsm/mod_utils.so
lib/sems/dsm/outbound_call.dsm
lib/sems/plug-in/adpcm.so
lib/sems/plug-in/ann_b2b.so
lib/sems/plug-in/announce_transfer.so
lib/sems/plug-in/announcement.so
lib/sems/plug-in/annrecorder.so
lib/sems/plug-in/callback.so
lib/sems/plug-in/cc_call_timer.so
lib/sems/plug-in/cc_ctl.so
lib/sems/plug-in/cc_dsm.so
lib/sems/plug-in/cc_pcalls.so
lib/sems/plug-in/cc_prepaid.so
lib/sems/plug-in/cc_registrar.so
lib/sems/plug-in/cc_syslog_cdr.so
lib/sems/plug-in/click2dial.so
lib/sems/plug-in/codec2.so
lib/sems/plug-in/conference.so
lib/sems/plug-in/dsm.so
lib/sems/plug-in/early_announce.so
lib/sems/plug-in/echo.so
lib/sems/plug-in/g722.so
lib/sems/plug-in/gsm.so
lib/sems/plug-in/ilbc.so
lib/sems/plug-in/isac.so
lib/sems/plug-in/l16.so
lib/sems/plug-in/monitoring.so
lib/sems/plug-in/msg_storage.so
lib/sems/plug-in/mwi.so
lib/sems/plug-in/opus.so
lib/sems/plug-in/precoded_announce.so
lib/sems/plug-in/reg_agent.so
lib/sems/plug-in/registrar_client.so
lib/sems/plug-in/rtmp.so
lib/sems/plug-in/sbc.so
lib/sems/plug-in/session_timer.so
lib/sems/plug-in/speex.so
lib/sems/plug-in/stats.so
lib/sems/plug-in/uac_auth.so
lib/sems/plug-in/voicebox.so
lib/sems/plug-in/voicemail.so
lib/sems/plug-in/wav.so
lib/sems/plug-in/webconference.so
sbin/sems
sbin/sems-get-callproperties
sbin/sems-list-active-calls
sbin/sems-list-calls
sbin/sems-list-finished-calls
sbin/sems-logfile-callextract
sbin/sems-sbc-get-activeprofile
sbin/sems-sbc-get-regex-map-names
sbin/sems-sbc-list-profiles
sbin/sems-sbc-load-profile
sbin/sems-sbc-reload-profile
sbin/sems-sbc-reload-profiles
sbin/sems-sbc-set-activeprofile
sbin/sems-sbc-set-regex-map
sbin/sems-rtp-mux-get-max-frame-age-ms
sbin/sems-rtp-mux-get-mtu-threshold
sbin/sems-rtp-mux-set-max-frame-age-ms
sbin/sems-rtp-mux-set-mtu-threshold
sbin/sems-sbc-load-callcontrol-modules
sbin/sems-sbc-teardown-call
sbin/sems-stats
%%DOCSDIR%%-%%SEMS_VERSION%%/Applications.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/CHANGELOG
%%DOCSDIR%%-%%SEMS_VERSION%%/COPYING
%%DOCSDIR%%-%%SEMS_VERSION%%/Howtostart_noproxy.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/Howtostart_simpleproxy.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/Howtostart_voicemail.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/Readme.ann_b2b.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/Readme.announce_transfer.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/Readme.announcement.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/Readme.annrecorder.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/Readme.callback.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/Readme.click2dial.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/Readme.conference.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/Readme.early_announce.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/Readme.echo.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/Readme.monitoring.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/Readme.msg_storage.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/Readme.reg_agent.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/Readme.registrar_client.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/Readme.sbc.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/Readme.uac_auth.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/Readme.voicebox.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/Readme.voicemail.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/Readme.webconference.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/Tuning.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/Readme.dsm.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/dsm_errorhandling.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/dsm_sbc_syntax.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/dsm_syntax.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/dsm_todo.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/183_early_establish.dsm
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/b2b_connect_audio/aas_callee.dsm
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/b2b_connect_audio/aas_caller.dsm
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/b2b_connect_extension/connect_extension.dsm
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/b2b_connect_extension/wav/Makefile
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/b2b_connect_extension/wav/connecting.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/b2b_connect_extension/wav/enter_extension.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/b2b_connect_extension/wav/failed_enter_extension.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/b2b_connect_extension/wav/sorry_problems.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/call/callsub.dsm
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/call/calltest.dsm
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/dsm_di_monit/Readme_ddm.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/dsm_di_monit/dsm_di_monitoring.dsm
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/dsm_di_monit/wav/change.wav
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/dsm_di_monit/wav/taken.wav
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/dsm_di_monit/wav/welcome.wav
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/early_media.dsm
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/handle_cancel.dsm
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/late_reply.dsm
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/moddlg_late_early.dsm
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/pin/main.dsm
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/pin/ok_pin.dsm
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/play_file.dsm
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/sbc/sbc_test_app/howto.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/sbc/sbc_test_app/profile/sbc_test_app_profile.sbcprofile.conf
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/sbc/sbc_test_app/sbc_test_app.conf
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/sbc/sbc_test_app/test_sbc.dsm
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/test.dsm
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/test_b2b.dsm
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/test_byehdr.dsm
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/test_conference.dsm
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/test_conference_mute.dsm
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/test_dbfile.dsm
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/test_exception.dsm
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/test_popen.dsm
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/test_remoteunreachable.dsm
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/test_request_events.dsm
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/test_rtptimeout.dsm
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/test_system_dsm.dsm
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/test_systemevents.dsm
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/examples/test_teeconf.dsm
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/mods/Readme.mod_aws.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/mods/Readme.mod_conference.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/mods/Readme.mod_curl.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/mods/Readme.mod_dlg.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/mods/Readme.mod_groups.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/mods/Readme.mod_monitoring.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/mods/Readme.mod_mysql.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/mods/Readme.mod_py.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/mods/Readme.mod_redis
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/mods/Readme.mod_regex.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/mods/Readme.mod_subscription.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/mods/Readme.mod_sys.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/mods/Readme.mod_uri.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/mods/Readme.mod_utils.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/mods/Readme.mod_xml.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/mods/Readme.mod_zrtp.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/tutorials/quizconnect/Readme.quizconnect_tutorial.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/tutorials/quizconnect/prompts/Makefile
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/tutorials/quizconnect/prompts/sorry_pin_wrong.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/tutorials/quizconnect/prompts/sorry_pin_wrong.wav
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/tutorials/quizconnect/prompts/welcome_callee.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/tutorials/quizconnect/prompts/welcome_callee.wav
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/tutorials/quizconnect/prompts/welcome_caller.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/tutorials/quizconnect/prompts/welcome_caller.wav
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/tutorials/quizconnect/quizconnect.conf
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/tutorials/quizconnect/quizconnect_callee.dsm
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/tutorials/quizconnect/quizconnect_caller.dsm
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/tutorials/quizconnect/quizconnect_tutorial.pdf
%%DOCSDIR%%-%%SEMS_VERSION%%/dsm/tutorials/quizconnect/quizconnect_tutorial.txt
%%DOCSDIR%%-%%SEMS_VERSION%%/figures/conference.dia
%%DOCSDIR%%-%%SEMS_VERSION%%/figures/png/conference.png
%%DOCSDIR%%-%%SEMS_VERSION%%/figures/png/service_invocation.png
%%DOCSDIR%%-%%SEMS_VERSION%%/figures/png/singleinstance.png
%%DOCSDIR%%-%%SEMS_VERSION%%/figures/png/two_instances_app_fixed.png
%%DOCSDIR%%-%%SEMS_VERSION%%/figures/png/two_instances_app_param.png
%%DOCSDIR%%-%%SEMS_VERSION%%/figures/png/voicemail.png
%%DOCSDIR%%-%%SEMS_VERSION%%/figures/png/webconference.png
%%DOCSDIR%%-%%SEMS_VERSION%%/figures/png/webconference_dialout.png
%%DOCSDIR%%-%%SEMS_VERSION%%/figures/service_invocation.dia
%%DOCSDIR%%-%%SEMS_VERSION%%/figures/singleinstance.dia
%%DOCSDIR%%-%%SEMS_VERSION%%/figures/two_instances_app_fixed.dia
%%DOCSDIR%%-%%SEMS_VERSION%%/figures/two_instances_app_param.dia
%%DOCSDIR%%-%%SEMS_VERSION%%/figures/voicemail.dia
%%DOCSDIR%%-%%SEMS_VERSION%%/figures/webconference.dia
%%DOCSDIR%%-%%SEMS_VERSION%%/figures/webconference_dialout.dia