This enables production debugging of the bouncer.
Closes: https://todo.sr.ht/~emersion/soju/155
git-svn-id: file:///srv/svn/repo/suika/trunk@713 f0ae65fe-ee39-954e-97ec-027ff2717ef4
We want to serve metrics via both BouncerServ and Prometheus. Add
a tiny abstraction to avoid updating multiple metrics at once.
git-svn-id: file:///srv/svn/repo/suika/trunk@709 f0ae65fe-ee39-954e-97ec-027ff2717ef4
This only exports the default metrics for now.
References: https://todo.sr.ht/~emersion/soju/142
git-svn-id: file:///srv/svn/repo/suika/trunk@707 f0ae65fe-ee39-954e-97ec-027ff2717ef4
The MOTD indicates the end of the registration's message burst, and
the server can send arbitrary messages before it.
Update the supported capabilities, the nick and the realname before
MOTD to make it so client logic that runs on MOTD can work with
up-to-date info.
git-svn-id: file:///srv/svn/repo/suika/trunk@706 f0ae65fe-ee39-954e-97ec-027ff2717ef4
The new upstream-user-ip directive allows bouncer operators to
assign one IP address per user.
git-svn-id: file:///srv/svn/repo/suika/trunk@705 f0ae65fe-ee39-954e-97ec-027ff2717ef4
This function wraps a parent context, and returns a new context
cancelled when the connection is closed. This will make it so
operations started from downstreamConn.handleMessage will be
cancelled when the connection is closed.
git-svn-id: file:///srv/svn/repo/suika/trunk@703 f0ae65fe-ee39-954e-97ec-027ff2717ef4
Should still be more than enough to connect even if the network is
somewhat flaky.
git-svn-id: file:///srv/svn/repo/suika/trunk@699 f0ae65fe-ee39-954e-97ec-027ff2717ef4
As a bonus, the timeout now applies to the whole TLS dial
operation. Before the timeout only applied to the net dial
operation, making it possible for a bad server to stall the request
by making the TLS handshake extremely slow.
git-svn-id: file:///srv/svn/repo/suika/trunk@698 f0ae65fe-ee39-954e-97ec-027ff2717ef4
This will make it easier to globally disable multi-upstream mode.
git-svn-id: file:///srv/svn/repo/suika/trunk@693 f0ae65fe-ee39-954e-97ec-027ff2717ef4
This only brings down a single user or downstream on panic, instead
or bringing down the whole bouncer.
Closes: https://todo.sr.ht/~emersion/soju/139
git-svn-id: file:///srv/svn/repo/suika/trunk@689 f0ae65fe-ee39-954e-97ec-027ff2717ef4
When on an unbound bouncer network downstream, we should return no
targets (there are none, because there are no upstreams at all).
When on a multi-upstream downstream, we should return no targets as we
don't support multi-upstream CHATHISTORY TARGETS.
Before this patch, we returned a misleading error message:
:example.com 403 :Missing network suffix in name
git-svn-id: file:///srv/svn/repo/suika/trunk@688 f0ae65fe-ee39-954e-97ec-027ff2717ef4
The bouncer process may be dealing with many opened FDs. The default
on Linux is 1024. To support bouncers with a lot of users, bump
RLIMIT_NOFILE to the max as advised in [1].
[1]: http://0pointer.net/blog/file-descriptor-limits.html
git-svn-id: file:///srv/svn/repo/suika/trunk@687 f0ae65fe-ee39-954e-97ec-027ff2717ef4
If a downstream of prefix host `foo` sends a message, the other
downstream of prefix host `bar` should receive an echo PRIVMSG with
prefix host bar.
This fixes a regression where no prefix host was sent at all.
git-svn-id: file:///srv/svn/repo/suika/trunk@686 f0ae65fe-ee39-954e-97ec-027ff2717ef4
Add support for MONITOR in single-upstream mode.
Each downstream has its own set of monitored targets. These sets
are merged together to compute the MONITOR commands to send to
upstream.
Each upstream has a set of monitored targets accepted by the server
alongside with their status (online/offline). This is used to
directly send replies to downstreams adding a target another
downstream has already added, and send MONITOR S[TATUS] replies.
Co-authored-by: delthas <delthas@dille.cc>
git-svn-id: file:///srv/svn/repo/suika/trunk@684 f0ae65fe-ee39-954e-97ec-027ff2717ef4
We just forward the command as-is, so we can pass down the ISUPPORT
token as well.
Closes: https://todo.sr.ht/~emersion/soju/148
git-svn-id: file:///srv/svn/repo/suika/trunk@683 f0ae65fe-ee39-954e-97ec-027ff2717ef4
This has the following upsides:
- We can now routes WHO replies to the correct client, without
broadcasting them to everybody.
- We are less likely to hit server rate limits when multiple downstreams
are issuing WHO commands at the same time.
git-svn-id: file:///srv/svn/repo/suika/trunk@682 f0ae65fe-ee39-954e-97ec-027ff2717ef4
Multi-upstream connections can still send LIST commands with a
network suffix.
git-svn-id: file:///srv/svn/repo/suika/trunk@681 f0ae65fe-ee39-954e-97ec-027ff2717ef4
More plumbing needed to make sure we don't block too long waiting
for the reply.
git-svn-id: file:///srv/svn/repo/suika/trunk@679 f0ae65fe-ee39-954e-97ec-027ff2717ef4
This prevents this function from blocking forever if it exceeds the
deadline.
git-svn-id: file:///srv/svn/repo/suika/trunk@678 f0ae65fe-ee39-954e-97ec-027ff2717ef4
Type-A modes always have an argument[0], but soju doesn't care about
them since it doesn't keep track of mode lists (ban/invite/.. lists).
[0] https://modern.ircdocs.horse/#mode-message
> Type A: Modes that add or remove an address to or from a list. These
> modes MUST always have a parameter when sent from the server to a
> client.
git-svn-id: file:///srv/svn/repo/suika/trunk@673 f0ae65fe-ee39-954e-97ec-027ff2717ef4
The message stores don't need to access the internal network
struct, they just need network metadata such as ID and name.
This can ease moving message stores into a separate package in the
future.
git-svn-id: file:///srv/svn/repo/suika/trunk@666 f0ae65fe-ee39-954e-97ec-027ff2717ef4