summaryrefslogtreecommitdiff
path: root/lib/irc
diff options
context:
space:
mode:
authorhref <href@random.sh>2021-09-08 15:39:01 +0200
committerhref <href@random.sh>2021-09-08 15:39:01 +0200
commitf7c3f34ad3cd63e92c2952a3ce6c34bd98ce2175 (patch)
tree335ae98acc40d17be143fc9fbfd32854e548bc1f /lib/irc
parentassets: build (diff)
;o custom subnets
Diffstat (limited to 'lib/irc')
-rw-r--r--lib/irc/connection.ex10
-rw-r--r--lib/irc/puppet_connection.ex37
2 files changed, 38 insertions, 9 deletions
diff --git a/lib/irc/connection.ex b/lib/irc/connection.ex
index a0cdc27..52910ac 100644
--- a/lib/irc/connection.ex
+++ b/lib/irc/connection.ex
@@ -222,11 +222,11 @@ defmodule IRC.Connection do
ExIRC.Client.add_handler(client, self())
client
end
- if state.conn.tls do
- ExIRC.Client.connect_ssl!(client, state.conn.host, state.conn.port, [])#[{:ifaddr, {45,150,150,33}}])
- else
- ExIRC.Client.connect!(client, state.conn.host, state.conn.port, [])#[{:ifaddr, {45,150,150,33}}])
- end
+
+ opts = [{:nodelay, true}]
+ conn_fun = if state.conn.tls, do: :connect_ssl!, else: :connect!
+ apply(ExIRC.Client, conn_fun, [client, to_charlist(state.conn.host), state.conn.port, opts])
+
{:noreply, %{state | client: client}}
end
diff --git a/lib/irc/puppet_connection.ex b/lib/irc/puppet_connection.ex
index da6cc93..b92ef2b 100644
--- a/lib/irc/puppet_connection.ex
+++ b/lib/irc/puppet_connection.ex
@@ -3,6 +3,7 @@ defmodule IRC.PuppetConnection do
@min_backoff :timer.seconds(5)
@max_backoff :timer.seconds(2*60)
@max_idle :timer.hours(12)
+ @env Mix.env
defmodule Supervisor do
use DynamicSupervisor
@@ -75,6 +76,15 @@ defmodule IRC.PuppetConnection do
end
def handle_continue(:connect, state) do
+ ipv6 = if @env == :prod do
+ subnet = LSG.Subnet.assign(state.account_id)
+ IRC.Account.put_meta(IRC.Account.get(state.account_id), "subnet", subnet)
+ ip = Pfx.host(subnet, 1)
+ {:ok, ipv6} = :inet_parse.ipv6_address(to_charlist(ip))
+ System.cmd("add-ip6", [ip])
+ ipv6
+ end
+
conn = IRC.Connection.lookup(state.connection_id)
client_opts = []
|> Keyword.put(:network, conn.network)
@@ -87,11 +97,30 @@ defmodule IRC.PuppetConnection do
ExIRC.Client.add_handler(client, self())
client
end
- if conn.tls do
- ExIRC.Client.connect_ssl!(client, conn.host, conn.port, [])#[{:ifaddr, {45,150,150,33}}])
- else
- ExIRC.Client.connect!(client, conn.host, conn.port, [])#[{:ifaddr, {45,150,150,33}}])
+
+ base_opts = [
+ {:nodelay, true}
+ ]
+
+ {ip, opts} = case {@env == :prod && ipv6, :inet_res.resolve(to_charlist(conn.host), :in, :aaaa)} do
+ {true, {:ok, {:dns_rec, _dns_header, _query, rrs = [{:dns_rr, _, _, _, _, _, _, _, _, _} | _], _, _}}} ->
+ ip = rrs
+ |> Enum.map(fn({:dns_rr, _, :aaaa, :in, _, _, ipv6, _, _, _}) -> ipv6 end)
+ |> Enum.shuffle()
+ |> List.first()
+
+ opts = [
+ :inet6,
+ {:ifaddr, ipv6}
+ ]
+ {ip, opts}
+ _ ->
+ {to_charlist(conn.host), []}
end
+
+ conn_fun = if conn.tls, do: :connect_ssl!, else: :connect!
+ apply(ExIRC.Client, conn_fun, [client, ip, conn.port, base_opts ++ opts])
+
{:noreply, %{state | client: client}}
end