🌴 Sync 2026-03-05 23:51:42

This commit is contained in:
github-actions[bot] committed 2026-03-05 23:51:42 +08:00
1 parent 97c049ed0a
commit 0acff03804
14253 files changed
+3893239

No files matched your search

+121
View File
@@ -0,0 +1,121 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=3ginfo
PKG_VERSION:=20251114
PKG_RELEASE:=1
include $(INCLUDE_DIR)/package.mk
define Package/3ginfo/Default
SECTION:=net
CATEGORY:=Network
TITLE:=Information about the status of the 3G/4G/5G modem
MAINTAINER:=Cezary Jackiewicz <cezary@eko.one.pl>
PKGARCH:=all
endef
define Package/3ginfo-old
$(call Package/3ginfo/Default)
DEPENDS:=+3ginfo-text-old +uhttpd
endef
define Package/3ginfo-lite
$(call Package/3ginfo/Default)
TITLE+= (lite version)
DEPENDS:=+comgt +@BUSYBOX_DEFAULT_AWK
endef
define Package/3ginfo-qmisignal
$(call Package/3ginfo/Default)
TITLE+= (qmi signal)
DEPENDS:=+uqmi +uhttpd
endef
define Package/3ginfo-text-old
$(call Package/3ginfo/Default)
TITLE+= (text version)
DEPENDS:=+comgt
endef
define Package/3ginfo-text-old/conffiles
/etc/config/3ginfo
endef
define Package/3ginfo
$(call Package/3ginfo/Default)
DEPENDS:=+3ginfo-text +uhttpd
endef
define Package/3ginfo-text
$(call Package/3ginfo/Default)
TITLE+= (text version)
DEPENDS:=+comgt +sms-tool +modemdata
endef
define Package/3ginfo-text/conffiles
/etc/config/3ginfo
endef
define Build/Compile
endef
define Package/3ginfo-old/install
$(CP) ./files-html-old/* $(1)
endef
define Package/3ginfo-lite/install
$(CP) ./files-lite/* $(1)
$(CP) ./files-text-old/usr/share/3ginfo/mccmnc.dat $(1)/usr/share/3ginfo-lite
$(CP) ./files-text-old/usr/share/3ginfo/scripts/probeport.gcom $(1)/usr/share/3ginfo-lite
endef
define Package/3ginfo-qmisignal/install
$(CP) ./files-qmisignal/* $(1)
$(FIND) $(1) -type f -name '*.js' | while read src; do \
uglifyjs "$$$$src" -o "$$$$src".1 && \
mv "$$$$src".1 "$$$$src" || true; \
done
endef
define Package/3ginfo-text-old/install
$(CP) ./files-text-old/* $(1)
endef
define Package/3ginfo-text-old/postinst
#!/bin/sh
[ -n "$${IPKG_INSTROOT}" ] || {
ln -sf /usr/share/3ginfo/cgi-bin/3ginfo.sh /usr/bin/3ginfo
}
exit 0
endef
define Package/3ginfo/install
$(CP) ./files-html/* $(1)
$(SED) 's/?v=1/?v='${PKG_VERSION}'/g' $(1)/usr/share/3ginfo/html/index.html
$(SED) 's/^\t*//g;s/^\s*//g;/^$$$$/d' $(1)/usr/share/3ginfo/html/index.html
$(FIND) $(1) -type f -name '*.js' | while read src; do \
uglifyjs "$$$$src" -o "$$$$src".1 && \
mv "$$$$src".1 "$$$$src" || true; \
done
$(FIND) $(1) -type f -name '*.css' | while read src; do \
cleancss "$$$$src" -o "$$$$src".1 && \
mv "$$$$src".1 "$$$$src" || true; \
done
endef
define Package/3ginfo-text/install
$(CP) ./files-text/* $(1)
endef
$(eval $(call BuildPackage,3ginfo-old))
$(eval $(call BuildPackage,3ginfo-lite))
$(eval $(call BuildPackage,3ginfo-qmisignal))
$(eval $(call BuildPackage,3ginfo-text-old))
$(eval $(call BuildPackage,3ginfo))
$(eval $(call BuildPackage,3ginfo-text))
+11
View File
@@ -0,0 +1,11 @@
#!/bin/sh /etc/rc.common
# (c) 2010-2019 Cezary Jackiewicz <cezary@eko.one.pl>
START=99
start () {
PORT=$(uci -q get 3ginfo.@3ginfo[0].http_port)
[ -z $PORT ] && { PORT=81; }
uhttpd -c /usr/share/3ginfo/uhttpd.conf -h /usr/share/3ginfo/ -p 0.0.0.0:$PORT > /dev/null 2>&1
}
+19
View File
@@ -0,0 +1,19 @@
#!/bin/sh
DEVICE=$(uci get 3ginfo.@3ginfo[0].device)
SCRIPT=$(uci get 3ginfo.@3ginfo[0].script)
echo -e "Content-type: text/html\n\n"
if [ -e scripts/$SCRIPT.sh ]; then
sh scripts/$SCRIPT.sh
elif [ -e scripts/$SCRIPT.gcom ]; then
if ! pidof gcom > /dev/null; then
O=$(gcom -d $DEVICE -s scripts/$SCRIPT.gcom)
echo "<div class=\"c\">$O</div>"
else
echo "<div class=\"c\">Brak możliwości sprawdzenia limitu. Spróbuj za chwilę.</div>"
fi
else
echo "<div class=\"c\"><font color=red>Brak skryptu $SCRIPT</font></div>"
fi
echo "<div class=\"c\"><input type=\"button\" class=\"button\" value=\"Wróć\" onclick=\"trzyginfo('cgi-bin/3ginfo.sh');\"></div>"
+17
View File
@@ -0,0 +1,17 @@
#!/bin/sh
SEC=$(uci -q get 3ginfo.@3ginfo[0].network)
[ -z "$SEC" ] && exit 0
ALLOW=$(uci -q get 3ginfo.@3ginfo[0].connect_button)
[ "x$ALLOW" = "x0" ] && exit 0
UP=$(ifstatus $SEC | grep "\"up\": true")
if [ -n "$UP" ]; then
ifdown $SEC > /dev/null 2>&1
else
ifup $SEC > /dev/null 2>&1
fi
sleep 3
exit 0
+6
View File
@@ -0,0 +1,6 @@
#!/bin/sh
D=$(uci -q get 3ginfo.@3ginfo[0].device)
echo -e "Content-type: text/html\n\n"
if [ -e $D ]; then
gcom -d $D sig | sed -e 's/ /,/g'
fi
+96
View File
@@ -0,0 +1,96 @@
#!/bin/sh
echo "Content-type: text/html"
echo ""
echo "
<html>
<style type=\"text/css\">
body {
font-family: Verdana, Arial, Helvetica, sans-serif;
}
#centered {
width: 800px;
margin: auto;
text-align: center;
}
.label {
text-align: left;
}
.text {
width: 100%;
}
pre {
text-align: left;
}
</style>
<head>
<title>SMS</title>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />
</head>
<body>
"
if [ "$REQUEST_METHOD" = POST ]; then
read -t 3 QUERY_STRING
eval $(echo "$QUERY_STRING"|awk -F'&' '{for(i=1;i<=NF;i++){print $i}}')
action=`uhttpd -d $action 2>/dev/null`
tel=`uhttpd -d $msisdn 2>/dev/null`
msg=`uhttpd -d $msg 2>/dev/null`
id=`uhttpd -d $id 2>/dev/null`
else
action="x"
fi
case "$action" in
send)
echo "[global]" > /tmp/gnokiirc
echo "model = AT" >> /tmp/gnokiirc
echo "port = "$(uci get 3ginfo.@3ginfo[0].device) >> /tmp/gnokiirc
echo "connection = serial" >> /tmp/gnokiirc
echo "$msg" | tr '+' ' ' | gnokii --config /tmp/gnokiirc --sendsms $tel 2>/dev/null
R=$?
if [ $R -eq 0 ]; then
echo "Wysłano wiadomość do $tel!<br />"
else
echo "<font color=red><strong>Wystąpił problem z wysłaniem wiadomości!</strong></font><br />"
fi
echo $tel": "$msg >> /tmp/sms.txt
rm /tmp/gnokiirc
;;
delete)
echo "[global]" > /tmp/gnokiirc
echo "model = AT" >> /tmp/gnokiirc
echo "port = "$(uci get 3ginfo.@3ginfo[0].device) >> /tmp/gnokiirc
echo "connection = serial" >> /tmp/gnokiirc
gnokii --config /tmp/gnokiirc --deletesms SM $id 2>/dev/null
rm /tmp/gnokiirc
;;
esac
echo "
<form method=\"post\">
<input type=\"hidden\" name=\"action\" id=\"action\" value=\"send\">
<div class=label>Numer telefonu:</div><input name=\"msisdn\" class=text><br />
<div class=label>Wiadomość:</div><textarea name=\"msg\" class=text></textarea><br /><br />
<input type=\"submit\" name=\"submit\" value=\"Wyślij\" text-align=center>
</form>
"
echo "[global]" > /tmp/gnokiirc
echo "model = AT" >> /tmp/gnokiirc
echo "port = "$(uci get 3ginfo.@3ginfo[0].device) >> /tmp/gnokiirc
echo "connection = serial" >> /tmp/gnokiirc
echo "<pre>"
gnokii --config /tmp/gnokiirc --getsms SM 0 end 2>/dev/null | \
sed -e ' \
s/ (unread)/<\/pre><font color=green><strong>Nowa wiadomość<\/strong><\/font><pre>/g; \
s/Msg Center.*//g; \
s/(read)//g; \
s/^Sender/Nadawca/g;s/Date\/time/Data\/czas/g; \
s/^Text:/Treść wiadomości:<\/pre><pre style="white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;">/g; \
s/\(^[0-9]*\)..Inbox Message/<\/pre><hr \/><form style="text-align: left;" method="post"><input type="hidden" name="action" id="action" value="delete"><input type="hidden" name="id" id="id" value="\1"><input type="submit" name="submit" value="Usuń"><\/form><pre>/g'
rm /tmp/gnokiirc
echo "</pre>
</div>
</body></html>"
+55
View File
@@ -0,0 +1,55 @@
#!/bin/sh
echo "Content-type: text/html"
echo ""
echo "
<html>
<style type=\"text/css\">
body {
font-family: Verdana, Arial, Helvetica, sans-serif;
}
#centered {
width: 800px;
margin: auto;
text-align: center;
}
.label {
text-align: left;
}
.text {
width: 100%;
}
pre {
text-align: left;
}
</style>
<head>
<title>USSD</title>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />
</head>
<body>
"
if [ "$REQUEST_METHOD" = POST ]; then
read -t 3 QUERY_STRING
eval $(echo "$QUERY_STRING"|awk -F'&' '{for(i=1;i<=NF;i++){print $i}}')
action=`uhttpd -d $action`
ussd=`uhttpd -d $ussd`
else
action="x"
fi
case "$action" in
send)
A=$(ussd159 -p $(uci get 3ginfo.@3ginfo[0].device) -t 30 -u "$ussd")
echo "Odpowiedź: $A<br /><br />"
;;
esac
echo "
<form method=\"post\">
<input type=\"hidden\" name=\"action\" id=\"action\" value=\"send\">
<div class=label>USSD:</div><input name=\"ussd\" class=text><br />
<input type=\"submit\" name=\"submit\" value=\"Wyślij\" text-align=center>
</form>
</div>
</body></html>"
@@ -0,0 +1,75 @@
<html>
<style type="text/css">
body {font-family: Verdana, Arial, Helvetica, sans-serif;}
.button {width:150px;}
a:link {text-decoration:none;color:blue;}
a:visited {text-decoration:none;color:blue;}
a:active {text-decoration:none;color:blue;}
a:hover {text-decoration:underline;color:blue;}
.c {margin:auto;text-align:center;clear:both;}
.l {width:39%;clear:both;float:left;text-align:right;}
.r {width:59%;float:right; text-align:left;}
</style>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>3G/4G</title>
<script language="javascript" type="text/javascript">
function detailson() {
document.getElementById('details').style.display = "inline";
document.getElementById('details_on').style.display = "none";
document.getElementById('details_off').style.display = "inline";
}
function detailsoff() {
document.getElementById('details').style.display = "none";
document.getElementById('details_on').style.display = "inline";
document.getElementById('details_off').style.display = "none";
}
function trzyginfo(zrodlo, reload) {
var a;
try {a = new XMLHttpRequest();} catch (e) {
try {a = new ActiveXObject("Msxml2.XMLHTTP");} catch (e) {
try {a = new ActiveXObject("Microsoft.XMLHTTP");} catch (e) {
alert("Coś stara ta przelądarka...");
return false;
}
}
}
document.getElementById('loader').style.display = "block";
document.getElementById('zawartosc').innerHTML = "";
a.open("GET", zrodlo);
a.onreadystatechange = function() {
if (a.readyState == 4) {
document.getElementById('loader').style.display = "none";
document.getElementById('zawartosc').innerHTML = a.responseText;
if (reload == 1) {
location.reload(true);
}
}
}
a.send(null);
}
</script>
</head>
<body onload="trzyginfo('cgi-bin/3ginfo.sh',0);">
<table style='width:100%;height:100%;'>
<tr><td colspan=3 style='height:100px;'>&nbsp;</td></tr>
<tr>
<td>&nbsp;</td>
<td style='width:600px; height:200px;'>
<div id='zawartosc'></div>
<div id='loader' style="text-align:center;display:block;"><img src="loader.gif"></div>
</td>
<td>&nbsp;</td>
</tr>
<tr><td colspan=3>&nbsp;</td></tr>
</table>
</body></html>
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

@@ -0,0 +1,9 @@
#!/bin/sh
O=$(wget -q -c http://www.cyfrowypolsat.pl/internet/biezace-zuzycie/ -O -)
O1=$(echo "$O" | sed -n '/Okres rozliczeniowy/,/_idJsp27/p' | tr -d '\n' | sed -e 's/\t//g;s/ */ /g;s/.*\(<span class="bolder">Okres.*\)\(<br><br><span\).*/\1/' | tr '\277\363\263\346\352\266\261\274\361' zolcesazn | tr '\241\306\312\243\321\323\246\257\254' ACELNOSZZ)
if [ -z "$O1" ]; then
echo "<div class=\"c\">Brak możliwości sprawdzenia limitu.</div>"
else
echo "$O1"
fi
@@ -0,0 +1,31 @@
pdu2txt() {
# pobrany z https://forum.openwrt.org/viewtopic.php?pid=158891#p158891
data1=$(echo $1 | sed -e 's/.\{2\}/&\ /g')
ret=''
shift=0
carry=0
for byte in $data1; do
if [ $shift -eq 7 ]; then
ret=$ret$(echo $carry | awk '{printf("%c",$0)}')
carry=0
shift=0
fi
byte=$((0x$byte))
: $(( a = (0xFF >> ($shift + 1)) & 0xFF ))
: $(( b = $a ^ 0xFF ))
: $(( digit = $carry | (($byte & $a) << $shift) & 0xFF ))
: $(( carry = ($byte & $b) >> (7 - $shift) ))
ret=$ret$(echo $digit | awk '{printf("%c",$0)}')
: $(( shift++ ))
done
echo $ret
}
@@ -0,0 +1,18 @@
opengt
set com 115200n81
set comecho off
set senddelay 0.02
waitquiet 0.2 0.2
send "AT+CUSD=1,\"AAD8EC3602\",15^m"
waitfor 10 "+CUSD: "
if % = -1 goto noresponse
get 1 "^m" $s
print $s
exit 0
:noresponse
print ""
exit 0
@@ -0,0 +1,10 @@
#!/bin/sh
. /usr/share/3ginfo/scripts/functions.sh
DEVICE=$(uci -q get 3ginfo.@3ginfo[0].device)
O=$(gcom -d $DEVICE -s /usr/share/3ginfo/scripts/lycamobile_pdu.gcom | cut -f2 -d\")
if [ ! -z "$O" ]; then
pdu2txt "$O" | tr '\n' ' ' | sed -e 's/1 Opis 9 Powrot 0 Wyjscie//g'
else
echo "Problem operatora - brak możliwości sprawdzenia"
fi
@@ -0,0 +1,71 @@
opengt
set com 115200n81
set comecho off
set senddelay 0.02
waitquiet 0.2 0.2
send "AT+CNMI=0,1,0,0,0^m"
waitfor 5 "OK"
if % = -1 goto error
send "AT+CMGF=1^m"
waitfor 5 "OK"
if % = -1 goto error
send "AT+CMGL=\"ALL\"^m"
waitfor 10 "OK"
if % = -1 goto error
send "AT+CUSD=1,\"*121#\",15^m"
waitfor 5 "+CUSD:"
if % = -1 goto error
let $c="AT+CMGL=\"REC UNREAD\"^m"
let $r="+CMGL"
gosub readatcmd
let $c="AT+CMGL=\"REC UNREAD\"^m"
let $r="+CMGL"
gosub readatcmd
:error
print "Problem operatora - brak możliwości sprawdzenia..."
exit 0
:readatcmd
let i=20
send $c
:loop
get 1 "^m" $s
let l=len($r)
if len($s) < l goto loop1
if $mid($s,1,l) <> $r goto loop1
let $j="x"
if $mid($s,9,1) <> "," goto del2
let $j=$mid($s,8,1)
goto del3
:del2
if $mid($s,10,1) <> "," goto del3
let $j=$mid($s,8,2)
:del3
get 1 "^m" $s
print $s
if $j = "x" goto del4
send "AT+CMGD="
send $j
send "^m"
waitfor 5 "OK"
:del4
exit 0
:loop1
if len($s) < 2 goto loop2
if $mid($s,1,2) = "ER" return
:loop2
if i = 0 return
let i=i-1
sleep 0.5
goto loop
@@ -0,0 +1,71 @@
opengt
set com 115200n81
set comecho off
set senddelay 0.02
waitquiet 0.2 0.2
send "AT+CNMI=0,1,0,0,0^m"
waitfor 5 "OK"
if % = -1 goto error
send "AT+CMGF=1^m"
waitfor 5 "OK"
if % = -1 goto error
send "AT+CMGL=\"ALL\"^m"
waitfor 10 "OK"
if % = -1 goto error
send "AT+CUSD=1,\"AA982C3602\",15^m"
waitfor 5 "+CUSD:"
if % = -1 goto error
let $c="AT+CMGL=\"REC UNREAD\"^m"
let $r="+CMGL"
gosub readatcmd
let $c="AT+CMGL=\"REC UNREAD\"^m"
let $r="+CMGL"
gosub readatcmd
:error
print "Problem operatora - brak możliwości sprawdzenia..."
exit 0
:readatcmd
let i=20
send $c
:loop
get 1 "^m" $s
let l=len($r)
if len($s) < l goto loop1
if $mid($s,1,l) <> $r goto loop1
let $j="x"
if $mid($s,9,1) <> "," goto del2
let $j=$mid($s,8,1)
goto del3
:del2
if $mid($s,10,1) <> "," goto del3
let $j=$mid($s,8,2)
:del3
get 1 "^m" $s
print $s
if $j = "x" goto del4
send "AT+CMGD="
send $j
send "^m"
waitfor 5 "OK"
:del4
exit 0
:loop1
if len($s) < 2 goto loop2
if $mid($s,1,2) = "ER" return
:loop2
if i = 0 return
let i=i-1
sleep 0.5
goto loop
@@ -0,0 +1,27 @@
opengt
set com 115200n81
set comecho off
set senddelay 0.02
waitquiet 0.2 0.2
send "at+cmgf=0^m"
waitfor 5 "OK"
if % = -1 goto error
send "at+cscs=\"IRA\"^m"
waitfor 5 "OK"
if % = -1 goto error
send "AT+CUSD=1,\"AA182CA682C546\",15^m"
waitfor 5 "+CUSD:"
if % = -1 goto error
get 1 "^m" $s
print $s
exit 0
:error
print ""
exit 0
@@ -0,0 +1,10 @@
#!/bin/sh
. /usr/share/3ginfo/scripts/functions.sh
DEVICE=$(uci -q get 3ginfo.@3ginfo[0].device)
O=$(gcom -d $DEVICE -s /usr/share/3ginfo/scripts/ofnk.gcom | cut -f2 -d\")
if [ ! -z "$O" ]; then
pdu2txt "$O"
else
echo "Problem operatora - brak możliwości sprawdzenia"
fi
@@ -0,0 +1,19 @@
opengt
set com 115200n81
set comecho off
set senddelay 0.02
waitquiet 0.2 0.2
send "AT+CUSD=1,\"*101*01#\",15^m"
waitfor 10 "+CUSD: "
if % = -1 goto noresponse
get 1 "^m" $s
print $s
exit 0
:noresponse
print ""
exit 0
@@ -0,0 +1,9 @@
#!/bin/sh
DEVICE=$(uci -q get 3ginfo.@3ginfo[0].device)
O=$(gcom -d $DEVICE -s /usr/share/3ginfo/scripts/ofnk2.gcom | cut -f2 -d\")
if [ ! -z "$O" ]; then
A=$(echo $O | awk '{for(i=1;;i=i+4)if(substr($1,i,4)!=""){printf "%c",(index("0123456789ABCDEF",substr($1,i+2,1))-1)*16+(index("0123456789ABCDEF",substr($1,i+3,1))-1)}else exit;}')
echo $A | sed -e 's/1 Opis.*9 Powrot.*0 Wyjscie//g'
else
echo "Problem operatora - brak możliwości sprawdzenia"
fi
@@ -0,0 +1,37 @@
opengt
set com 115200n81
set comecho off
set senddelay 0.02
waitquiet 0.2 0.2
send "AT+CUSD=1,\"*111#\",15^m"
waitfor 10 "0 Wyjscie"
if % = -1 goto noresponse
send "AT+CUSD=1,\"1\",15^m"
waitfor 10 "0 Wyjscie"
if % = -1 goto noresponse
let c=20
send "AT+CUSD=1,\"3\",15^m"
:loop
get 1 "^m" $s
if c=0 goto exit
if len($s) < 6 goto toshort
if $mid($s,1,5) = "+CUSD" goto ok
:toshort
let c=c-1
sleep 1
goto loop
:ok
let $s=$right($s,len($s)-10)
print $s,"\"\n"
:exit
send "AT+CUSD=1,\"0\",15^m"
waitfor 10 "Dziekujemy"
exit 0
:noresponse
print "Problem operatora - brak możliwości sprawdzenia..."
exit 0
@@ -0,0 +1,28 @@
opengt
set com 115200n81
set comecho off
set senddelay 0.02
waitquiet 0.2 0.2
send "AT+CUSD=1,\"*111#\",15^m"
waitfor 10 "+CUSD: "
if % = -1 goto noresponse
send "AT+CUSD=1,\"1\",15^m"
waitfor 10 "+CUSD: "
if % = -1 goto noresponse
send "AT+CUSD=1,\"3\",15^m"
waitfor 10 "+CUSD: "
if % = -1 goto noresponse
get 1 "^m" $s
print $s
send "AT+CUSD=1,\"0\",15^m"
waitfor 10 "+CUSD: "
exit 0
:noresponse
print ""
exit 0
@@ -0,0 +1,9 @@
#!/bin/sh
DEVICE=$(uci -q get 3ginfo.@3ginfo[0].device)
O=$(gcom -d $DEVICE -s /usr/share/3ginfo/scripts/play_fresh2.gcom | cut -f2 -d\")
if [ ! -z "$O" ]; then
A=$(echo $O | awk '{for(i=1;;i=i+4)if(substr($1,i,4)!=""){printf "%c",(index("0123456789ABCDEF",substr($1,i+2,1))-1)*16+(index("0123456789ABCDEF",substr($1,i+3,1))-1)}else exit;}')
echo $A | sed -e 's/1 Opis.*9 Powrot.*0 Wyjscie//g'
else
echo "Problem operatora - brak możliwości sprawdzenia"
fi
@@ -0,0 +1,28 @@
opengt
set com 115200n81
set comecho off
set senddelay 0.02
waitquiet 0.2 0.2
send "AT+CUSD=1,\"AA582C3602\",15^m"
waitfor 10 "+CUSD: "
if % = -1 goto noresponse
send "AT+CUSD=1,\"31\",15^m"
waitfor 10 "+CUSD: "
if % = -1 goto noresponse
send "AT+CUSD=1,\"33\",15^m"
waitfor 10 "+CUSD: "
if % = -1 goto noresponse
get 1 "^m" $s
print $s
send "AT+CUSD=1,\"30\",15^m"
waitfor 10 "+CUSD: "
exit 0
:noresponse
print ""
exit 0
@@ -0,0 +1,10 @@
#!/bin/sh
. /usr/share/3ginfo/scripts/functions.sh
DEVICE=$(uci -q get 3ginfo.@3ginfo[0].device)
O=$(gcom -d $DEVICE -s /usr/share/3ginfo/scripts/play_fresh_pdu.gcom | cut -f2 -d\")
if [ ! -z "$O" ]; then
pdu2txt "$O" | tr '\n' ' ' | sed -e 's/1 Opis.*9 Powrot.*0 Wyjscie//g'
else
echo "Problem operatora - brak możliwości sprawdzenia"
fi
@@ -0,0 +1,20 @@
opengt
set com 115200n81
set comecho off
set senddelay 0.02
waitquiet 0.2 0.2
send "AT+CUSD=1,\"AA182C3602\",15^m"
waitfor 10 "+CUSD: "
if % = -1 goto noresponse
get 1 "^m" $s
print $s
send "AT+CUSD=1,\"30\",15^m"
waitfor 10 "+CUSD: "
exit 0
:noresponse
print ""
exit 0
@@ -0,0 +1,10 @@
#!/bin/sh
. /usr/share/3ginfo/scripts/functions.sh
DEVICE=$(uci -q get 3ginfo.@3ginfo[0].device)
O=$(gcom -d $DEVICE -s /usr/share/3ginfo/scripts/tmobile.gcom | cut -f2 -d\")
if [ ! -z "$O" ]; then
pdu2txt "$O" | tr '\n' ' ' | sed -e 's/1 Opis 9 Powrot 0 Wyjscie//g'
else
echo "Problem operatora - brak możliwości sprawdzenia"
fi
@@ -0,0 +1,19 @@
opengt
set com 115200n81
set comecho off
set senddelay 0.02
waitquiet 0.2 0.2
send "AT+CUSD=1,\"*108#\",15^m"
waitfor 10 "+CUSD: "
if % = -1 goto noresponse
get 1 "^m" $s
print $s
exit 0
:noresponse
print ""
exit 0
@@ -0,0 +1,27 @@
opengt
set com 115200n81
set comecho off
set senddelay 0.02
waitquiet 0.2 0.2
send "at+cmgf=0^m"
waitfor 5 "OK"
if % = -1 goto error
send "at+cscs=\"IRA\"^m"
waitfor 5 "OK"
if % = -1 goto error
send "AT+CUSD=1,\"AA180C3702\",15^m"
waitfor 5 "+CUSD:"
if % = -1 goto error
get 1 "^m" $s
print $s
exit 0
:error
print ""
exit 0
@@ -0,0 +1,10 @@
#!/bin/sh
. /usr/share/3ginfo/scripts/functions.sh
DEVICE=$(uci -q get 3ginfo.@3ginfo[0].device)
O=$(gcom -d $DEVICE -s /usr/share/3ginfo/scripts/virginmobile_pdu.gcom | cut -f2 -d\")
if [ ! -z "$O" ]; then
pdu2txt "$O"
else
echo "Problem operatora - brak możliwości sprawdzenia"
fi
@@ -0,0 +1,86 @@
<html>
<style type="text/css">
body {font-family: Verdana, Arial, Helvetica, sans-serif;}
.c {margin:auto;text-align:center;clear:both;}
.l {width:49%;clear:both;float:left;text-align:right;}
.r {width:49%;float:right;text-align:left;}
</style>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Siła sygnału</title>
<script language="javascript" type="text/javascript">
<!--
var secs=0;
var delay = 1000;
startTimer();
function startTimer()
{
if (secs==0)
{
secs=3;
refreshData();
}
else
{
self.status = secs;
secs = secs - 1;
}
self.setTimeout("startTimer()", delay);
}
function refreshData()
{
var req;
try {req = new XMLHttpRequest();} catch (e) {
try {req = new ActiveXObject("Msxml2.XMLHTTP");} catch (e) {
try {req = new ActiveXObject("Microsoft.XMLHTTP");} catch (e) {
alert("Coś stara ta przelądarka...");
return false;
}
}
}
req.open("GET", "/cgi-bin/signal.sh");
req.onreadystatechange = function() {
if (req.readyState == 4) {
var line=req.responseText;
var arr=(line.split(/,/));
if(arr.length>3)
{
var p = (arr[2]*100/31).toFixed();
document.getElementById('csq').innerHTML=p+'%';
document.getElementById('precent').style.width=p+"%";
var color = "red";
if (p > 29) {color="orange"; }
if (p > 45) {color="yellow"; }
if (p > 61) {color="green"; }
document.getElementById('precent').style.backgroundColor=color;
}
}
}
req.send(null);
}
//-->
</script>
</head>
<body>
<table style='width:100%;height:100%;'>
<tr><td colspan=3 style='height:100px;'>&nbsp;</td></tr>
<tr>
<td>&nbsp;</td>
<td style='width:600px; height:200px;'>
<span class="l">Siła sygnału:</span><span id="csq" class="r"></span>
<div style="float:left; margin:1%; width:98%; height:20px; border:1px solid #000000; background-color:transparent;">
<div id="precent" style="float:left; background-color:black; border-right:1px solid #000000; height:100%; width:0%">&nbsp;</div>
</div>
</td>
<td>&nbsp;</td>
</tr>
<tr><td colspan=3>&nbsp;</td></tr>
</table>
</body>
</html>
@@ -0,0 +1,35 @@
<span class="l" style="display:{STATUS_SHOW}">Status:</span><span class="r" style="display:{STATUS_SHOW}">{STATUS}</span>
<span class="l" style="display:{STATUS_SHOW}"><small>Connection time:</small></span><span class="r" style="display:{STATUS_SHOW}"><small>{CONN_TIME}</small></span>
<span class="l" style="display:{STATUS_SHOW}"><small>Received:</small></span><span class="r" style="display:{STATUS_SHOW}"><small>{RX}</small></span>
<span class="l" style="display:{STATUS_SHOW}"><small>Transmitted:</small></span><span class="r" style="display:{STATUS_SHOW}"><small>{TX}</small></span>
<span class="l">Operator:</span><span class="r">{COPS}</span>
<span class="l">Operating mode:</span><span class="r">{MODE}</span>
<span class="l">Signal strength:</span><span class="r"><strong>{CSQ_PER}%</strong></span>
<div style="float:left; margin:1%; width:98%; height:20px; border:1px solid #000000; background-color:transparent;">
<div style="float:left; background-color:{CSQ_COL}; border-right:1px solid #000000; height:100%; width:{CSQ_PER}%">&nbsp;</div>
</div>
<div class="c" style="display:{SMS_SHOW};"><input type="button" class="button" value="SMS" onClick="window.location.href='cgi-bin/sms.sh'"></div>
<div class="c" style="display:{USSD_SHOW};"><input type="button" class="button" value="USSD" onClick="window.location.href='cgi-bin/ussd.sh'"></div>
<div class="c" style="display:{LIMIT_SHOW};"><input type="button" class="button" value="Pozostały limit" onClick="return trzyginfo('cgi-bin/limit.sh',0);"></div>
<div class="c"><input type="button" class="button" value="Refresh" onClick="return trzyginfo('cgi-bin/3ginfo.sh',0);"></div>
<div class="c" style="display:{STATUS_SHOW_BUTTON}"><input type="button" class="button" value="{STATUS_TRE}" onClick="trzyginfo('cgi-bin/onoff.sh',1);"></div>
<br />
<a href="#" id='details_on' onclick="detailson();" style="float:left;display:inline;"><small>Show details</small></a>
<a href="#" id='details_off' onclick="detailsoff();" style="float:left;display:none;"><small>Hide details</small></a>
<br />
<div id='details' style="display:none;">
<span class="l">CSQ:</span><span class="r">{CSQ}</span>
<span class="l">RSSI:</span><span class="r">{CSQ_RSSI} dBm</span>
<span class="l" style="display:{QOS_SHOW}">UMTS QoS Profile:</span><span class="r" style="display:{QOS_SHOW}">{DOWN} kbps DOWN | {UP} kbps UP</span>
<span class="l">MCC MNC:</span><span class="r">{COPS_MCC} {COPS_MNC}</span>
<span class="l">LAC:</span><span class="r">{LAC} ({LAC_NUM})</span>
<span class="l">CID:</span><span class="r">{CID} ({CID_NUM})</span>
<span class="l">TAC:</span><span class="r">{TAC} ({TAC_NUM})</span>
<span class="l">RSCP:</span><span class="r">{RSCP} dBm</span>
<span class="l">Ec/IO:</span><span class="r">{ECIO} dB</span>
<span class="l">RSRP:</span><span class="r">{RSRP} dBm</span>
<span class="l">SINR:</span><span class="r">{SINR} dB</span>
<span class="l">RSRQ:</span><span class="r">{RSRQ} dB</span>
<span class="l">&nbsp;</span><small><span class="r">{BTSINFO}</small>
<span class="l">Device:</span><span class="r">{DEVICE}</span>
</div>
@@ -0,0 +1,35 @@
<span class="l" style="display:{STATUS_SHOW}">Staatus:</span><span class="r" style="display:{STATUS_SHOW}">{STATUS}</span>
<span class="l" style="display:{STATUS_SHOW}"><small>Ühendusaeg:</small></span><span class="r" style="display:{STATUS_SHOW}"><small>{CONN_TIME}</small></span>
<span class="l" style="display:{STATUS_SHOW}"><small>Vastvõetud:</small></span><span class="r" style="display:{STATUS_SHOW}"><small>{RX}</small></span>
<span class="l" style="display:{STATUS_SHOW}"><small>Saadetud:</small></span><span class="r" style="display:{STATUS_SHOW}"><small>{TX}</small></span>
<span class="l">Operaator:</span><span class="r">{COPS}</span>
<span class="l">Töörežiim:</span><span class="r">{MODE}</span>
<span class="l">Signaali tugevus:</span><span class="r"><strong>{CSQ_PER}%</strong></span>
<div style="float:left; margin:1%; width:98%; height:20px; border:1px solid #000000; background-color:transparent;">
<div style="float:left; background-color:{CSQ_COL}; border-right:1px solid #000000; height:100%; width:{CSQ_PER}%">&nbsp;</div>
</div>
<div class="c" style="display:{SMS_SHOW};"><input type="button" class="button" value="SMS" onClick="window.location.href='cgi-bin/sms.sh'"></div>
<div class="c" style="display:{USSD_SHOW};"><input type="button" class="button" value="USSD" onClick="window.location.href='cgi-bin/ussd.sh'"></div>
<div class="c" style="display:{LIMIT_SHOW};"><input type="button" class="button" value="Pozostały limit" onClick="return trzyginfo('cgi-bin/limit.sh',0);"></div>
<div class="c"><input type="button" class="button" value="Uuenda" onClick="return trzyginfo('cgi-bin/3ginfo.sh',0);"></div>
<div class="c" style="display:{STATUS_SHOW_BUTTON}"><input type="button" class="button" value="{STATUS_TRE}" onClick="trzyginfo('cgi-bin/onoff.sh',1);"></div>
<br />
<a href="#" id='details_on' onclick="detailson();" style="float:left;display:inline;"><small>Näita detaile</small></a>
<a href="#" id='details_off' onclick="detailsoff();" style="float:left;display:none;"><small>Peida detailid</small></a>
<br />
<div id='details' style="display:none;">
<span class="l">CSQ:</span><span class="r">{CSQ}</span>
<span class="l">RSSI:</span><span class="r">{CSQ_RSSI} dBm</span>
<span class="l" style="display:{QOS_SHOW}">UMTS QoS Profile:</span><span class="r" style="display:{QOS_SHOW}">{DOWN} kbps DOWN | {UP} kbps UP</span>
<span class="l">MCC MNC:</span><span class="r">{COPS_MCC} {COPS_MNC}</span>
<span class="l">LAC:</span><span class="r">{LAC} ({LAC_NUM})</span>
<span class="l">CID:</span><span class="r">{CID} ({CID_NUM})</span>
<span class="l">TAC:</span><span class="r">{TAC} ({TAC_NUM})</span>
<span class="l">RSCP:</span><span class="r">{RSCP} dBm</span>
<span class="l">Ec/IO:</span><span class="r">{ECIO} dB</span>
<span class="l">RSRP:</span><span class="r">{RSRP} dBm</span>
<span class="l">SINR:</span><span class="r">{SINR} dB</span>
<span class="l">RSRQ:</span><span class="r">{RSRQ} dB</span>
<span class="l">&nbsp;</span><small><span class="r">{BTSINFO}</small>
<span class="l">Seade:</span><span class="r">{DEVICE}</span>
</div>
@@ -0,0 +1,35 @@
<span class="l" style="display:{STATUS_SHOW}">Stato:</span><span class="r" style="display:{STATUS_SHOW}">{STATUS}</span>
<span class="l" style="display:{STATUS_SHOW}"><small>Tempo di connessione:</small></span><span class="r" style="display:{STATUS_SHOW}"><small>{CONN_TIME}</small></span>
<span class="l" style="display:{STATUS_SHOW}"><small>Ricevuti:</small></span><span class="r" style="display:{STATUS_SHOW}"><small>{RX}</small></span>
<span class="l" style="display:{STATUS_SHOW}"><small>Trasmessi:</small></span><span class="r" style="display:{STATUS_SHOW}"><small>{TX}</small></span>
<span class="l">Operatore:</span><span class="r">{COPS}</span>
<span class="l">Tipo di connessione:</span><span class="r">{MODE}</span>
<span class="l">Forza segnale:</span><span class="r"><strong>{CSQ_PER}%</strong></span>
<div style="float:left; margin:1%; width:98%; height:20px; border:1px solid #000000; background-color:transparent;">
<div style="float:left; background-color:{CSQ_COL}; border-right:1px solid #000000; height:100%; width:{CSQ_PER}%">&nbsp;</div>
</div>
<div class="c" style="display:{SMS_SHOW};"><input type="button" class="button" value="SMS" onClick="window.location.href='cgi-bin/sms.sh'"></div>
<div class="c" style="display:{USSD_SHOW};"><input type="button" class="button" value="USSD" onClick="window.location.href='cgi-bin/ussd.sh'"></div>
<div class="c" style="display:{LIMIT_SHOW};"><input type="button" class="button" value="Limite" onClick="return trzyginfo('cgi-bin/limit.sh',0);"></div>
<div class="c"><input type="button" class="button" value="Aggiorna" onClick="return trzyginfo('cgi-bin/3ginfo.sh',0);"></div>
<div class="c" style="display:{STATUS_SHOW_BUTTON}"><input type="button" class="button" value="{STATUS_TRE}" onClick="trzyginfo('cgi-bin/onoff.sh',1);"></div>
<br />
<a href="#" id='details_on' onclick="detailson();" style="float:left;display:inline;"><small>Mostra dettagli</small></a>
<a href="#" id='details_off' onclick="detailsoff();" style="float:left;display:none;"><small>Nascondi dettagli</small></a>
<br />
<div id='details' style="display:none;">
<span class="l">CSQ:</span><span class="r">{CSQ}</span>
<span class="l">RSSI:</span><span class="r">{CSQ_RSSI} dBm</span>
<span class="l" style="display:{QOS_SHOW}">Profilo UMTS QoS:</span><span class="r" style="display:{QOS_SHOW}">{DOWN} kbps DOWN | {UP} kbps UP</span>
<span class="l">MCC MNC:</span><span class="r">{COPS_MCC} {COPS_MNC}</span>
<span class="l">LAC:</span><span class="r">{LAC} ({LAC_NUM})</span>
<span class="l">CID:</span><span class="r">{CID} ({CID_NUM})</span>
<span class="l">TAC:</span><span class="r">{TAC} ({TAC_NUM})</span>
<span class="l">RSCP:</span><span class="r">{RSCP} dBm</span>
<span class="l">Ec/IO:</span><span class="r">{ECIO} dB</span>
<span class="l">RSRP:</span><span class="r">{RSRP} dBm</span>
<span class="l">SINR:</span><span class="r">{SINR} dB</span>
<span class="l">RSRQ:</span><span class="r">{RSRQ} dB</span>
<span class="l">&nbsp;</span><small><span class="r">{BTSINFO}</small>
<span class="l">Dispositivo:</span><span class="r">{DEVICE}</span>
</div>
@@ -0,0 +1,35 @@
<span class="l" style="display:{STATUS_SHOW}">Status:</span><span class="r" style="display:{STATUS_SHOW}">{STATUS}</span>
<span class="l" style="display:{STATUS_SHOW}"><small>Czas połączenia:</small></span><span class="r" style="display:{STATUS_SHOW}"><small>{CONN_TIME}</small></span>
<span class="l" style="display:{STATUS_SHOW}"><small>Pobrano:</small></span><span class="r" style="display:{STATUS_SHOW}"><small>{RX}</small></span>
<span class="l" style="display:{STATUS_SHOW}"><small>Wysłano:</small></span><span class="r" style="display:{STATUS_SHOW}"><small>{TX}</small></span>
<span class="l">Operator:</span><span class="r">{COPS}</span>
<span class="l">Tryb pracy:</span><span class="r">{MODE}</span>
<span class="l">Siła sygnału:</span><span class="r"><strong>{CSQ_PER}%</strong></span>
<div style="float:left; margin:1%; width:98%; height:20px; border:1px solid #000000; background-color:transparent;">
<div style="float:left; background-color:{CSQ_COL}; border-right:1px solid #000000; height:100%; width:{CSQ_PER}%">&nbsp;</div>
</div>
<div class="c" style="display:{SMS_SHOW};"><input type="button" class="button" value="SMS" onClick="window.location.href='cgi-bin/sms.sh'"></div>
<div class="c" style="display:{USSD_SHOW};"><input type="button" class="button" value="USSD" onClick="window.location.href='cgi-bin/ussd.sh'"></div>
<div class="c" style="display:{LIMIT_SHOW};"><input type="button" class="button" value="Pozostały limit" onClick="return trzyginfo('cgi-bin/limit.sh',0);"></div>
<div class="c"><input type="button" class="button" value="Odśwież" onClick="return trzyginfo('cgi-bin/3ginfo.sh',0);"></div>
<div class="c" style="display:{STATUS_SHOW_BUTTON}"><input type="button" class="button" value="{STATUS_TRE}" onClick="trzyginfo('cgi-bin/onoff.sh',1);"></div>
<br />
<a href="#" id='details_on' onclick="detailson();" style="float:left;display:inline;"><small>Pokaż informacje dodatkowe</small></a>
<a href="#" id='details_off' onclick="detailsoff();" style="float:left;display:none;"><small>Ukryj informacje dodatkowe</small></a>
<br />
<div id='details' style="display:none;">
<span class="l">CSQ:</span><span class="r">{CSQ}</span>
<span class="l">RSSI:</span><span class="r">{CSQ_RSSI} dBm</span>
<span class="l" style="display:{QOS_SHOW}">Profil UMTS QoS:</span><span class="r" style="display:{QOS_SHOW}">{DOWN} kbps DOWN | {UP} kbps UP</span>
<span class="l">MCC MNC:</span><span class="r">{COPS_MCC} {COPS_MNC}</span>
<span class="l">LAC:</span><span class="r">{LAC} ({LAC_NUM})</span>
<span class="l">CID:</span><span class="r">{CID} ({CID_NUM})</span>
<span class="l">TAC:</span><span class="r">{TAC} ({TAC_NUM})</span>
<span class="l">RSCP:</span><span class="r">{RSCP} dBm</span>
<span class="l">Ec/IO:</span><span class="r">{ECIO} dB</span>
<span class="l">RSRP:</span><span class="r">{RSRP} dBm</span>
<span class="l">SINR:</span><span class="r">{SINR} dB</span>
<span class="l">RSRQ:</span><span class="r">{RSRQ} dB</span>
<span class="l">&nbsp;</span><small><span class="r">{BTSINFO}</small>
<span class="l">Urządzenie:</span><span class="r">{DEVICE}</span>
</div>
@@ -0,0 +1 @@
E404:/index.html
+13
View File
@@ -0,0 +1,13 @@
#!/bin/sh /etc/rc.common
#
# (c) 2010-2024 Cezary Jackiewicz <cezary@eko.one.pl>
#
START=99
start() {
PORT=$(uci -q get 3ginfo.@3ginfo[0].http_port)
[ -z "$PORT" ] && PORT=81
uhttpd -E /index.html -x /cgi-bin -h /usr/share/3ginfo/html -p 0.0.0.0:$PORT -i .sh=/bin/sh > /dev/null 2>&1
}
@@ -0,0 +1,192 @@
label {
font-weight: 400;
text-align: right;
}
.modal {
display: none;
position: fixed;
z-index: 1;
left: 0;
top: 0;
width: 100%;
height: 100%;
overflow: auto;
background-color: rgb(0,0,0);
background-color: rgba(0,0,0,0.4);
}
.modal-content {
background-color: #fefefe;
margin: 15% auto;
padding: 20px;
border: 1px solid #888;
width: 80%;
border-radius: 5px;
}
.section {
border-bottom: 1px dashed #8c8b8b;
}
h3 {
margin-bottom: 20px;
}
#container {
transition: margin-left .5s;
padding: 20px;
}
.click,
.click:hover,
.click:visited,
.click:link {
text-decoration: none;
color: #31708f;
cursor: pointer;
}
.margintop {
margin-top: 10px;
}
@media (max-width: 768px) {
.margintop {
margin-top: -90px;
}
.center-xd {
text-align: center;
}
}
.sizing-box {
height: 110px;
width: 150px;
}
.signal-bars {
display: inline-block;
}
.signal-bars .bar {
width: 14%;
margin-left: 1%;
min-height: 20%;
display: inline-block;
}
.signal-bars .bar.first-bar { height: 20%; }
.signal-bars .bar.second-bar { height: 40%; }
.signal-bars .bar.third-bar { height: 60%; }
.signal-bars .bar.fourth-bar { height: 80%; }
.signal-bars .bar.fifth-bar { height: 99%; }
.lzero .bar {
background-color: #fafafa;
border: thin solid #ccc;
}
.lone .bar {
background-color: #ff0000;
border: thin solid #800000;
}
.ltwo .bar {
background-color: #ff6a00;
border: thin solid #803500;
}
.lthree .bar {
background-color: #ffd800;
border: thin solid #806a00;
}
.lfour .bar {
background-color: #b6ff00;
border: thin solid #558000;
}
.lfive .bar {
background-color: #4cff00;
border: thin solid #2a8000;
}
.four-bars .bar.fifth-bar,
.three-bars .bar.fifth-bar,
.three-bars .bar.fourth-bar,
.one-bar .bar:not(.first-bar),
.two-bars .bar:not(.first-bar):not(.second-bar) {
background-color: #fafafa;
border: thin solid #ccc;
}
.oneline {
clear: both;
}
@media (max-width: 527px) {
.hidden-vxs {
display: none;
}
}
@media (min-width: 578px) and (max-width: 821px) {
.modalmargintop {
margin-top: 5px;
}
}
.error {
color: red;
}
@media (max-width: 768px) {
.col-xs-12-text-left {
text-align: left;
}
}
.tab {
overflow: hidden;
border: 1px solid #ccc;
background-color: #f1f1f1;
}
.tab button {
background-color: inherit;
float: left;
border: none;
outline: none;
cursor: pointer;
padding: 14px 16px;
transition: 0.3s;
font-size: 17px;
}
.tab button:hover {
background-color: #ddd;
}
.tab button.active {
background-color: #ccc;
}
.tabcontent {
display: none;
padding: 6px 12px;
b1order: 1px solid #ccc;
b1order-top: none;
}
.full-height {
height: 100vh;
}
.flex-center {
align-items: center;
display: flex;
justify-content: center;
}
.position-ref {
position: relative;
}
.flex-content {
text-align: center;
}
@@ -0,0 +1,794 @@
function readdata(source, callback) {
var xmlhttp;
try {xmlhttp = new XMLHttpRequest();} catch (e) {
try {xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");} catch (e) {
try {xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");} catch (e) {
alert("Old browser?");
return false;
}
}
}
xmlhttp.open("GET", "/cgi-bin/" + source);
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4) {
if(xmlhttp.status == 200) {
callback(JSON.parse(xmlhttp.responseText));
}
}
}
xmlhttp.send(null);
}
function translate() {
var lang = navigator.languages ? navigator.languages[0] : navigator.language;
this._lang = lang.substr(0, 2);
// this._lang = 'en';
fetch(`/i18n/${this._lang}.json`)
.then((response) => {
if (response.ok) {
return response.json();
}
throw new Error('Something went wrong');
})
.then((translation) => {
this._translation = translation;
this._elements = document.querySelectorAll("[data-i18n]");
this._elements.forEach((element) => {
var keys = element.dataset.i18n.split(".");
var text = keys.reduce((obj, i) => obj[i], translation);
if (text) {
element.innerHTML = text;
}
});
})
.catch((error) => {
console.log(`Could not load ${this._lang}, en will be used`);
});
}
function _t(text, defaulttext) {
if (this._translation) {
var key = text.replaceAll(' ', '').toLowerCase();
if (key in this._translation) {
return this._translation[key];
}
}
return defaulttext ? defaulttext : text;
}
function info_onload() {
translate();
showmodeminfo();
}
function formatDateTime(s) {
if (s.length == 14) {
return s.replace(/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/, "$1-$2-$3 $4:$5:$6");
} else if (s.length == 12) {
return s.replace(/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})/, "$1-$2-$3 $4:$5");
} else if (s.length == 8) {
return s.replace(/(\d{4})(\d{2})(\d{2})/, "$1-$2-$3");
} else if (s.length == 6) {
return s.replace(/(\d{4})(\d{2})/, "$1-$2");
}
return s;
}
function lz(n) {
return (n < 10 ? '0' : '' ) + n;
}
function formatDateTimeForUptime(uptime) {
var d = new Date(new Date().getTime() - uptime * 1000);
return '' +
d.getFullYear() + '-' +
lz(d.getMonth() + 1) + '-' +
lz(d.getDate()) + ' ' +
lz(d.getHours()) + ':' +
lz(d.getMinutes()) + ':' +
lz(d.getSeconds());
}
function createRowForModal(key, value) {
return '<div class="row"><div class="col-xs-5 col-sm-6 text-right">' + key + '</div><div class="col-xs-7 col-sm-6 text-left"><p>' + value + '</p></div></div>';
}
function createRow9ColForModal(arr) {
return '<div class="row">' +
'<div class="col-xs-1 text-right"><p>' + arr[0] + '</p></div>' +
'<div class="col-xs-3 text-left"><p>' + arr[1] + '</p></div>' +
'<div class="col-xs-2 text-left"><p>' + arr[2] + '</p></div>' +
'<div class="col-xs-1 text-left"><p>' + arr[3] + '</p></div>' +
'<div class="col-xs-1 text-left"><p>' + arr[4] + '</p></div>' +
'<div class="col-xs-1 text-left"><p>' + arr[5] + '</p></div>' +
'<div class="col-xs-1 text-left"><p>' + arr[6] + '</p></div>' +
'<div class="col-xs-1 text-left"><p>' + arr[7] + '</p></div>' +
'<div class="col-xs-1 text-left"><p>' + arr[8] + '</p></div>' +
'</div>';
}
/*****************************************************************************/
var modal;
function setValue(element, value) {
var e = document.getElementById(element);
if (e.tagName == "SELECT") {
for (var i = 0; i < e.options.length; i++) {
if (e.options[i].value == value) {
e.selectedIndex = i;
break;
}
}
} else if (e.tagName == "P") {
e.innerHTML = value;
} else if (e.tagName == "H3") {
e.innerHTML = value;
} else if (e.tagName == "SPAN") {
e.innerHTML = value;
} else if (e.tagName == "DIV") {
e.innerHTML = value;
} else if (e.type === 'checkbox') {
e.checked = value;
} else if (e.type === 'radio') {
e.checked = value;
} else {
e.value = value;
}
}
function setDisplay(element, show) {
document.getElementById(element).style.display = (show ? 'block' : 'none');
}
function addClasses(element, classes) {
for (var i = 0; i < classes.length; i++) {
if (!element.className.match(new RegExp('(?:^|\\s)' + classes[i] + '(?!\\S)', 'g')))
element.className += " " + classes[i];
}
}
function removeClasses(element, classes) {
for (var i = 0; i < classes.length; i++) {
element.className = element.className.replace(new RegExp('(?:^|\\s)' + classes[i] + '(?!\\S)', 'g'), '');
}
}
function showMsg(msg, error) {
closeMsg();
if (!msg || 0 === msg.length) { msg = _t('Please wait') + '...'; }
var e = document.getElementById('msgtxt');
e.innerHTML = msg;
if (error) {
e.style.color = 'red';
addClasses(e, ['has-error']);
} else {
e.style.color = null;
removeClasses(e, ['has-error']);
}
modal = document.getElementById('div_msg');
modal.style.display = 'block';
window.onclick = function(event) {
if (event.target == modal) {
modal.style.display = 'none';
}
}
}
function closeMsg() {
if (modal) { modal.style.display = 'none'; }
}
function sortJSON(data, key, way) {
return data.sort(function(a, b) {
var x = a[key]; var y = b[key];
if (way === 'asc' ) { return ((x < y) ? -1 : ((x > y) ? 1 : 0)); }
if (way === 'desc') { return ((x > y) ? -1 : ((x < y) ? 1 : 0)); }
});
}
function formatDuration(s, showsec) {
if (s === '-') {return '-';}
if (s === '') {return '-';}
var d = Math.floor(s/86400),
h = Math.floor(s/3600) % 24,
m = Math.floor(s/60)%60,
s = s % 60;
var time = d > 0 ? d + 'd ' : '';
if (time != '') {time += h + _t('h') + ' '} else {time = h > 0 ? h + _t('h') + ' ' : ''}
if (time != '') {time += m + 'm '} else {time = m > 0 ? m + 'm ' : ''}
if (showsec) {
time += s + 's';
} else {
if (time == '') { time += m + 'm'; }
}
return time;
}
/*****************************************************************************/
function modem(evt, modem) {
var i, tabcontent, tablinks;
tabcontent = document.getElementsByClassName("tabcontent");
for (i = 0; i < tabcontent.length; i++) {
tabcontent[i].style.display = "none";
}
tablinks = document.getElementsByClassName("tablinks");
for (i = 0; i < tablinks.length; i++) {
tablinks[i].className = tablinks[i].className.replace(" active", "");
}
document.getElementById(modem).style.display = "block";
evt.currentTarget.className += " active";
}
function showmodeminfo() {
readdata('infoproducts.sh', function(data1) {
var html = '';
if (data1.res.length > 1) {
var htmltab = '<div class="tab">';
(data1.res).forEach(function callback(value, idx) {
var id = (idx == 0 ? 'id="defaultOpen"' : '');
htmltab += '<button class="tablinks" onclick="modem(event, \'modem' + idx + '\')"' + id + '><span id="tabtitle' + idx + '"></span></button>';
html += ('<div id="modem' + idx + '" class="tabcontent">' + document.getElementById('div_template').innerHTML + '</div>').replaceAll('_idx', idx);
});
htmltab += '</div>';
setValue('div_modems', '');
document.getElementById('div_modems').insertAdjacentHTML('beforeend', htmltab + html);
document.getElementById("defaultOpen").click();
} else {
setValue('div_modems', '');
html += ('<div id="modem0">' + document.getElementById('div_template').innerHTML + '</div>').replaceAll('_idx', 0);
document.getElementById('div_modems').insertAdjacentHTML('beforeend', html);
}
(data1.res).forEach(function callback(data, idx) {
setValue('vendor' + idx, data.vendor == '' ? '-' : data.vendor);
setValue('product' + idx, data.product == '' ? '-' : data.product);
if (data1.res.length > 1) {
setValue('tabtitle' + idx, data.product == '' ? 'modem #' + (idx + 1) : data.product);
}
setValue('revision' + idx, data.revision == '' ? '-' : data.revision);
setValue('imei' + idx, data.imei == '' ? '-' : data.imei);
setValue('iccid' + idx, data.iccid == '' ? '-' : data.iccid);
setValue('imsi' + idx, data.imsi == '' ? '-' : data.imsi);
});
showmodemparams();
setInterval(showmodemparams, 10000);
});
}
var arrmodemaddon = [];
function showmodemparams() {
readdata('info.sh', function(data1) {
(data1.res).forEach(function callback(data2, idx) {
var data = data2[0];
setValue('rx' + idx, data.rx == '' ? '-' : data.rx);
setValue('tx' + idx, data.tx == '' ? '-' : data.tx);
setValue('uptime' + idx, formatDuration(data.conn_time_sec, false));
setValue('uptime_since' + idx, ' (' + _t('since') + ' ' + formatDateTimeForUptime(data.conn_time_sec) + ')');
var data = data2[1];
if (data.error)
return;
arrmodemaddon[idx] = [];
switch(data.registration) {
case "0":
setValue('registration' + idx, _t('registered0', 'Not registered'));
break;
case "1":
setValue('registration' + idx, _t('registered1', 'Registered, home network'));
break;
case "2":
setValue('registration' + idx, _t('registered2', 'Not registered, searching'));
break;
case "3":
setValue('registration' + idx, _t('registered3', 'Registration denied'));
break;
case "5":
setValue('registration' + idx, _t('registered5', 'Registered, roaming'));
break;
case "6":
setValue('registration' + idx, _t('registered6', 'Registered for SMS only, home network'));
break;
case "7":
setValue('registration' + idx, _t('registered7', 'Registered for SMS only, roaming'));
break;
default:
setValue('registration' + idx, data.registration == '' ? '-' : data.registration);
}
if (data.registration == '1' || data.registration == '5' || data.registration == '6' || data.registration == '7') {
setValue('signal' + idx, data.signal == '' ? '-' : data.signal + '%');
if (data.signal) {
var e = document.getElementById('signal_bars' + idx);
removeClasses(e, ['lzero', 'lone', 'ltwo', 'lthree', 'lfour', 'lfive', 'one-bar', 'two-bars', 'three-bars', 'four-bars', 'five-bars']);
if (data.signal >= 80) {
addClasses(e, ['lfive', 'five-bars']);
}
if (data.signal < 80 && data.signal >= 60) {
addClasses(e, ['lfour', 'four-bars']);
}
if (data.signal < 60 && data.signal >= 40) {
addClasses(e, ['lthree', 'three-bars']);
}
if (data.signal < 40 && data.signal >= 20) {
addClasses(e, ['ltwo', 'two-bars']);
}
if (data.signal < 20 && data.signal > 0) {
addClasses(e, ['lone', 'one-bar']);
}
if (data.signal == 0) {
addClasses(e, ['lzero', 'one-bar']);
}
}
setValue('operator' + idx, data.operator_name == '' ? '-' : data.operator_name);
var mode = (data.mode == '' ? '-' : data.mode);
if (mode.toLowerCase().includes('lte') || mode.toLowerCase().includes('5g')) {
if (mode.toLowerCase().includes('lte')) {
mode = (data.mode).split(' ')[0];
}
if (mode.toLowerCase().includes('5g')) {
mode = (data.mode).split(' ')[0] + ' ' + (data.mode).split(' ')[1];
}
var count = ((data.mode).match(/\//g) || []).length;
if (count > 0) {
mode += ' (' + (count + 1) + 'CA)';
}
}
setValue('mode' + idx, mode);
arrmodemaddon[idx].push({'idx':1, 'key':'Mode', 'value':data.mode});
if (data.country) {
arrmodemaddon[idx].push({'idx':19, 'key':'Country', 'value':data.country});
}
if (data.operator_mcc && data.operator_mcc != '' && data.operator_mnc && data.operator_mnc != '') {
arrmodemaddon[idx].push({'idx':20, 'key':'MCC MNC', 'value':data.operator_mcc + ' ' + data.operator_mnc});
}
if (data.lac_dec && data.lac_dec > 0) {
arrmodemaddon[idx].push({'idx':22, 'key':'LAC', 'value':data.lac_dec + ' (' + data.lac_hex + ')'});
}
if (data.cid_dec && data.cid_dec > 0) {
arrmodemaddon[idx].push({'idx':21, 'key':'Cell ID', 'value':data.cid_dec + ' (' + data.cid_hex + ')'});
}
if (data.cid_dec && data.cid_dec > 0 && data.operator_mcc == 260) {
document.getElementById('btsearch' + idx).setAttribute("href", "http://www.btsearch.pl/szukaj.php?search=" + data.cid_dec + "&siec=-1&mode=std");
setDisplay('div_btsearch' + idx, true);
} else {
setDisplay('div_btsearch' + idx, false);
}
} else {
setValue('signal' + idx, '-');
var e = document.getElementById('signal_bars' + idx);
removeClasses(e, ['lzero', 'lone', 'ltwo', 'lthree', 'lfour', 'lfive', 'one-bar', 'two-bars', 'three-bars', 'four-bars', 'five-bars']);
addClasses(e, ['lzero', 'one-bar']);
setValue('operator' + idx, '-');
setValue('mode' + idx, '-');
setDisplay('div_btsearch' + idx, false);
}
if (data.addon) {
arrmodemaddon[idx] = arrmodemaddon[idx].concat(data.addon);
}
setDisplay('div_addon' + idx, (arrmodemaddon[idx]).length > 0);
});
});
}
function paramdesc(param, value) {
var pvalue = parseInt(value.split(' ')[0]);
var description = '';
var color = '';
var title = '';
switch(param) {
case 'rssi':
if (pvalue > -65) { color = '#2bdf5a'; description += _t('excellent'); }
if (pvalue > -75 && pvalue <= -65 ) { color = '#efff12'; description += _t('good'); }
if (pvalue > -85 && pvalue <= -75 ) { color = '#f8c200'; description += _t('fair'); }
if (pvalue > -95 && pvalue <= -85 ) { color = '#fa0000'; description += _t('poor'); }
if (pvalue <= -95) { color = '#fa0000'; description += _t('very poor'); }
title += '> -65 dBm ' + _t('excellent') + '\n';
title += '> -75 dBm i <= -65 dBm ' + _t('good') + '\n';
title += '> -85 dBm i <= -75 dBm ' + _t('fair') + '\n';
title += '> -95 dBm i <= -85 dBm ' + _t('poor') + '\n';
title += '<= -95 dBm ' + _t('very poor');
break;
case 'rsrp':
if (pvalue >= -80) { color = '#2bdf5a'; description += _t('excellent'); }
if (pvalue >= -90 && pvalue < -80 ) { color = '#efff12'; description += _t('good'); }
if (pvalue >= -100 && pvalue < -90 ) { color = '#f8c200'; description += _t('fair'); }
if (pvalue < -100) { color = '#fa0000'; description += _t('poor'); }
title += '> -80 dBm ' + _t('excellent') + '\n';
title += '>= -90 dBm i < -80 dBm ' + _t('good') + '\n';
title += '>= -100 dBm i < -90 dBm ' + _t('fair') + '\n';
title += '< -100 dBm ' + _t('poor');
break;
case 'rsrq':
if (pvalue >= -10) { color = '#2bdf5a'; description += _t('excellent'); }
if (pvalue >= -15 && pvalue < -10 ) { color = '#efff12'; description += _t('good'); }
if (pvalue >= -20 && pvalue < -15 ) { color = '#f8c200'; description += _t('fair'); }
if (pvalue < -20) { color = '#fa0000'; description += _t('poor'); }
title += '>= -10 dB ' + _t('excellent') + '\n';
title += '>= -15 dB i < -10 dB ' + _t('good') + '\n';
title += '>= -20 dB i < -15 dB ' + _t('fair') + '\n';
title += '< -20 dB ' + _t('poor');
break;
}
return ', <span style="color:' + color + '" title="' + title + '">' + description + '</span>';
}
function modemaddon(idx) {
var htmlco = '';
var htmlxs = '';
var html = '';
var pcc = [];
var scc1 = [];
var scc2 = [];
var scc3 = [];
var scc4 = [];
var ulscc = [];
var sorted = sortJSON(arrmodemaddon[idx], 'idx', 'asc');
sorted.forEach(function(e) {
var description = '';
switch (e.idx) {
// MODE
case 1:
if ((e.value).search(/^LTE B/) > -1 || (e.value).search(/^LTE-A B/) > -1) {
pcc[1] = (e.value).replace(/^LTE /, '').replace(/^LTE-A /, '');
}
if ((e.value).search(/^5G/) > -1) {
pcc[1] = (e.value).replace(/^5G NSA /, '').replace(/^5G SA /, '');
}
break;
// PCC
case 30:
if ((e.value).includes(' @')) {
pcc[1] = (e.value).split(' @')[0];
pcc[2] = (e.value).split(' @')[1];
} else {
pcc[1] = e.value;
}
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 31:
pcc[2] = e.value;
htmlxs += createRowForModal(e.key, e.value);
break;
case 32:
if (typeof pcc[2] === 'undefined') {
pcc[2] = e.value;
} else {
pcc[2] = e.value + ' DL<br>' + pcc[2] + ' UL'
}
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 33:
pcc[3] = e.value;
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 34:
if ((e.key).toLowerCase().includes('earfcn ul')) {
if (typeof pcc[4] === 'undefined') {
pcc[4] = e.value + ' UL';
} else {
pcc[4] = pcc[4] + ' DL<br>' + e.value + ' UL';
}
} else {
if (typeof pcc[4] === 'undefined') {
pcc[4] = e.value;
} else {
pcc[4] = e.value + ' DL<br>' + pcc[4];
}
}
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 35:
description = paramdesc('rssi', e.value);
pcc[5] = e.value + description.replace(', ', '<br>');
htmlxs += createRowForModal(_t(e.key), e.value + description);
break;
case 36:
description = paramdesc('rsrp', e.value);
pcc[6] = e.value + description.replace(', ', '<br>');
htmlxs += createRowForModal(_t(e.key), e.value + description);
break;
case 37:
description = paramdesc('rsrq', e.value);
pcc[7] = e.value + description.replace(', ', '<br>');
htmlxs += createRowForModal(_t(e.key), e.value + description);
break;
case 38:
if ((e.key).toLowerCase().includes('sinr')) {
pcc[8] = e.value;
} else {
html += createRowForModal(_t(e.key), e.value);
}
htmlxs += createRowForModal(_t(e.key), e.value);
break;
// SCC1
case 50:
if ((e.value).includes(' @')) {
scc1[1] = (e.value).split(' @')[0];
scc1[2] = (e.value).split(' @')[1];
} else {
scc1[1] = e.value;
}
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 52:
scc1[2] = e.value;
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 53:
scc1[3] = e.value;
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 54:
if (!(e.key).toLowerCase().includes('earfcn ul')) {
scc1[4] = e.value;
} else {
html += createRowForModal(_t(e.key), e.value);
}
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 55:
description = paramdesc('rssi', e.value);
scc1[5] = e.value + description.replace(', ', '<br>');
htmlxs += createRowForModal(_t(e.key), e.value + description);
break;
case 56:
description = paramdesc('rsrp', e.value);
scc1[6] = e.value + description.replace(', ', '<br>');
htmlxs += createRowForModal(_t(e.key), e.value + description);
break;
case 57:
description = paramdesc('rsrq', e.value);
scc1[7] = e.value + description.replace(', ', '<br>');
htmlxs += createRowForModal(_t(e.key), e.value + description);
break;
case 58:
if ((e.key).toLowerCase().includes('sinr')) {
scc1[8] = e.value;
} else {
html += createRowForModal(e.key, e.value);
}
htmlxs += createRowForModal(_t(e.key), e.value);
break;
// SCC2
case 60:
if ((e.value).includes(' @')) {
scc2[1] = (e.value).split(' @')[0];
scc2[2] = (e.value).split(' @')[1];
} else {
scc2[1] = e.value;
}
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 62:
scc2[2] = e.value;
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 63:
scc2[3] = e.value;
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 64:
if (!(e.key).toLowerCase().includes('earfcn ul')) {
scc2[4] = e.value;
} else {
html += createRowForModal(_t(e.key), e.value);
}
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 65:
description = paramdesc('rssi', e.value);
scc2[5] = e.value + description.replace(', ', '<br>');
htmlxs += createRowForModal(_t(e.key), e.value + description);
break;
case 66:
description = paramdesc('rsrp', e.value);
scc2[6] = e.value + description.replace(', ', '<br>');
htmlxs += createRowForModal(_t(e.key), e.value + description);
break;
case 67:
description = paramdesc('rsrq', e.value);
scc2[7] = e.value + description.replace(', ', '<br>');
htmlxs += createRowForModal(_t(e.key), e.value + description);
break;
case 68:
if ((e.key).toLowerCase().includes('sinr')) {
scc2[8] = e.value;
} else {
html += createRowForModal(_t(e.key), e.value);
}
htmlxs += createRowForModal(_t(e.key), e.value);
break;
// SCC3
case 70:
if ((e.value).includes(' @')) {
scc3[1] = (e.value).split(' @')[0];
scc3[2] = (e.value).split(' @')[1];
} else {
scc3[1] = e.value;
}
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 72:
scc3[2] = e.value;
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 73:
scc3[3] = e.value;
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 74:
if (!(e.key).toLowerCase().includes('earfcn ul')) {
scc3[4] = e.value;
} else {
html += createRowForModal(e.key, e.value);
}
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 75:
description = paramdesc('rssi', e.value);
scc3[5] = e.value + description.replace(', ', '<br>');
htmlxs += createRowForModal(_t(e.key), e.value + description);
break;
case 76:
description = paramdesc('rsrp', e.value);
scc3[6] = e.value + description.replace(', ', '<br>');
htmlxs += createRowForModal(_t(e.key), e.value + description);
break;
case 77:
description = paramdesc('rsrq', e.value);
scc3[7] = e.value + description.replace(', ', '<br>');
htmlxs += createRowForModal(_t(e.key), e.value + description);
break;
case 78:
if ((e.key).toLowerCase().includes('sinr')) {
scc3[8] = e.value;
} else {
html += createRowForModal(_t(e.key), e.value);
}
htmlxs += createRowForModal(_t(e.key), e.value);
break;
// SCC4
case 80:
if ((e.value).includes(' @')) {
scc4[1] = (e.value).split(' @')[0];
scc4[2] = (e.value).split(' @')[1];
} else {
scc4[1] = e.value;
}
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 82:
scc4[2] = e.value;
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 83:
scc4[3] = e.value;
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 84:
if (!(e.key).toLowerCase().includes('earfcn ul')) {
scc4[4] = e.value;
} else {
html += createRowForModal(_t(e.key), e.value);
}
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 85:
description = paramdesc('rssi', e.value);
scc4[5] = e.value + description.replace(', ', '<br>');
htmlxs += createRowForModal(_t(e.key), e.value + description);
break;
case 86:
description = paramdesc('rsrp', e.value);
scc4[6] = e.value + description.replace(', ', '<br>');
htmlxs += createRowForModal(_t(e.key), e.value + description);
break;
case 87:
description = paramdesc('rsrq', e.value);
scc4[7] = e.value + description.replace(', ', '<br>');
htmlxs += createRowForModal(_t(e.key), e.value + description);
break;
case 88:
if ((e.key).toLowerCase().includes('sinr')) {
scc4[8] = e.value;
} else {
html += createRowForModal(_t(e.key), e.value);
}
htmlxs += createRowForModal(_t(e.key), e.value);
break;
case 150:
ulscc[1] = e.value;
htmlxs += createRowForModal(e.key, e.value);
break;
case 152:
ulscc[2] = e.value;
htmlxs += createRowForModal(e.key, e.value);
break;
case 153:
ulscc[3] = e.value;
htmlxs += createRowForModal(e.key, e.value);
break;
case 154:
ulscc[4] = e.value;
htmlxs += createRowForModal(e.key, e.value);
break;
default:
if (e.idx < 30) {
htmlco += createRowForModal(_t(e.key), e.value);
} else {
html += createRowForModal(_t(e.key), e.value);
htmlxs += createRowForModal(_t(e.key), e.value);
}
}
});
htmlco += '<div class="visible-xs-block visible-sm-block">' + htmlxs + '</div>';
if (pcc.length + scc1.length + scc2.length + scc3.length + scc4.length > 0) {
htmlco += '<div class="margintop hidden-xs hidden-sm">' + html;
if (pcc.length > 0) {
pcc[0] = 'PCC';
for (var idx = 0; idx <= 9; idx++) {
if (typeof pcc[idx] === 'undefined') { pcc[idx] = '-'; }
}
htmlco += createRow9ColForModal(['', _t('Band'), _t('Bandwidth'), 'PCI', 'EARFCN', 'RSSI', 'RSRP', 'RSRQ', 'SINR']);
htmlco += createRow9ColForModal(pcc);
}
if (scc1.length > 0) {
scc1[0] = 'SCC1';
for (var idx = 0; idx <= 9; idx++) {
if (typeof scc1[idx] === 'undefined') { scc1[idx] = '-'; }
}
htmlco += createRow9ColForModal(scc1);
}
if (scc2.length > 0) {
scc2[0] = 'SCC2';
for (var idx = 0; idx <= 9; idx++) {
if (typeof scc2[idx] === 'undefined') { scc2[idx] = '-'; }
}
htmlco += createRow9ColForModal(scc2);
}
if (scc3.length > 0) {
scc3[0] = 'SCC3';
for (var idx = 0; idx <= 9; idx++) {
if (typeof scc3[idx] === 'undefined') { scc3[idx] = '-'; }
}
htmlco += createRow9ColForModal(scc3);
}
if (scc4.length > 0) {
scc4[0] = 'SCC4';
for (var idx = 0; idx <= 9; idx++) {
if (typeof scc4[idx] === 'undefined') { scc4[idx] = '-'; }
}
htmlco += createRow9ColForModal(scc4);
}
if (ulscc.length > 0) {
ulscc[0] = 'UL SCC';
for (var idx = 0; idx <= 9; idx++) {
if (typeof ulscc[idx] === 'undefined') { ulscc[idx] = '-'; }
}
htmlco += createRow9ColForModal(ulscc);
}
htmlco += '</div>';
}
showMsg(htmlco);
}
/*****************************************************************************/
window.onload = info_onload;
@@ -0,0 +1,7 @@
/*!
* Generated using the Bootstrap Customizer (https://getbootstrap.com/docs/3.4/customize/)
*//*!
* Bootstrap v3.4.1 (https://getbootstrap.com/)
* Copyright 2011-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{color:#000 !important;text-shadow:none !important;background:transparent !important;-webkit-box-shadow:none !important;box-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:hover,a:focus{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.Line truncated
+53
View File
@@ -0,0 +1,53 @@
#!/bin/sh
#
# (c) 2024-2025 Cezary Jackiewicz <cezary@eko.one.pl>
#
. /lib/functions.sh
RES="/usr/share/modemdata"
ECM=""
SEPARATOR=""
parse_section() {
[ -n "$SEPARATOR" ] && echo "$SEPARATOR"
local section="$1"
config_get device "$section" device ""
config_get network "$section" network ""
config_get force_plmn "$section" force_plmn "0"
if echo "x$device" | grep -q "192.168."; then
ECM="$RES/addon/ecm/huawei.sh $device"
else
ECM=""
if [ ! -e /var/state/3ginfo-detected ]; then
[ -z "$device" ] && device=$(/usr/share/3ginfo/detectdevice.sh)
[ -z "$network" ] && network=$(/usr/share/3ginfo/detectsection.sh "$section")
fi
config_get pincode "$section" pincode ""
if [ -n "$pincode" ] && [ ! -e /var/state/3ginfo-pincode ]; then
[ -n "$device" ] && sms_tool -d "$device" at "at+cpin=\"$pincode\""
fi
fi
echo "["
$RES/network.sh "$network" | tr -d '\n'
echo ","
if [ -n "$ECM" ]; then
$ECM params
else
$RES/params.sh "$device" "$force_plmn" | tr -d '\n'
fi
echo "]"
SEPARATOR=","
}
config_load 3ginfo
echo -e "Content-type: application/json\n\n"
echo '{"res":['
config_foreach parse_section 3ginfo
echo ']}'
touch /var/state/3ginfo-detected
touch /var/state/3ginfo-pincode
exit 0
@@ -0,0 +1,42 @@
#!/bin/sh
#
# (c) 2024-2025 Cezary Jackiewicz <cezary@eko.one.pl>
#
. /lib/functions.sh
RES="/usr/share/modemdata"
SEPARATOR=""
parse_section() {
[ -n "$SEPARATOR" ] && echo "$SEPARATOR"
local section="$1"
local device
local network
config_get device "$section" device ""
if echo "x$device" | grep -q "192.168."; then
$RES/addon/ecm/huawei.sh $device product
else
if [ ! -e /var/state/3ginfo-detected ]; then
[ -z "$device" ] && device=$(/usr/share/3ginfo/detectdevice.sh)
fi
config_get pincode "$section" pincode ""
if [ -n "$pincode" ] && [ ! -e /var/state/3ginfo-pincode ]; then
[ -n "$device" ] && sms_tool -d "$device" at "at+cpin=\"$pincode\""
fi
$RES/product.sh "$device" | tr -d '\n'
fi
SEPARATOR=","
}
config_load 3ginfo
echo -e "Content-type: application/json\n\n"
echo '{"res":['
config_foreach parse_section 3ginfo
echo ']}'
touch /var/state/3ginfo-detected
touch /var/state/3ginfo-pincode
exit 0
@@ -0,0 +1,4 @@
/**
* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
*/
!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document);
@@ -0,0 +1,39 @@
{
"device": "Urządzenie",
"vendor": "Producent",
"product": "Model",
"revision": "Wersja",
"imei": "Identyfikator modemu (IMEI)",
"iccid": "Numer karty SIM (ICCID)",
"imsi": "Identyfikator abonenta (IMSI)",
"parameters": "Parametry",
"signal": "Sygnał",
"mode": "Technologia",
"simstatus": "Status karty SIM",
"more": "więcej parametrów",
"btslocation": "lokalizacja stacji bazowej",
"connection": "Połączenie z internetem",
"connectiontime": "Czas połączenia",
"tx": "Wysłano",
"rx": "Pobrano",
"registered0": "Brak sieci",
"registered1": "Zalogowana do sieci macierzystej",
"registered2": "Wyszukiwanie operatora",
"registered3": "Odmowa dostępu",
"registered5": "Zalogowana do sieci w roamingu",
"registered6": "Zalogowana do sieci macierzystej, tylko SMS",
"registered7": "Zalogowana do sieci w roamingu, tylko SMS",
"since": "od",
"h": "g",
"temperature": "Temperatura",
"band": "Pasmo",
"primaryband": "Pasmo podstawowe",
"bandwidth": "Szerokość",
"excellent": "doskonały",
"good": "dobry",
"fair": "słaby",
"poor": "zły",
"verypoor": "bardzo zły",
"pleasewait": "Proszę czekać",
"country": "Kraj"
}
@@ -0,0 +1,145 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="author" content="cezary@eko.one.pl">
<title>3G/4G/5G</title>
<link href="/bootstrap.min.css?v=1" rel="stylesheet">
<!--[if lt IE 9]>
<script src="/html5shiv.min.js?v=1"></script>
<script src="/respond.min.js?v=1"></script>
<![endif]-->
<link href="/3ginfo.css?v=1" rel="stylesheet">
<script src="/3ginfo.js?v=1"></script>
</head>
<body>
<div class="container">
<div id="div_content">
<div id="div_template" style="display:none">
<h3 class="section" data-i18n="device">Device</h3>
<div class="row">
<div class="col-xs-6 text-right" data-i18n="vendor">Vendor</div>
<div class="col-xs-6">
<p id="vendor_idx">-</p>
</div>
</div>
<div class="row">
<div class="col-xs-6 text-right" data-i18n="product">Product</div>
<div class="col-xs-6">
<p id="product_idx">-</p>
</div>
</div>
<div class="row">
<div class="col-xs-6 text-right" data-i18n="revision">Revision</div>
<div class="col-xs-6">
<p id="revision_idx">-</p>
</div>
</div>
<div class="row">
<div class="col-xs-6 text-right" data-i18n="imei">International Mobile Equipment Identity (IMEI)</div>
<div class="col-xs-6">
<p id="imei_idx">-</p>
</div>
</div>
<div class="row">
<div class="col-xs-6 text-right" data-i18n="iccid">SIM number (ICCID)</div>
<div class="col-xs-6">
<p id="iccid_idx">-</p>
</div>
</div>
<div class="row">
<div class="col-xs-6 text-right" data-i18n="imsi">International Mobile Subscriber Identity (IMSI)</div>
<div class="col-xs-6">
<p id="imsi_idx">-</p>
</div>
</div>
<h3 class="section" data-i18n="parameters">Parameters</h3>
<div class="row">
<div class="col-sm-8">
<div class="row">
<div class="col-xs-6 text-right" data-i18n="operator">Operator</div>
<div class="col-xs-6">
<p id="operator_idx">-</p>
</div>
</div>
<div class="row">
<div class="col-xs-6 text-right" data-i18n="signal">Signal</div>
<div class="col-xs-6">
<p id="signal_idx">-</p>
</div>
</div>
<div class="row">
<div class="col-xs-6 text-right" data-i18n="mode">Mode</div>
<div class="col-xs-6">
<p id="mode_idx">-</p>
</div>
</div>
<div class="row">
<div class="col-xs-6 text-right" data-i18n="simstatus">SIM status</div>
<div class="col-xs-6">
<p id="registration_idx">-</p>
</div>
</div>
<div class="row" id="div_addon_idx" style="display:none;">
<div class="col-xs-6 col-xs-offset-6">
<p><a href="#" class="click" onclick="modemaddon(_idx);" data-i18n="more">more parameters</a></p>
</div>
</div>
<div class="row" id="div_btsearch_idx" style="display:none;">
<div class="col-xs-6 col-xs-offset-6">
<p><a href="#" id="btsearch_idx" class="click" target="_blank" data-i18n="btslocation">BTS location</a>&nbsp;&rarr;</p>
</div>
</div>
</div>
<div class="col-sm-4 center-xd">
<div class="signal-bars sizing-box lzero one-bar" id="signal_bars_idx">
<div class="first-bar bar"></div>
<div class="second-bar bar"></div>
<div class="third-bar bar"></div>
<div class="fourth-bar bar"></div>
<div class="fifth-bar bar"></div>
</div>
</div>
</div>
<h3 class="section" data-i18n="connection">Connection</h3>
<div class="row">
<div class="col-xs-6 text-right" data-i18n="connectiontime">Connection time</div>
<div class="col-xs-6">
<p><span id="uptime_idx">-</span><span class="visible-xs oneline"></span><span id="uptime_since_idx"></span></p>
</div>
</div>
<div class="row">
<div class="col-xs-6 text-right" data-i18n="tx">Uploaded</div>
<div class="col-xs-6">
<p id="tx_idx">-</p>
</div>
</div>
<div class="row">
<div class="col-xs-6 text-right" data-i18n="rx">Downloaded</div>
<div class="col-xs-6">
<p id="rx_idx">-</p>
</div>
</div>
</div>
<div id="div_modems">
<div class="flex-center position-ref full-height">
<div class="flex-content">
<div data-i18n="pleasewait">Please wait</div>
</div>
</div>
</div>
</div>
<div id="div_msg" class="modal">
<div id="msgtxt" class="modal-content text-center" data-i18n="pleasewait">Please wait</div>
</div>
<div class="text-center">&nbsp;</div>
</body>
</html>
@@ -0,0 +1,5 @@
/*! Respond.js v1.4.2: min/max-width media query polyfill * Copyright 2013 Scott Jehl
* Licensed under https://github.com/scottjehl/Respond/blob/master/LICENSE-MIT
* */
!function(a){"use strict";a.matchMedia=a.matchMedia||function(a){var b,c=a.documentElement,d=c.firstElementChild||c.firstChild,e=a.createElement("body"),f=a.createElement("div");return f.id="mq-test-1",f.style.cssText="position:absolute;top:-100em",e.style.background="none",e.appendChild(f),function(a){return f.innerHTML='&shy;<style media="'+a+'"> #mq-test-1 { width: 42px; }</style>',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){u(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))};if(c.ajax=f,c.queue=d,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\([\s]*min\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/,maxw:/\([\s]*max\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var g,h,i,j=a.document,k=j.documentElement,l=[],m=[],n=[],o={},p=30,q=j.getElementsByTagName("head")[0]||k,r=j.getElementsByTagName("base")[0],s=q.getElementsByTagName("link"),t=function(){var a,b=j.createElement("div"),c=j.body,d=k.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=j.createElement("body"),c.style.background="none"),k.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&k.insertBefore(c,k.firstChild),a=b.offsetWidth,f?k.removeChild(c):c.removeChild(b),k.style.fontSize=d,e&&(c.style.fontSize=e),a=i=parseFloat(a)},u=function(b){var c="clientWidth",d=k[c],e="CSS1Compat"===j.compatMode&&d||j.body[c]||d,f={},o=s[s.length-1],r=(new Date).getTime();if(b&&g&&p>r-g)return a.clearTimeout(h),h=a.setTimeout(u,p),void 0;g=r;for(var v in l)if(l.hasOwnProperty(v)){var w=l[v],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?i||t():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?i||t():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(m[w.rules]))}for(var C in n)n.hasOwnProperty(C)&&n[C]&&n[C].parentNode===q&&q.removeChild(n[C]);n.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=j.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,q.insertBefore(E,o.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(j.createTextNode(F)),n.push(E)}},v=function(a,b,d){var e=a.replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var g=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},h=!f&&d;b.length&&(b+="/"),h&&(f=1);for(var i=0;f>i;i++){var j,k,n,o;h?(j=d,m.push(g(a))):(j=e[i].match(c.regex.findStyles)&&RegExp.$1,m.push(RegExp.$2&&g(RegExp.$2))),n=j.split(","),o=n.length;for(var p=0;o>p;p++)k=n[p],l.push({media:k.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:m.length-1,hasquery:k.indexOf("(")>-1,minw:k.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:k.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}u()},w=function(){if(d.length){var b=d.shift();f(b.href,function(c){v(c,b.href,b.media),o[b.href]=!0,a.setTimeout(function(){w()},0)})}},x=function(){for(var b=0;b<s.length;b++){var c=s[b],e=c.href,f=c.media,g=c.rel&&"stylesheet"===c.rel.toLowerCase();e&&g&&!o[e]&&(c.styleSheet&&c.styleSheet.rawCssText?(v(c.styleSheet.rawCssText,e,f),o[e]=!0):(!/^([a-zA-Z:]*\/\/)/.test(e)&&!r||e.replace(RegExp.$1,"").split("/")[0]===a.location.host)&&("//"===e.substring(0,2)&&(e=a.location.protocol+e),d.push({href:e,media:f})))}w()};x(),c.update=x,c.getEmValue=t,a.addEventListener?a.addEventListener("resize",b,!1):a.attachEvent&&a.attachEvent("onresize",b)}}(this);
@@ -0,0 +1,51 @@
opengt
set com 115200n81
set comecho off
set senddelay 0.01
waitquiet 0.01 0.01
let $c="AT+CSQ^m"
let $r="+CSQ"
gosub readatcmd
let $c="AT+COPS=3,0;+COPS?^m"
let $r="+COPS"
gosub readatcmd
let $c="AT+COPS=3,2;+COPS?^m"
let $r="+COPS"
gosub readatcmd
let $c="AT+CREG=2;+CREG?^m"
let $r="+CREG"
gosub readatcmd
let $c="AT+CPIN?^m"
let $r="+CPIN"
gosub readatcmd
exit 0
:readatcmd
let i=15
send $c
:loop
get 0.1 "^m" $s
let l=len($r)
if len($s) < l goto loop1
if $mid($s,1,l) <> $r goto loop1
print $s
return
:loop1
if len($s) < 2 goto loop2
if $mid($s,1,2) = "ER" return
if $mid($s,1,2) = "CO" return
if len($s) < 10 goto loop2
if $mid($s,1,10) != "+CME ERROR" goto loop2
print $s
return
:loop2
if i = 0 exit 0
let i=i-1
goto loop
+118
View File
@@ -0,0 +1,118 @@
#!/bin/sh
#
# (c) 2010-2019 Cezary Jackiewicz <cezary@eko.one.pl>
#
RES="/usr/share/3ginfo-lite"
DEVICE=$(uci -q get 3ginfo.@3ginfo[0].device)
if [ "x$DEVICE" = "x" ]; then
touch /tmp/modem
DEVICE=$(cat /tmp/modem)
else
echo "$DEVICE" > /tmp/modem
fi
if [ "x$DEVICE" = "x" ]; then
devices=$(ls /dev/ttyUSB* /dev/cdc-wdm* /dev/ttyACM* /dev/ttyHS* 2>/dev/null | sort -r)
for d in $devices; do
DEVICE=$d gcom -s $RES/probeport.gcom > /dev/null 2>&1
if [ $? = 0 ]; then
echo "$d" > /tmp/modem
break
fi
done
DEVICE=$(cat /tmp/modem)
fi
if [ "x$DEVICE" = "x" ]; then
echo '{"error":"Device not found"}'
exit 0
fi
O=$(gcom -d $DEVICE -s $RES/3ginfo.gcom 2>/dev/null)
# CSQ
CSQ=$(echo "$O" | awk -F[,\ ] '/^\+CSQ/ {print $2}')
[ "x$CSQ" = "x" ] && CSQ=-1
if [ $CSQ -ge 0 -a $CSQ -le 31 ]; then
CSQ_PER=$(($CSQ * 100/31))
else
CSQ="-"
CSQ_PER="0"
fi
# COPS numeric
COPS_NUM=$(echo "$O" | awk -F[\"] '/^\+COPS: .,2/ {print $2}' | head -1)
if [ "x$COPS_NUM" = "x" ]; then
COPS_NUM="-"
COPS_MCC="-"
COPS_MNC="-"
else
COPS_MCC=${COPS_NUM:0:3}
COPS_MNC=${COPS_NUM:3:3}
COPS=$(awk -F[\;] '/'$COPS_NUM'/ {print $2}' $RES/mccmnc.dat)
fi
[ "x$COPS" = "x" ] && COPS=$COPS_NUM
if [ -z "$FORCE_PLMN" ]; then
# COPS alphanumeric
T=$(echo "$O" | awk -F[\"] '/^\+COPS: .,0/ {print $2}')
[ "x$T" != "x" ] && COPS="$T"
fi
# CREG
eval $(echo "$O" | busybox awk -F[,] '/^\+CREG/ {gsub(/[[:space:]"]+/,"");printf "T=\"%d\";LAC_HEX=\"%X\";CID_HEX=\"%X\";LAC_DEC=\"%d\";CID_DEC=\"%d\";MODE1=\"%d\"", $2, "0x"$3, "0x"$4, "0x"$3, "0x"$4, $5}')
case "$T" in
0*) REG="0";;
1*) REG="1";;
2*) REG="2";;
3*) REG="3";;
5*) REG="5";;
*) REG="-";;
esac
# MODE
[ -z "$MODE1" -o "x$MODE1" = "x0" ] && MODE1=$(echo "$O" | awk -F[,] '/^\+COPS/ {print $4;exit}')
case "$MODE1" in
2*) MODE="UMTS";;
3*) MODE="EDGE";;
4*) MODE="HSDPA";;
5*) MODE="HSUPA";;
6*) MODE="HSPA";;
7*) MODE="LTE";;
*) MODE="-";;
esac
T=$(echo "$O" | awk -F[,\ ] '/^\+CME ERROR:/ {print $0;exit}')
if [ -n "$T" ]; then
case "$T" in
"+CME ERROR: 10"*) REG="SIM not inserted";;
"+CME ERROR: 11"*) REG="SIM PIN required";;
"+CME ERROR: 12"*) REG="SIM PUK required";;
"+CME ERROR: 13"*) REG="SIM failure";;
"+CME ERROR: 14"*) REG="SIM busy";;
"+CME ERROR: 15"*) REG="SIM wrong";;
"+CME ERROR: 17"*) REG="SIM PIN2 required";;
"+CME ERROR: 18"*) REG="SIM PUK2 required";;
*) REG=$(echo "$T" | cut -f2 -d: | xargs);;
esac
fi
cat <<EOF
{
"csq":"$CSQ",
"signal":"$CSQ_PER",
"operator_name":"$COPS",
"operator_mcc":"$COPS_MCC",
"operator_mnc":"$COPS_MNC",
"mode":"$MODE",
"registration":"$REG",
"lac_dec":"$LAC_DEC",
"lac_hex":"$LAC_HEX",
"cid_dec":"$CID_DEC",
"cid_hex":"$CID_HEX"
}
EOF
exit 0
+9
View File
@@ -0,0 +1,9 @@
#!/bin/sh
echo "Content-type: application/json"
echo ""
if [ -e /dev/cdc-wdm0 ]; then
uqmi -s -d /dev/cdc-wdm0 --get-signal-info | sed 's/"type":"hdr".*,"type"/"type"/g'
else
echo "{}"
fi
exit 0
+42
View File
@@ -0,0 +1,42 @@
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Status" />
<meta name="author" content="Cezary Jackiewicz">
<title>QMI</title>
<link rel="icon" href="/favicon.ico">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body>
<div class="container">
<p> </p>
<table class='table table-condensed table-striped'>
<colgroup><col class='col-xs-4'><col class='col-xs-2'><col class='col-xs-2'><col class='col-xs-2'><col class='col-xs-2'></colgroup>
<thead><tr><th>Parametr</th><th>Wartość</th><th>Min</th><th>Max</th><th>Jednostka</th></tr></thead>
<tbody>
<tr><td><span id='key1'>&nbsp;</span></td><td><span id='val1'></span></td><td><span id='min1'></span></td><td><span id='max1'></span></td><td><span id='unit1'></span></td></tr>
<tr><td><span id='key2'>&nbsp;</span></td><td><span id='val2'></span></td><td><span id='min2'></span></td><td><span id='max2'></span></td><td><span id='unit2'></span></td></tr>
<tr><td><span id='key3'>&nbsp;</span></td><td><span id='val3'></span></td><td><span id='min3'></span></td><td><span id='max3'></span></td><td><span id='unit3'></span></td></tr>
<tr><td><span id='key4'>&nbsp;</span></td><td><span id='val4'></span></td><td><span id='min4'></span></td><td><span id='max4'></span></td><td><span id='unit4'></span></td></tr>
<tr><td><span id='key5'>&nbsp;</span></td><td><span id='val5'></span></td><td><span id='min5'></span></td><td><span id='max5'></span></td><td><span id='unit5'></span></td></tr>
</tbody>
</table>
<div id="div_g" style="width:100%; height:300px;"><p class="text-center">Trwa zbieranie danych...</p></div>
<p><i>Interwał 3s, okno 15 minut.</i></p>
</div>
<script src="https://code.jquery.com/jquery-1.12.4.min.js" integrity="sha384-nvAa0+6Qg9clwYCGGPpDQLVpLNn0fRaROjHqs13t4Ggj3Ez50XnGQqc/r8MhnRDZ" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/dygraph/1.1.1/dygraph-combined.js"></script>
<script src="/qmisignal.js"></script>
</body>
</html>
+102
View File
@@ -0,0 +1,102 @@
var data = [];
var g;
var min = [], max = [];
var colors = [];
colors['signal'] = '#333';
colors['rssi'] = '#333';
colors['rsrp'] = '#333';
colors['ecio'] = '#333';
colors['rsrq'] = '#333';
colors['snr'] = '#333';
window.intervalId = setInterval(function() {
$.getJSON( "/cgi-bin/qmisignal.sh", function(data1) {
var idx=0
$.each(data1, function(i, val) {
idx++;
unit='';
if (!min[i]) {min[i]=999;max[i]=-999;}
switch(i) {
case "type":
val=(val).toUpperCase();
break;
case "signal":
case "rssi":
case "rsrp":
if (val < min[i]) {min[i] = val;}
if (val > max[i]) {max[i] = val;}
unit='dBm'
break;
case "ecio":
case "rsrq":
case "snr":
if (val < min[i]) {min[i] = val;}
if (val > max[i]) {max[i] = val;}
unit='dB'
break;
}
$("#key"+idx).text(''+i);
$("#val"+idx).text(''+val);
$('#val'+idx).css('color', colors[i]);
$("#unit"+idx).text(''+unit);
$('#unit'+idx).css('color', colors[i]);
if (i != 'type')
{
$("#min"+idx).text(''+min[i]);
$('#min'+idx).css('color', colors[i]);
$("#max"+idx).text(''+max[i]);
$('#max'+idx).css('color', colors[i]);
}
});
data.push([new Date(),
data1["signal"],
data1["rssi"],
data1["rsrp"],
data1["ecio"],
data1["rsrq"],
data1["snr"]
]);
if (data.length > 300) {data.shift();}
if (g==null) {
g = new Dygraph(document.getElementById("div_g"), data, {
drawPoints: false,
showRoller: false,
labels: ['', 'Signal', 'RSSI', 'RSRP', 'ECIO', 'RSRQ', 'SNR'],
labelsSeparateLines: true,
ylabel: 'RSSI, RSRP [dBm]',
y2label: 'ECIO, RSRQ, SNR [dB]',
series : {
'ECIO': {axis: 'y2'},
'RSRQ': {axis: 'y2'},
'SNR': {axis: 'y2'}
},
axes: {
y: {independentTicks: true},
y2: {
independentTicks: true,
ticker: Dygraph.numericLinearTicks,
drawGrid: true,
gridLineColor: "#ff0000",
gridLinePattern: [4,4]
}
}
});
var tcolors = g.getColors();
colors['signal'] = tcolors[0];
colors['rssi'] = tcolors[1];
colors['rsrp'] = tcolors[2];
colors['ecio'] = tcolors[3];
colors['rsrq'] = tcolors[4];
colors['snr'] = tcolors[5];
} else {
g.updateOptions({'file':data});
}
});
}, 3000);
+7
View File
@@ -0,0 +1,7 @@
config 3ginfo
option device ''
option http_port '81'
option language 'pl'
option network 'wan'
option pincode ''
+4
View File
@@ -0,0 +1,4 @@
case "$ACTION" in
remove)
[ -f /tmp/pincode_was_given ] && rm -f /tmp/pincode_was_given;;
esac
+4
View File
@@ -0,0 +1,4 @@
#!/bin/sh
ln -s /usr/share/3ginfo/cgi-bin/3ginfo.sh /usr/bin/3ginfo
exit 0
+598
View File
@@ -0,0 +1,598 @@
#!/bin/sh
#
# (c) 2010-2019 Cezary Jackiewicz <cezary@eko.one.pl>
#
# Output format
# 0 - html
# 1 - txt
# 2 - json
FORMAT=1
RES="/usr/share/3ginfo"
LANG=$(uci -q get 3ginfo.@3ginfo[0].language)
[ "x$LANG" = "x" ] && LANG="en"
getpath() {
devname="$(basename "$1")"
case "$devname" in
'tty'*)
devpath="$(readlink -f /sys/class/tty/$devname/device)"
P=${devpath%/*/*}
;;
*)
devpath="$(readlink -f /sys/class/usbmisc/$devname/device/)"
P=${devpath%/*}
;;
esac
}
showjsonerror() {
echo "{\"error\": \"$1\"}"
}
if [ "x$1" = "xjson" ]; then
FORMAT=2
else
if [ "`basename $0`" = "3ginfo" ]; then
FORMAT=1
else
FORMAT=0
echo -e "Content-type: text/html\n\n"
fi
if [ ! -e $RES/msg.dat.$LANG ]; then
echo "File missing: $RES/msg.dat.$LANG"
exit 0
fi
. $RES/msg.dat.$LANG
fi
# odpytanie urzadzenia
DEVICE=$(uci -q get 3ginfo.@3ginfo[0].device)
if echo "x$DEVICE" | grep -q "192.168."; then
if grep -q "Vendor=1bbb" /sys/kernel/debug/usb/devices; then
O=$($RES/scripts/alcatel_hilink.sh $DEVICE)
fi
if grep -q "Vendor=12d1" /sys/kernel/debug/usb/devices; then
O=$($RES/scripts/huawei_hilink.sh $DEVICE)
fi
if grep -q "Vendor=19d2" /sys/kernel/debug/usb/devices; then
O=$($RES/scripts/zte.sh $DEVICE)
fi
SEC=$(uci -q get 3ginfo.@3ginfo[0].network)
SEC=${SEC:-wan}
else
if [ "x$DEVICE" = "x" ]; then
devices=$(ls /dev/ttyUSB* /dev/cdc-wdm* /dev/ttyACM* /dev/ttyHS* 2>/dev/null | sort -r);
for d in $devices; do
DEVICE=$d gcom -s $RES/scripts/probeport.gcom > /dev/null 2>&1
if [ $? = 0 ]; then
uci set 3ginfo.@3ginfo[0].device="$d"
uci commit 3ginfo
break
fi
done
DEVICE=$(uci -q get 3ginfo.@3ginfo[0].device)
fi
if [ "x$DEVICE" = "x" ]; then
[ $FORMAT -eq 0 ] && echo "<h3 style='color:red;' class=\"c\">$NOTDETECTED</h3>"
[ $FORMAT -eq 1 ] && echo $NOTDETECTED
[ $FORMAT -eq 2 ] && showjsonerror "NOTDETECTED"
exit 0
fi
if [ ! -e $DEVICE ]; then
[ $FORMAT -eq 0 ] && echo "<h3 style='color:red;' class=\"c\">$NODEVICE $DEVICE!</h3>"
[ $FORMAT -eq 1 ] && echo "$NODEVICE $DEVICE."
[ $FORMAT -eq 2 ] && showjsonerror "NODEVICE $DEVICE"
exit 0
fi
# znajdz odpowiednia sekcje w konfiguracji
SEC=$(uci -q get 3ginfo.@3ginfo[0].network)
if [ -z "$SEC" ]; then
getpath $DEVICE
PORIG=$P
for DEV in /sys/class/tty/* /sys/class/usbmisc/*; do
getpath "/dev/"${DEV##/*/}
if [ "x$PORIG" = "x$P" ]; then
SEC=$(uci show network | grep "/dev/"${DEV##/*/} | cut -f2 -d.)
[ -n "$SEC" ] && break
fi
done
fi
# [ "${DEVICE%%[0-9]}" = "/dev/ttyUSB" ] && stty -F $DEVICE -iexten -opost -icrnl
# daj pin jak jest taka potrzeba
if [ ! -f /tmp/pincode_was_given ]; then
# tylko za pierwszym razem
if [ ! -z $SEC ]; then
PINCODE=$(uci -q get network.$SEC.pincode)
fi
if [ -z "$PINCODE" ]; then
PINCODE=$(uci -q get 3ginfo.@3ginfo[0].pincode)
fi
if [ ! -z $PINCODE ]; then
PINCODE="$PINCODE" gcom -d "$DEVICE" -s /etc/gcom/setpin.gcom > /dev/null || {
[ $FORMAT -eq 0 ] && echo "<h3 style='color:red;' class=\"c\">$PINERROR</h3>"
[ $FORMAT -eq 1 ] && echo "$PINERROR"
[ $FORMAT -eq 2 ] && showjsonerror "PINERROR"
exit 0
}
fi
touch /tmp/pincode_was_given
fi
O=$(gcom -d $DEVICE -s $RES/scripts/3ginfo.gcom 2>/dev/null)
fi
if [ "x$1" = "xtest" ]; then
echo "$O"
echo "---------------------------------------------------------------"
ls /dev/tty*
echo "---------------------------------------------------------------"
cat /sys/kernel/debug/usb/devices
echo "---------------------------------------------------------------"
uci show 3ginfo
exit 0
fi
# CSQ
CSQ=$(echo "$O" | awk -F[,\ ] '/^\+CSQ/ {print $2}')
[ "x$CSQ" = "x" ] && CSQ=-1
if [ $CSQ -ge 0 -a $CSQ -le 31 ]; then
# for Gargoyle
[ -e /tmp/strength.txt ] && echo "+CSQ: $CSQ,99" > /tmp/strength.txt
CSQ_PER=$(($CSQ * 100/31))
CSQ_COL="red"
[ $CSQ -ge 10 ] && CSQ_COL="orange"
[ $CSQ -ge 15 ] && CSQ_COL="yellow"
[ $CSQ -ge 20 ] && CSQ_COL="green"
CSQ_RSSI=$((2 * CSQ - 113))
else
CSQ="-"
CSQ_PER="0"
CSQ_COL="black"
CSQ_RSSI="-"
fi
# COPS
COPS_NUM=$(echo "$O" | awk -F[\"] '/^\+COPS: .,2/ {print $2}')
if [ "x$COPS_NUM" = "x" ]; then
COPS_NUM="-"
COPS_MCC="-"
COPS_MNC="-"
else
COPS_MCC=${COPS_NUM:0:3}
COPS_MNC=${COPS_NUM:3:3}
COPS=$(awk -F[\;] '/'$COPS_NUM'/ {print $2}' $RES/mccmnc.dat)
[ "x$COPS" = "x" ] && COPS="-"
fi
# dla modemow Option i ZTE
if [ "$COPS_NUM" = "-" ]; then
COPS=$(echo "$O" | awk -F[\"] '/^\+COPS: .,0/ {print $2}')
[ "x$COPS" = "x" ] && COPS="---"
COPS_TMP=$(awk -F[\;] 'BEGIN {IGNORECASE = 1} /'"$COPS"'/ {print $2}' $RES/mccmnc.dat)
if [ "x$COPS_TMP" = "x" ]; then
COPS_NUM="-"
COPS_MCC="-"
COPS_MNC="-"
else
COPS="$COPS_TMP"
COPS_NUM=$(awk -F[\;] 'BEGIN {IGNORECASE = 1} /'"$COPS"'/ {print $1}' $RES/mccmnc.dat)
COPS_MCC=${COPS_NUM:0:3}
COPS_MNC=${COPS_NUM:3:3}
fi
fi
# Technologia
MODE="-"
# Nowe Huawei
TECH=$(echo "$O" | awk -F[,] '/^\^SYSINFOEX/ {print $9}' | sed 's/"//g')
if [ "x$TECH" != "x" ]; then
MODE=$(echo "$TECH" | sed 's/-//g')
fi
# Starsze modele Huawei i inne pozostale
if [ "x$MODE" = "x-" ]; then
TECH=$(echo "$O" | awk -F[,] '/^\^SYSINFO/ {print $7}')
case $TECH in
17*) MODE="HSPA+ (64QAM)";;
18*) MODE="HSPA+ (MIMO)";;
1*) MODE="GSM";;
2*) MODE="GPRS";;
3*) MODE="EDGE";;
4*) MODE="UMTS";;
5*) MODE="HSDPA";;
6*) MODE="HSUPA";;
7*) MODE="HSPA";;
9*) MODE="HSPA+";;
*) MODE="-";;
esac
fi
# ZTE
if [ "x$MODE" = "x-" ]; then
TECH=$(echo "$O" | awk -F[,\ ] '/^\+ZPAS/ {print $2}' | sed 's/"//g')
if [ "x$TECH" != "x" -a "x$TECH" != "xNo" ]; then
MODE="$TECH"
fi
fi
# OPTION
if [ "x$MODE" = "x-" ]; then
TECH=$(echo "$O" | awk -F, '/^\+COPS: 0/ {print $4}')
MODE="-"
if [ "$TECH" = 0 ]; then
TECH1=$(echo "$O" | awk '/^_OCTI/ {print $2}' | cut -f1 -d,)
case $TECH1 in
1*) MODE="GSM";;
2*) MODE="GPRS";;
3*) MODE="EDGE";;
*) MODE="-";;
esac
elif [ "$TECH" = 2 ]; then
TECH1=$(echo "$O" | awk '/^_OWCTI/ {print $2}')
case $TECH1 in
1*) MODE="UMTS";;
2*) MODE="HSDPA";;
3*) MODE="HSUPA";;
4*) MODE="HSPA";;
*) MODE="-";;
esac
fi
fi
# Sierra
if [ "x$MODE" = "x-" ]; then
TECH=$(echo "$O" | awk -F[,\ ] '/^\*CNTI/ {print $3}' | sed 's|/|,|g')
if [ "x$TECH" != "x" ]; then
MODE="$TECH"
fi
fi
# Novatel
if [ "x$MODE" = "x-" ]; then
TECH=$(echo "$O" | awk -F[,\ ] '/^\$CNTI/ {print $4}' | sed 's|/|,|g')
if [ "x$TECH" != "x" ]; then
MODE="$TECH"
fi
fi
# Vodafone - icera
if [ "x$MODE" = "x-" ]; then
TECH=$(echo "$O" | awk -F[,\ ] '/^\%NWSTATE/ {print $4}' | sed 's|/|,|g')
if [ "x$TECH" != "x" ]; then
MODE="$TECH"
fi
fi
# SIMCOM
if [ "x$MODE" = "x-" ]; then
TECH=$(echo "$O" | awk -F[,\ ] '/^\+CNSMOD/ {print $3}')
case "$TECH" in
1*) MODE="GSM";;
2*) MODE="GPRS";;
3*) MODE="EDGE";;
4*) MODE="UMTS";;
5*) MODE="HSDPA";;
6*) MODE="HSUPA";;
7*) MODE="HSPA";;
*) MODE="-";;
esac
fi
# generic 3GPP TS 27.007 V10.4.0
if [ "x$MODE" = "x-" ]; then
TECH=$(echo "$O" | awk -F[,] '/^\+COPS/ {print $4}')
case "$TECH" in
2*) MODE="UMTS";;
3*) MODE="EDGE";;
4*) MODE="HSDPA";;
5*) MODE="HSUPA";;
6*) MODE="HSPA";;
7*) MODE="LTE";;
*) MODE="-";;
esac
fi
# CREG
CREG="+CGREG"
LAC=$(echo "$O" | awk -F[,] '/\'$CREG'/ {printf "%s", toupper($3)}' | sed 's/[^A-F0-9]//g')
if [ "x$LAC" = "x" ]; then
CREG="+CREG"
LAC=$(echo "$O" | awk -F[,] '/\'$CREG'/ {printf "%s", toupper($3)}' | sed 's/[^A-F0-9]//g')
fi
if [ "x$LAC" != "x" ]; then
LAC_NUM=$(printf %d 0x$LAC)
else
LAC="-"
LAC_NUM="-"
fi
# TAC
TAC=$(echo "$O" | awk -F[,] '/^\+CEREG/ {printf "%s", toupper($3)}' | sed 's/[^A-F0-9]//g')
if [ "x$TAC" != "x" ]; then
TAC_NUM=$(printf %d 0x$TAC)
else
TAC="-"
TAC_NUM="-"
fi
# ECIO / RSCP
ECIO="-"
RSCP="-"
ECIx=$(echo "$O" | awk -F[,\ ] '/^\+ZRSSI:/ {print $3}')
if [ "x$ECIx" != "x" ]; then
ECIO=`expr $ECIx / 2`
ECIO="-"$ECIO
fi
RSCx=$(echo "$O" | awk -F[,\ ] '/^\+ZRSSI:/ {print $4}')
if [ "x$RSCx" != "x" ]; then
RSCP=`expr $RSCx / 2`
RSCP="-"$RSCP
fi
RSCx=$(echo "$O" | awk -F[,\ ] '/^\^CSNR:/ {print $2}')
if [ "x$RSCx" != "x" ]; then
RSCP=$RSCx
fi
ECIx=$(echo "$O" | awk -F[,\ ] '/^\^CSNR:/ {print $3}')
if [ "x$ECIx" != "x" ]; then
ECIO=$ECIx
fi
# RSRP / RSRQ
RSRP="-"
RSRQ="-"
SINR="-"
RSRx=$(echo "$O" | awk -F[,:] '/^\^LTERSRP:/ {print $2}')
if [ "x$RSRx" != "x" ]; then
RSRP=$RSRx
RSRQ=$(echo "$O" | awk -F[,:] '/^\^LTERSRP:/ {print $3}')
fi
TECH=$(echo "$O" | awk -F[,:] '/^\^HCSQ:/ {print $2}' | sed 's/[" ]//g')
if [ "x$TECH" != "x" ]; then
PARAM2=$(echo "$O" | awk -F[,:] '/^\^HCSQ:/ {print $4}')
PARAM3=$(echo "$O" | awk -F[,:] '/^\^HCSQ:/ {print $5}')
PARAM4=$(echo "$O" | awk -F[,:] '/^\^HCSQ:/ {print $6}')
case "$TECH" in
WCDMA*)
RSCP=$(awk 'BEGIN {print -121 + '$PARAM2'}')
ECIO=$(awk 'BEGIN {print -32.5 + '$PARAM3'/2}')
;;
LTE*)
RSRP=$(awk 'BEGIN {print -141 + '$PARAM2'}')
SINR=$(awk 'BEGIN {print -20.2 + '$PARAM3'/5}')
RSRQ=$(awk 'BEGIN {print -20 + '$PARAM4'/2}')
;;
esac
fi
if [ -n "$SEC" ]; then
if [ "x$(uci -q get network.$SEC.proto)" = "xqmi" ]; then
. /usr/share/libubox/jshn.sh
json_init
json_load "$(uqmi -d "$(uci -q get network.$SEC.device)" --get-signal-info)" >/dev/null 2>&1
json_get_var T type
if [ "x$T" = "xlte" ]; then
json_get_var RSRP rsrp
json_get_var RSRQ rsrq
fi
if [ "x$T" = "xwcdma" ]; then
json_get_var ECIO ecio
json_get_var RSSI rssi
json_get_var RSCP rscp
if [ -z "$RSCP" ]; then
RSCP=$((RSSI+ECIO))
fi
fi
fi
fi
BTSINFO=""
CID=$(echo "$O" | awk -F[,] '/\'$CREG'/ {printf "%s", toupper($4)}' | sed 's/[^A-F0-9]//g')
if [ "x$CID" != "x" ]; then
CID_NUM=$(printf %d 0x$CID)
if [ ${#CID} -gt 4 ]; then
T=$(echo "$CID" | awk '{print substr($1,length(substr($1,1,length($1)-4))+1)}')
else
T=$CID
fi
CLF=$(uci -q get 3ginfo.@3ginfo[0].clf)
if [ -e "$CLF" ]; then
PAT="xxx"
[ "x$T" != "x-" -a "x$LAC_NUM" != "x-" ] && PAT="^$COPS_NUM;0x"$(printf %04X 0x$T)";0x"$(printf %04X $LAC_NUM)";"
is_gz=$(dd if="$CLF" bs=1 count=2 2>/dev/null | hexdump -v -e '1/1 "%02x"')
if [ "x$is_gz" = "x1f8b" ] ; then
BTSINFO="<a href=\"http://maps.google.pl/?t=k\&z=17\&q="$(zcat "$CLF" | awk -F";" '/'$PAT'/ {printf $5","$6}')"\">"$(zcat "$CLF" | awk -F";" '/'$PAT'/ {gsub(/\!/,"\\!");print $8}')"</a>"
else
BTSINFO="<a href=\"http://maps.google.pl/?t=k\&z=17\&q="$(awk -F";" '/'$PAT'/ {printf $5","$6}' "$CLF")"\">"$(awk -F";" '/'$PAT'/ {gsub(/\!/,"\\!");print $8}' "$CLF")"</a>"
fi
if [ $FORMAT -eq 2 ]; then
BTSINFO=$(echo "$BTSINFO" | sed 's!<a.*>\(.*\)</a>!\1!g')
fi
fi
if [ $FORMAT -eq 0 ]; then
case $COPS_NUM in
26001*) CID="<a href=\"http://btsearch.pl/szukaj.php?search="$CID"h\&amp;siec=3\&amp;mode=adv\">$CID</a>";;
26002*) CID="<a href=\"http://btsearch.pl/szukaj.php?search="$CID"h\&amp;siec=-1\&amp;mode=adv\">$CID</a>";;
26003*) CID="<a href=\"http://btsearch.pl/szukaj.php?search="$CID"h\&amp;siec=-1\&amp;mode=adv\">$CID</a>";;
26006*) CID="<a href=\"http://btsearch.pl/szukaj.php?search="$CID"h\&amp;siec=4\&amp;mode=adv\">$CID</a>";;
26016*) CID="<a href=\"http://btsearch.pl/szukaj.php?search="$CID"h\&amp;siec=7\&amp;mode=adv\">$CID</a>";;
26017*) CID="<a href=\"http://btsearch.pl/szukaj.php?search="$CID"h\&amp;siec=8\&amp;mode=adv\">$CID</a>";;
esac
fi
else
CID="-"
CID_NUM="-"
fi
# CGEQNEG
QOS_SHOW="none"
DOWN="-"
UP="-"
DOWx=$(echo "$O" | awk -F[,] '/\+CGEQNEG/ {printf "%s", $4}')
if [ "x$DOWx" != "x" ]; then
DOWN=$DOWx
UP=$(echo "$O" | awk -F[,] '/\+CGEQNEG/ {printf "%s", $3}')
QOS_SHOW="block"
fi
# SMS
if [ -e /usr/bin/gnokii ]; then
SMS_SHOW="block"
else
SMS_SHOW="none"
fi
# USSD
which ussd159 >/dev/null 2>&1
if [ $? -eq 0 ]; then
USSD_SHOW="block"
else
USSD_SHOW="none"
fi
# Stan limitu
LIMIT_SHOW="none"
LIMIT=$(uci -q get 3ginfo.@3ginfo[0].script)
if [ "x$LIMIT" != "x" ]; then
LIMIT_SHOW="block"
fi
# Status polaczenia
CONN_TIME="-"
RX="-"
TX="-"
if [ -z "$SEC" ]; then
STATUS=$NOINFO
[ $FORMAT -eq 2 ] && STATUS="NOINFO"
STATUS_TRE="-"
STATUS_SHOW="none"
STATUS_SHOW_BUTTON="none"
else
NETUP=$(ifstatus $SEC | grep "\"up\": true")
if [ -n "$NETUP" ]; then
[ $FORMAT -eq 0 ] && STATUS="<font color=green>$CONNECTED</font>"
[ $FORMAT -eq 1 ] && STATUS=$CONNECTED
[ $FORMAT -eq 2 ] && STATUS="CONNECTED"
STATUS_TRE=$DISCONNECT
CT=$(uci -q -P /var/state/ get network.$SEC.connect_time)
if [ -z $CT ]; then
CT=$(ifstatus $SEC | awk -F[:,] '/uptime/ {print $2}' | xargs)
else
UPTIME=$(cut -d. -f1 /proc/uptime)
CT=$((UPTIME-CT))
fi
if [ ! -z $CT ]; then
D=$(expr $CT / 60 / 60 / 24)
H=$(expr $CT / 60 / 60 % 24)
M=$(expr $CT / 60 % 60)
S=$(expr $CT % 60)
CONN_TIME=$(printf "%dd, %02d:%02d:%02d" $D $H $M $S)
fi
IFACE=$(ifstatus $SEC | awk -F\" '/l3_device/ {print $4}')
if [ -n "$IFACE" ]; then
RX=$(ifconfig $IFACE | awk -F[\(\)] '/bytes/ {printf "%s",$2}')
TX=$(ifconfig $IFACE | awk -F[\(\)] '/bytes/ {printf "%s",$4}')
fi
else
[ $FORMAT -eq 0 ] && STATUS="<font color=red>$DISCONNECTED</font>"
[ $FORMAT -eq 1 ] && STATUS=$DISCONNECTED
[ $FORMAT -eq 2 ] && STATUS="DISCONNECTED"
STATUS_TRE=$CONNECT
fi
STATUS_SHOW="block"
STATUS_SHOW_BUTTON="block"
fi
if [ "x"$(uci -q get 3ginfo.@3ginfo[0].connect_button) = "x0" ]; then
STATUS_SHOW_BUTTON="none"
fi
# Informacja o urzadzeniu
DEVICE=$(echo "$O" | awk -F[:] '/DEVICE/ { print $2}')
if [ "x$DEVICE" = "x" ]; then
DEVICE="-"
fi
# podmiana w szablonie
if [ $FORMAT -eq 2 ]; then
TEMPLATE="$RES/status.json"
else
[ $FORMAT -eq 0 ] && EXT="html"
[ $FORMAT -eq 1 ] && EXT="txt"
TEMPLATE="$RES/status.$EXT.$LANG"
fi
if [ -e $TEMPLATE ]; then
sed -e "s!{CSQ}!$CSQ!g; \
s!{CSQ_PER}!$CSQ_PER!g; \
s!{CSQ_RSSI}!$CSQ_RSSI!g; \
s!{CSQ_COL}!$CSQ_COL!g; \
s!{COPS}!$COPS!g; \
s!{COPS_NUM}!$COPS_NUM!g; \
s!{COPS_MCC}!$COPS_MCC!g; \
s!{COPS_MNC}!$COPS_MNC!g; \
s!{LAC}!$LAC!g; \
s!{LAC_NUM}!$LAC_NUM!g; \
s!{CID}!$CID!g; \
s!{CID_NUM}!$CID_NUM!g; \
s!{TAC}!$TAC!g; \
s!{TAC_NUM}!$TAC_NUM!g; \
s!{BTSINFO}!$BTSINFO!g; \
s!{DOWN}!$DOWN!g; \
s!{UP}!$UP!g; \
s!{QOS_SHOW}!$QOS_SHOW!g; \
s!{SMS_SHOW}!$SMS_SHOW!g; \
s!{USSD_SHOW}!$USSD_SHOW!g; \
s!{LIMIT_SHOW}!$LIMIT_SHOW!g; \
s!{STATUS}!$STATUS!g; \
s!{CONN_TIME}!$CONN_TIME!g; \
s!{CONN_TIME_SEC}!$CT!g; \
s!{RX}!$RX!g; \
s!{TX}!$TX!g; \
s!{STATUS_TRE}!$STATUS_TRE!g; \
s!{STATUS_SHOW}!$STATUS_SHOW!g; \
s!{STATUS_SHOW_BUTTON}!$STATUS_SHOW_BUTTON!g; \
s!{DEVICE}!$DEVICE!g; \
s!{ECIO}!$ECIO!g; \
s!{RSCP}!$RSCP!g; \
s!{RSRP}!$RSRP!g; \
s!{RSRQ}!$RSRQ!g; \
s!{SINR}!$SINR!g; \
s!{MODE}!$MODE!g" $TEMPLATE
else
echo "Template $TEMPLATE missing!"
fi
exit 0
@@ -0,0 +1,39 @@
22234;BT Italia SpA
22202;Elsacom
22299;H3G
22233;H3G
22277;IPSE 2000
22235;Lycamobile Srl
22207;Noverca Italia Srl
22230;RFI Rete Ferroviaria Italiana SpA
22243;Telecom Italia Mobile SpA
22201;TIM
22248;Telecom Italia Mobile SpA
22210;Vodafone
22206;Vodafone
22244;WIND
22288;WIND
26001;Plus
26002;T-Mobile;T-Mobile.pl
26003;Orange;PTK Centertel;Orange PL
26006;Play;Play Fakt Mobile
26016;Mobyland LTE;Cyfrowy Polsat
26017;Aero2
26034;NetWorks
24801;Telia
24802;Elisa
24803;Tele2
51001;Indosat Ooredoo
51003;StarOne
51007;TelkomFlexi
51008;AXIS
51009;Smartfren
51010;Telkomsel
51011;XL 4G
51020;TELKOMMobile
51021;IM3
51027;Ceria
51028;Fren/Hepi
51088;BOLT! Super 4G
51089;3
51099;Esia
@@ -0,0 +1,8 @@
NOTDETECTED="Not detected any device"
NODEVICE="No device"
PINERROR="PIN code error"
CONNECTED="Connected"
CONNECT="Connect"
DISCONNECTED="Disconnected"
DISCONNECT="Disconnect"
NOINFO="No information"
@@ -0,0 +1,8 @@
NOTDETECTED="Ei tuvastatud ühtegi seadet"
NODEVICE="Seade puudub"
PINERROR="PIN-koodi viga"
CONNECTED="Ühendatud"
CONNECT="Ühenda"
DISCONNECTED="Lahti ühendatud"
DISCONNECT="Ühenda lahti"
NOINFO="Pole informatsiooni"
@@ -0,0 +1,8 @@
NOTDETECTED="Nessun dispositivo trovato"
NODEVICE="Nessun dispositivo"
PINERROR="Errore codice PIN"
CONNECTED="Connesso"
CONNECT="Connetti"
DISCONNECTED="Disconnesso"
DISCONNECT="Disconnetti"
NOINFO="Nessuna Informazione"
@@ -0,0 +1,8 @@
NOTDETECTED="Nie wykryto żadnego urządzenia!"
NODEVICE="Brak urządzenia"
PINERROR="Błąd kodu PIN"
CONNECTED="Połączony"
CONNECT="Połącz"
DISCONNECTED="Rozłączony"
DISCONNECT="Rozłącz"
NOINFO="Brak informacji"
@@ -0,0 +1,176 @@
opengt
set com 115200n81
set comecho off
set senddelay 0.02
waitquiet 0.2 0.2
send "AT\^CURC=0^m"
waitfor 5 "OK","ERROR"
let $c="AT+CSQ^m"
let $r="+CSQ"
gosub readatcmd
let $c="ATE1; +CGMI^m"
gosub readatcmdnr
let $v=$s
if $toupper($mid($v,0,3)) = "HUA" goto huawei
if $toupper($mid($v,0,3)) = "NOK" goto vodafone
if $toupper($mid($v,0,3)) = "NOV" goto novatel
if $toupper($mid($v,0,3)) = "OPT" goto option
if $toupper($mid($v,0,3)) = "QUA" goto qualcomm
if $toupper($mid($v,0,3)) = "SIM" goto simcom
if $toupper($mid($v,0,3)) = "SIE" goto sierra
if $toupper($mid($v,0,3)) = "VOD" goto vodafone
if $toupper($mid($v,0,3)) = "ZTE" goto zte
goto generic
:simcom
let $c="AT+CNSMOD?^m"
let $r="+CNSMOD"
gosub readatcmd
goto next
:vodafone
let $c="AT%NWSTATE=1^m"
let $r="%NWSTATE"
gosub readatcmd
goto next
:novatel
let $c="AT$CNTI=0^m"
let $r="$CNTI"
gosub readatcmd
goto next
:sierra
let $c="AT*CNTI=0^m"
let $r="*CNTI"
gosub readatcmd
goto next
:option
let $c="AT_OCTI?^m"
let $r="_OCTI"
gosub readatcmd
let $c="AT_OWCTI?^m"
let $r="_OWCTI"
gosub readatcmd
goto next
:qualcomm
let $c="AT+COPS?^m"
let $r="+COPS"
gosub readatcmd
goto next1
:zte
let $c="AT+COPS?^m"
let $r="+COPS"
gosub readatcmd
let $c="AT+ZRSSI^m"
let $r="+ZRSSI"
gosub readatcmd
let $c="AT+ZPAS?^m"
let $r="+ZPAS"
gosub readatcmd
goto next1
:huawei
let $c="AT\^SYSINFOEX^m"
let $r="\^SYSINFOEX"
gosub readatcmd
let $c="AT\^CSNR?^m"
let $r="\^CSNR"
gosub readatcmd
let $c="AT\^LTERSRP?^m"
let $r="\^LTERSRP"
gosub readatcmd
let $c="AT\^HCSQ?^m"
let $r="\^HCSQ"
gosub readatcmd
:generic
let $c="AT\^SYSINFO^m"
let $r="\^SYSINFO"
gosub readatcmd
:next
let $c="AT+COPS=3,2;+COPS?^m"
let $r="+COPS"
gosub readatcmd
:next1
let $c="AT+CREG=2;+CREG?^m"
let $r="+CREG"
gosub readatcmd
let $c="AT+CGREG=2;+CGREG?^m"
let $r="+CGREG"
gosub readatcmd
let $c="AT+CEREG=2;+CEREG?^m"
let $r="+CEREG"
gosub readatcmd
let $c="AT+CGEQNEG=1^m"
let $r="+CGEQNEG"
gosub readatcmd
let $c="ATE1; +CGMM^m"
gosub readatcmdnr
print "\nDEVICE:",$v," ",$s,"\n"
exit 0
:readatcmd
let i=15
send $c
:loop
get 0.1 "^m" $s
let l=len($r)
if len($s) < l goto loop1
if $mid($s,1,l) <> $r goto loop1
print $s
return
:loop1
if len($s) < 2 goto loop2
if $mid($s,1,2) = "ER" return
if $mid($s,1,2) = "CO" return
:loop2
if i = 0 return
let i=i-1
goto loop
:readatcmdnr
let i=15
send $c
:loop3
get 0.1 "^m" $s
if len($s) < 2 goto loop5
if $mid($s,1,2) = "ER" goto loop4
if $mid($s,1,2) = "OK" goto loop5
if $mid($s,1,2) = "AT" goto loop5
if $mid($s,1,2) = "TE" goto loop5
if $mid($s,1,1) = "+" goto loop5
if $mid($s,1,1) = "\^" goto loop5
let l=len($s)
let $s=$mid($s,1,l)
return
:loop4
let $s=""
return
:loop5
if i = 0 return
let i=i-1
goto loop3
@@ -0,0 +1,60 @@
#!/bin/sh
IP=$1
[ -z "$IP" ] && exit 0
[ -e /usr/bin/wget ] || exit 0
getvaluen() {
echo $(sed 's!.*"'$2'":\([^,]*\).*!\1!g' /tmp/$1)
}
getvalue() {
echo $(sed 's!.*"'$2'":"\([^"]*\).*!\1!g' /tmp/$1)
}
rand=`awk 'BEGIN{srand();print int(rand()*(99000-1000))+1000 }'`
files="getWanInfo getImgInfo getSysteminfo"
for f in $files; do
wget -t 3 -O /tmp/$f "http://$IP/goform/$f?rand=$rand" >/dev/null 2>&1
done
MODEN=$(getvaluen getWanInfo "network_type")
case $MODEN in
1) MODE="GPRS";;
2) MODE="EDGE";;
3) MODE="HSDPA";;
4) MODE="HSUPA";;
5) MODE="UMTS";;
9) MODE="GSM";;
11) MODE="LTE";;
12) MODE="HSPA+";;
13) MODE="DC HSPA+";;
*) MODE="-";;
esac
echo "^SYSINFOEX:x,x,x,x,,x,\"$MODE\",$MODEN,\"$MODE\""
OPER=$(getvalue getWanInfo "network_name")
echo "+COPS: 0,0,\"$OPER\",x"
SIGNAL=$(getvaluen getImgInfo "signal")
case $SIGNAL in
1) CSQ="6";;
2) CSQ="12";;
3) CSQ="18";;
4) CSQ="24";;
5) CSQ="31";;
*) CSQ="0";;
esac
echo "+CSQ: $CSQ,99"
MODEL=$(getvalue getSysteminfo "dev_name")
echo "DEVICE:Alcatel $MODEL"
if [ "x$2" != "xdebug" ]; then
for f in $files; do
rm /tmp/$f
done
fi
exit 0
@@ -0,0 +1,172 @@
#!/bin/sh
IP=$1
[ -z "$IP" ] && exit 0
[ -e /usr/bin/wget ] || exit 0
getvaluen() {
echo $(awk -F[\<\>] '/<'$2'>/ {print $3}' /tmp/$1 | sed 's/[^0-9]//g')
}
getvaluens() {
echo $(awk -F[\<\>] '/<'$2'>/ {print $3}' /tmp/$1 | sed 's/[^0-9-]//g')
}
getvalue() {
echo $(awk -F[\<\>] '/<'$2'>/ {print $3}' /tmp/$1)
}
cookie=$(mktemp)
/usr/bin/wget -t 25 -O /tmp/webserver-token "http://$IP/api/webserver/token" >/dev/null 2>&1
token=$(getvaluen webserver-token token)
if [ -z "$token" ]; then
/usr/bin/wget -t 25 -O /tmp/webserver-token "http://$IP/api/webserver/SesTokInfo" >/dev/null 2>&1
sesinfo=$(getvalue webserver-token SesInfo)
fi
if [ -z "$sesinfo" ]; then
/usr/bin/wget -q -O /dev/null --keep-session-cookies --save-cookies $cookie "http://$IP/html/home.html"
fi
/usr/bin/wget -t 25 -O /tmp/user-state-login "http://$IP/api/user/state-login"
T1=$(getvalue user-state-login State)
if [ "x$T1" != "x0" ]; then
USER="admin"
PASS="admin"
PASS=$(echo -n "$PASS" | base64)
DATA="<request><Username>$USER</Username><Password>$PASS</Password></request>"
/usr/bin/wget -t 25 -O /dev/null "http://$IP/api/user/login" --post-data $DATA --header "__RequestVerificationToken: $token"
fi
files="device/signal monitoring/status net/current-plmn net/signal-para device/information device/basic_information"
for f in $files; do
nf=$(echo $f | sed 's!/!-!g')
if [ -n "$token" ]; then
/usr/bin/wget -t 3 -O /tmp/$nf "http://$IP/api/$f" --header "__RequestVerificationToken: $token" >/dev/null 2>&1
elif [ -n "$sesinfo" ]; then
/usr/bin/wget -t 3 -O /tmp/$nf "http://$IP/api/$f" --header "Cookie: $sesinfo" >/dev/null 2>&1
else
/usr/bin/wget -t 3 -O /tmp/$nf "http://$IP/api/$f" --load-cookies=$cookie >/dev/null 2>&1
fi
done
rssi=$(getvaluen device-signal rssi)
if [ -n "$rssi" ]; then
CSQ=$(((-1*rssi + 113)/2))
echo "+CSQ: $CSQ,99"
else
per=$(getvaluen monitoring-status SignalStrength)
if [ -n "$per" ]; then
CSQ=$((($per*31)/100))
echo "+CSQ: $CSQ,99"
fi
fi
MODEN=$(getvaluen monitoring-status CurrentNetworkType)
case $MODEN in
1) MODE="GSM";;
2) MODE="GPRS";;
3) MODE="EDGE";;
4) MODE="WCDMA";;
5) MODE="HSDPA";;
6) MODE="HSUPA";;
7) MODE="HSPA";;
8) MODE="TDSCDMA";;
9) MODE="HSPA+";;
10) MODE="EVDO rev. 0";;
11) MODE="EVDO rev. A";;
12) MODE="EVDO rev. B";;
13) MODE="1xRTT";;
14) MODE="UMB";;
15) MODE="1xEVDV";;
16) MODE="3xRTT";;
17) MODE="HSPA+64QAM";;
18) MODE="HSPA+MIMO";;
19) MODE="LTE";;
21) MODE="IS95A";;
22) MODE="IS95B";;
23) MODE="CDMA1x";;
24) MODE="EVDO rev. 0";;
25) MODE="EVDO rev. A";;
26) MODE="EVDO rev. B";;
27) MODE="Hybrydowa CDMA1x";;
28) MODE="Hybrydowa EVDO rev. 0";;
29) MODE="Hybrydowa EVDO rev. A";;
30) MODE="Hybrydowa EVDO rev. B";;
31) MODE="EHRPD rev. 0";;
32) MODE="EHRPD rev. A";;
33) MODE="EHRPD rev. B";;
34) MODE="Hybrydowa EHRPD rev. 0";;
35) MODE="Hybrydowa EHRPD rev. A";;
36) MODE="Hybrydowa EHRPD rev. B";;
41) MODE="WCDMA (UMTS)";;
42) MODE="HSDPA";;
43) MODE="HSUPA";;
44) MODE="HSPA";;
45) MODE="HSPA+";;
46) MODE="DC-HSPA+";;
61) MODE="TD SCDMA";;
62) MODE="TD HSDPA";;
63) MODE="TD HSUPA";;
64) MODE="TD HSPA";;
65) MODE="TD HSPA+";;
81) MODE="802.16E";;
101) MODE="LTE";;
*) MODE="-";;
esac
echo "^SYSINFOEX:x,x,x,x,,x,\"$MODE\",$MODEN,\"$MODE\""
numeric=$(getvaluen net-current-plmn Numeric)
echo "+COPS: 0,2,\"$numeric\",x"
lac=$(getvalue net-signal-para Lac)
if [ -z "$lac" ]; then
/usr/bin/wget -t 3 -O /tmp/add-param "http://$IP/config/deviceinformation/add_param.xml" > /dev/null 2>&1
lac=$(getvalue add-param lac)
rm /tmp/add-param
fi
cid=$(getvalue net-signal-para CellID)
if [ -z "$cid" ]; then
cell_id=$(getvalue device-signal cell_id)
cid=""
[ -n "$cell_id" ] && cid=$(printf %0X $cell_id)
fi
echo "+CREG: 2,1,\"$lac\",\"$cid\""
if [ "x$MODE" = "xLTE" ]; then
rsrp=$(getvaluens device-signal rsrp)
sinr=$(getvaluens device-signal sinr)
rsrq=$(getvaluens device-signal rsrq)
rsrp=$(awk 'BEGIN {print '$rsrp' + 141}')
sinr=$(awk 'BEGIN {print ('$sinr'+20.2)*5}')
rsrq=$(awk 'BEGIN {print ('$rsrq'+20)*2}')
echo "^HCSQ: \"$MODE\",$rssi,$rsrp,$sinr,$rsrq"
else
rscp=$(getvaluens device-signal rscp)
[ -z "$rscp" ] && rscp=$(getvaluens net-signal-para Rscp)
ecio=$(getvaluens net-signal-para ecio)
[ -z "$ecio" ] && ecio=$(getvaluens net-signal-para Ecio)
echo "^CSNR: $rscp,$ecio"
fi
device=$(getvalue device-information DeviceName)
if [ -n "$device" ]; then
class=$(getvalue device-information Classify)
echo "DEVICE:Huawei $device $class"
else
device=$(getvalue device-basic_information devicename)
class=$(getvalue device-basic_information classify)
[ -n "$device" ] && echo "DEVICE:Huawei $device $class"
fi
DATA="<request><Logout>1</Logout></request>"
/usr/bin/wget -t 25 -O /tmp/ccc "http://$IP/api/user/logout" --post-data $DATA --header "__RequestVerificationToken: $token"
if [ "x$2" != "xdebug" ]; then
for f in $files webserver/token; do
nf=$(echo $f | sed 's!/!-!g')
rm /tmp/$nf
done
fi
rm $cookie
exit 0
@@ -0,0 +1,159 @@
#!/bin/sh
IP=$1
[ -z "$IP" ] && exit 0
[ -e /usr/bin/wget ] || exit 0
getvaluen() {
echo $(awk -F[\<\>] '/<'$2'>/ {print $3}' /tmp/$1 | sed 's/[^0-9]//g')
}
getvaluens() {
echo $(awk -F[\<\>] '/<'$2'>/ {print $3}' /tmp/$1 | sed 's/[^0-9-]//g')
}
getvalue() {
echo $(awk -F[\<\>] '/<'$2'>/ {print $3}' /tmp/$1)
}
cookie=$(mktemp)
/usr/bin/wget -t 25 -O /tmp/webserver-token "http://$IP/api/webserver/token" >/dev/null 2>&1
token=$(getvaluen webserver-token token)
if [ -z "$token" ]; then
/usr/bin/wget -t 25 -O /tmp/webserver-token "http://$IP/api/webserver/SesTokInfo" >/dev/null 2>&1
sesinfo=$(getvalue webserver-token SesInfo)
fi
if [ -z "$sesinfo" ]; then
/usr/bin/wget -q -O /dev/null --keep-session-cookies --save-cookies $cookie "http://$IP/html/home.html"
fi
files="device/signal monitoring/status net/current-plmn net/signal-para device/information device/basic_information"
for f in $files; do
nf=$(echo $f | sed 's!/!-!g')
if [ -n "$token" ]; then
/usr/bin/wget -t 3 -O /tmp/$nf "http://$IP/api/$f" --header "__RequestVerificationToken: $token" >/dev/null 2>&1
elif [ -n "$sesinfo" ]; then
/usr/bin/wget -t 3 -O /tmp/$nf "http://$IP/api/$f" --header "Cookie: $sesinfo" >/dev/null 2>&1
else
/usr/bin/wget -t 3 -O /tmp/$nf "http://$IP/api/$f" --load-cookies=$cookie >/dev/null 2>&1
fi
done
rssi=$(getvaluen device-signal rssi)
if [ -n "$rssi" ]; then
CSQ=$(((-1*rssi + 113)/2))
echo "+CSQ: $CSQ,99"
else
per=$(getvaluen monitoring-status SignalStrength)
if [ -n "$per" ]; then
CSQ=$((($per*31)/100))
echo "+CSQ: $CSQ,99"
fi
fi
MODEN=$(getvaluen monitoring-status CurrentNetworkType)
case $MODEN in
1) MODE="GSM";;
2) MODE="GPRS";;
3) MODE="EDGE";;
4) MODE="WCDMA";;
5) MODE="HSDPA";;
6) MODE="HSUPA";;
7) MODE="HSPA";;
8) MODE="TDSCDMA";;
9) MODE="HSPA+";;
10) MODE="EVDO rev. 0";;
11) MODE="EVDO rev. A";;
12) MODE="EVDO rev. B";;
13) MODE="1xRTT";;
14) MODE="UMB";;
15) MODE="1xEVDV";;
16) MODE="3xRTT";;
17) MODE="HSPA+64QAM";;
18) MODE="HSPA+MIMO";;
19) MODE="LTE";;
21) MODE="IS95A";;
22) MODE="IS95B";;
23) MODE="CDMA1x";;
24) MODE="EVDO rev. 0";;
25) MODE="EVDO rev. A";;
26) MODE="EVDO rev. B";;
27) MODE="Hybrydowa CDMA1x";;
28) MODE="Hybrydowa EVDO rev. 0";;
29) MODE="Hybrydowa EVDO rev. A";;
30) MODE="Hybrydowa EVDO rev. B";;
31) MODE="EHRPD rev. 0";;
32) MODE="EHRPD rev. A";;
33) MODE="EHRPD rev. B";;
34) MODE="Hybrydowa EHRPD rev. 0";;
35) MODE="Hybrydowa EHRPD rev. A";;
36) MODE="Hybrydowa EHRPD rev. B";;
41) MODE="WCDMA (UMTS)";;
42) MODE="HSDPA";;
43) MODE="HSUPA";;
44) MODE="HSPA";;
45) MODE="HSPA+";;
46) MODE="DC-HSPA+";;
61) MODE="TD SCDMA";;
62) MODE="TD HSDPA";;
63) MODE="TD HSUPA";;
64) MODE="TD HSPA";;
65) MODE="TD HSPA+";;
81) MODE="802.16E";;
101) MODE="LTE";;
*) MODE="-";;
esac
echo "^SYSINFOEX:x,x,x,x,,x,\"$MODE\",$MODEN,\"$MODE\""
numeric=$(getvaluen net-current-plmn Numeric)
echo "+COPS: 0,2,\"$numeric\",x"
lac=$(getvalue net-signal-para Lac)
if [ -z "$lac" ]; then
/usr/bin/wget -t 3 -O /tmp/add-param "http://$IP/config/deviceinformation/add_param.xml" > /dev/null 2>&1
lac=$(getvalue add-param lac)
rm /tmp/add-param
fi
cid=$(getvalue net-signal-para CellID)
if [ -z "$cid" ]; then
cell_id=$(getvalue device-signal cell_id)
cid=""
[ -n "$cell_id" ] && cid=$(printf %0X $cell_id)
fi
echo "+CREG: 2,1,\"$lac\",\"$cid\""
if [ "x$MODE" = "xLTE" ]; then
rsrp=$(getvaluens device-signal rsrp)
sinr=$(getvaluens device-signal sinr)
rsrq=$(getvaluens device-signal rsrq)
rsrp=$(awk 'BEGIN {print '$rsrp' + 141}')
sinr=$(awk 'BEGIN {print ('$sinr'+20.2)*5}')
rsrq=$(awk 'BEGIN {print ('$rsrq'+20)*2}')
echo "^HCSQ: \"$MODE\",$rssi,$rsrp,$sinr,$rsrq"
else
rscp=$(getvaluens device-signal rscp)
[ -z "$rscp" ] && rscp=$(getvaluens net-signal-para Rscp)
ecio=$(getvaluens net-signal-para ecio)
[ -z "$ecio" ] && ecio=$(getvaluens net-signal-para Ecio)
echo "^CSNR: $rscp,$ecio"
fi
device=$(getvalue device-information DeviceName)
if [ -n "$device" ]; then
class=$(getvalue device-information Classify)
echo "DEVICE:Huawei $device $class"
else
device=$(getvalue device-basic_information devicename)
class=$(getvalue device-basic_information classify)
[ -n "$device" ] && echo "DEVICE:Huawei $device $class"
fi
if [ "x$2" != "xdebug" ]; then
for f in $files webserver/token; do
nf=$(echo $f | sed 's!/!-!g')
rm /tmp/$nf
done
fi
rm $cookie
exit 0
@@ -0,0 +1,14 @@
let $d = $env("DEVICE")
if $d = "" goto timeout
open com $d
set com 115200n81
set senddelay 0.05
waitquiet 2 0.5
send "AT^m"
waitfor 2 "OK" "+CME ERROR"
if % = -1 goto timeout
exit 0
:timeout
exit 1
+50
View File
@@ -0,0 +1,50 @@
#!/bin/sh
IP=$1
[ -z "$IP" ] && exit 0
T=$(mktemp)
wget -q -O $T "http://$IP/goform/goform_get_cmd_process?multi_data=1&cmd=manufacturer_name,model_name,network_provider,network_type,lte_rsrp,lte_rsrq,lte_rssi,lte_snr,cell_id,lac_code,hmcc,hmnc,rmcc,rmnc,rssi,rscp,ecio"
. /usr/share/libubox/jshn.sh
json_load "$(cat $T)"
json_get_vars manufacturer_name model_name network_provider network_type lte_rsrp lte_rsrq lte_rssi lte_snr cell_id lac_code hmcc hmnc rmcc rmnc rssi rscp ecio
if [ -n "$lte_rssi" ]; then
rssi=$lte_rssi
fi
if [ -n "$rssi" ]; then
CSQ=$(((rssi+113)/2))
else
CSQ=0
fi
echo "+CSQ: $CSQ,99"
echo "DEVICE:$manufacturer_name $model_name"
echo "^SYSINFOEX:x,x,x,x,,x,\"$network_type\",x,\"$network_type\""
if [ -n "$hmcc" ]; then
mcc=$(printf "%03d" $hmcc)
else
[ -n "$rmcc" ] && mcc=$(printf "%03d" $rmcc)
fi
if [ -n "$hmnc" ]; then
mnc=$(printf "%02d" $hmnc)
else
[ -n "$rmnc" ] && mnc=$(printf "%02d" $rmnc)
fi
echo "+COPS: 0,2,\"$mcc$mnc\",x"
if [ "x$network_type" = "xLTE" ]; then
echo "^LTERSRP: $lte_rsrp,$lte_rsrq"
else
echo "^CSNR: $rscp,$ecio"
fi
echo "+CREG: 2,1,\"$lac_code\",\"$cell_id\""
rm $T
exit 0
@@ -0,0 +1,31 @@
{
"error": "",
"csq": "{CSQ}",
"signal": "{CSQ_PER}",
"rssi": "{CSQ_RSSI}",
"mode": "{MODE}",
"device": "{DEVICE}",
"operator_name": "{COPS}",
"operator": "{COPS_NUM}",
"operator_mcc": "{COPS_MCC}",
"operator_mnc": "{COPS_MNC}",
"lac_hex": "{LAC}",
"lac_dec": "{LAC_NUM}",
"cid_hex": "{CID}",
"cid_dec": "{CID_NUM}",
"tac_hex": "{TAC}",
"tac_dec": "{TAC_NUM}",
"bts_info": "{BTSINFO}",
"bts_qos_down": "{DOWN}",
"bts_qos_up": "{UP}",
"status": "{STATUS}",
"conn_time": "{CONN_TIME}",
"conn_time_sec": "{CONN_TIME_SEC}",
"iface_rx": "{RX}",
"iface_tx": "{TX}",
"rscp": "{RSCP}",
"ecio": "{ECIO}",
"rsrp": "{RSRP}",
"sinr": "{SINR}",
"rsrq": "{RSRQ}"
}
@@ -0,0 +1,18 @@
Status: {STATUS}
Connection time: {CONN_TIME}
Received / Transmitted data: {RX} / {TX}
Operator: {COPS}
Operating mode: {MODE}
Signal strength: {CSQ_PER}%
Device: {DEVICE}
MCC MNC: {COPS_MCC} {COPS_MNC}
LAC: {LAC} ({LAC_NUM})
CID: {CID} ({CID_NUM})
TAC: {TAC} ({TAC_NUM})
CSQ: {CSQ}
RSSI: {CSQ_RSSI} dBm
RSCP: {RSCP} dBm
Ec/IO: {ECIO} dB
RSRP: {RSRP} dBm
SINR: {SINR} dB
RSRQ: {RSRQ} dB
@@ -0,0 +1,18 @@
Staatus: {STATUS}
Ühendusaeg: {CONN_TIME}
Vastuvõetud/saadetud andmed: {RX} / {TX}
Operaator: {COPS}
Töörežiim: {MODE}
Signaali tugevus: {CSQ_PER}%
Seade: {DEVICE}
MCC MNC: {COPS_MCC} {COPS_MNC}
LAC: {LAC} ({LAC_NUM})
CID: {CID} ({CID_NUM})
TAC: {TAC} ({TAC_NUM})
CSQ: {CSQ}
RSSI: {CSQ_RSSI} dBm
RSCP: {RSCP} dBm
Ec/IO: {ECIO} dB
RSRP: {RSRP} dBm
SINR: {SINR} dB
RSRQ: {RSRQ} dB
@@ -0,0 +1,18 @@
Stato: {STATUS}
Tempo di connessione: {CONN_TIME}
Dati ricevuti / Trasmessi: {RX} / {TX}
Operatore: {COPS}
Tipo di connessione: {MODE}
Forza segnale: {CSQ_PER}%
Dispositivo: {DEVICE}
MCC MNC: {COPS_MCC} {COPS_MNC}
LAC: {LAC} ({LAC_NUM})
CID: {CID} ({CID_NUM})
TAC: {TAC} ({TAC_NUM})
CSQ: {CSQ}
RSSI: {CSQ_RSSI} dBm
RSCP: {RSCP} dBm
Ec/IO: {ECIO} dB
RSRP: {RSRP} dBm
SINR: {SINR} dB
RSRQ: {RSRQ} dB
@@ -0,0 +1,18 @@
Status: {STATUS}
Czas polaczenia: {CONN_TIME}
Przeslano danych: {RX} / {TX}
Operator: {COPS}
Tryb pracy: {MODE}
Sila sygnalu: {CSQ_PER}%
Urzadzenie: {DEVICE}
MCC MNC: {COPS_MCC} {COPS_MNC}
LAC: {LAC} ({LAC_NUM})
CID: {CID} ({CID_NUM})
TAC: {TAC} ({TAC_NUM})
CSQ: {CSQ}
RSSI: {CSQ_RSSI} dBm
RSCP: {RSCP} dBm
Ec/IO: {ECIO} dB
RSRP: {RSRP} dBm
SINR: {SINR} dB
RSRQ: {RSRQ} dB
+6
View File
@@ -0,0 +1,6 @@
config 3ginfo
option device ''
option http_port '81'
option network 'wan'
option pincode ''
+138
View File
@@ -0,0 +1,138 @@
#!/bin/sh
#
# (c) 2024-2025 Cezary Jackiewicz <cezary@eko.one.pl>
#
. /lib/functions.sh
. /usr/share/libubox/jshn.sh
FORMAT=1
[ "x$1" = "xjson" ] && FORMAT=2
ECM=""
RES="/usr/share/modemdata"
format_conn_time() {
CT=$1
D=$(expr $CT / 60 / 60 / 24)
H=$(expr $CT / 60 / 60 % 24)
M=$(expr $CT / 60 % 60)
S=$(expr $CT % 60)
printf "%dd, %02d:%02d:%02d" $D $H $M $S
}
SEPARATOR=""
parse_section() {
[ -n "$SEPARATOR" ] && echo "$SEPARATOR"
local section="$1"
config_get device "$section" device ""
config_get network "$section" network ""
config_get force_plmn "$section" force_plmn "0"
if echo "x$device" | grep -q "192.168."; then
ECM="$RES/addon/ecm/huawei.sh $device"
else
ECM=""
if [ ! -e /var/state/3ginfo-detected ]; then
[ -z "$device" ] && device=$(/usr/share/3ginfo/detectdevice.sh)
[ -z "$network" ] && network=$(/usr/share/3ginfo/detectsection.sh "$section")
fi
config_get pincode "$section" pincode ""
if [ -n "$pincode" ] && [ ! -e /var/state/3ginfo-pincode ]; then
[ -n "$device" ] && sms_tool -d "$device" at "at+cpin=\"$pincode\""
fi
fi
if [ "$FORMAT" = "1" ]; then
SEPARATOR="---"
json_init
if [ -n "$ECM" ]; then
json_load "$($ECM product)"
else
json_load "$($RES/product.sh "$device")"
fi
json_get_vars vendor product revision imei iccid imsi
echo "Device: ${vendor} ${product}"
echo "Revision: ${revision}"
echo "IMEI: ${imei}"
echo "ICCID: ${iccid}"
echo "IMSI: ${imsi}"
echo ""
json_init
json_load "$($RES/network.sh "$network")"
json_get_vars conn_time_sec rx tx
echo "Connected time: "$(format_conn_time ${conn_time_sec})
echo "TX: ${tx}"
echo "RX: ${rx}"
echo ""
json_init
if [ -n "$ECM" ]; then
json_load "$($ECM params)"
else
json_load "$($RES/params.sh "$device" "$force_plmn")"
fi
json_get_vars signal operator_name operator_mcc operator_mnc country mode registration lac_dec lac_hex cid_dec cid_hex
echo "Signal: ${signal} %"
echo "Mode: ${mode}"
echo "Operator: ${operator_name} (${operator_mcc} ${operator_mnc})"
[ -n "$country" ] && echo "Country: ${country}"
case $registration in
0) REG="not registered";;
1) REG="registered, home network";;
2) REG="not registered, searching";;
3) REG="registration denied";;
5) REG="registered, roaming";;
6) REG="registered for SMS only, home network";;
7) REG="registered for SMS only, roaming";;
*) REG="$registration";;
esac
echo "Registration: ${REG}"
echo ""
T="21;CellID: ${cid_dec} (${cid_hex})"
T="${T}\n22;LAC: ${lac_dec} (${lac_hex})"
if json_is_a addon array; then
json_get_keys addon addon
json_select addon
for i in $addon; do
json_select "$i"
json_get_vars idx key value
json_select ..
if [ "$idx" = "10" ]; then
T="${T}\n${idx};${key}: ${value/&deg;/°}"
else
T="${T}\n${idx};${key}: ${value}"
fi
done
fi
echo -e "$T" | sort | awk -F[\;] '{print $2}'
else
SEPARATOR=","
echo "["
if [ -n "$ECM" ]; then
$ECM product
echo ","
$RES/network.sh "$network"
echo ","
$ECM params
else
$RES/product.sh "$device"
echo ","
$RES/network.sh "$network"
echo ","
$RES/params.sh "$device" "$force_plmn"
fi
echo "]"
fi
}
config_load 3ginfo
[ "$FORMAT" = "2" ] && echo '{"res":['
config_foreach parse_section 3ginfo
[ "$FORMAT" = "2" ] && echo ']}'
touch /var/state/3ginfo-detected
touch /var/state/3ginfo-pincode
exit 0
@@ -0,0 +1,13 @@
opengt
set com 115200n81
set comecho off
set senddelay 0.01
waitquiet 0.01 0.01
send "AT+CPIN?^m"
waitfor 2 "OK" "+CME ERROR"
if % = -1 goto timeout
exit 0
:timeout
exit 1
+20
View File
@@ -0,0 +1,20 @@
#!/bin/sh
#
# (c) 2023-2024 Cezary Jackiewicz <cezary@eko.one.pl>
#
# find any device
DEVICES=$(find /dev -name "ttyUSB*" -o -name "ttyACM*" -o -name "wwan*at*" | sort -r)
for DEVICE in $DEVICES; do
gcom -d $DEVICE -s /usr/share/3ginfo/check.gcom >/dev/null 2>&1
if [ $? = 0 ]; then
uci set 3ginfo.@3ginfo[0].device="$DEVICE"
uci commit 3ginfo
echo "$DEVICE"
exit 0
fi
done
echo ""
exit 0
+60
View File
@@ -0,0 +1,60 @@
#!/bin/sh
#
# (c) 2024 Cezary Jackiewicz <cezary@eko.one.pl>
#
getdevicepath() {
devname="$(basename $1)"
case "$devname" in
'wwan'*'at'*)
devpath="$(readlink -f /sys/class/wwan/$devname/device)"
echo ${devpath%/*/*/*}
;;
'ttyACM'*)
devpath="$(readlink -f /sys/class/tty/$devname/device)"
echo ${devpath%/*}
;;
'tty'*)
devpath="$(readlink -f /sys/class/tty/$devname/device)"
echo ${devpath%/*/*}
;;
*)
devpath="$(readlink -f /sys/class/usbmisc/$devname/device)"
echo ${devpath%/*}
;;
esac
}
CONFIGSEC=$1
if [ -n "$CONFIGSEC" ]; then
SEC=$(uci -q get 3ginfo.${CONFIGSEC}.network)
if [ -n "$SEC" ]; then
echo "$SEC"
exit 0
fi
fi
DEVICE=$(uci -q get 3ginfo.${CONFIGSEC}.device)
if [ -z "$DEVICE" ]; then
echo ""
exit 0
fi
DEVPATH=$(getdevicepath "$DEVICE")
DEVICES=$(uci show network | awk '/network\..*\.device/')
for T in $DEVICES; do
T1=$(echo "$T" | cut -f2 -d= | xargs)
if [ -e "$T1" ]; then
if [ "$DEVPATH" = "$(getdevicepath "$T1")" ]; then
T2=$(echo "$T" | cut -f2 -d.)
uci set 3ginfo.${CONFIGSEC}.network="$T2"
uci commit 3ginfo
echo "$T2"
exit 0
fi
fi
done
echo ""
exit 0