FreeSwitch+Opensips 集群安装配置操作指导书_第1页
FreeSwitch+Opensips 集群安装配置操作指导书_第2页
FreeSwitch+Opensips 集群安装配置操作指导书_第3页
FreeSwitch+Opensips 集群安装配置操作指导书_第4页
FreeSwitch+Opensips 集群安装配置操作指导书_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

FreeSwitch+Opensips集群

安装配置操作指导书

拟制:日期:

杨机智2015-9-24

PreparedbyDate

审核:日期:

ReviewedbyDate

审核:日期:

ReviewedbyDate

批准:日期:

GrantedbyDate

修订记录Revisionrecord

日期修订版本修改描述作者

DateRevisionchangeDescriptionAuthor

version

2015-9-241.00初稿完成杨机智

目录TableofContents

1集群组网.............................................................................7

2Opensips安装配置....................................................................7

2.1环境说明.........................................................................7

2.2安装依赖的包.....................................................................8

2.3安装Opensips............................................................................................................................8

2.4配置Mysql...................................................................................................................................8

2.5复制启动脚本.....................................................................8

2.6启动Opensips............................................................................................................................9

3集群配置.............................................................................9

3.1Opensips负载均衡配置............................................................9

3.2Freeswitch集群配置..............................................................12

3.2.1环境说明....................................................................12

3.2.2安装依赖的包................................................................12

3.2.3ODBC配置..................................................................13

3.2.4Freeswitch安装..............................................................13

3.2.5数据库共享配置..............................................................14

3.2.6账号数据库验证模式配置....................................................14

3.2.7HighAvailability配置.........................................................16

3.2.8共享数据库表结构说明........................................................16

3.3NFS文件共享配置...............................................................18

3.3.1NFS软件包安装..............................................................18

3.3.2NFSServer配置.............................................................18

3.3.1NFSServer启动关闭.........................................................19

3.3.1NFSCIiem配置..............................................................19

3.3.1NFSClient挂载卸载..........................................................20

3.1rsync文件同步配置...............................................................20

3.1.1rsync介绍...................................................................20

3.1.2rsync安装...................................................................20

3.1.3rsync服务端配置.............................................................20

3.1.4rsync客户端配置.............................................................21

3.1.5rsync文件同步...............................................................22

4常见问题解决方法...................................................................22

4.1用nslookup解析域名解析不了...................................................22

4.1.1现象描述....................................................................22

4.1.2原因分析....................................................................22

4.1.3处理方法....................................................................22

4.2数据库连接不上.................................................................23

4.2.1现象描述....................................................................23

4.2.2原因.........................................................................23

4.2.3解决方法....................................................................23

图目录ListofFigures

图1XX图Figure1XX...........................................................................................错误味定义书签。

FreeSwitch+Opensips集群

安装配置操作指导书

关键词Keywords:FreeSwrch,Opensips,NFS,集群

摘要Abstract:本文介绍了Freeswitch+Opensips集群的安装与配置

缩略语清单Listofabbreviations:

Abbreviations缩略语Fullspelling英文全名Chineseexplanation中文解释

1集群组网

集群组网如下图所示:

Opensips+FS+NFS集群组网

集群组网说明:

Opensips部署在前端,作为集群的负载均衡器,同时负责疝FS节点的健康检查及故障转移

Freeswitch服务器集群部署在中间,提供注册及通话等服务

后端为mysql数据库及NFS服务器,mysql提供Freeswitch集群各节点的注册信息、会话信息的共享,

NFS服务器提供Freeswitch集群各节点配置文件的共享

2Opensips安装配置

2.1环境说明

操作系统:CentOS6.332位〔会升级为6.6)

数据库:Mysql5.1.73

2.2安装依赖的包

#yuminstallgcc-c++bisonflexlynxsubversion

2.3安装Opensips

从官方网站:http方/www.opensips.org/,卜.载稳定的版本,当前为:1.11.3

解压:

#tar-zxvfopensips-1_11.3_src.tar.gz

安装:

#cdopensips-1.11.3-tls

#makemenuconfig(选择ConfigureCompi1eOptions-ConfigureExcluded

Modu1es---mysq1)

#makeinclude.moduies=wdbjnysql”prefix="/usr/localwinstall

完成之后会在/usr/lccal/etc/下生成opensips文件夹

2.4配置Mysql

1.进入[安装目录]/ctc/opensips/,编辑opcnsipsctlrc乂件

DBENGINE:MYSQL(可选的有MYSQL,PGSQL,ORACLE,DB_BERKELEY,orDBTEXT)

DBHOST=localhost(数据库所在主机)

DBNAME=opensips(数据库的名称)

DBRWUSER=opensips(数据库的用户名)

DBRWPW=opensips(数据库的密码)

I)BROOTUSER=root(使用该数据库的用户)

2.在[安装目录]/sbin/下运行:./opensipsdbctlcreate

3.进入Mysql修改权限:

grantal1privilegesonopensips.*toopensips@loca1hostidentif'iedby'opensips';

2.5复制启动脚本

#cp/usr/src/opensips-1.11.3-tIs/packaging/rpm/opensips.init/etc/init.d/opensips

#sed-iz/s/\/usr\/sbin\/cpensips/\/usr\/local\/sbin\/opensips/g,z/etc/init.d/opensips

#sed-i"s/\/ctc\/opcnsips/\/usr\/local\/ctc\/opcnsips/g"/ctc/init.d/opcnsips

#sed-i^s/X/etcX/defau11\/opensips/Vusr\/1ocal\/etc\/opensips/g^

/etc/init.d/opensips

#sed-i〃s/RUN_OPENSIPS=ro/RUN_OPENSIPS=yes/g"/etc/init.d/opensips

chmod+x/etc/init.d/opensips

2.6启动Opensips

进入[安装目录]/sbin/运行:./opensips

3集群配置

3.1Opensips负载均衡配置

步骤1、修改opensips,cfg文件(建议先备份)

debug=6#设置输出的H志级别

logstderror=yes#将3打印到控制台上

log_facility=LOG_LOCALO#日志输出

fork=no#启动到前台,便于调试

childrcn-4

disabletcp=yes

dns_try_ipv6=no

autoaliases=no

disable_tls=yes

listen=udp:10.3.4.240:5060#用于监旷IP地址和端口

#加载的模块

#setmodulepath

mpath=n/usr/local/lib/opensips/modules/"

####SIGNALINGmodule

loadmodule"signaling.s。"

####StateLessmodule

loadmoduleusl.so"

####TransactionModule

loadmodule"tm.s。"

modparam("tm",ufr_timeout",5)

modparam("tm*',"fr_inv_timeoutH,30)

modparam("tm',,nrestart_fr_on_each_replyH,0)

modparam("tm*',”onreply_avp_mode”,1)

modparam(•'tm",,'fr_timeru,2)

####RecordRouteModule

loadmodulenrr.so"

/*donotappendfromtagtotheRR(noneedforthisscript)*/

modparam(Hrr",nappencl_fromtag'*,1)

modparam("rr","enable_double_rrn,1)

####MAXForWarDmodule

loadmoduleumaxfwd.so"

####SIPMSGOPerationSmodule

loadmodule“sipmsgops.so”

####FIFOManagementInterface

loadmodulenmi_fifo.so"

nH

modparam(mi_fifo"f"f二fo_name",/tmp/opensips_fifo")

#modparam(nmi_fifo",nfifo_mode",0666)

####URImodule

loadmodule"uri.so”

modparam("uri","use_uri_table”,0)

####USeRLOCationmodule

loadmodule“usrloc.so”

modparam(*usrloc*,"nat_bflag","NAT")

modparam(*usrloc*,“dbjnode”,0)

#期#REGISTRARmodule

loadmodule“registrar,so”

modparam("registrar","tcp_persistent_flag","TCP_PERSISTENT")

/*uncommentthenextlinenottoallowmorethan10contactsperAOR*/

#niodparani("registrar","maxcontacts”,10)

####.ACCountingmodule

loadmodule"acc.so”

/*whatspecialeventsshouldbeaccounted?*/

modparam("acc","earlyjncdia”,0)

modparam("acc","reportcancels^,0)

/*bydefaultwedonotadjustthedirectofthesequentialrequests,

ifyouenablethisparameter,besuretheenable"append_fromtag”

in"rr"module*/

modparam("acc",*detect_directionw,0)

modparam("acc",*failed_transaction_flag*,"ACC_FAILED")

/*accounttriggers(flags)*/

modparam("acc","log_flag","ACC_D0")

modparam("acc","log_missed_flag","ACC_MISSED")

loadmoduletextops,so”

###db_mysqlmodu1e

loadmodule“dbjnysql.so”

dbdefaulturl=^mysql://opensips:opensips@localhost/opensipsw

###dialogmodu1e

loadmodule"dialog,so”

modparam("dialog","db_mode”,1)

modparam("dialog","dburl”,,zmysq1://opensips:opensips@localhost/opensipsw)

##相dispatchermodule

loadmodule“dispatcher,so”

modparam("dispatcher”,“db_url","mysql://opensips:opensips@localhost/opensipsz,)

modparam("dispatcher","ds_ping_method","OPTIONS")

modparam("dispatcher”,“ds_ping_inlerval”,5)

modparam("dispatcher","dsjDrobingthreshhold",2)

modparam("dispatcher”,z/ds_probingmod。",1)

####loadbalancermodu1e

loadmodule/zload_balancer.so”

modparam(,zloadbalancer","db_url”,^mysql://opensips:opensips@localhost/opensipsw)

modparam(*loadbalancer","probingmethod",“OPTIONS")

modparain(*1oadba1ancer7",,/probing_intervalz,,5)

舶#琳##RoutingLogic####«###

#mainrequestroutinglogic

route{

if(!mf_process_maxfwd_header(^lO*)){

sl_send_reply(“483","TooManyHops");

exit;

}

if(!has_totag()){

#initialrequest

record_route();

}else(

#sequentialrequest-obeyRouteindication

loose_route();

t_relay();

exit;

}

#CANCELprocessing

if(isjnethod("CANCEL"))

(

if(t_check_trans())

t_relay();

exit;

)

#fromnowonwehaveonlytheinitialrequests

#selectthenodethat*11handlethecall(loadbalanced)

#themethodusedisdifferentforinvite/registerrequests

#unknownmethodsarerejectedhere

if(is_methodC!NVnr)){

if(!loadbalanced","pstn","1")){

sendreply(z,503,\"ServiceUnavailable");

exit;

)

}elseif(isjnethod("REGISTER")){

if(!ds_select_dstCl*,*0*)){

sendreply(“503","ServiceUnavailable");

exit;

}

}else(

sendreply("405","MethodNotAllowed*);

exii;

#routetherequest

if(!t_relay()){

sl_repiy_en'or();

}

}

步骤2、添加Freeswitch节点

添加Freeswitch节点作为负载均衡:

mysql>useopensips;

mysql>insertintoload_balancer(group_idrdst_uri,resources,description)

values(1,'sip:10.3.4.230','pstn=32',TSI');

mysql>insertintoload_balancer(group_idzdst_uri,resources,description)

values(1,*sip:10.3.4.232*,,pstn=32',*FS2,);

mysql>quit;

添加分发器节点:

格式为:opcnsipsctldispatcheraddgw<setid><dostination><socket><state><weight><attrs>

[description]

opensipsctldispatcheraddgw1sip:10.3.4.230'1050,FS1*'230cluster-FSl,

opensipsctldispatcheraddgw1sip:10.3.4.2321'050*FS1*'230cluster-FSl*

此时就可以将SIP客户端注册到regserver,yealink.com上,可以看到两个Freeswitch的节点上发现了注

册日志

3.2Freesw让ch集群配置

3.2.1环境说明

操作系统:CentOS6.332位(后面会更新成6.6)

Freeswitch:1.4

数据库:Mysql5J.73

3.2.2安装依赖的包

系统需要的包:

#yuminstallgitgcc-c++autoconfautomakelibzoolwgetpythonncurses-devel

zlib-devel1jbjpeg-developenssl-devele2fsprogs-develsql.ite-devel

libcurl-develpcre-develspeex-develIdns-devellibedit-devel

ODBC需要的包:

#yuminstallunixODBCunixODBC-devel

Mysql需要的包:

#yuminstallmysql-connector-odbc

更新系统的内核及依赖包:

#yum-yupdate

3.2.3ODBC配置

1、修改/etc/odbc.ini配置要连接的数据库信息

[freoswitch]

Driver=/usr/1ib/1ibmyodbc5.so

SERVER=10.3.4.220(数据库地址)

PORT=3306

DATABASE=freeswitch(数据库上要先创建该数据库名称)

USER=root(数据库用户名)

PASSWORD=123456(数据库密码)

OPTION=67108864(freeswitch会将多条SQL语句放一起执行,提高效率)

2、/etc/odbcinst.ini修改mysq的部分,将驱动包指向正确,关注Mysql数据库配置即可,

[MySQL]

Description=ODBCforMySQL

Driver=/usr/1ib/1ibmyodbc5.so

Setup=/usr/1ib/1ibodbcmyS.so

FileUsage=1

3、修改之后,执行isql-vfreeswitch

如果出现

[root@testetc]#isql-vfreeswitch

+----------------------------------------+

Connected!

II

sql-statement

help[tablename]

Iquit

II

+----------------------------------------+

SQL>

则代表你的unixodbc配置成4了

3.2.4Freeswitch安装

#cd/usr/local/src

#gitclone-bvl.4https://freeswitch.or^/stash/scm/fs/Freeswitch.Rit

#cd/usr/local/src/Freeswitch

#./configure--enable-core-odbc-support

#make

#makeinstall

#makecd-sounds-install(声音包)

#makecd-moh-install(声音包)

完成之后会默认在/usr/loca"路径下

3.2.5数据库共享配置

在每■—个Freeswitch集群节点按照如下设置数据库共享:

修改:/usr/local/freeswitch/conf/autoloadconfigs/switch.conf,xml

<paramname="core-db-dsn“value="freeswitch:root:123456”/>

修改:/usr/local/freeswitch/conf/autoload_configs/db.conf,xml

<paramnamc="odbc-dsn“valuc=/l,frecswitch:root:123456w/>

修改:/usr/local/freeswitch/conf/sip_profiles/internal.xml

<paramname="odbc-dsn"value=/zfreeswitch:root:123456w/>

修改freeswitch下的vars.xml文件,将

<X-PRE-PROCESScmd—set"data=,,domain=$${local_ip_v4}"/>

修改成:

<X-PRE-PROCESScmd="sct"data=,/domain=regscrvcr.ycalink.com"/〉

3.2.6账号数据库验证模式配置

Freeswitch默认是采用conf/direct。”/目录下的账号文件米进行注册账号的验证。如果采用

共享数据库的模式,也可以配置成通过mysql数据库的users表来进行注册账号的验证。具体可以

通过如下步骤来修改:

修改freeswitch/conf/autoload_configs/lua.conf,xml,内容如下:

<paramname=z,xml-handlor-script/,value=/,/usr/local/frecswitch/scripts/gcndiruserxml.lua”

/>

<paramname="xml-handler-bindings“value="directory”/>

其中gen_dir_user_xml.lua内容如下:

freeswitch.consoleLog("NOTICE","luataketheusers…\n");

-gone!iruserxml.lua

-examplescriptforgeneratinguserdirectoryXML

-commentthefollowinglineforproduction:

-frcoswitch.consoieLog(//noticc,/,“Debugfromgendiruserxml.lua,providedparams:\nz/

params:serialize()..”\n")

localreq_domain=params:getHeader("domain")

localreq_key=params:getHeader(,zkey,z)

localrequser=params:getHeader("user")

localreqpassword=parans:getHeader(^pass'O

——databasename:freeswitch

-databaseuser:root

-databasemedia:media

localdbh=freeswitch.Dbh("frees*tch","root","media");

freeswitch.consoleLog("NOTICE","startconnectDB…\r\n");

assert(dbh:connected());

-databaseusertablename:Users

dbh:query(""selectpasswordfromUserswhereid=z,..requser,function(row)

freeswitch.consoleLog("NOTICE”,string,format("%s\n”,row.password))

req_password=string.formatrow.password)

end);

dbh:release();

freeswitch.consoleLog("NOTICE","info:.reqdomain.."一.reqkey.."-.requser..,z-.req

password.."\n");

-assert(reqdomainandreqkeyandrequser,

―“Thisexamplescriptonlysupportsgeneratingdirectoryxmlforasingleuser!\n")

ifreqdomain~=nilandreq_key^=ni1andrequser=ni1then

XML_STRTNG=

[[<?xmlversion="l.0"encoding="UTF-8'standalone="no”?>

<documcnttypc-Wfrccswitch/xml,,>

<sectionname=z,directory'^

<domainname=z,]]..req_domain..[[*>

<params>

<paramname="dial-string”

valuc=w{presenceid=$(dialeduser}@${dialeddomain)}${sofiacontact(S{dialeduser}{dialedd

omain})}“/>

</params>

<groups>

<groupname=,,default,,>

<users>

<userid="]]..req_user..[[*>

<params>

<paramname="password"value=/,]]..req_password..[[”/>

<paramname="vm-password“value=z,1]..req_password..[["/>

</params>

<variables>

<variablename=vtollailow*value=,/domestic,international,local'/)

<variablename='*accountcode//value、”]]..req_user..[[”/>

<variablename='vusercontext“value=",defaultz7>

<variablename=vdirectory-visib1e,zvaluo=z,true,//>

<variablename="directory-exten-visible“value=A,true,,/>

<variablename="limit_max"value="15'7》

<variablename='*effective_cal1er_id-name"value="Extension]]..req_user..[[*/>

<variablename='veffective_cal1er_id_number,zvalue="]]..req_user..[[*/>

<variablename=vcallgroupz,value=//tcchsupport,z/>

</variables>

</user>

</users>

</group>

</groups>

</domain>

</section>

</document>]]

else

XML_STRING=

[[<?xmlversion="l.0"encoding="UTF-8'standalone=//no,,?>

<documenttype="freeswitch/xml”>

<sectionname="directory”〉

</section>

</document>]]

end

-commentthefollowinglineforproduction:

freeswitch.conso1eLog(*noticez,,“Debugfromgendiruserxml.lua,generatedXML:\nA

XML_STRING.."\n");

拨号规则配置(用于测试使用)

<include>

<extensionname=,/freeswitch”>

<conditionfield=,,destinationnumberexpression=r(29\d⑵)$”>

<actionapplication="log"data=*INF0testupdatemountfile219”/>

<actionapplication-,,sct/,data-,,dialcd_cxtcnsion_$1/z/>

<actionapplication="/bridge//dala="user/${dialed_extension}@${domainname}"/>

</condition>

</extension>

</include>

3.2.7HighAvailability配置

为了freeswitch在故障之后能够恢复,需要进行3步配置:

1.将故障前的信息写入数据库中,在sip_profiles/internal.xml添加参数:

<paramname="track-calls“value="true〃/>

2.Freeswitch恢复时是通过hostname来查询数据库中的数据,需要在switch,conf,xml中修改:

<paramname="swilchname"value=,,freeswitchz,/>

3.如果手动恢复freeswitch,需要在控制台中执行命令:

Sofiarecover

4.如果自动恢复frees*tch,需要在「reeswiich.xml中添加:

<X-PRE-PROCESScmd="set"data=,,apionstartup=sofiarecover'/)

3.2.8共享数据库表结构说明

表名来源作用备注

aliasesfreesuilch

basic_callfrees”itch通话的基本信息视图

callsfreeswitch通话的记录表,只记录双方的

uuid和时间

channelsfreeswitch记录一次通话的双方具体信息

db_dalafreeswitch

dctailcd_callsfreeswitch通话的详细信息视图

group_datafreeswitch

interfacesfreeswitch保存当前Freeswitch提供出的接

口,可以是application中的也可

以是file中的

limit_datafreeswitch

natfreeswitch

recoveryfrccswitch需要恢复的信息依赖3.2.7的配置记录下通

话的信息

registrationsfreesuitch己注册的SIP账号信息

sip_aulliciiliualioiificcswiluh保存服务器对SIP客户端的消息

摘要信息

sip_dialogsfreesuitch保存每路通话的信息

sip_presencefreeswitch

sip_rcgistrationsfrccswitch保存已注册的SIP客户端信息

sip_sharcd_appcaranccfrccswitch

.dialogs

sip_shared_appearancefreeswitch

.subscriptions

sip_subscriptionsfreeswitch存储非话机的SIP客户端例如使用Xlite注卅时会被

记录到该表中

tasksfreeswitch

users外部创建存储SIP账号目前该表仅做测试使用

数据库表;Users

名称类型长度是否为空是否主键备注

idvarchar128NY

passwordvarchar128NN

3.3NFS文件共享配置

3.3.1NFS软件包安装

NFS服务器和FreeSwitch各节点都要安装nfs和rpcbind软件包:

yum-yinstallnfs-utilsrpcbind

3.3.2NFSServer配置

步骤1:在服务器上创建NFS共享目录:mkdir/usr/local/freeswitch/conf

步骤2:设置共享目录的读写权限:chmod666/usr/local/freeswitch/conf

步骤3:编辑export文件:vi/etc/exports

/usr/local/freeswitch/conf10.3.4.xxx(rw,no_root_squash,no_all_squash,sync)

注意地址和参数表之间没有空格。如果下面设置的mountd端口大于1024,需要在参数表里加入参数:

insecure

步骤4:配置生效:

exportfs-r

注:配置文件说明:

/usr/local/freeswitch/conf为Freeswitch集群各节点共享的目录,使用绝对路径。

10.3.4.xxx(rw,no_root_squ&sh,no_all_squash,sync)为客户端的地址及权限,地址可以是一个

网段(如:/24),一个IP地址或者是一个域名,域名支持通配符,如:*.hpce.cn,

地址与权限中间没有空格。

权限说明:

rw:read-writc,可读写;

ro:read-only,只读;

sync:文件同时写入硬盘和内存;

async:文件暂存于内存,而不是直接写入内存;

no_root_squash:M3客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,

也拥有root权限。显然开启这项是不安全的。

root.squash:NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,拥

有匿名用户权限,通常他将使用nobody或nfsnobody身份;

all.squash:不论NFS客户端连接服务端时使用什么用户,对服务端分享的目录来说都是拥有匿名

用户权限;

anonuid:匿名用户的UID值,通常是nobody或nfsnobody,可以在此处自行设定;

anongid:匿名用户的GID值。

3.3.1NFSServer启动关闭

启动:

#servicerpcbindstart

ftservicenfsstart

重启:

#servicenfsrestart

关闭:

#servicenfsstop

3.3.1NFSClient配置

步骤1:扫瞄可以使用的NFSServer目录

showmount-e10.3.4.xxx

步骤2:创建挂载目录

mkdir/usr/local/freeswitch/conf〃对于freeswitch节点这一步可以省略,因为目录已

经存在了

步骤3:使用mount进行挂载

mount-tnfs10.3.3.10:/usr/local/freeswitch/conf/usr/local/freeswitch/conf-o

proto=tcp-onolock

注:为了提高NFS的稳定性,使用TCP协议挂载,NFS默认用UDP协议

步骤4:查看挂载情况

用如下命令查看:

#df

FilesystemiK-blocksUsedAvailableUse%Mountedon

/dev/mapper/VolGroup-lv_rool

516061403471488455132128%/

tmpfs200428802CXJ428S0%/dev/shm

/dev/sdal4958445280941743512%/boot

/dev/mapper/VolGroup-lv_home

4245282722029524027604961%/home

10.34.xxx:/usr/local/freeswitch/conf

516065281611776473733124%/usr/local/frceswilch/conf

注:c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论