]> Git — Sourcephile - julm/julm-nix.git/blob - hosts/aubergine/networking/lte.nix
nix: format with nixfmt-rfc-style
[julm/julm-nix.git] / hosts / aubergine / networking / lte.nix
1 {
2 pkgs,
3 lib,
4 config,
5 ...
6 }:
7 with (import ./names-and-numbers.nix);
8 let
9 inherit (config.users) users;
10 modemmanager = pkgs.modemmanager-1-18;
11 in
12 #modemmanager = pkgs.modemmanager-1-20-4;
13 {
14 networking.nftables.ruleset = ''
15 table inet filter {
16 chain input {
17 iifname ${lteIface} jump input-net
18 iifname ${lteIface} log level warn prefix "input-net: " counter drop
19 }
20 chain output-net {
21 ip daddr 10.151.0.1 tcp dport 8080 counter accept \
22 comment "mmsd: Prixtel/SFR"
23 }
24 chain output {
25 oifname ${lteIface} jump output-net
26 oifname ${lteIface} log level warn prefix "output-net: " counter drop
27 }
28 chain forward-to-net {
29 }
30 chain forward-from-net {
31 }
32 chain forward-to-net { }
33 chain forward-from-net { }
34 chain forward {
35 iifname { ${wifiIface}, ${eth1Iface}, ${eth2Iface}, ${eth3Iface} } oifname ${lteIface} goto forward-to-net
36 iifname ${lteIface} oifname { ${wifiIface}, ${eth1Iface}, ${eth2Iface}, ${eth3Iface} } goto forward-from-net
37 }
38 }
39 table inet nat {
40 chain postrouting {
41 iifname { ${wifiIface}, ${eth1Iface}, ${eth2Iface}, ${eth3Iface} } oifname ${lteIface} masquerade
42 }
43 }
44 '';
45 services.mmsd.enable = true;
46 services.mmsd.extraArgs = [ "--debug" ];
47 systemd.services.ModemManager.serviceConfig.ExecStart = lib.mkForce [
48 ""
49 # See https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/issues/780
50 "${modemmanager}/bin/ModemManager --debug"
51 ];
52 systemd.services.NetworkManager.wants = [ "ModemManager.service" ];
53 services.dbus.packages = [ pkgs.dconf ];
54 programs.dconf.enable = true;
55 environment.etc."NetworkManager/system-connections/Prixtel.nmconnection" = {
56 mode = "600";
57 text = ''
58 [connection]
59 id=Prixtel
60 uuid=b223f550-dff1-4ba3-9755-cd4557faaa5a
61 type=gsm
62 autoconnect=true
63 autoconnect-priority=999
64 autoconnect-retries=0
65
66 [gsm]
67 apn=sl2sfr
68 number=*99#
69 #home-only=true
70
71 [ppp]
72
73 [ipv4]
74 method=auto
75 dhcp-send-hostname=false
76
77 [ipv6]
78 method=auto
79 addr-gen-mode=stable-privacy
80 ip6-privacy=2
81 dhcp-send-hostname=false
82
83 [proxy]
84 '';
85 };
86 systemd.services.watch-lte = {
87 after = [
88 "ModemManager.service"
89 "NetworkManager.service"
90 "NetworkManager-wait-online.service"
91 ];
92 requires = [
93 "ModemManager.service"
94 "NetworkManager.service"
95 "NetworkManager-wait-online.service"
96 ];
97 wantedBy = [ "network-online.target" ];
98 #startAt = "*:0/5"; # every 5 min
99 path = with pkgs; [
100 inetutils
101 jq
102 modemmanager
103 networkmanager
104 ];
105 unitConfig = {
106 StartLimitIntervalSec = 0;
107 };
108 serviceConfig = {
109 Type = "simple";
110 IPAddressAllow = [ "9.9.9.9" ];
111 RestrictAddressFamilies = [
112 "AF_INET"
113 "AF_INET6"
114 "AF_UNIX"
115 ];
116 ExecStart = pkgs.writeShellScript "watch-lte" ''
117 set -eux
118 lastPONG=$(date +%s)
119 while sleep 5; do
120 if ping 9.9.9.9 --count 10 --linger 20 --interval 1 --quiet --numeric
121 then lastPONG=$(date +%s)
122 fi
123 if test $(( $(date +%s) - lastPONG )) -gt 300
124 then
125 modem=$(mmcli -L -J | jq -r '.["modem-list"][0]') || true
126 mmcli -m "$modem" --command "AT+CFUN=1,1" || true
127 sleep 10
128 systemctl restart ModemManager
129 sleep 10
130 nmcli connection up Prixtel
131 sleep 300
132 fi
133 done
134 '';
135 Restart = "on-failure";
136 RestartSec = "10s";
137 };
138 };
139 environment.systemPackages = [
140 pkgs.modem-manager-gui
141 pkgs.libmbim
142 pkgs.chatty
143 pkgs.gnome-contacts
144 pkgs.picocom
145 pkgs.tio
146 pkgs.calls
147 pkgs.d-spy
148 # https://gitlab.com/mobian1/callaudiod/-/issues/26
149 # https://gitlab.com/mobian1/callaudiod/-/issues/27
150 pkgs.callaudiod
151 ];
152 }