Hi all,
I'm using wesip with openser 1.2.2.
I've configured both of the configuration files (openser.cfg with SEAS
module and server.xml) but when I run the wesip startup script I get this
Exception:
Starting WESIP Application Server VozTelecom...
[root@SERVER conf]# Exception during startup processing
java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke (libgcj.so.7)
at org.apache.catalina.startup.Bootstrap.main (Bootstrap.java:156)
Caused by: java.lang.NoSuchMethodError: method
java.lang.Class.getSimpleNamewith signature ()Ljava.lang.String; was
not found.
at org.apache.catalina.connector.http.HttpConnector.start (
HttpConnector.java:1194)
at org.apache.catalina.core.StandardService.start (StandardService.java
:452)
at org.apache.catalina.core.StandardServer.start (StandardServer.java
:2142)
at org.apache.catalina.startup.Catalina.start (Catalina.java:474)
at org.apache.catalina.startup.Catalina.execute (Catalina.java:358)
at org.apache.catalina.startup.Catalina.process (Catalina.java:129)
at java.lang.reflect.Method.invoke (libgcj.so.7)
...1 more
Can somebody help me?
Regards,
daniel
--
Daniel Grotti
________________________
e-mail : d.grotti(a)gmail.com
Hi Guys,
I like the whole idea of naming and my self i propose this great
OpenSource Tool to be Code named "UHURU".
It is a Swahili word which means Freedom, it can be freedom of anything,
be it colonialization, of expression, way of doing things
etc.etc. ....am not John the Baptist though..teh! teh!..teh!..
WBR,
LU.
Hi...
I have installed SER-0.10.99 with presence capabilities following the presence hadnbook, the server is running OK, but I have problems when I tried to register a client (x-lite). I am getting 483: Too many hops...
What can be the problem?????
Thank you for your help,
Carlos
Config file:
debug=3 # debug level (cmd line: -dddddddddd)
#fork=yes
#log_stderror=no # (cmd line: -E)
#memlog=5 # memory debug log level
#log_facility=LOG_LOCAL0 # sets the facility used for logging (see syslog(3))
check_via=no # (cmd. line: -v)
dns=no # (cmd. line: -r)
rev_dns=no # (cmd. line: -R)
port=5060
children=2
alias="test-domain.com"
#user=ser
#group=ser
#open_fd_limit=1024 # sets the open file descriptors limit
mhomed=yes # usefull for multihomed hosts, small performance penalty
#disable_tcp=yes
#tcp_accept_aliases=yes # accepts the tcp alias via option (see NEWS)
#tcp_poll_method="sigio_rt"
# ------------------ module loading ----------------------------------
# Uncomment this if you want to use SQL database
loadmodule "/base/ser/directory/lib/ser/modules//sl.so"
loadmodule "/base/ser/directory/lib/ser/modules/avp.so"
loadmodule "/base/ser/directory/lib/ser/modules//avpops.so"
loadmodule "/base/ser/directory/lib/ser/modules//tm.so"
loadmodule "/base/ser/directory/lib/ser/modules//rr.so"
loadmodule "/base/ser/directory/lib/ser/modules//maxfwd.so"
loadmodule "/base/ser/directory/lib/ser/modules//usrloc.so"
loadmodule "/base/ser/directory/lib/ser/modules//registrar.so"
loadmodule "/base/ser/directory/lib/ser/modules//textops.so"
loadmodule "/base/ser/directory/lib/ser/modules//mysql.so"
loadmodule "/base/ser/directory/lib/ser/modules//dialog.so"
loadmodule "/base/ser/directory/lib/ser/modules//rls.so"
loadmodule "/base/ser/directory/lib/ser/modules/pa.so"
loadmodule "/base/ser/directory/lib/ser/modules//presence_b2b.so"
loadmodule "/base/ser/directory/lib/ser/modules//uri.so"
loadmodule "/base/ser/directory/lib/ser/modules//uri_db.so"
loadmodule "/base/ser/directory/lib/ser/modules//domain.so"
loadmodule "/base/ser/directory/lib/ser/modules//fifo.so"
loadmodule "/base/ser/directory/lib/ser/modules//xmlrpc.so"
loadmodule "/base/ser/directory/lib/ser/modules//xlog.so"
#loadmodule "/base/ser/directory/lib/ser/modules//unixsock.so"
# Uncomment this if you want digest authentication
# mysql.so must be loaded !
loadmodule "/base/ser/directory/lib/ser/modules//auth.so"
loadmodule "/base/ser/directory/lib/ser/modules//auth_db.so"
loadmodule "/base/ser/directory/lib/ser/modules//msilo.so"
# ----------------- setting module-specific parameters ---------------
# modparam("msilo","registrar","sip:registrar@test-domain.com")
modparam("msilo","use_contact",0)
modparam("msilo","expire_time",7200)
# -- usrloc params --
# -- auth params --
# Uncomment if you are using auth module
#
modparam("auth_db", "calculate_ha1", yes)
#
# If you set "calculate_ha1" parameter to yes (which true in this config),
# uncomment also the following parameter)
#
modparam("auth_db", "password_column", "password")
# -- rr params --
# add value to ;lr param to make some broken UAs happy
modparam("rr", "enable_full_lr", 1)
modparam("rls", "min_expiration", 200)
modparam("rls", "max_expiration", 300)
modparam("rls", "default_expiration", 300)
modparam("rls", "auth", "none")
modparam("rls", "xcap_root", "http://localhost/xcap")
modparam("rls", "reduce_xcap_needs", 1)
modparam("rls", "db_mode", 0)
modparam("rls", "db_url", "mysql://ser:heslo@localhost:3306/ser")
modparam("pa", "use_db", 0)
# allow storing authorization requests for offline users into database
modparam("pa", "use_offline_winfo", 1)
# how often try to remove old stored authorization requests
modparam("pa", "offline_winfo_timer", 600)
# how long stored authorization requests live
modparam("pa", "offline_winfo_expiration", 600)
modparam("pa", "db_url", "mysql://ser:heslo@localhost:3306/ser")
# mode of PA authorization: none, implicit or xcap
modparam("pa", "auth", "xcap")
modparam("pa", "auth_xcap_root", "http://localhost/xcap")
# do not authorize watcherinfo subscriptions
modparam("pa", "winfo_auth", "none")
# use only published information if set to 0
modparam("pa", "use_callbacks", 1)
# don't accept internal subscriptions from RLS, ...
modparam("pa", "accept_internal_subscriptions", 0)
# maximum value of Expires for subscriptions
modparam("pa", "max_subscription_expiration", 600)
# maximum value of Expires for publications
modparam("pa", "max_publish_expiration", 120)
# how often test if something changes and send NOTIFY
modparam("pa", "timer_interval", 10)
# route for generated SUBSCRIBE requests for presence
modparam("presence_b2b", "presence_route", "")
# waiting time from error to new attepmt about SUBSCRIBE
modparam("presence_b2b", "on_error_retry_time", 60)
# how long wait for NOTIFY with Subscription-Status=terminated after unsubscribe
modparam("presence_b2b", "wait_for_term_notify", 33)
# how long before expiration send renewal SUBSCRIBE request
modparam("presence_b2b", "resubscribe_delta", 30)
# minimal time to send renewal SUBSCRIBE request from receiving previous response
modparam("presence_b2b", "min_resubscribe_time", 60)
# default expiration timeout
modparam("presence_b2b", "default_expiration", 3600)
# process internal subscriptions to presence events
modparam("presence_b2b", "handle_presence_subscriptions", 1)
modparam("usrloc", "db_mode", 0)
modparam("domain", "db_mode", 1)
modparam("domain|uri_db|acc|auth_db|usrloc|msilo", "db_url", "mysql://ser:heslo@localhost:3306/ser")
modparam("fifo", "fifo_file", "/tmp/ser_fifo")
# ------------------------- request routing logic -------------------
# main routing logic
route{
# XML RPC
if (method == "POST" || method == "GET") {
create_via();
dispatch_rpc();
break;
}
# initial sanity checks -- messages with
# max_forwards==0, or excessively long requests
if (!mf_process_maxfwd_header("10")) {
sl_send_reply("483","Too Many Hops");
break;
};
if (msg:len>= max_len ) {
sl_send_reply("513", "Message too big");
break;
};
# we record-route all messages -- to make sure that
# subsequent messages will go through our proxy; that's
# particularly good if upstream and downstream entities
# use different transport protocol
if (!method=="REGISTER") record_route();
# subsequent messages withing a dialog should take the
# path determined by record-routing
if (loose_route()) {
# mark routing logic in request
append_hf("P-hint: rr-enforced\r\n");
route(1);
break;
};
# if the request is for other domain use UsrLoc
# (in case, it does not work, use the following command
# with proper names and addresses in it)
if (uri==myself) {
if (!lookup_domain("To")) {
xlog("L_ERR", "Unknown domain to: %tu from: %fu\n");
route(1);
break;
}
if (method=="SUBSCRIBE") {
if (!t_newtran()) {
sl_reply_error();
break;
};
if (@to.tag=="") {
# only for new subscriptions (with empty to tag)
if (lookup_user("To")) {
# existing user -> it is subscription to PA
if (handle_subscription("registrar")) {
if ((@msg.event=~"presence\.winfo")) {
# new watcher info subscription
# sends one watcher info NOTIFY message with all saved authorization requests
xlog("L_ERR", "dumping stored winfo to %fu\n");
dump_stored_winfo("registrar", "presence");
}
else {
# new presence subscription
if ((@msg.event=~"presence") && (%subscription_status=="pending")) {
# if offline user and new pending subscription
if (!target_online("registrar")) {
#%subscription_status="waiting"; # store it as waiting subscription
xlog("L_ERR", "storing 'pending' winfo to: %tu, from: %fu\n");
store_winfo("registrar");
}
}
}
}
break;
}
if ((@msg.supported=~"eventlist")) {
# such user doesn't exist and Supported header field
# -> probably RLS subscription
if (lookup_domain("From")) {
if (lookup_user("From")) {
if (is_simple_rls_target("$uid-list")) {
# log(1, "it is simple subscription!\n");
# takes From UID and makes XCAP query for user's
# list named "default"
if (!query_resource_list("default")) {
t_reply("404", "No such user list");
break;
}
}
}
}
if (!have_flat_list()) {
# query_resource_list failed or was not called
# do standard RLS query acording to To/AOR
if (!query_rls_services()) {
log(1, "XCAP query failed\n");
t_reply("404", "No such list URI");
break;
}
}
# uncomment this if you want to authenticate first SUBSCRIBE request to resource list
# if (!proxy_authenticate("test-domain.com", "credentials")) {
# proxy_challenge( "test-domain.com", "0");
# break;
# };
handle_rls_subscription("1");
}
else {
# not resource list subscription -> invalid user
xlog("L_ERR", "subscription to invalid user %tu\n");
t_reply("404", "User not found");
}
break;
}
else {
# renewal subscriptions - try to handle it as RLS and if failed, handle it as PA subscription
# FIXME: better will be test like existing_rls_subscription()
# and existing_subscription("registrar")
if (!handle_rls_subscription("0")) {
handle_subscription("registrar");
}
break;
}
};
# get user (common for all other messages than SUBSCRIBE)
if (!lookup_user("To")) {
# log(1, "Unknown user - message should be forwarded?");
# # break;
append_hf("P-hint: unknown user\r\n");
route(1);
break;
}
if (method=="PUBLISH") {
if (!t_newtran()) {
# log(1, "newtran error\n");
sl_reply_error();
break;
};
handle_publish("registrar");
# deliver messages to online user
# TODO: only if user goes from offline to online?
if (target_online("registrar")) {
# log(1, "Dumping stored messages\n");
# dump stored messages - route it through myself (otherwise routed via DNS!)
if (m_dump("sip:127.0.0.1")) {
xlog("L_ERR", "MSILO: offline messages for %fu dumped\n");
}
}
break;
};
if (method=="NOTIFY") {
if (!t_newtran()) {
log(1, "newtran error\n");
sl_reply_error();
break;
};
# handle notification sent in internal subscriptions (presence_b2b)
if (!handle_notify()) {
t_reply("481", "Unable to handle notification");
}
break;
};
if (method=="MESSAGE") {
if (authorize_message("http://localhost/xcap")) {
# use usrloc for delivery
if (lookup("location")) {
log(1, "Delivering MESSAGE using usrloc\n");
t_on_failure("1");
if (!t_relay()) {
sl_reply_error();
}
break;
}
else {
# store messages for offline user
xlog("L_ERR", "MSILO: storing MESSAGE for %tu\n");
if (!t_newtran()) {
log(1, "newtran error\n");
sl_reply_error();
break;
};
# store only text messages NOT isComposing... !
if (search("^(Content-Type|c):.*application/im-iscomposing\+xml.*")) {
log(1, "it is only isComposing message - ignored\n");
t_reply("202", "Ignored");
break;
}
if (m_store("0", "sip:127.0.0.1")) {
# log(1, "MSILO: offline message stored\n");
if (!t_reply("202", "Accepted")) {
sl_reply_error();
};
} else {
log(1, "MSILO: error storing offline message\n");
if (!t_reply("503", "Service Unavailable")) {
sl_reply_error();
};
};
break;
}
break;
}
else {
# log(1, "unauthorized message\n");
sl_reply("403", "Forbidden");
}
break;
}
if (method=="REGISTER") {
# uncomment this if you want to authenticate REGISTER request
# if (!www_authenticate("", "credentials")) {
# www_challenge("", "0");
# break;
# };
save("location");
# dump stored messages - route it through myself (otherwise routed via DNS!)
if (m_dump("sip:127.0.0.1")) {
xlog("L_ERR", "MSILO: offline messages for %fu dumped\n");
}
break;
};
# native SIP destinations are handled using our USRLOC DB
if (!lookup("location")) {
sl_send_reply("404", "Not Found");
break;
};
};
# append_hf("P-hint: usrloc applied\r\n");
route(1);
}
route[1]
{
# send it out now; use stateful forwarding as it works reliably
# even for UDP2TCP
if (!t_relay()) {
sl_reply_error();
};
}
failure_route[1] {
# forwarding failed -- check if the request was a MESSAGE
if (!method=="MESSAGE") { break; };
log(1, "MSILO: MESSAGE forward failed - storing it\n");
# we have changed the R-URI with the contact address, ignore it now
if (m_store("0", "")) {
t_reply("202", "Accepted");
} else {
log(1, "MSILO: offline message NOT stored\n");
t_reply("503", "Service Unavailable");
};
}
_________________________________________________________________
Explore the seven wonders of the world
http://search.msn.com/results.aspx?q=7+wonders+world&mkt=en-US&form=QBRE
Hello
We use SER and rtpproxy for a couple of years over public network. It worked
perfectly before. The users from different LNA can talk to each other over
SIP call (xlite or Linksys adapters). We could fax over SIP from other
countries. However, fax stopped working shortly (about 6-month). But SIP
call worked fine till the beginning of this year. Suddenly, sip-phone only
hears ring. There is no sound on both sides.
Do anyone have the similar problem or encounter stability issues in this
setup (SER + Rtpproxy)?
Best
Steven
Hi,
>From the documentation (mini-Howto on how to configure SER and SEMS to work
together), the SER that it's mentioned, does it means the SIP-stack SER or
the Proxy SER? I'm having 2 SERs in one machine and I'm a bit confuse...
Hope someone can give me a hint =)
Thanks.
Roa Yu
-----Original Message-----
From: sems-bounces(a)lists.iptel.org [mailto:sems-bounces@lists.iptel.org] On
Behalf Of roayu
Sent: Monday, November 26, 2007 10:40 PM
To: 'sems(a)lists.iptel.org'
Subject: [Sems] How to setup conference?
Hi,
I'm new to SEMS and i managed to setup 2 SERs and 1 SEMS to work together.
However, i'm not sure how to configure the Conference. Can anyone guide me
on the conference setup?
Thanks.
Roa Yu
_______________________________________________
Sems mailing list
Sems(a)lists.iptel.org
http://lists.iptel.org/mailman/listinfo/sems
Hi,
I managed to create the mysql.so after re-intall the MySQL, especially the
mysql-dev package.
Thanks for your help!
Roa Yu
-----Original Message-----
From: SIP [mailto:sip@arcdiv.com]
Sent: Monday, November 26, 2007 8:36 PM
To: roayu
Cc: serusers(a)lists.iptel.org
Subject: Re: [Serusers] Can SER support MySQL 5.0.22
First off, do you have the mysql-dev package installed?
As for whether or not it will run with mysql 5.0.22, it can, but it's
tricky. The makefile for the mysql module doesn't look everywhere for
the libmysqlclient libs when it's compiling. It expects the libs to be
in a particular place, and if they're not there, it ignores the libpath,
compiles ANYway, and they just fails to work once you start up SER. It
gives NO errors on compile, which makes it utterly difficult to track down.
The latest RPMs for RHEL/CentOS from the MySQL community site place the
libmysqlclient.so.X libs into /usr/lib and NOT /usr/lib/mysql as SER
expects.
SER will simply NOT find it in that location. What we've ended up having
to do is symlinking the /usr/lib/libmysqlclient* into /usr/lib/mysql,
recompile the mysql module, and install it in the correct place. Then,
SER runs happily and readily without weird errors.
Also note that there is a patch that must be applied to use MySQL 5.0.X
for SER 0.9.6
see
http://www.iptel.org/faq/why_does_my_mysql_5_0_x_connection_time_out_when_us
ing_ser_0_9_x
N.
roayu wrote:
>
> Hi there!
>
>
>
> Would like to ask, can SER 0.9.6 support MySQL 5.0.22 ? I got the
> following errors when I tried start SER and to connect to MySQL:
>
>
>
> [root@localhost ~]# /usr/local/sbin/ser
>
> 0(3291) ERROR: load_module: could not open module
> </usr/local/lib/ser/modules/mysql.so>: libmysqlclient.so.14: cannot
> open shared object file: No such file or directory
>
> 0(3291) parse error (31,13-14): failed to load module
>
> ERROR: bad config file (1 errors)
>
>
>
>
>
> Thanks.
>
>
>
> Roa Yu
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Serusers mailing list
> Serusers(a)lists.iptel.org
> http://lists.iptel.org/mailman/listinfo/serusers
>
I have an OpenSER 1.1 install here, and for some reason, OpenSER is sending the INVITE message twice to the upstream host.
The time difference between them is about 1/5 of a second. Nothing is received between the first and second INVITE's.
Why is OpenSER doing this?
I have xlog() statements everywhere in openser.cfg, and OpenSER is only logging ONE outgoing INVITE message, eventhough it's sending two. It is logging the multiple TRYING messages that come back however.
OpenSER is not calling failure_route because nothing is logged in there.
What could be going wrong? Why is it doing this?
Doug.
____________________________________________________________________________________
Get easy, one-click access to your favorites.
Make Yahoo! your homepage.
http://www.yahoo.com/r/hs
Hi,
Invoking force_rtp_proxy() after fix_nated_sdp() causes error
that in the connection filed one ip address apears after second
(previous one is not removed)
v=0.
o=- 3 2 IN IP4 192.168.1.3.
s=CounterPath X-Lite 3.0.
c=IN IP4 82.210.160.59192.168.129.74.
t=0 0.
m=audio 35036 RTP/AVP 107 119 100 106 0 105 98 8 101.
a=fmtp:101 0-15.
a=rtpmap:107 BV32/16000.
a=rtpmap:119 BV32-FEC/16000.
a=rtpmap:100 SPEEX/16000.
a=rtpmap:106 SPEEX-FEC/16000.
a=rtpmap:105 SPEEX-FEC/8000.
a=rtpmap:98 iLBC/8000.
a=rtpmap:101 telephone-event/8000.
a=sendrecv.
a=direction:active.
a=oldmediaip:192.168.1.3.
a=nortpproxy:yes.
in the example above
fix_nated_sdp put the 82.210.160.59 address
and force_rtp_proxy instead of replacing the 82.210.160.59
appended it at the end of the line
Cheers
TOmasz
Hello all,
Just checkout the lates svn version of OSer. trying to run openserdbctl
create with DB=PGSQL
i get the following errors.
ERROR: relation "subscriber" does not exist
ERROR: relation "dbaliases" does not exist
ERROR: Grant privileges to database failed!
Any pointers welcome.
OSer details: Repository UUID: 689a6050-402a-0410-94f2-e92a70836424
Revision: 3203
--
TC
Hi,
i'm using openser-tls 1.0.1, and i intend to estabilish a security call
between 2 users agents. When using eyeBeam 1.5.6 in the automatic mode
i can register and make calls, no problem. But when i choose TLS in the
softphone i always get Registration Error: 503 - Service Unavailable.
the eyeBeam log shows:
[07-11-24]13:01:01.386 | Info (debug) RESIP:TRANSPORT | "Adding message to
tx buffer to: [ V4 xxx.xx.xx.xxx:5061 TLS target
domain=xxx.xx.xx.xxxreceived on: Transport: [ V4
0.0.0.0:35085 TLS target domain=unspecified connectionId=0 ] connectionId=0
]" |
[07-11-24]13:01:01.487 | Info (debug) RESIP:TRANSPORT | "Processing write
for [ V4 xxx.xx.xx.xxx:5061 TLS target domain=xxx.xx.xx.xxx received on:
Transport: [ V4 0.0.0.0:35085 TLS target domain=unspecified connectionId=0 ]
connectionId=0 ]" |
[07-11-24]13:01:01.487 | Info (debug) RESIP:TRANSPORT | "Creating fd=1660
V4/TCP" |
[07-11-24]13:01:01.487 | Info (debug) RESIP:TRANSPORT | "Opening new
connection to [ V4 xxx.xx.xx.xxx:5061 TLS target
domain=xxx.xx.xx.xxxreceived on: Transport: [ V4
0.0.0.0:35085 TLS target domain=unspecified connectionId=0 ] connectionId=0
]" |
[07-11-24]13:01:01.488 | Info (debug) RESIP:TRANSPORT |
"ConnectionBase::ConnectionBase, who: [ V4 xxx.xx.xx.xxx:5061 TLS target
domain=xxx.xx.xx.xxx received on: Transport: [ V4 0.0.0.0:35085 TLS target
domain=unspecified connectionId=0 ] connectionId=0 ] 024AA840" |
[07-11-24]13:01:01.488 | Info (more) RESIP:TRANSPORT | "Creating TLS
connection for domain [ V4 xxx.xx.xx.xxx:5061 TLS target domain=
xxx.xx.xx.xxx received on: Transport: [ V4 0.0.0.0:35085 TLS target
domain=unspecified connectionId=0 ] connectionId=0 ] on 1660" |
[07-11-24]13:01:01.488 | Info (debug) RESIP:TRANSPORT | "Trying to form TLS
connection - acting as client" |
[07-11-24]13:01:02.405 | Info (more) RESIP:TRANSPORT | "Exception writing to
socket 1660 code: 10061; closing connection" |
[07-11-24]13:01:02.406 | Info (debug) RESIP:TRANSPORT |
"ConnectionBase::~ConnectionBase 024AA840" |
[07-11-24]13:01:02.406 | Info (more) RESIP:TRANSACTION | "Sending
ConnectionTerminated 4 to TUs" |
[07-11-24]13:01:02.406 | Info (more) RESIP:TRANSACTION | "Try sending
request to a different dns result" |
[07-11-24]13:01:02.406 | Info (more) RESIP:TRANSACTION | "Ran out of dns
entries for xxx.xx.xx.xxx. Send 503" |
[07-11-24]13:01:02.406 | Info (debug) RESIP | "Helper::makeResponse(SipReq:
REGISTER xxx.xx.xx.xxx tid=a1596d01462f2d03 cseq=REGISTER contact=
marcio@yyy.yy.yy.yy:35085 / 1 from(tu) code=503 reason=" |
[07-11-24]13:01:02.408 | Warning (min) RESIP:DNS | "local hostname does not
contain a domain part" |
[07-11-24]13:01:02.408 | Info (debug) RESIP:TRANSACTION | "Send to TU: TU:
DialogUsageManager size=1 SIP/2.0 503 Service Unavailable
Via: SIP/2.0/TLS yyy.yy.yy.yy
:35085;branch=z9hG4bK-d87543-a1596d01462f2d03-1--d87543-;rport
To: ""Marcio""<sip:marcio@xxx.xx.xx.xxx>;tag=b76ee406
From: ""Marcio""<sip:marcio@xxx.xx.xx.xxx>;tag=bf4bff41
Call-ID: 507d385424726b5fOGFmYzRkOTMwZjFmOTNjNzkyYmE1MjI4MDY0YzAwNzg.
CSeq: 1 REGISTER
Warning: 499 DUMNONIA """"
Content-Length: 0
searching on google doesn't give-me much stuf about this. I really need to
implement secure communication... the softphone doesn't matter.
I have no idea of what to do, and i really need help...
thanks,
Marcio Ribeiro