-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinstall_quectel_RM520N_GL.sh
More file actions
234 lines (198 loc) · 6.58 KB
/
install_quectel_RM520N_GL.sh
File metadata and controls
234 lines (198 loc) · 6.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
#!/usr/bin/env bash
set -euo pipefail
# Quectel RM520N-GL (PCIe/MHI) bootstrap for Ubuntu:
# - Installs deps
# - Wires ModemManager FCC-unlock scripts (VID:PID symlink + /etc population)
# - Interactive APN selection (Spain presets + custom)
# - Creates/updates NetworkManager GSM connection and brings it up
CONN_NAME_DEFAULT="wwan"
DEVICE_DEFAULT="wwan0mbim0"
need_root() {
if [[ "${EUID:-$(id -u)}" -ne 0 ]]; then
echo "Run as root: sudo $0"
exit 1
fi
}
have_cmd() { command -v "$1" >/dev/null 2>&1; }
install_deps() {
export DEBIAN_FRONTEND=noninteractive
apt-get update -y
apt-get install -y modemmanager network-manager libmbim-utils pciutils
}
detect_quectel_pci_id() {
# Prefer Quectel vendor 1EAC.
local uevent
uevent="$(grep -Rsl -m1 '^PCI_ID=1EAC:' /sys/bus/pci/devices/*/uevent 2>/dev/null || true)"
if [[ -z "${uevent}" ]]; then
# Fallback: look for Quectel in lspci and map to /sys path.
local bdf
bdf="$(lspci -Dn | awk 'tolower($0) ~ /quectel/ {print $1; exit} tolower($0) ~ /1eac:/ {print $1; exit}' || true)"
if [[ -n "${bdf}" && -f "/sys/bus/pci/devices/0000:${bdf}/uevent" ]]; then
uevent="/sys/bus/pci/devices/0000:${bdf}/uevent"
fi
fi
if [[ -z "${uevent}" ]]; then
echo "ERROR: No Quectel PCI device found (VID 1eac). Check: lspci -nn | grep -i quectel"
exit 2
fi
local pci_id
pci_id="$(grep '^PCI_ID=' "$uevent" | cut -d= -f2 | tr '[:upper:]' '[:lower:]')"
if [[ -z "${pci_id}" ]]; then
echo "ERROR: Could not read PCI_ID from $uevent"
exit 3
fi
echo "$pci_id" # e.g. 1eac:1007
}
wire_fcc_unlock() {
local pci_id="$1" # 1eac:1007
local vid="${pci_id%%:*}" # 1eac
local avail="/usr/share/ModemManager/fcc-unlock.available.d"
local etcdir="/etc/ModemManager/fcc-unlock.d"
mkdir -p "$etcdir"
if [[ ! -d "$avail" ]]; then
echo "ERROR: Missing $avail. Is ModemManager installed correctly?"
exit 4
fi
if [[ -e "${avail}/${vid}" ]]; then
if [[ ! -e "${avail}/${pci_id}" ]]; then
ln -s "${vid}" "${avail}/${pci_id}"
echo "FCC-unlock map: ${avail}/${pci_id} -> ${vid}"
else
echo "FCC-unlock map exists: ${avail}/${pci_id}"
fi
else
echo "WARNING: ${avail}/${vid} not found. Available entries:"
ls -1 "$avail" || true
echo "Continuing anyway (may still work depending on your ModemManager build)."
fi
# Activate all available unlock scripts
find "$avail" -maxdepth 1 -mindepth 1 -print0 | while IFS= read -r -d '' f; do
ln -sf "$f" "${etcdir}/$(basename "$f")"
done
systemctl restart ModemManager || true
systemctl restart NetworkManager || true
}
pick_device() {
# Prefer MBIM control port if present.
local dev
dev="$(nmcli -t -f DEVICE,TYPE device | awk -F: '$2=="gsm"{print $1; exit}')"
if [[ -n "${dev}" ]]; then
echo "$dev"
else
echo "$DEVICE_DEFAULT"
fi
}
prompt() {
local var="$1" msg="$2" def="${3:-}"
local val
if [[ -n "$def" ]]; then
read -r -p "${msg} [${def}]: " val
val="${val:-$def}"
else
read -r -p "${msg}: " val
fi
printf -v "$var" "%s" "$val"
}
choose_operator_apn() {
echo
echo "Select operator/APN (Spain presets)."
echo " 1) Lowi -> lowi.private.omv.es"
echo " 2) Vodafone -> ac.vodafone.es"
echo " 3) Movistar -> movistar.es"
echo " 4) Orange/Jazztel -> orangeworld"
echo " 5) Digi -> internet.digimobil.es"
echo " 6) Simyo -> gprs-service.com"
echo " 7) O2 -> telefonica.es"
echo " 8) Custom (enter APN manually)"
echo
local choice
prompt choice "Choice (1-8)" "1"
case "$choice" in
1) OPERATOR="Lowi"; APN="lowi.private.omv.es" ;;
2) OPERATOR="Vodafone"; APN="ac.vodafone.es" ;;
3) OPERATOR="Movistar"; APN="movistar.es" ;;
4) OPERATOR="Orange/Jazztel"; APN="orangeworld" ;;
5) OPERATOR="Digi"; APN="internet.digimobil.es" ;;
6) OPERATOR="Simyo"; APN="gprs-service.com" ;;
7) OPERATOR="O2"; APN="telefonica.es" ;;
8)
prompt OPERATOR "Operator name" "Custom"
prompt APN "APN"
;;
*) echo "Invalid choice"; exit 10 ;;
esac
# Optional creds (usually blank in Spain)
prompt USERNAME "APN username (blank if none)" ""
prompt PASSWORD "APN password (blank if none)" ""
}
create_or_update_nm_connection() {
local conn_name="$1" dev="$2" apn="$3" user="$4" pass="$5"
# If connection exists, modify; otherwise create.
if nmcli -t -f NAME connection show | grep -Fxq "$conn_name"; then
echo "Updating connection: $conn_name"
nmcli connection modify "$conn_name" connection.type gsm
else
echo "Creating connection: $conn_name"
nmcli connection add type gsm con-name "$conn_name" ifname "$dev" apn "$apn" >/dev/null
fi
nmcli connection modify "$conn_name" gsm.apn "$apn"
# Credentials (optional)
if [[ -n "$user" ]]; then
nmcli connection modify "$conn_name" gsm.username "$user"
else
nmcli connection modify "$conn_name" -gsm.username || true
fi
if [[ -n "$pass" ]]; then
nmcli connection modify "$conn_name" gsm.password "$pass"
else
nmcli connection modify "$conn_name" -gsm.password || true
fi
# Practical defaults: IPv4 only avoids some operator quirks; can be changed later.
nmcli connection modify "$conn_name" ipv4.method auto
nmcli connection modify "$conn_name" ipv6.method ignore
# Ensure WWAN radio is on
nmcli radio wwan on || true
}
bring_up_and_diagnose() {
local conn_name="$1"
echo
echo "Bringing up: $conn_name"
if ! nmcli connection up "$conn_name"; then
echo
echo "NM failed. Useful logs:"
echo " journalctl -u NetworkManager -u ModemManager -b --no-pager | tail -200"
echo
echo "Current device list:"
nmcli device || true
echo
echo "Modem status (if modem index is 0):"
mmcli -m 0 || true
exit 20
fi
echo
echo "Connected. IP info:"
nmcli -f GENERAL.DEVICE,GENERAL.STATE,IP4.ADDRESS,IP4.GATEWAY,IP4.DNS device show || true
echo
echo "Modem summary (best effort):"
mmcli -m 0 | sed -n '/Status/,$p' || true
echo
echo "Quick connectivity check:"
ping -c 2 1.1.1.1 >/dev/null 2>&1 && echo "Ping OK" || echo "Ping failed (check DNS/routing)."
}
main() {
need_root
install_deps
local pci_id
pci_id="$(detect_quectel_pci_id)"
echo "Detected Quectel PCI_ID: $pci_id"
wire_fcc_unlock "$pci_id"
local dev conn_name
dev="$(pick_device)"
prompt conn_name "NetworkManager connection name" "$CONN_NAME_DEFAULT"
echo "Using WWAN device: $dev"
choose_operator_apn
echo "Selected: $OPERATOR (APN: $APN)"
create_or_update_nm_connection "$conn_name" "$dev" "$APN" "$USERNAME" "$PASSWORD"
bring_up_and_diagnose "$conn_name"
}
main "$@"