阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

OpenSIPS离线消息功能配置

460次阅读
没有评论

共计 13205 个字符,预计需要花费 34 分钟才能阅读完成。

按照项目的需求,需要使用 OpenSIPS 的离线功能,现在将配置过程记录以备后用。

OpenSIPS 离线消息功能依赖于 msilo 模块 (http://www.opensips.org/html/docs/modules/1.11.x/msilo.html)

修改 OpenSIPS 的配置文件 opensips.cfg 添加

loadmodule “msilo.so”
# 加载 msilo 模块
modparam(“msilo”, “db_table”, “silo”)
# 配置离线消息存储的表 silo
modparam(“msilo”, “db_url”,”mysql://opensips:opensipsrw@localhost/opensips”)
# 配置数据库路径
modparam(“msilo”, “add_date”, 1)
# 配置是否显示 [offline message + 时间]
modparam(“msilo”,”content_type_hdr”,”Content-Type: text/plain\r\n”)
# 配置存储类型

 

# 注释以下这段:
/*      if (!(is_method(“REGISTER”)  ) ) {
                if (from_uri==myself)
                {
                        # authenticate if from local subscriber
                        # authenticate all initial non-REGISTER request that pretend to be
                        # generated by local subscriber (domain from FROM URI is local)
                        if (!proxy_authorize(“”, “subscriber”)) {
                                proxy_challenge(“”, “0”);
                                exit;
                        }
                        if (!db_check_from()) {
                                sl_send_reply(“403″,”Forbidden auth ID”);
                                exit;
                        }
                        consume_credentials();
                        # caller authenticated
                } else {
                        # if caller is not local, then called number must be local
                        if (!uri==myself) {
                                send_reply(“403″,”Rely forbidden”);
                                exit;
                        }
                }
        }
*/
 
# 修改一下这段
        if (is_method(“REGISTER”))
        {
 
                # authenticate the REGISTER requests
                if (!www_authorize(“”, “subscriber”))
                {
                        www_challenge(“”, “0”);
                        exit;
                }
 
                if (!db_check_to())
                {
                        sl_send_reply(“403″,”Forbidden auth ID”);
                        exit;
                }
 
                if (0) setflag(TCP_PERSISTENT);
 
                if (!save(“location”))
                        sl_reply_error();
                #增加部分 –start
                if (m_dump()){
                        log(“MSILO:offline message dumped\n”);
                }else{
                        log(“MSILO:no offline message dumped\n”);
                }
                #增加部分 –end
                exit;
        }
 
 
 #修改这段
        if (!lookup(“location”,”m”)) {
                if (!db_does_uri_exist()) {
                        send_reply(“420″,”Bad Extension”);
                        exit;
                }
 
                #从这里开始修改
                if(! t_newtran()){
                        sl_reply_error();
                        exit;
                }
                #以下为增加部分
                if (!method==”MESSAGE”)
                {
                        if (!t_reply(“404”, “Not found”))
                        {
                                sl_reply_error();
                        };
                        exit;
                };
                log(“MSILO:Message received -> storing using MSILO\n”);
                if (m_store(“$ru”)){
                        log(“MSILO:offline message stored\n”);
                        if (!t_reply(“202″,”Accepted”)){
                                sl_reply_error();
                        };
                }else{
                        log(“MSILO:offline message NOT stroed\n”);
                        if(!t_reply(“503″,”Service Unavailable”)){
                                sl_reply_error();
                        };
                };
                exit;
        }
        t_on_failure(“1”);  #增加这句
        if (isbflagset(NAT)) setflag(NAT);   
       
# 在配置文件最后增加:
failure_route[1] {
    # forwarding failed — check if the request was a MESSAGE
    if (!method==”MESSAGE”)
    {
        exit;
    };
 
    log(1,”MSILO:the downstream UA doesn’t support MESSAGEs\n”);
    # we have changed the R-URI with the contact address, ignore it now
    if (m_store(“$ou”))
    {
        log(“MSILO: offline message stored\n”);
        t_reply(“202”, “Accepted”);
    }else{
        log(“MSILO: offline message NOT stored\n”);
        t_reply(“503”, “Service Unavailable”);
    };
}

 

#
# OpenSIPS residential configuration script
#    by OpenSIPS Solutions <team@opensips-solutions.com>
#
# This script was generated via “make menuconfig”, from
#  the “Residential” scenario.
# You can enable / disable more features / functionalities by
#  re-generating the scenario with different options.#
#
# Please refer to the Core CookBook at:
#      http://www.opensips.org/Resources/DocsCookbooks
# for a explanation of possible statements, functions and parameters.
#

####### Global Parameters #########

debug=3
log_stderror=no
log_facility=LOG_LOCAL0

fork=yes
children=4

/* uncomment the following lines to enable debugging */
#debug=6
#fork=no
#log_stderror=yes

/* uncomment the next line to enable the auto temporary blacklisting of
  not available destinations (default disabled) */
#disable_dns_blacklist=no

/* uncomment the next line to enable IPv6 lookup after IPv4 dns
  lookup failures (default disabled) */
#dns_try_ipv6=yes

/* comment the next line to enable the auto discovery of local aliases
  based on revers DNS on IPs */
auto_aliases=no

listen=udp:eth0:5060  # CUSTOMIZE ME

#disable_tcp=yes

#disable_tls=yes

####### Modules Section ########

#set module path
mpath=”/data/opensips1.11.4/lib64/opensips/modules/”

#### SIGNALING module
loadmodule “signaling.so”

#### StateLess module
loadmodule “sl.so”

#### Transaction Module
loadmodule “tm.so”
modparam(“tm”, “fr_timeout”, 5)
modparam(“tm”, “fr_inv_timeout”, 30)
modparam(“tm”, “restart_fr_on_each_reply”, 0)
modparam(“tm”, “onreply_avp_mode”, 1)

#### Record Route Module
loadmodule “rr.so”
/* do not append from tag to the RR (no need for this script) */
modparam(“rr”, “append_fromtag”, 0)

#### MAX ForWarD module
loadmodule “maxfwd.so”

#### SIP MSG OPerationS module
loadmodule “sipmsgops.so”

#### FIFO Management Interface
loadmodule “mi_fifo.so”
modparam(“mi_fifo”, “fifo_name”, “/tmp/opensips_fifo”)
modparam(“mi_fifo”, “fifo_mode”, 0666)

#### URI module
loadmodule “uri.so”
modparam(“uri”, “use_uri_table”, 0)
modparam(“uri”, “db_url”,”mysql://opensips:opensipsrw@localhost/opensips”)

loadmodule “msilo.so”
modparam(“msilo”, “db_table”, “silo”)
modparam(“msilo”, “db_url”,”mysql://opensips:opensipsrw@localhost/opensips”)
modparam(“msilo”, “add_date”, 1)
modparam(“msilo”,”content_type_hdr”,”Content-Type: text/plain\r\n”)

#### MYSQL module
loadmodule “db_mysql.so”

 

#### USeR LOCation module
loadmodule “usrloc.so”
modparam(“usrloc”, “nat_bflag”, “NAT”)
modparam(“usrloc”, “db_mode”,  2)
modparam(“usrloc”, “db_url”,
    “mysql://opensips:opensipsrw@localhost/opensips”) # CUSTOMIZE ME

#### REGISTRAR module
loadmodule “registrar.so”
modparam(“registrar”, “tcp_persistent_flag”, “TCP_PERSISTENT”)
modparam(“registrar”, “received_avp”, “$avp(received_nh)”)
/* uncomment the next line not to allow more than 10 contacts per AOR */
#modparam(“registrar”, “max_contacts”, 10)

#### ACCounting module
loadmodule “acc.so”
/* what special events should be accounted ? */
modparam(“acc”, “early_media”, 0)
modparam(“acc”, “report_cancels”, 0)
/* by default we do not adjust the direct of the sequential requests.
  if you enable this parameter, be sure the enable “append_fromtag”
  in “rr” module */
modparam(“acc”, “detect_direction”, 0)
modparam(“acc”, “failed_transaction_flag”, “ACC_FAILED”)
/* account triggers (flags) */
modparam(“acc”, “db_flag”, “ACC_DO”)
modparam(“acc”, “db_missed_flag”, “ACC_MISSED”)
modparam(“acc”, “db_url”,
    “mysql://opensips:opensipsrw@localhost/opensips”) # CUSTOMIZE ME

#### AUTHentication modules
loadmodule “auth.so”
loadmodule “auth_db.so”
modparam(“auth_db”, “calculate_ha1”, no)
modparam(“auth_db”, “password_column”, “ha1”)
modparam(“auth_db”, “db_url”,
    “mysql://opensips:opensipsrw@localhost/opensips”) # CUSTOMIZE ME
modparam(“auth_db”, “load_credentials”, “”)

#### ALIAS module
loadmodule “alias_db.so”
modparam(“alias_db”, “db_url”,
    “mysql://opensips:opensipsrw@localhost/opensips”) # CUSTOMIZE ME

 

 

#### DIALOG module
loadmodule “dialog.so”
modparam(“dialog”, “dlg_match_mode”, 1)
modparam(“dialog”, “default_timeout”, 21600)  # 6 hours timeout
modparam(“dialog”, “db_mode”, 2)
modparam(“dialog”, “db_url”,
    “mysql://opensips:opensipsrw@localhost/opensips”) # CUSTOMIZE ME

####  NAT modules
loadmodule “nathelper.so”
modparam(“nathelper”, “natping_interval”, 10)
modparam(“nathelper”, “ping_nated_only”, 1)
modparam(“nathelper”, “received_avp”, “$avp(received_nh)”)

loadmodule “rtpproxy.so”
modparam(“rtpproxy”, “rtpproxy_sock”, “udp:localhost:12221”) # CUSTOMIZE ME

 

 

 

####### Routing Logic ########

# main request routing logic

route{
    force_rport();
    if (nat_uac_test(“23”)) {
        if (is_method(“REGISTER”)) {
            fix_nated_register();
            setbflag(NAT);
        } else {
            fix_nated_contact();
            setflag(NAT);
        }
    }
   

    if (!mf_process_maxfwd_header(“10”)) {
        sl_send_reply(“483″,”Too Many Hops”);
        exit;
    }

    if (has_totag()) {
        # sequential request withing a dialog should
        # take the path determined by record-routing
        if (loose_route()) {
           
            # validate the sequential request against dialog
            if ($DLG_status!=NULL && !validate_dialog() ) {
                xlog(“In-Dialog $rm from $si (callid=$ci) is not valid according to dialog\n”);
                ## exit;
            }
           
            if (is_method(“BYE”)) {
                setflag(ACC_DO); # do accounting …
                setflag(ACC_FAILED); # … even if the transaction fails
            } else if (is_method(“INVITE”)) {
                # even if in most of the cases is useless, do RR for
                # re-INVITEs alos, as some buggy clients do change route set
                # during the dialog.
                record_route();
            }

            if (check_route_param(“nat=yes”))
                setflag(NAT);

            # route it out to whatever destination was set by loose_route()
            # in $du (destination URI).
            route(relay);
        } else {
           
            if (is_method(“ACK”) ) {
                if (t_check_trans() ) {
                    # non loose-route, but stateful ACK; must be an ACK after
                    # a 487 or e.g. 404 from upstream server
                    t_relay();
                    exit;
                } else {
                    # ACK without matching transaction ->
                    # ignore and discard
                    exit;
                }
            }
            sl_send_reply(“404″,”Not here”);
        }
        exit;
    }

    # CANCEL processing
    if (is_method(“CANCEL”))
    {
        if (t_check_trans())
            t_relay();
        exit;
    }

    t_check_trans();

/*    if (!(is_method(“REGISTER”)  ) ) {
       
        if (from_uri==myself)
       
        {
           
            # authenticate if from local subscriber
            # authenticate all initial non-REGISTER request that pretend to be
            # generated by local subscriber (domain from FROM URI is local)
            if (!proxy_authorize(“”, “subscriber”)) {
                proxy_challenge(“”, “0”);
                exit;
            }
            if (!db_check_from()) {
                sl_send_reply(“403″,”Forbidden auth ID”);
                exit;
            }
       
            consume_credentials();
            # caller authenticated

           
        } else {
            # if caller is not local, then called number must be local
           
            if (!uri==myself) {
                send_reply(“403″,”Rely forbidden”);
                exit;
            }
        }

    }

*/

    # preloaded route checking
    if (loose_route()) {
        xlog(“L_ERR”,
        “Attempt to route with preloaded Route’s [$fu/$tu/$ru/$ci]”);
        if (!is_method(“ACK”))
            sl_send_reply(“403″,”Preload Route denied”);
        exit;
    }

    # record routing
    if (!is_method(“REGISTER|MESSAGE”))
        record_route();

    # account only INVITEs
    if (is_method(“INVITE”)) {
       
        # create dialog with timeout
        if (!create_dialog(“B”) ) {
            send_reply(“500″,”Internal Server Error”);
            exit;
        }
       
        setflag(ACC_DO); # do accounting
    }

   
    if (!uri==myself) {
        append_hf(“P-hint: outbound\r\n”);
       
        route(relay);
    }

    # requests for my domain
   
    if (is_method(“PUBLISH|SUBSCRIBE”))
    {
        sl_send_reply(“503”, “Service Unavailable”);
        exit;
    }

    if (is_method(“REGISTER”))
    {
       
        # authenticate the REGISTER requests
        if (!www_authorize(“”, “subscriber”))
        {
            www_challenge(“”, “0”);
            exit;
        }
       
        if (!db_check_to())
        {
            sl_send_reply(“403″,”Forbidden auth ID”);
            exit;
        }

        if (0) setflag(TCP_PERSISTENT);

        if (!save(“location”))
            sl_reply_error();

                if (m_dump()){
                        log(“MSILO:offline message dumped\n”);
                }else{
                        log(“MSILO:no offline message dumped\n”);
                }

      exit;
    }

    if ($rU==NULL) {
        # request with no Username in RURI
        sl_send_reply(“484″,”Address Incomplete”);
        exit;
    }

   
    # apply DB based aliases
    alias_db_lookup(“dbaliases”);

   

   

    # do lookup with method filtering
    if (!lookup(“location”,”m”)) {
        if (!db_does_uri_exist()) {
            send_reply(“420″,”Bad Extension”);
            exit;
        }

      if(! t_newtran()){
            sl_reply_error();
            exit;
        }
        if (!method==”MESSAGE”)
        {
                    if (!t_reply(“404”, “Not found”))
                    {
                            sl_reply_error();
                      };
                    exit;
                };
        log(“MSILO:Message received -> storing using MSILO\n”);
        if (m_store(“$ru”)){
            log(“MSILO:offline message stored\n”);
            if (!t_reply(“202″,”Accepted”)){
                sl_reply_error();
            };
        }else{
            log(“MSILO:offline message NOT stroed\n”);
            if(!t_reply(“503″,”Service Unavailable”)){
                sl_reply_error();
            };
        };
        exit;
    }
    t_on_failure(“1”);

  if (isbflagset(NAT)) setflag(NAT);

    # when routing via usrloc, log the missed calls also
    setflag(ACC_MISSED);
    route(relay);
}

route[relay] {
    # for INVITEs enable some additional helper routes
    if (is_method(“INVITE”)) {
       
        if (isflagset(NAT)) {
            rtpproxy_offer(“ro”);
        }

        t_on_branch(“per_branch_ops”);
        t_on_reply(“handle_nat”);
        t_on_failure(“missed_call”);
    }

    if (isflagset(NAT)) {
        add_rr_param(“;nat=yes”);
        }

    if (!t_relay()) {
        send_reply(“500″,”Internal Error”);
    };
    exit;
}

 

branch_route[per_branch_ops] {
    xlog(“new branch at $ru\n”);
}

onreply_route[handle_nat] {
    if (nat_uac_test(“1”))
        fix_nated_contact();
    if (isflagset(NAT) )
        rtpproxy_answer(“ro”);
    xlog(“incoming reply\n”);
}

failure_route[missed_call] {
    if (t_was_cancelled()) {
        exit;
    }

    # uncomment the following lines if you want to block client
    # redirect based on 3xx replies.
    ##if (t_check_status(“3[0-9][0-9]”)) {
    ##t_reply(“404″,”Not found”);
    ##    exit;
    ##}

   
}

 

local_route {
    if (is_method(“BYE”) && $DLG_dir==”UPSTREAM”) {
       
        acc_db_request(“200 Dialog Timeout”, “acc”);
       
    }
}

failure_route[1] {
    # forwarding failed — check if the request was a MESSAGE
    if (!method==”MESSAGE”)
    {
        exit;
    };
   
    log(1,”MSILO:the downstream UA doesn’t support MESSAGEs\n”);
    # we have changed the R-URI with the contact address, ignore it now
    if (m_store(“$ou”))
    {
        log(“MSILO: offline message stored\n”);
        t_reply(“202”, “Accepted”);
    }else{
        log(“MSILO: offline message NOT stored\n”);
        t_reply(“503”, “Service Unavailable”);
    };
}

RHEL6.5 下安装 OpenSIPS  http://www.linuxidc.com/Linux/2014-06/102671.htm

CentOS 下 OpenSIPS 安装配置过程记录 http://www.linuxidc.com/Linux/2013-08/89136.htm

OpenSIPS 的详细介绍 :请点这里
OpenSIPS 的下载地址 :请点这里

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2015-07/120566.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-20发表,共计13205字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19350
评论数
4
阅读量
7963042
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
4盘位、4K输出、J3455、遥控,NAS硬件入门性价比之王

4盘位、4K输出、J3455、遥控,NAS硬件入门性价比之王

  4 盘位、4K 输出、J3455、遥控,NAS 硬件入门性价比之王 开篇 在 NAS 市场中,威...
告别Notion焦虑!这款全平台开源加密笔记神器,让你的隐私真正“上锁”

告别Notion焦虑!这款全平台开源加密笔记神器,让你的隐私真正“上锁”

  告别 Notion 焦虑!这款全平台开源加密笔记神器,让你的隐私真正“上锁” 引言 在数字笔记工...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站 - 手机博物馆 -CHAZ 3D Experience 一句话介绍:一个用 3D 方式重温...
颠覆 AI 开发效率!开源工具一站式管控 30+大模型ApiKey,秘钥付费+负载均衡全搞定

颠覆 AI 开发效率!开源工具一站式管控 30+大模型ApiKey,秘钥付费+负载均衡全搞定

  颠覆 AI 开发效率!开源工具一站式管控 30+ 大模型 ApiKey,秘钥付费 + 负载均衡全...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
星哥带你玩飞牛NAS硬件 01:捡垃圾的最爱双盘,暴风二期矿渣为何成不老神话?

星哥带你玩飞牛NAS硬件 01:捡垃圾的最爱双盘,暴风二期矿渣为何成不老神话?

星哥带你玩飞牛 NAS 硬件 01:捡垃圾的最爱双盘,暴风二期矿渣为何成不老神话? 前言 在选择 NAS 用预...
三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Android 的最优解?

三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Android 的最优解?

  三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Andr...
240 元左右!五盘位 NAS主机,7 代U硬解4K稳如狗,拓展性碾压同价位

240 元左右!五盘位 NAS主机,7 代U硬解4K稳如狗,拓展性碾压同价位

  240 元左右!五盘位 NAS 主机,7 代 U 硬解 4K 稳如狗,拓展性碾压同价位 在 NA...
每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站 - 手机博物馆 -CHAZ 3D Experience 一句话介绍:一个用 3D 方式重温...
星哥带你玩飞牛NAS-16:不再错过公众号更新,飞牛NAS搭建RSS

星哥带你玩飞牛NAS-16:不再错过公众号更新,飞牛NAS搭建RSS

  星哥带你玩飞牛 NAS-16:不再错过公众号更新,飞牛 NAS 搭建 RSS 对于经常关注多个微...