Add modem/networks DWM plugins, Dual-SIM & PIN/PUK support, built-in dmenu views, and game UX fixes
This commit is contained in:
@@ -1,6 +1,9 @@
|
||||
# Maximum time to wait for SIM card to appear after starting the modem.
|
||||
# Some SIM cards or modem firmwares might take longer to initialize. :(
|
||||
# To avoid blocking boot without a SIM card for too long this is fairly short
|
||||
# by default (4 seconds), but you can increase it to e.g. 30 seconds if necessary.
|
||||
# Some SIM cards or modem firmwares might take longer to initialize.
|
||||
# Set to 0 to disable waiting entirely.
|
||||
sim_wait_time=4
|
||||
|
||||
# Preferred physical SIM slot (1 or 2) for Primary GW provisioning on Dual-SIM
|
||||
# Qualcomm MSM8905/MSM8909 devices. Falls back automatically if the preferred
|
||||
# slot has no SIM card inserted.
|
||||
preferred_sim_slot=1
|
||||
|
||||
@@ -16,10 +16,16 @@ permit nopass :wheel as root cmd rc-service args eg25-manager stop
|
||||
permit nopass :wheel as root cmd rc-service args eg25-manager start
|
||||
permit nopass :wheel as root cmd rc-service args modemmanager stop
|
||||
permit nopass :wheel as root cmd rc-service args modemmanager start
|
||||
permit nopass :wheel as root cmd rc-service args modemmanager restart
|
||||
permit nopass :wheel as root cmd systemctl args start eg25-manager
|
||||
permit nopass :wheel as root cmd systemctl args stop eg25-manager
|
||||
permit nopass :wheel as root cmd systemctl args start ModemManager
|
||||
permit nopass :wheel as root cmd systemctl args stop ModemManager
|
||||
permit nopass :wheel as root cmd systemctl args restart ModemManager
|
||||
permit nopass :wheel as root cmd /usr/libexec/msm-modem-uim-selection
|
||||
permit nopass :wheel as root cmd msm-modem-uim-selection
|
||||
permit nopass :wheel as root cmd setup-timezone
|
||||
permit nopass :wheel as root cmd /sbin/setup-timezone
|
||||
permit nopass :wheel as root cmd rtcwake
|
||||
permit nopass :wheel as root cmd tee args -a /sys/power/wake_lock
|
||||
permit nopass :wheel as root cmd tee args -a /sys/power/wake_unlock
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Executable
+7
@@ -0,0 +1,7 @@
|
||||
#!/bin/sh
|
||||
# SPDX-License-Identifier: AGPL-3.0-only
|
||||
# Bananarchy Bluetooth menu wrapper — routes to native xnetworks Bluetooth tab
|
||||
if command -v xnetworks >/dev/null 2>&1 && [ -n "${DISPLAY:-}" ]; then
|
||||
exec xnetworks bluetooth
|
||||
fi
|
||||
exec /usr/bin/dwm-plugin networks bluetooth
|
||||
@@ -98,7 +98,7 @@ checkforfinishedcalls() {
|
||||
|
||||
sxmo_notifs.sh new \
|
||||
-g "incoming-call-$FINISHEDNUMBER" \
|
||||
"TERMNAME='$NOTIFMSG' sxmo_terminal.sh sh -c \"echo '$NOTIFMSG at $(date)' && read\"" \
|
||||
"xcalllog" \
|
||||
"Missed $icon_phn $CONTACT ($FINISHEDNUMBER)"
|
||||
fi
|
||||
|
||||
@@ -280,7 +280,7 @@ checkfornewtexts() {
|
||||
if [ -z "$SXMO_DISABLE_SMS_NOTIFS" ]; then
|
||||
sxmo_notifs.sh new \
|
||||
-g "incoming-message-$NUM" \
|
||||
"sxmo_hook_tailtextlog.sh '$NUM'" \
|
||||
"xsms tailtextlog '$NUM'" \
|
||||
"$CONTACTNAME: $TEXT"
|
||||
|
||||
fi
|
||||
|
||||
Executable
+7
@@ -0,0 +1,7 @@
|
||||
#!/bin/sh
|
||||
# SPDX-License-Identifier: AGPL-3.0-only
|
||||
if command -v xmodem >/dev/null 2>&1 && [ -n "${DISPLAY:-}" ]; then
|
||||
exec xmodem info
|
||||
fi
|
||||
. sxmo_common.sh
|
||||
sxmo_terminal.sh sh -c "mmcli -m any && read"
|
||||
Executable
+7
@@ -0,0 +1,7 @@
|
||||
#!/bin/sh
|
||||
# SPDX-License-Identifier: AGPL-3.0-only
|
||||
if command -v xmodem >/dev/null 2>&1 && [ -n "${DISPLAY:-}" ]; then
|
||||
exec xmodem log
|
||||
fi
|
||||
. sxmo_common.sh
|
||||
sxmo_terminal.sh sh -c "tail -n9999 -f $SXMO_LOGDIR/modemlog.tsv"
|
||||
Executable
+7
@@ -0,0 +1,7 @@
|
||||
#!/bin/sh
|
||||
# SPDX-License-Identifier: AGPL-3.0-only
|
||||
# Bananarchy Networks wrapper — routes to native xnetworks DWM plugin
|
||||
if command -v xnetworks >/dev/null 2>&1 && [ -n "${DISPLAY:-}" ]; then
|
||||
exec xnetworks "$@"
|
||||
fi
|
||||
exec /usr/bin/dwm-plugin networks "$@"
|
||||
Executable
+27
@@ -0,0 +1,27 @@
|
||||
#!/bin/sh
|
||||
# SPDX-License-Identifier: AGPL-3.0-only
|
||||
# Bananarchy SIM PIN/PUK unlock wrapper — routes to native xmodem plugin UI
|
||||
|
||||
if command -v xmodem >/dev/null 2>&1 && [ -n "${DISPLAY:-}" ]; then
|
||||
exec xmodem unlock
|
||||
fi
|
||||
|
||||
# Fallback if X11 plugin is not running
|
||||
. sxmo_common.sh
|
||||
SIM="$(mmcli -m any 2>/dev/null | grep -oE 'SIM/([0-9]+)' | head -n1 | cut -d'/' -f2 || true)"
|
||||
[ -z "$SIM" ] && exit 0
|
||||
LOCKSTATE="$(mmcli -m any -K 2>/dev/null | grep 'modem.generic.unlock-required' | cut -d':' -f2 | tr -d ' ' || true)"
|
||||
case "$LOCKSTATE" in
|
||||
sim-pin)
|
||||
PIN="$(printf "0000\n1234\nCancel" | sxmo_dmenu.sh -p "PIN")"
|
||||
[ -z "$PIN" ] || [ "$PIN" = "Cancel" ] && exit 0
|
||||
mmcli -i "$SIM" --pin="$PIN"
|
||||
;;
|
||||
sim-puk)
|
||||
PUK="$(printf "Cancel\n" | sxmo_dmenu.sh -p "PUK (8 digits)")"
|
||||
[ -z "$PUK" ] || [ "$PUK" = "Cancel" ] && exit 0
|
||||
NEWPIN="$(printf "0000\n1234\nCancel" | sxmo_dmenu.sh -p "New PIN")"
|
||||
[ -z "$NEWPIN" ] || [ "$NEWPIN" = "Cancel" ] && exit 0
|
||||
mmcli -i "$SIM" --puk="$PUK" --pin="$NEWPIN"
|
||||
;;
|
||||
esac
|
||||
Binary file not shown.
+1
@@ -0,0 +1 @@
|
||||
dwm-plugin
|
||||
Symlink
+1
@@ -0,0 +1 @@
|
||||
dwm-plugin
|
||||
Symlink
+1
@@ -0,0 +1 @@
|
||||
dwm-plugin
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Executable
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+415
@@ -0,0 +1,415 @@
|
||||
#!/bin/sh
|
||||
# Bananarchy Dual-SIM & QMI UIM Provisioning Helper for Qualcomm MSM8905/MSM8909
|
||||
set -eu
|
||||
|
||||
CONF_FILE="/etc/conf.d/msm-modem-uim-selection"
|
||||
if [ -r "$CONF_FILE" ]; then
|
||||
# shellcheck disable=SC1090
|
||||
. "$CONF_FILE"
|
||||
fi
|
||||
|
||||
SIM_WAIT_TIME="${SIM_WAIT_TIME:-${sim_wait_time:-4}}"
|
||||
PREFERRED_SIM_SLOT="${PREFERRED_SIM_SLOT:-${preferred_sim_slot:-1}}"
|
||||
QMICLI_MODEM=""
|
||||
|
||||
detect_qmicli_modem() {
|
||||
if ! command -v qmicli >/dev/null 2>&1; then
|
||||
return 1
|
||||
fi
|
||||
if [ -e "/dev/modem" ]; then
|
||||
QMICLI_MODEM="qmicli --silent -d /dev/modem"
|
||||
return 0
|
||||
elif [ -e "/dev/wwan0qmi0" ]; then
|
||||
QMICLI_MODEM="qmicli --silent -d /dev/wwan0qmi0 --device-open-qmi"
|
||||
return 0
|
||||
elif qmicli --silent -pd qrtr://0 --uim-noop >/dev/null 2>&1; then
|
||||
QMICLI_MODEM="qmicli --silent -pd qrtr://0"
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
wait_for_qmicli_modem() {
|
||||
max_wait="${1:-45}"
|
||||
count=0
|
||||
while [ "$count" -lt "$max_wait" ]; do
|
||||
if detect_qmicli_modem; then
|
||||
return 0
|
||||
fi
|
||||
sleep 1
|
||||
count=$((count + 1))
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
# Parse `qmicli --uim-get-card-status` into shell-safe KEY=VALUE lines
|
||||
parse_uim_card_status() {
|
||||
raw_status="$1"
|
||||
pref_slot="$2"
|
||||
printf "%s\n" "$raw_status" | awk -v pref="$pref_slot" '
|
||||
BEGIN {
|
||||
prim_slot = 0
|
||||
prim_app = 0
|
||||
cur_slot = 0
|
||||
in_app = 0
|
||||
for (s = 1; s <= 2; s++) {
|
||||
cstate[s] = "absent"
|
||||
rawstate[s] = "absent"
|
||||
upin_state[s] = "not-initialized"
|
||||
upin_ret[s] = 0
|
||||
upuk_ret[s] = 0
|
||||
app_type[s] = "none"
|
||||
app_state[s] = "none"
|
||||
aid[s] = ""
|
||||
pin1_state[s] = "not-initialized"
|
||||
pin1_ret[s] = 0
|
||||
puk1_ret[s] = 0
|
||||
}
|
||||
}
|
||||
/Primary GW:/ {
|
||||
if ($0 ~ /slot \x27[0-9]+\x27/) {
|
||||
line = $0
|
||||
sub(/.*slot \x27/, "", line)
|
||||
sub(/\x27.*/, "", line)
|
||||
prim_slot = line + 0
|
||||
}
|
||||
if ($0 ~ /application \x27[0-9]+\x27/) {
|
||||
line = $0
|
||||
sub(/.*application \x27/, "", line)
|
||||
sub(/\x27.*/, "", line)
|
||||
prim_app = line + 0
|
||||
}
|
||||
}
|
||||
/^[[:space:]]*Slot \[[0-9]+\]:/ {
|
||||
line = $0
|
||||
sub(/.*Slot \[/, "", line)
|
||||
sub(/\].*/, "", line)
|
||||
cur_slot = line + 0
|
||||
in_app = 0
|
||||
next
|
||||
}
|
||||
cur_slot >= 1 && cur_slot <= 2 {
|
||||
if ($0 ~ /^[[:space:]]*Application \[[0-9]+\]:/) {
|
||||
in_app = 1
|
||||
next
|
||||
}
|
||||
if (!in_app && $0 ~ /Card state:/) {
|
||||
line = $0
|
||||
sub(/.*Card state: \x27/, "", line)
|
||||
sub(/\x27.*/, "", line)
|
||||
rawstate[cur_slot] = line
|
||||
if (line == "present") cstate[cur_slot] = "present"
|
||||
else if (line == "absent" || line ~ /no-atr-received/) cstate[cur_slot] = "absent"
|
||||
else cstate[cur_slot] = "error"
|
||||
}
|
||||
if (!in_app && $0 ~ /UPIN state:/) {
|
||||
line = $0
|
||||
sub(/.*UPIN state: \x27/, "", line)
|
||||
sub(/\x27.*/, "", line)
|
||||
upin_state[cur_slot] = line
|
||||
}
|
||||
if (!in_app && $0 ~ /UPIN retries:/) {
|
||||
line = $0
|
||||
sub(/.*UPIN retries: \x27/, "", line)
|
||||
sub(/\x27.*/, "", line)
|
||||
upin_ret[cur_slot] = line + 0
|
||||
}
|
||||
if (!in_app && $0 ~ /UPUK retries:/) {
|
||||
line = $0
|
||||
sub(/.*UPUK retries: \x27/, "", line)
|
||||
sub(/\x27.*/, "", line)
|
||||
upuk_ret[cur_slot] = line + 0
|
||||
}
|
||||
if (in_app && $0 ~ /Application type:/) {
|
||||
line = $0
|
||||
sub(/.*Application type: \x27/, "", line)
|
||||
sub(/\x27.*/, "", line)
|
||||
if (line ~ /^usim/) {
|
||||
app_type[cur_slot] = "usim"
|
||||
want_aid[cur_slot] = 2
|
||||
} else if (line ~ /^sim/ && app_type[cur_slot] != "usim") {
|
||||
app_type[cur_slot] = "sim"
|
||||
want_aid[cur_slot] = 1
|
||||
} else {
|
||||
want_aid[cur_slot] = 0
|
||||
}
|
||||
}
|
||||
if (in_app && $0 ~ /Application state:/ && want_aid[cur_slot] > 0) {
|
||||
line = $0
|
||||
sub(/.*Application state: \x27/, "", line)
|
||||
sub(/\x27.*/, "", line)
|
||||
app_state[cur_slot] = line
|
||||
}
|
||||
if (in_app && $0 ~ /Application ID:/ && want_aid[cur_slot] > 0) {
|
||||
need_aid_line[cur_slot] = 1
|
||||
next
|
||||
}
|
||||
if (in_app && need_aid_line[cur_slot] == 1) {
|
||||
line = $0
|
||||
gsub(/^[[:space:]]+|[[:space:]]+$/, "", line)
|
||||
if (line != "") {
|
||||
aid[cur_slot] = line
|
||||
}
|
||||
need_aid_line[cur_slot] = 0
|
||||
}
|
||||
if (in_app && $0 ~ /PIN1 state:/ && want_aid[cur_slot] > 0) {
|
||||
line = $0
|
||||
sub(/.*PIN1 state: \x27/, "", line)
|
||||
sub(/\x27.*/, "", line)
|
||||
pin1_state[cur_slot] = line
|
||||
}
|
||||
if (in_app && $0 ~ /PIN1 retries:/ && want_aid[cur_slot] > 0) {
|
||||
line = $0
|
||||
sub(/.*PIN1 retries: \x27/, "", line)
|
||||
sub(/\x27.*/, "", line)
|
||||
pin1_ret[cur_slot] = line + 0
|
||||
}
|
||||
if (in_app && $0 ~ /PUK1 retries:/ && want_aid[cur_slot] > 0) {
|
||||
line = $0
|
||||
sub(/.*PUK1 retries: \x27/, "", line)
|
||||
sub(/\x27.*/, "", line)
|
||||
puk1_ret[cur_slot] = line + 0
|
||||
}
|
||||
}
|
||||
END {
|
||||
printf "PREFERRED_SLOT=%d\n", (pref == 2 ? 2 : 1)
|
||||
printf "PRIMARY_GW_SLOT=%d\n", prim_slot
|
||||
printf "PRIMARY_GW_APP=%d\n", prim_app
|
||||
for (s = 1; s <= 2; s++) {
|
||||
printf "SLOT%d_STATE=%s\n", s, cstate[s]
|
||||
printf "SLOT%d_RAW_STATE=%s\n", s, rawstate[s]
|
||||
printf "SLOT%d_APP_TYPE=%s\n", s, app_type[s]
|
||||
printf "SLOT%d_APP_STATE=%s\n", s, app_state[s]
|
||||
printf "SLOT%d_AID=%s\n", s, aid[s]
|
||||
printf "SLOT%d_PIN1_STATE=%s\n", s, pin1_state[s]
|
||||
printf "SLOT%d_PIN1_RETRIES=%d\n", s, pin1_ret[s]
|
||||
printf "SLOT%d_PUK1_RETRIES=%d\n", s, puk1_ret[s]
|
||||
printf "SLOT%d_UPIN_STATE=%s\n", s, upin_state[s]
|
||||
printf "SLOT%d_UPIN_RETRIES=%d\n", s, upin_ret[s]
|
||||
printf "SLOT%d_UPUK_RETRIES=%d\n", s, upuk_ret[s]
|
||||
}
|
||||
}
|
||||
'
|
||||
}
|
||||
|
||||
save_preferred_slot() {
|
||||
target_slot="$1"
|
||||
if [ -f "$CONF_FILE" ]; then
|
||||
if grep -q "^preferred_sim_slot=" "$CONF_FILE"; then
|
||||
sed -i "s/^preferred_sim_slot=.*/preferred_sim_slot=$target_slot/" "$CONF_FILE"
|
||||
else
|
||||
printf "\npreferred_sim_slot=%s\n" "$target_slot" >> "$CONF_FILE"
|
||||
fi
|
||||
else
|
||||
printf "sim_wait_time=4\npreferred_sim_slot=%s\n" "$target_slot" > "$CONF_FILE"
|
||||
fi
|
||||
}
|
||||
|
||||
provision_slot() {
|
||||
req_slot="$1"
|
||||
wait_secs="$2"
|
||||
|
||||
if ! wait_for_qmicli_modem "$wait_secs"; then
|
||||
echo "No modem available." >&2
|
||||
return 2
|
||||
fi
|
||||
|
||||
QMI_CARDS="$($QMICLI_MODEM --uim-get-card-status 2>/dev/null || true)"
|
||||
count=0
|
||||
while ! printf "%s" "$QMI_CARDS" | grep -Fq "Card state: 'present'"; do
|
||||
if [ "$count" -ge "$SIM_WAIT_TIME" ]; then
|
||||
echo "No SIM detected after $SIM_WAIT_TIME seconds."
|
||||
return 0
|
||||
fi
|
||||
sleep 1
|
||||
count=$((count + 1))
|
||||
QMI_CARDS="$($QMICLI_MODEM --uim-get-card-status 2>/dev/null || true)"
|
||||
done
|
||||
|
||||
eval "$(parse_uim_card_status "$QMI_CARDS" "$req_slot")"
|
||||
|
||||
chosen_slot=""
|
||||
chosen_aid=""
|
||||
if [ "$req_slot" = "2" ]; then
|
||||
if [ "$SLOT2_STATE" = "present" ] && [ -n "$SLOT2_AID" ]; then
|
||||
chosen_slot="2"
|
||||
chosen_aid="$SLOT2_AID"
|
||||
elif [ "$SLOT1_STATE" = "present" ] && [ -n "$SLOT1_AID" ]; then
|
||||
chosen_slot="1"
|
||||
chosen_aid="$SLOT1_AID"
|
||||
fi
|
||||
else
|
||||
if [ "$SLOT1_STATE" = "present" ] && [ -n "$SLOT1_AID" ]; then
|
||||
chosen_slot="1"
|
||||
chosen_aid="$SLOT1_AID"
|
||||
elif [ "$SLOT2_STATE" = "present" ] && [ -n "$SLOT2_AID" ]; then
|
||||
chosen_slot="2"
|
||||
chosen_aid="$SLOT2_AID"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$chosen_slot" ] || [ -z "$chosen_aid" ]; then
|
||||
echo "No valid USIM/SIM application found on any slot."
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [ "$PRIMARY_GW_SLOT" != "0" ]; then
|
||||
$QMICLI_MODEM --uim-change-provisioning-session='activate=no,session-type=primary-gw-provisioning' >/dev/null 2>&1 || true
|
||||
fi
|
||||
|
||||
echo "Selecting AID $chosen_aid on slot $chosen_slot"
|
||||
$QMICLI_MODEM --uim-change-provisioning-session="slot=$chosen_slot,activate=yes,session-type=primary-gw-provisioning,aid=$chosen_aid" >/dev/null
|
||||
return $?
|
||||
}
|
||||
|
||||
cmd="${1:-boot}"
|
||||
|
||||
case "$cmd" in
|
||||
boot)
|
||||
if command -v systemd-notify >/dev/null 2>&1; then
|
||||
trap '[ $? -eq 0 ] && systemd-notify --ready' EXIT
|
||||
fi
|
||||
case "$(cat /sys/devices/soc0/machine 2>/dev/null || true)" in
|
||||
APQ*)
|
||||
echo "Skipping SIM configuration on APQ SoC."
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
provision_slot "$PREFERRED_SIM_SLOT" 45
|
||||
exit $?
|
||||
;;
|
||||
|
||||
status)
|
||||
if ! detect_qmicli_modem; then
|
||||
echo "MODEM_AVAILABLE=0"
|
||||
echo "PREFERRED_SLOT=$PREFERRED_SIM_SLOT"
|
||||
exit 0
|
||||
fi
|
||||
QMI_CARDS="$($QMICLI_MODEM --uim-get-card-status 2>/dev/null || true)"
|
||||
if [ -z "$QMI_CARDS" ]; then
|
||||
echo "MODEM_AVAILABLE=0"
|
||||
echo "PREFERRED_SLOT=$PREFERRED_SIM_SLOT"
|
||||
exit 0
|
||||
fi
|
||||
echo "MODEM_AVAILABLE=1"
|
||||
parse_uim_card_status "$QMI_CARDS" "$PREFERRED_SIM_SLOT"
|
||||
exit 0
|
||||
;;
|
||||
|
||||
switch)
|
||||
target="${2:-1}"
|
||||
if [ "$target" != "1" ] && [ "$target" != "2" ]; then
|
||||
echo "Invalid slot: $target (must be 1 or 2)" >&2
|
||||
exit 1
|
||||
fi
|
||||
save_preferred_slot "$target"
|
||||
SIM_WAIT_TIME=2
|
||||
provision_slot "$target" 5
|
||||
if command -v rc-service >/dev/null 2>&1; then
|
||||
rc-service modemmanager restart >/dev/null 2>&1 || true
|
||||
elif command -v systemctl >/dev/null 2>&1; then
|
||||
systemctl restart ModemManager >/dev/null 2>&1 || true
|
||||
fi
|
||||
exit 0
|
||||
;;
|
||||
|
||||
verify-pin)
|
||||
slot="${2:-1}"
|
||||
pin="${3:-}"
|
||||
if [ -z "$pin" ]; then
|
||||
echo "Missing PIN" >&2
|
||||
exit 1
|
||||
fi
|
||||
sim_id="$(mmcli -m any 2>/dev/null | grep -oE 'SIM/[0-9]+' | head -n1 | cut -d'/' -f2 || true)"
|
||||
if [ -n "$sim_id" ] && mmcli -i "$sim_id" --pin="$pin" >/dev/null 2>&1; then
|
||||
exit 0
|
||||
fi
|
||||
if detect_qmicli_modem; then
|
||||
if $QMICLI_MODEM --uim-verify-pin="PIN1,$pin,session-type=primary-gw-provisioning" >/dev/null 2>&1; then
|
||||
exit 0
|
||||
fi
|
||||
if $QMICLI_MODEM --uim-verify-pin="PIN1,$pin,session-type=card-slot-$slot" >/dev/null 2>&1; then
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
exit 1
|
||||
;;
|
||||
|
||||
unblock-puk)
|
||||
slot="${2:-1}"
|
||||
puk="${3:-}"
|
||||
newpin="${4:-}"
|
||||
if [ -z "$puk" ] || [ -z "$newpin" ]; then
|
||||
echo "Missing PUK or new PIN" >&2
|
||||
exit 1
|
||||
fi
|
||||
sim_id="$(mmcli -m any 2>/dev/null | grep -oE 'SIM/[0-9]+' | head -n1 | cut -d'/' -f2 || true)"
|
||||
if [ -n "$sim_id" ] && mmcli -i "$sim_id" --puk="$puk" --pin="$newpin" >/dev/null 2>&1; then
|
||||
exit 0
|
||||
fi
|
||||
if detect_qmicli_modem; then
|
||||
if $QMICLI_MODEM --uim-unblock-pin="PIN1,$puk,$newpin,session-type=primary-gw-provisioning" >/dev/null 2>&1; then
|
||||
exit 0
|
||||
fi
|
||||
if $QMICLI_MODEM --uim-unblock-pin="PIN1,$puk,$newpin,session-type=card-slot-$slot" >/dev/null 2>&1; then
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
exit 1
|
||||
;;
|
||||
|
||||
set-pin-lock)
|
||||
slot="${2:-1}"
|
||||
mode="${3:-enable}"
|
||||
pin="${4:-}"
|
||||
if [ -z "$pin" ] || { [ "$mode" != "enable" ] && [ "$mode" != "disable" ]; }; then
|
||||
echo "Usage: $0 set-pin-lock <1|2> <enable|disable> <pin>" >&2
|
||||
exit 1
|
||||
fi
|
||||
sim_id="$(mmcli -m any 2>/dev/null | grep -oE 'SIM/[0-9]+' | head -n1 | cut -d'/' -f2 || true)"
|
||||
if [ -n "$sim_id" ]; then
|
||||
if [ "$mode" = "enable" ] && mmcli -i "$sim_id" --enable-pin --pin="$pin" >/dev/null 2>&1; then
|
||||
exit 0
|
||||
elif [ "$mode" = "disable" ] && mmcli -i "$sim_id" --disable-pin --pin="$pin" >/dev/null 2>&1; then
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
if detect_qmicli_modem; then
|
||||
if $QMICLI_MODEM --uim-set-pin-protection="PIN1,$mode,$pin,session-type=primary-gw-provisioning" >/dev/null 2>&1; then
|
||||
exit 0
|
||||
fi
|
||||
if $QMICLI_MODEM --uim-set-pin-protection="PIN1,$mode,$pin,session-type=card-slot-$slot" >/dev/null 2>&1; then
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
exit 1
|
||||
;;
|
||||
|
||||
change-pin)
|
||||
slot="${2:-1}"
|
||||
oldpin="${3:-}"
|
||||
newpin="${4:-}"
|
||||
if [ -z "$oldpin" ] || [ -z "$newpin" ]; then
|
||||
echo "Usage: $0 change-pin <1|2> <oldpin> <newpin>" >&2
|
||||
exit 1
|
||||
fi
|
||||
sim_id="$(mmcli -m any 2>/dev/null | grep -oE 'SIM/[0-9]+' | head -n1 | cut -d'/' -f2 || true)"
|
||||
if [ -n "$sim_id" ] && mmcli -i "$sim_id" --change-pin="$newpin" --pin="$oldpin" >/dev/null 2>&1; then
|
||||
exit 0
|
||||
fi
|
||||
if detect_qmicli_modem; then
|
||||
if $QMICLI_MODEM --uim-change-pin="PIN1,$oldpin,$newpin,session-type=primary-gw-provisioning" >/dev/null 2>&1; then
|
||||
exit 0
|
||||
fi
|
||||
if $QMICLI_MODEM --uim-change-pin="PIN1,$oldpin,$newpin,session-type=card-slot-$slot" >/dev/null 2>&1; then
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
exit 1
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "Usage: $0 [boot|status|switch <1|2>|verify-pin <slot> <pin>|unblock-puk <slot> <puk> <newpin>|set-pin-lock <slot> <enable|disable> <pin>|change-pin <slot> <oldpin> <newpin>]" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
Regular → Executable
+9
@@ -9,6 +9,15 @@
|
||||
export PATH="${HOME:-/home/user}/.local/bin:${HOME:-/home/user}/.config/sxmo/hooks:/usr/share/sxmo/default_hooks:$PATH"
|
||||
. sxmo_hook_icons.sh
|
||||
|
||||
GAMES_CACHE="${XDG_RUNTIME_DIR:-/tmp}/sxmo_games.cache"
|
||||
if [ -f "$GAMES_CACHE" ] && [ ! "$0" -nt "$GAMES_CACHE" ] && [ ! /usr/bin -nt "$GAMES_CACHE" ] && [ ! /usr/local/bin -nt "$GAMES_CACHE" ] && [ ! "${HOME:-/home/user}/.local/bin" -nt "$GAMES_CACHE" ]; then
|
||||
cat "$GAMES_CACHE"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
exec 3>&1 > "$GAMES_CACHE.tmp"
|
||||
trap 'mv -f "$GAMES_CACHE.tmp" "$GAMES_CACHE" 2>/dev/null; cat "$GAMES_CACHE" >&3 2>/dev/null' EXIT
|
||||
|
||||
write_line() {
|
||||
printf "%s ^ 0 ^ %s\n" "$1" "$2"
|
||||
}
|
||||
|
||||
@@ -16,38 +16,31 @@ newstate="$2"
|
||||
sxmo_debug "$2 (old: $1 [reason: $3])"
|
||||
|
||||
case "$newstate" in
|
||||
"locked")
|
||||
sxmo_log "State is locked. Attempting to unlock."
|
||||
if ! pgrep -f "sxmo_unlocksim.sh" >/dev/null; then
|
||||
sxmo_unlocksim.sh
|
||||
fi
|
||||
;;
|
||||
"enabling")
|
||||
sxmo_log "State is enabling. Clearing stale call files."
|
||||
rm "$XDG_RUNTIME_DIR"/sxmo_calls/* 2>/dev/null
|
||||
rm -f "$SXMO_NOTIFDIR"/incomingcall* 2>/dev/null
|
||||
;;
|
||||
"registered")
|
||||
sxmo_log "State is registered. Checking for calls and messages."
|
||||
"locked")
|
||||
sxmo_log "State is locked. Opening SIM PIN/PUK unlock dialog."
|
||||
if command -v xmodem >/dev/null 2>&1; then
|
||||
xmodem unlock >/dev/null 2>&1 &
|
||||
elif ! pgrep -f "sxmo_unlocksim.sh" >/dev/null; then
|
||||
sxmo_unlocksim.sh &
|
||||
fi
|
||||
;;
|
||||
"enabling")
|
||||
sxmo_log "State is enabling. Clearing stale call files."
|
||||
rm "$XDG_RUNTIME_DIR"/sxmo_calls/* 2>/dev/null || true
|
||||
rm -f "$SXMO_NOTIFDIR"/incomingcall* 2>/dev/null || true
|
||||
;;
|
||||
"registered")
|
||||
sxmo_log "State is registered. Checking for calls and messages."
|
||||
|
||||
# kill the pin-entry dmenu if still open
|
||||
pkill -f sxmo_unlocksim.sh
|
||||
# kill the pin-entry dmenu if still open
|
||||
pkill -f sxmo_unlocksim.sh 2>/dev/null || true
|
||||
|
||||
sxmo_modem.sh checkforfinishedcalls
|
||||
sxmo_modem.sh checkforincomingcalls
|
||||
sxmo_modem.sh checkfornewtexts
|
||||
sxmo_modem.sh checkforstucksms
|
||||
if [ -f "${SXMO_MMS_BASE_DIR:-"$HOME"/.mms/modemmanager}/mms" ]; then
|
||||
sxmo_mms.sh checkforlostmms
|
||||
fi
|
||||
|
||||
# An example of something else to do here!
|
||||
#if ! ping -Iwwan0 -q -c 1 -W 10 www.google.com >/dev/null; then
|
||||
# sxmo_log "ping failed."
|
||||
# nmcli c down "MINTY"
|
||||
# nmcli c up "MINTY"
|
||||
#else
|
||||
# sxmo_log "ping ok."
|
||||
#fi
|
||||
;;
|
||||
sxmo_modem.sh checkforfinishedcalls
|
||||
sxmo_modem.sh checkforincomingcalls
|
||||
sxmo_modem.sh checkfornewtexts
|
||||
sxmo_modem.sh checkforstucksms
|
||||
if [ -f "${SXMO_MMS_BASE_DIR:-"$HOME"/.mms/modemmanager}/mms" ]; then
|
||||
sxmo_mms.sh checkforlostmms
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
Reference in New Issue
Block a user