🌴 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
+140
View File
@@ -0,0 +1,140 @@
# SPDX-License-Identifier: GPL-2.0-only
#
# Copyright (C) 2025 ImmortalWrt.org
include $(TOPDIR)/rules.mk
PKG_NAME:=3proxy
PKG_VERSION:=0.9.5
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/3proxy/3proxy/tar.gz/$(PKG_VERSION)?
PKG_HASH:=skip
PKG_CPE_ID:=cpe:/a:3proxy:3proxy
PKG_LICENSE:=3proxy Apache-2.0 GPL-2.0-or-later LGPL-2.1-or-later
PKG_LICENSE_FILES:=copying
PKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>
PKG_BUILD_PARALLEL:=1
include $(INCLUDE_DIR)/package.mk
define Package/3proxy/Default
SECTION:=net
CATEGORY:=Network
SUBMENU:=Web Servers/Proxies
TITLE:=tiny free proxy server
URL:=https://3proxy.ru/
endef
define Package/3proxy
$(call Package/3proxy/Default)
endef
define Package/3proxy/description
3Proxy tiny free proxy server is really tiny cross-platform (Win32/Win64&Unix)
freeware proxy servers set. It includes HTTP proxy with HTTPS and FTP support,
SOCKSv4/SOCKSv4.5/SOCKSv5 proxy (socks/socks.exe), POP3 proxy, SMTP proxy,
AIM/ICQ proxy (icqpr/icqpr.exe), MSN messenger / Live messenger proxy
(msnpr/msnpr.exe), FTP proxy, caching DNS proxy, TCP and UDP portmappers.
You can use every proxy as a standalone program (socks, proxy, tcppm, udppm,
pop3p) or use combined program (3proxy). Combined proxy additionally supports
features like access control, bandwidth limiting, limiting daily/weekly/monthly
traffic amount, proxy chaining, log rotation, syslog and ODBC logging, etc.
It's created to be small, simple and yet very functional.
endef
define Package/3proxy/conffiles
/etc/3proxy/
/etc/config/3proxy
endef
define Package/3proxy/install
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/bin/3proxy $(1)/usr/bin/3proxy
$(INSTALL_DIR) $(1)/etc/config
$(INSTALL_CONF) $(CURDIR)/files/3proxy.config $(1)/etc/config/3proxy
$(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_BIN) $(CURDIR)/files/3proxy.init $(1)/etc/init.d/3proxy
endef
# 1: library name
# 2: library path
# 3: library dependencies
# 4: library description
define 3proxyLibrary
3proxyLibs+= $(1)
PKG_CONFIG_DEPENDS+= CONFIG_PACKAGE_3proxy-lib-$(1)
define Package/3proxy-lib-$(1)
$(call Package/3proxy/Default)
TITLE+= - $(1) library
DEPENDS+= 3proxy $(3)
endef
define Package/3proxy-lib-$(1)/description
3Proxy shared library - $(1).
$(4)
endef
define Package/3proxy-lib-$(1)/install
$(INSTALL_DIR) $$(1)/usr/libexec/3proxy
$(CP) $(PKG_BUILD_DIR)/bin/$(2).ld.so $$(1)/usr/libexec/3proxy/
endef
endef
$(eval $(call 3proxyLibrary,pam,pamauth,+libpam,))
$(eval $(call 3proxyLibrary,pcre,PCREPlugin,,This filtering plugin can be used to create matching and replace rules with regular expressions for client's request, client and servers header and client and server data.))
$(eval $(call 3proxyLibrary,ssl,SSLPlugin,+libopenssl,This plugin can be used to decrypt and manupulate SSL/TLS traffic.))
$(eval $(call 3proxyLibrary,strings,StringsPlugin,,Allows to change replies of HTTP proxy server.))
$(eval $(call 3proxyLibrary,traffic,TrafficPlugin,,This plugin attempts to correct 3proxy computations to approximate network or link level traffic by using either fixed coefficients by port number or attempting to predict number and sizes of network packets.))
$(eval $(call 3proxyLibrary,transparent,TransparentPlugin,,This plugin can be used to implement 3proxy transparently for client for any TCP-based protocols.))
# 1: module name
# 2: module dependencies
define 3proxyModule
3proxyMods+= $(1)
PKG_CONFIG_DEPENDS+= CONFIG_PACKAGE_3proxy-mod-$(1)
define Package/3proxy-mod-$(1)
$(call Package/3proxy/Default)
TITLE+= - $(1) standalone module
DEPENDS+= $(2)
endef
define Package/3proxy-mod-$(1)/description
3Proxy standalone module - $(1).
This module can be used as a standalone program.
endef
define Package/3proxy-mod-$(1)/install
$(INSTALL_DIR) $$(1)/usr/libexec/3proxy
$(INSTALL_BIN) $(PKG_BUILD_DIR)/bin/$(1) $$(1)/usr/libexec/3proxy/
endef
endef
$(eval $(call 3proxyModule,ftppr,))
$(eval $(call 3proxyModule,mycrypt,))
$(eval $(call 3proxyModule,pop3p,))
$(eval $(call 3proxyModule,proxy,))
$(eval $(call 3proxyModule,smtpp,))
$(eval $(call 3proxyModule,socks,))
$(eval $(call 3proxyModule,tcppm,))
$(eval $(call 3proxyModule,tlspr,))
$(eval $(call 3proxyModule,udppm,))
MAKE_FLAGS += \
PLUGINS="$(strip \
$(if $(CONFIG_PACKAGE_3proxy-lib-pam),PamAuth) \
$(if $(CONFIG_PACKAGE_3proxy-lib-pcre),PCREPlugin) \
$(if $(CONFIG_PACKAGE_3proxy-lib-ssl),SSLPlugin) \
$(if $(CONFIG_PACKAGE_3proxy-lib-strings),StringsPlugin) \
$(if $(CONFIG_PACKAGE_3proxy-lib-traffic),TrafficPlugin) \
$(if $(CONFIG_PACKAGE_3proxy-lib-transparent),TransparentPlugin))" \
-f Makefile.Linux
$(foreach lib,$(3proxyLibs),$(eval $(call BuildPackage,3proxy-lib-$(lib))))
$(foreach mod,$(3proxyMods),$(eval $(call BuildPackage,3proxy-mod-$(mod))))
$(eval $(call BuildPackage,3proxy))
+5
View File
@@ -0,0 +1,5 @@
config 3proxy 'config'
option enabled '0'
option conffile '/etc/3proxy/3proxy.cfg'
+33
View File
@@ -0,0 +1,33 @@
#!/bin/sh /etc/rc.common
START=99
USE_PROCD=1
CONF="3proxy"
PROG="/usr/bin/3proxy"
start_service() {
config_load "$CONF"
local enabled conffile
config_get_bool enabled "config" "enabled" "0"
[ "$enabled" -eq "1" ] || return 0
config_get conffile "config" "conffile" "/etc/3proxy/3proxy.cfg"
procd_open_instance
procd_set_param command "$PROG" "$conffile"
procd_set_param stdout "1"
procd_set_param stderr "1"
procd_set_param limits core="unlimited"
procd_set_param limits nofile="1000000 1000000"
procd_set_param respawn
procd_close_instance
}
service_triggers() {
procd_add_reload_trigger "$CONF"
}
@@ -0,0 +1,25 @@
From 67315da11c88d7007090c23f68e0b66e6d9b8e37 Mon Sep 17 00:00:00 2001
From: Mikhail Novosyolov <m.novosyolov@rosalinux.ru>
Date: Mon, 28 Feb 2022 14:26:57 +0300
Subject: [PATCH] Fix underlinkage of SSLPlugin
+ /usr/share/spec-helper/check_elf_files
<...>
Warning: undefined symbols in /usr/lib64/3proxy/SSLPlugin.ld.so: TLS_client_method SSL_get_error BIO_new_fp TLS_server_method SSL_write SSL_free X509_delete_ext SSL_set_fd EVP_sha1 X509_get_subject_name EVP_PKEY_free X509_set_issuer_name SSL_read X509_get_ext_by_NID SSL_new SSL_shutdown SSL_set_read_ahead PEM_write_bio_X509 SSL_accept SSL_CTX_new SSL_get_peer_certificate BIO_ctrl BIO_free OPENSSL_init_ssl SSL_ctrl ERR_error_string SSL_pending X509_free X509_set_pubkey X509_digest SSL_connect SSL_CTX_free X509_sign ERR_get_error SSL_CTX_use_PrivateKey X509_EXTENSION_free X509_dup PEM_read_bio_PrivateKey PEM_read_bio_X509 SSL_CTX_use_certificate EVP_sha256 BIO_new_file
Fixes: https://github.com/3proxy/3proxy/issues/749
---
src/plugins/SSLPlugin/Makefile.inc | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
--- a/src/plugins/SSLPlugin/Makefile.inc
+++ b/src/plugins/SSLPlugin/Makefile.inc
@@ -10,5 +10,5 @@ my_ssl$(OBJSUFFICS): my_ssl.c
$(BUILDDIR)SSLPlugin$(DLSUFFICS): ssl_plugin$(OBJSUFFICS) my_ssl$(OBJSUFFICS)
- $(LN) $(LNOUT)../../$(BUILDDIR)SSLPlugin$(DLSUFFICS) $(LDFLAGS) $(DLFLAGS) ssl_plugin$(OBJSUFFICS) my_ssl$(OBJSUFFICS) $(LIBS)
-
\ No newline at end of file
+ $(LN) $(LNOUT)../../$(BUILDDIR)SSLPlugin$(DLSUFFICS) $(LDFLAGS) $(DLFLAGS) ssl_plugin$(OBJSUFFICS) my_ssl$(OBJSUFFICS) $(LIBS) -lcrypto -lssl
+
+62
View File
@@ -0,0 +1,62 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=7z
PKG_VERSION:=25.01
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)$(subst .,,$(PKG_VERSION))-src.tar.xz
PKG_SOURCE_URL:=https://7-zip.org/a/
PKG_HASH:=skip
PKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>
PKG_LICENSE:=LGPL-2.1-or-later BSD-3-Clause unRAR
PKG_LICENSE_FILES:=DOC/License.txt DOC/copying.txt DOC/unRarLicense.txt
PKG_CPE_ID:=cpe:/a:7-zip:7-zip
HOST_BUILD_PARALLEL:=1
PKG_BUILD_PARALLEL:=1
include $(INCLUDE_DIR)/package.mk
include $(INCLUDE_DIR)/host-build.mk
TAR_CMD=$(HOST_TAR) -C $(1) $(TAR_OPTIONS)
define Package/7z
SECTION:=utils
CATEGORY:=Utilities
SUBMENU:=Compression
TITLE:=File archiver with a high compression ratio
URL:=https://7-zip.org/
DEPENDS:=+libstdcpp
endef
HOST_MAKE_PATH:=CPP/7zip/Bundles/Alone2
HOST_MAKE_FLAGS+= \
-f ../../cmpl_gcc.mak \
CC="$(HOSTCC) $(HOST_CFLAGS)" \
CXX="$(HOSTCXX) $(HOST_CXXFLAGS)"
MAKE_PATH:=CPP/7zip/Bundles/Alone2
MAKE_FLAGS+= \
-f ../../cmpl_gcc.mak \
CC="$(TARGET_CC) $(TARGET_CFLAGS)" \
CXX="$(TARGET_CXX) $(TARGET_CXXFLAGS)"
define Host/Clean
$(RM) $(STAGING_DIR_HOSTPKG)/bin/7z $(STAGING_DIR_HOSTPKG)/bin/7zz
endef
define Host/Install
$(INSTALL_DIR) $(STAGING_DIR_HOSTPKG)/bin
$(INSTALL_BIN) $(HOST_BUILD_DIR)/$(MAKE_PATH)/b/g/7zz $(STAGING_DIR_HOSTPKG)/bin/
$(LN) 7zz $(STAGING_DIR_HOSTPKG)/bin/7z
endef
define Package/7z/install
$(INSTALL_DIR) $(1)/usr/bin/
$(INSTALL_BIN) $(PKG_BUILD_DIR)/$(MAKE_PATH)/b/g/7zz $(1)/usr/bin/
$(LN) 7zz $(1)/usr/bin/7z
endef
$(eval $(call HostBuild))
$(eval $(call BuildPackage,7z))
+44
View File
@@ -0,0 +1,44 @@
--- a/CPP/7zip/7zip_gcc.mak
+++ b/CPP/7zip/7zip_gcc.mak
@@ -24,7 +24,7 @@ PROGPATH_STATIC = $(O)/$(PROG)s
ifneq ($(CC), xlc)
-CFLAGS_WARN_WALL = -Werror -Wall -Wextra
+CFLAGS_WARN_WALL = -Wall -Wextra
endif
# for object file
@@ -45,12 +45,12 @@ CFLAGS_DEBUG = -g
else
CFLAGS_DEBUG = -DNDEBUG
ifneq ($(CC), $(CROSS_COMPILE)clang)
-LFLAGS_STRIP = -s
+LFLAGS_STRIP =
endif
endif
# CFLAGS_BASE_LIST = -S
-CFLAGS_BASE = -O2 $(CFLAGS_BASE_LIST) $(CFLAGS_WARN_WALL) $(CFLAGS_WARN) \
+CFLAGS_BASE = $(CFLAGS_BASE_LIST) $(CFLAGS_WARN_WALL) $(CFLAGS_WARN) \
$(CFLAGS_DEBUG) -D_REENTRANT -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE \
-fPIC
@@ -169,7 +169,7 @@ endif
-CFLAGS = $(MY_ARCH_2) $(LOCAL_FLAGS) $(CFLAGS_BASE2) $(CFLAGS_BASE) $(FLAGS_FLTO) $(CC_SHARED) -o $@
+CFLAGS += $(MY_ARCH_2) $(LOCAL_FLAGS) $(CFLAGS_BASE2) $(CFLAGS_BASE) $(FLAGS_FLTO) $(CC_SHARED) -o $@
ifdef IS_MINGW
@@ -1361,7 +1361,7 @@ predef_cc:
$(CC) $(CFLAGS) -E $(SHOW_PREDEF) ../../../../C/CpuArch.c > predef_cc_log
# $(CC) $(CFLAGS) -E -dM - < /dev/null
predef_cxx:
- $(CXX) $(CFLAGS) -E $(SHOW_PREDEF) ../../../Common/CrcReg.cpp > predef_cxx_log
+ $(CXX) $(CXXFLAGS) -E $(SHOW_PREDEF) ../../../Common/CrcReg.cpp > predef_cxx_log
predef: predef_cc predef_cxx
+36
View File
@@ -0,0 +1,36 @@
--- a/C/Threads.c
+++ b/C/Threads.c
@@ -472,7 +472,7 @@ WRes Thread_Create_With_CpuSet(CThread *
*/
// ret2 =
- pthread_attr_setaffinity_np(&attr, sizeof(*cpuSet), cpuSet);
+ //pthread_attr_setaffinity_np(&attr, sizeof(*cpuSet), cpuSet);
// if (ret2) ret = ret2;
#endif
}
@@ -482,14 +482,12 @@ WRes Thread_Create_With_CpuSet(CThread *
if (!ret)
{
p->_created = 1;
- /*
if (cpuSet)
{
// ret2 =
pthread_setaffinity_np(p->_tid, sizeof(*cpuSet), cpuSet);
// if (ret2) ret = ret2;
}
- */
}
}
// ret2 =
--- a/C/Threads.h
+++ b/C/Threads.h
@@ -29,6 +29,7 @@ Z7_DIAGNOSTIC_IGNORE_END_RESERVED_MACRO_
#endif
#include <pthread.h>
+#include <sched.h>
#endif
+3
View File
@@ -0,0 +1,3 @@
#!/bin/sh
7zz | grep "$PKG_VERSION"
+55
View File
@@ -0,0 +1,55 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=7zip
PKG_VERSION:=25.01
PKG_REV:=$(subst .,,$(PKG_VERSION))
PKG_RELEASE:=1
PKG_SOURCE:=7z$(PKG_REV)-src.tar.xz
PKG_SOURCE_URL:=https://7-zip.org/a/
PKG_HASH:=skip
PKG_MAINTAINER:=jjm2473 <jjm2473@gmail.com>
PKG_LICENSE:=LGPL-2.0-only
PKG_LICENSE_FILES:=DOC/License.txt DOC/copying.txt
PKG_CPE_ID:=cpe:/a:7-zip:7-zip
PKG_CHECK_FORMAT_SECURITY:=0
include $(INCLUDE_DIR)/package.mk
define Package/7zip
SECTION:=utils
CATEGORY:=Utilities
DEPENDS:=+libstdcpp
TITLE:=7zip
URL:=https://7-zip.org/
SUBMENU:=Compression
endef
define Package/7zip/description
File archiver with a high compression ratio
endef
TAR_OPTIONS := -C $(PKG_BUILD_DIR) $(TAR_OPTIONS)
define Build/Configure
endef
define Build/Compile
$(MAKE) -C $(PKG_BUILD_DIR)/CPP/7zip/Bundles/Alone2 -f ../../cmpl_gcc.mak \
CC="$(TARGET_CC) $(TARGET_CFLAGS) -D_GNU_SOURCE -O" \
CXX="$(TARGET_CXX) $(TARGET_CXXFLAGS) -D_GNU_SOURCE -O" \
DISABLE_RAR=1
endef
define Package/7zip/install
$(INSTALL_DIR) $(1)/usr/bin/
$(INSTALL_BIN) \
$(PKG_BUILD_DIR)/CPP/7zip/Bundles/Alone2/b/g/7zz \
$(1)/usr/bin/
$(LN) 7zz $(1)/usr/bin/7z
endef
$(eval $(call BuildPackage,7zip))
+44
View File
@@ -0,0 +1,44 @@
--- a/CPP/7zip/7zip_gcc.mak
+++ b/CPP/7zip/7zip_gcc.mak
@@ -24,7 +24,7 @@ PROGPATH_STATIC = $(O)/$(PROG)s
ifneq ($(CC), xlc)
-CFLAGS_WARN_WALL = -Werror -Wall -Wextra
+CFLAGS_WARN_WALL = -Wall -Wextra
endif
# for object file
@@ -45,12 +45,12 @@ CFLAGS_DEBUG = -g
else
CFLAGS_DEBUG = -DNDEBUG
ifneq ($(CC), $(CROSS_COMPILE)clang)
-LFLAGS_STRIP = -s
+LFLAGS_STRIP =
endif
endif
# CFLAGS_BASE_LIST = -S
-CFLAGS_BASE = -O2 $(CFLAGS_BASE_LIST) $(CFLAGS_WARN_WALL) $(CFLAGS_WARN) \
+CFLAGS_BASE = $(CFLAGS_BASE_LIST) $(CFLAGS_WARN_WALL) $(CFLAGS_WARN) \
$(CFLAGS_DEBUG) -D_REENTRANT -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE \
-fPIC
@@ -169,7 +169,7 @@ endif
-CFLAGS = $(MY_ARCH_2) $(LOCAL_FLAGS) $(CFLAGS_BASE2) $(CFLAGS_BASE) $(FLAGS_FLTO) $(CC_SHARED) -o $@
+CFLAGS += $(MY_ARCH_2) $(LOCAL_FLAGS) $(CFLAGS_BASE2) $(CFLAGS_BASE) $(FLAGS_FLTO) $(CC_SHARED) -o $@
ifdef IS_MINGW
@@ -1361,7 +1361,7 @@ predef_cc:
$(CC) $(CFLAGS) -E $(SHOW_PREDEF) ../../../../C/CpuArch.c > predef_cc_log
# $(CC) $(CFLAGS) -E -dM - < /dev/null
predef_cxx:
- $(CXX) $(CFLAGS) -E $(SHOW_PREDEF) ../../../Common/CrcReg.cpp > predef_cxx_log
+ $(CXX) $(CXXFLAGS) -E $(SHOW_PREDEF) ../../../Common/CrcReg.cpp > predef_cxx_log
predef: predef_cc predef_cxx
+36
View File
@@ -0,0 +1,36 @@
--- a/C/Threads.c
+++ b/C/Threads.c
@@ -472,7 +472,7 @@ WRes Thread_Create_With_CpuSet(CThread *
*/
// ret2 =
- pthread_attr_setaffinity_np(&attr, sizeof(*cpuSet), cpuSet);
+ //pthread_attr_setaffinity_np(&attr, sizeof(*cpuSet), cpuSet);
// if (ret2) ret = ret2;
#endif
}
@@ -482,14 +482,12 @@ WRes Thread_Create_With_CpuSet(CThread *
if (!ret)
{
p->_created = 1;
- /*
if (cpuSet)
{
// ret2 =
pthread_setaffinity_np(p->_tid, sizeof(*cpuSet), cpuSet);
// if (ret2) ret = ret2;
}
- */
}
}
// ret2 =
--- a/C/Threads.h
+++ b/C/Threads.h
@@ -29,6 +29,7 @@ Z7_DIAGNOSTIC_IGNORE_END_RESERVED_MACRO_
#endif
#include <pthread.h>
+#include <sched.h>
#endif
+23
View File
@@ -0,0 +1,23 @@
## 适用于openwrt 23.05 及以上的分支.
## 所有插件都为网上收集的开源插件,感谢作者们的付出.
## 本仓库所有插件已编译IPK下载
### 使用软件源请删除 opkg配置(/etc/opkg.conf) 中的 option check_signature
| CPU架构 | 下载地址 | 适用设备 | 软件源 | 更新频率 |
|----------------|-----------------------------------------------------|--------------------------------------|-----------|-----------|
| X86_64 | [📥](https://dl.openwrt.ai/latest/packages/x86_64/kiddin9/) | 64位PC软路由 | src/gz openwrt_kiddin9 https://dl.openwrt.ai/latest/packages/x86_64/kiddin9 | 日更 |
| i386_pentium4 | [📥](https://dl.openwrt.ai/latest/packages/i386_pentium4/kiddin9/) | 32位PC软路由 | src/gz openwrt_kiddin9 https://dl.openwrt.ai/latest/packages/i386_pentium4/kiddin9 | 日更 |
| aarch64_generic | [📥](https://dl.openwrt.ai/latest/packages/aarch64_generic/kiddin9/) | R2S/R4S等 | src/gz openwrt_kiddin9 https://dl.openwrt.ai/latest/packages/aarch64_generic/kiddin9 | 日更 |
| aarch64_cortex-a72 | [📥](https://dl.openwrt.ai/latest/packages/aarch64_cortex-a72/kiddin9/) | 树莓派4B等 | src/gz openwrt_kiddin9 https://dl.openwrt.ai/latest/packages/aarch64_cortex-a72/kiddin9 | 日更 |
| arm_arm1176jzf-s_vfp | [📥](https://dl.openwrt.ai/latest/packages/arm_arm1176jzf-s_vfp/kiddin9/) | 树莓派1等 | src/gz openwrt_kiddin9 https://dl.openwrt.ai/latest/packages/arm_arm1176jzf-s_vfp/kiddin9 | 日更 |
| mipsel_24kc | [📥](https://dl.openwrt.ai/latest/packages/mipsel_24kc/kiddin9/) | k2p,ac2100等 | src/gz openwrt_kiddin9 https://dl.openwrt.ai/latest/packages/mipsel_24kc/kiddin9 | 日更 |
| mips_24kc | [📥](https://dl.openwrt.ai/latest/packages/mips_24kc/kiddin9/) | GL-AR300M,NETGEAR WNDR4300等 | src/gz openwrt_kiddin9 https://dl.openwrt.ai/latest/packages/mips_24kc/kiddin9 | 日更 |
| aarch64_cortex-a53 | [📥](https://dl.openwrt.ai/latest/packages/aarch64_cortex-a53/kiddin9/) | N1,红米AX6,小米AX6S等 | src/gz openwrt_kiddin9 https://dl.openwrt.ai/latest/packages/aarch64_cortex-a53/kiddin9 | 日更 |
| arm_cortex-a9 | [📥](https://dl.openwrt.ai/latest/packages/arm_cortex-a9/kiddin9/) | 斐讯K3,华硕RT-AC68U,RT-AC88U等 | src/gz openwrt_kiddin9 https://dl.openwrt.ai/latest/packages/arm_cortex-a9/kiddin9 | 日更 |
| arm_cortex-a7_neon-vfpv4 | [📥](https://dl.openwrt.ai/latest/packages/arm_cortex-a7_neon-vfpv4/kiddin9/) | 华硕RT-ACRH17,RT-AC58U等 | src/gz openwrt_kiddin9 https://dl.openwrt.ai/latest/packages/arm_cortex-a7_neon-vfpv4/kiddin9 | 日更 |
| arm_cortex-a9_vfpv3-d16 | [📥](https://dl.openwrt.ai/latest/packages/arm_cortex-a9_vfpv3-d16/kiddin9/) | Linksys WRT1900ACS等 | src/gz openwrt_kiddin9 https://dl.openwrt.ai/latest/packages/arm_cortex-a9_vfpv3-d16/kiddin9 | 日更 |
| arm_cortex-a5_vfpv4 | [📥](https://dl.openwrt.ai/latest/packages/arm_cortex-a5_vfpv4/kiddin9/) | 玩客云等 | src/gz openwrt_kiddin9 https://dl.openwrt.ai/latest/packages/arm_cortex-a5_vfpv4/kiddin9 | 日更 |
| arm_cortex-a15_neon-vfpv4 | [📥](https://dl.openwrt.ai/latest/packages/arm_cortex-a15_neon-vfpv4/kiddin9/) | NETGEAR R7800等 | src/gz openwrt_kiddin9 https://dl.openwrt.ai/latest/packages/arm_cortex-a15_neon-vfpv4/kiddin9 | 日更 |
| aarch64_cortex-a76 | [📥](https://dl.openwrt.ai/latest/packages/aarch64_cortex-a76/kiddin9/) | 树莓派5等 | src/gz openwrt_kiddin9 https://dl.openwrt.ai/latest/packages/aarch64_cortex-a76/kiddin9 | 日更 |
+55
View File
@@ -0,0 +1,55 @@
#
# Copyright (C) 2015 OpenWrt-dist
# Copyright (C) 2015 Jian Chang <aa65535@live.com>
#
# This is free software, licensed under the GNU General Public License v3.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=ShadowVPN
PKG_VERSION:=0.2.0
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://github.com/aa65535/openwrt-shadowvpn/releases/download/v$(PKG_VERSION)
PKG_HASH:=skip
PKG_LICENSE:=GPL-3.0
PKG_LICENSE_FILES:=COPYING
PKG_MAINTAINER:=clowwindy <clowwindy42@gmail.com>
PKG_FIXUP:=autoreconf
PKG_BUILD_PARALLEL:=1
PKG_INSTALL:=1
include $(INCLUDE_DIR)/package.mk
define Package/ShadowVPN
SECTION:=net
CATEGORY:=Network
TITLE:=A fast, safe VPN based on libsodium
URL:=https://github.com/clowwindy/ShadowVPN
DEPENDS:=+kmod-tun +ip
endef
define Package/ShadowVPN/conffiles
/etc/config/shadowvpn
endef
define Package/ShadowVPN/install
$(INSTALL_DIR) $(1)/etc/config
$(INSTALL_DATA) ./files/shadowvpn.config $(1)/etc/config/shadowvpn
$(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_BIN) ./files/shadowvpn.init $(1)/etc/init.d/shadowvpn
$(INSTALL_DIR) $(1)/etc/hotplug.d/iface
$(INSTALL_DATA) ./files/shadowvpn.hotplug $(1)/etc/hotplug.d/iface/30-shadowvpn
$(INSTALL_DIR) $(1)/etc/shadowvpn
$(INSTALL_DATA) ./files/client_up.sh $(1)/etc/shadowvpn/client_up.sh
$(INSTALL_DATA) ./files/client_down.sh $(1)/etc/shadowvpn/client_down.sh
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/shadowvpn $(1)/usr/bin/
endef
$(eval $(call BuildPackage,ShadowVPN))
+44
View File
@@ -0,0 +1,44 @@
#!/bin/sh
#
# Copyright (C) 2015 OpenWrt-dist
# Copyright (C) 2015 Jian Chang <aa65535@live.com>
#
# This is free software, licensed under the GNU General Public License v3.
# See /LICENSE for more information.
#
# This script will be executed when client is down.
# All key value pairs in ShadowVPN config file will be passed to this script
# as environment variables, except password.
PID=$(cat $pidfile 2>/dev/null)
loger() {
echo "$(date '+%c') down.$1 ShadowVPN[$PID] $2"
}
# Get uci setting
route_mode=$(uci get shadowvpn.@shadowvpn[-1].route_mode_save 2>/dev/null)
# Turn off NAT over VPN
iptables -t nat -D POSTROUTING -o $intf -j MASQUERADE
iptables -D FORWARD -i $intf -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -D FORWARD -o $intf -j ACCEPT
loger notice "Turn off NAT over $intf"
# Change routing table
ip route del $server
if [ "$route_mode" != 2 ]; then
ip route del 0.0.0.0/1
ip route del 128.0.0.0/1
loger notice "Default route changed to original route"
fi
# Remove route rules
if [ -f /tmp/shadowvpn_routes ]; then
sed -e "s/^/route del /" /tmp/shadowvpn_routes | ip -batch -
loger notice "Route rules have been removed"
fi
rm -rf /tmp/shadowvpn_routes
loger info "Script $0 completed"
+59
View File
@@ -0,0 +1,59 @@
#!/bin/sh
#
# Copyright (C) 2015 OpenWrt-dist
# Copyright (C) 2015 Jian Chang <aa65535@live.com>
#
# This is free software, licensed under the GNU General Public License v3.
# See /LICENSE for more information.
#
# This script will be executed when client is up.
# All key value pairs in ShadowVPN config file will be passed to this script
# as environment variables, except password.
PID=$(cat $pidfile 2>/dev/null)
loger() {
echo "$(date '+%c') up.$1 ShadowVPN[$PID] $2"
}
# Configure IP address and MTU of VPN interface
ip addr add $net dev $intf
ip link set $intf mtu $mtu
ip link set $intf up
# Get original gateway
gateway=$(ip route show 0/0 | sed -e 's/.* via \([^ ]*\).*/\1/')
loger info "The default gateway: via $gateway"
# Get uci setting
route_mode=$(uci get shadowvpn.@shadowvpn[-1].route_mode 2>/dev/null)
route_file=$(uci get shadowvpn.@shadowvpn[-1].route_file 2>/dev/null)
# Save uci setting
uci set shadowvpn.@shadowvpn[-1].route_mode_save=$route_mode
uci commit shadowvpn
# Turn on NAT over VPN
iptables -t nat -A POSTROUTING -o $intf -j MASQUERADE
iptables -I FORWARD 1 -i $intf -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -I FORWARD 1 -o $intf -j ACCEPT
loger notice "Turn on NAT over $intf"
# Change routing table
suf="dev $intf"
ip route add $server via $gateway
if [ "$route_mode" != 2 ]; then
ip route add 0.0.0.0/1 dev $intf
ip route add 128.0.0.0/1 dev $intf
loger notice "Default route changed to VPN tun"
suf="via $gateway"
fi
# Load route rules
if [ "$route_mode" != 0 -a -f "$route_file" ]; then
grep -E "^([0-9]{1,3}\.){3}[0-9]{1,3}" $route_file >/tmp/shadowvpn_routes
sed -e "s/^/route add /" -e "s/$/ $suf/" /tmp/shadowvpn_routes | ip -batch -
loger notice "Route rules have been loaded"
fi
loger info "Script $0 completed"
+12
View File
@@ -0,0 +1,12 @@
config shadowvpn
option enable '0'
option server '127.0.0.1'
option port '1123'
option password 'my_password'
option concurrency '1'
option net '10.7.0.2/24'
option mtu '1432'
option intf 'tun0'
option route_mode '1'
option route_file '/etc/chinadns_chnroute.txt'
+10
View File
@@ -0,0 +1,10 @@
#!/bin/sh
[ "$ACTION" = ifup ] || exit 0
device=$(ip route show 0/0 | sed -e 's/.* dev \([^ ]*\).*/\1/')
[ -z "$device" -o "$DEVICE" = "$device" ] || exit 0
/etc/init.d/shadowvpn restart
logger -t ShadowVPN "Restart ShadowVPN due to ifup of $INTERFACE ($DEVICE)"
+71
View File
@@ -0,0 +1,71 @@
#!/bin/sh /etc/rc.common
#
# Copyright (C) 2015 OpenWrt-dist
# Copyright (C) 2015 Jian Chang <aa65535@live.com>
#
# This is free software, licensed under the GNU General Public License v3.
# See /LICENSE for more information.
#
START=90
STOP=15
CONFIG=/var/etc/shadowvpn.conf
start_vpn() {
local enable server port password concurrency mtu intf
config_get_bool enable $1 enable
[ "$enable" = 1 ] || return 0
config_get server $1 server
config_get port $1 port
config_get user_token $1 user_token
config_get password $1 password
config_get concurrency $1 concurrency
config_get net $1 net
config_get mtu $1 mtu
config_get intf $1 intf
: ${server:?}
: ${port:?}
: ${password:?}
: ${user_token:=0000000000000000}
mkdir -p $(dirname $CONFIG)
cat <<-EOF >$CONFIG
server=$server
port=$port
password=$password
mode=client
concurrency=1
net=${net:-10.7.0.2/24}
mtu=${mtu:-1432}
intf=${intf:-tun0}
up=/etc/shadowvpn/client_up.sh
down=/etc/shadowvpn/client_down.sh
pidfile=/var/run/shadowvpn.pid
logfile=/var/log/shadowvpn.log
EOF
if [ "$user_token" != "0000000000000000" ]; then
echo "user_token=$user_token" >>$CONFIG
fi
/usr/bin/shadowvpn -c $CONFIG -s start
}
start() {
config_load shadowvpn
config_foreach start_vpn shadowvpn
}
stop() {
/usr/bin/shadowvpn -c $CONFIG -s stop
}
boot() {
if [ ! -c "/dev/net/tun" ]; then
mkdir -p /dev/net
mknod /dev/net/tun c 10 200
chmod 0666 /dev/net/tun
fi
until ip route show 0/0 | grep -q "^default"; do
sleep 1
done
start
}
+71
View File
@@ -0,0 +1,71 @@
diff --git a/Makefile.am b/Makefile.am
index d8461de..9b3fcbd 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,6 +1,3 @@
-EXTRA_DIST = \
- autogen.sh \
- README.md \
- COPYING
+EXTRA_DIST = autogen.sh
-SUBDIRS = src samples
+SUBDIRS = src
diff --git a/configure.ac b/configure.ac
index dc562d4..f54171c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -79,6 +79,6 @@ AC_ARG_ENABLE([analyze],
AM_CONDITIONAL(STATIC, test x"$static" = x"true")
-AC_CONFIG_FILES([Makefile src/Makefile samples/Makefile])
+AC_CONFIG_FILES([Makefile src/Makefile])
AC_CONFIG_SUBDIRS([libsodium])
AC_OUTPUT
diff --git a/libsodium/Makefile.am b/libsodium/Makefile.am
index ee794b0..5a73134 100644
--- a/libsodium/Makefile.am
+++ b/libsodium/Makefile.am
@@ -1,19 +1,8 @@
ACLOCAL_AMFLAGS = -I m4
-EXTRA_DIST = \
- autogen.sh \
- libsodium.sln \
- libsodium.vcxproj \
- libsodium.vcxproj.filters \
- LICENSE \
- README.markdown \
- THANKS
+EXTRA_DIST = autogen.sh
-SUBDIRS = \
- dist-build \
- msvc-scripts \
- src \
- test
+SUBDIRS = src
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = @PACKAGE_NAME@.pc
diff --git a/libsodium/configure.ac b/libsodium/configure.ac
index 21b8f10..281e3ff 100644
--- a/libsodium/configure.ac
+++ b/libsodium/configure.ac
@@ -442,15 +442,10 @@ AH_VERBATIM([NDEBUG], [/* Always evaluate assert() calls */
#endif])
AC_CONFIG_FILES([Makefile
- dist-build/Makefile
libsodium.pc
- libsodium-uninstalled.pc
- msvc-scripts/Makefile
src/Makefile
src/libsodium/Makefile
src/libsodium/include/Makefile
src/libsodium/include/sodium/version.h
- test/default/Makefile
- test/Makefile
])
AC_OUTPUT
@@ -0,0 +1,110 @@
--- a/libsodium/src/libsodium/Makefile.am
+++ b/libsodium/src/libsodium/Makefile.am
@@ -31,6 +31,9 @@ libsodium_la_SOURCES = \
crypto_core/salsa20/ref/core_salsa20.c \
crypto_core/salsa20/core_salsa20_api.c \
crypto_core/salsa20/ref/api.h \
+ crypto_core/salsa208/ref/core_salsa208.c \
+ crypto_core/salsa208/core_salsa208_api.c \
+ crypto_core/salsa208/ref/api.h \
crypto_generichash/crypto_generichash.c \
crypto_generichash/blake2/generichash_blake2_api.c \
crypto_generichash/blake2/ref/api.h \
@@ -136,6 +139,10 @@ libsodium_la_SOURCES = \
crypto_stream/chacha20/ref/api.h \
crypto_stream/chacha20/ref/stream_chacha20_ref.c \
crypto_stream/salsa20/stream_salsa20_api.c \
+ crypto_stream/salsa208/stream_salsa208_api.c \
+ crypto_stream/salsa208/ref/api.h \
+ crypto_stream/salsa208/ref/stream_salsa208.c \
+ crypto_stream/salsa208/ref/xor_salsa208.c \
crypto_stream/xsalsa20/stream_xsalsa20_api.c \
crypto_stream/xsalsa20/ref/api.h \
crypto_stream/xsalsa20/ref/stream_xsalsa20.c \
@@ -204,9 +211,6 @@ libsodium_la_SOURCES += \
crypto_core/salsa2012/ref/core_salsa2012.c \
crypto_core/salsa2012/core_salsa2012_api.c \
crypto_core/salsa2012/ref/api.h \
- crypto_core/salsa208/ref/core_salsa208.c \
- crypto_core/salsa208/core_salsa208_api.c \
- crypto_core/salsa208/ref/api.h \
crypto_sign/edwards25519sha512batch/sign_edwards25519sha512batch_api.c \
crypto_sign/edwards25519sha512batch/ref/api.h \
crypto_sign/edwards25519sha512batch/ref/fe25519.h \
@@ -232,11 +236,7 @@ libsodium_la_SOURCES += \
crypto_stream/salsa2012/stream_salsa2012_api.c \
crypto_stream/salsa2012/ref/api.h \
crypto_stream/salsa2012/ref/stream_salsa2012.c \
- crypto_stream/salsa2012/ref/xor_salsa2012.c \
- crypto_stream/salsa208/stream_salsa208_api.c \
- crypto_stream/salsa208/ref/api.h \
- crypto_stream/salsa208/ref/stream_salsa208.c \
- crypto_stream/salsa208/ref/xor_salsa208.c
+ crypto_stream/salsa2012/ref/xor_salsa2012.c
endif
libsodium_la_LDFLAGS = \
--- a/libsodium/src/libsodium/crypto_generichash/blake2/ref/blake2.h
+++ b/libsodium/src/libsodium/crypto_generichash/blake2/ref/blake2.h
@@ -98,7 +98,7 @@ extern "C" {
uint8_t personal[BLAKE2B_PERSONALBYTES]; // 64
} blake2b_param;
-#ifndef DEFINE_BLAKE2B_STATE
+#if 1
typedef crypto_generichash_blake2b_state blake2b_state;
#else
ALIGN( 64 ) typedef struct blake2b_state_
@@ -110,7 +110,6 @@ typedef crypto_generichash_blake2b_state blake2b_state;
size_t buflen;
uint8_t last_node;
} blake2b_state;
-#endif
typedef struct blake2sp_state_
{
@@ -127,6 +126,8 @@ typedef crypto_generichash_blake2b_state blake2b_state;
uint8_t buf[4 * BLAKE2B_BLOCKBYTES];
size_t buflen;
} blake2bp_state;
+#endif
+
#pragma pack(pop)
// Streaming API
@@ -146,6 +147,7 @@ typedef crypto_generichash_blake2b_state blake2b_state;
int blake2b_update( blake2b_state *S, const uint8_t *in, uint64_t inlen );
int blake2b_final( blake2b_state *S, uint8_t *out, uint8_t outlen );
+#if 0
int blake2sp_init( blake2sp_state *S, const uint8_t outlen );
int blake2sp_init_key( blake2sp_state *S, const uint8_t outlen, const void *key, const uint8_t keylen );
int blake2sp_update( blake2sp_state *S, const uint8_t *in, uint64_t inlen );
@@ -155,6 +157,7 @@ typedef crypto_generichash_blake2b_state blake2b_state;
int blake2bp_init_key( blake2bp_state *S, const uint8_t outlen, const void *key, const uint8_t keylen );
int blake2bp_update( blake2bp_state *S, const uint8_t *in, uint64_t inlen );
int blake2bp_final( blake2bp_state *S, uint8_t *out, uint8_t outlen );
+#endif
// Simple API
int blake2s( uint8_t *out, const void *in, const void *key, const uint8_t outlen, const uint64_t inlen, uint8_t keylen );
--- a/libsodium/src/libsodium/crypto_generichash/blake2/ref/blake2b-ref.c
+++ b/libsodium/src/libsodium/crypto_generichash/blake2/ref/blake2b-ref.c
@@ -415,7 +415,7 @@ int blake2b_final( blake2b_state *S, uint8_t *out, uint8_t outlen )
/* inlen, at least, should be uint64_t. Others can be size_t. */
int blake2b( uint8_t *out, const void *in, const void *key, const uint8_t outlen, const uint64_t inlen, uint8_t keylen )
{
- blake2b_state S[1];
+ blake2b_state *S;
/* Verify parameters */
if ( NULL == in ) return -1;
@@ -441,7 +441,7 @@ int blake2b( uint8_t *out, const void *in, const void *key, const uint8_t outlen
int blake2b_salt_personal( uint8_t *out, const void *in, const void *key, const uint8_t outlen, const uint64_t inlen, uint8_t keylen,
const void *salt, const void *personal )
{
- blake2b_state S[1];
+ blake2b_state *S;
/* Verify parameters */
if ( NULL == in ) return -1;
+83
View File
@@ -0,0 +1,83 @@
# SPDX-Identifier-License: GPL-3.0-only
#
# Copyright (C) 2021 ImmortalWrt.org
include $(TOPDIR)/rules.mk
PKG_NAME:=UnblockNeteaseMusic-Go
PKG_VERSION:=0.2.13
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/cnsilvan/UnblockNeteaseMusic/tar.gz/$(PKG_VERSION)?
PKG_HASH:=skip
PKG_LICENSE:=GPL-3.0
PKG_LICENSE_FILE:=LICENSE
PKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>
PKG_CONFIG_DEPENDS:= \
CONFIG_UNBLOCKNETEASEMUSIC_GO_COMPRESS_GOPROXY \
CONFIG_UNBLOCKNETEASEMUSIC_GO_COMPRESS_UPX
PKG_BUILD_DIR:=$(BUILD_DIR)/$(firstword $(subst -, ,$(PKG_NAME)))-$(PKG_VERSION)
PKG_BUILD_DEPENDS:=golang/host upx/host
PKG_BUILD_PARALLEL:=1
PKG_USE_MIPS16:=0
GO_PKG:=github.com/cnsilvan/UnblockNeteaseMusic
GO_PKG_BUILD_PKG:=$$(GO_PKG)
GO_PKG_LDFLAGS:=-s -w
COMPILE_TIME:= $(shell TZ=UTC-8 date '+%Y-%m-%d %H:%M:%S')
GO_PKG_LDFLAGS+= \
-X '$(GO_PKG)/version.Version=$(PKG_VERSION)' \
-X '$(GO_PKG)/version.BuildTime=$(COMPILE_TIME)' \
-X '$(GO_PKG)/version.ExGoVersionInfo=$(GO_ARM) $(GO_MIPS)$(GO_MIPS64)'
include $(INCLUDE_DIR)/package.mk
include $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk
define Package/UnblockNeteaseMusic-Go/config
config UNBLOCKNETEASEMUSIC_GO_COMPRESS_GOPROXY
bool "Compiling with GOPROXY proxy"
default n
config UNBLOCKNETEASEMUSIC_GO_COMPRESS_UPX
bool "Compress executable files with UPX"
depends on !mips64
default n
endef
ifeq ($(CONFIG_UNBLOCKNETEASEMUSIC_GO_COMPRESS_GOPROXY),y)
export GO111MODULE=on
export GOPROXY=https://goproxy.io
endif
define Package/UnblockNeteaseMusic-Go
SECTION:=multimedia
CATEGORY:=Multimedia
TITLE:=Revive Netease Cloud Music (Golang)
URL:=https://github.com/cnsilvan/UnblockNeteaseMusic
DEPENDS:=$(GO_ARCH_DEPENDS)
endef
define Build/Compile
$(call GoPackage/Build/Compile)
ifeq ($(CONFIG_UNBLOCKNETEASEMUSIC_GO_COMPRESS_UPX),y)
$(STAGING_DIR_HOST)/bin/upx --lzma --best $(GO_PKG_BUILD_BIN_DIR)/UnblockNeteaseMusic
endif
endef
define Package/UnblockNeteaseMusic-Go/install
$(call GoPackage/Package/Install/Bin,$(PKG_INSTALL_DIR))
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/UnblockNeteaseMusic $(1)/usr/bin/UnblockNeteaseMusic
$(INSTALL_DIR) $(1)/usr/share/UnblockNeteaseMusicGo
$(CP) ./files/* $(1)/usr/share/UnblockNeteaseMusicGo/
endef
$(eval $(call GoBinPackage,UnblockNeteaseMusic-Go))
$(eval $(call BuildPackage,UnblockNeteaseMusic-Go))
+14
View File
@@ -0,0 +1,14 @@
-----BEGIN CERTIFICATE-----
MIICIjCCAaigAwIBAgIUTc9HQDej5hLCQ74u436a5yE4MDcwCgYIKoZIzj0EAwMw
SDELMAkGA1UEBhMCQ04xJDAiBgNVBAMMG1VuYmxvY2tOZXRlYXNlTXVzaWMgUm9v
dCBDQTETMBEGA1UECgwKMTcxNTE3MzMyOTAeFw0yMTA0MzAwNzIzMDJaFw0yNjA0
MjkwNzIzMDJaMEgxCzAJBgNVBAYTAkNOMSQwIgYDVQQDDBtVbmJsb2NrTmV0ZWFz
ZU11c2ljIFJvb3QgQ0ExEzARBgNVBAoMCjE3MTUxNzMzMjkwdjAQBgcqhkjOPQIB
BgUrgQQAIgNiAASIyI7lYgGlq49qWtY1O2/XNDeowYf7W/Z+l7C14bphxAJ9jSDo
tLwbFPWy5VPENc0rB0/yeHA2z7LU67POL2gGgp+17y7scLkkBk3Q7wRMETrtP44Z
ITBstZ0wzVyyQEKjUzBRMB0GA1UdDgQWBBQ2F7+t8cPHJaWuCD8RHTSdLugKYzAf
BgNVHSMEGDAWgBQ2F7+t8cPHJaWuCD8RHTSdLugKYzAPBgNVHRMBAf8EBTADAQH/
MAoGCCqGSM49BAMDA2gAMGUCMQDqaRX2e01e0U+f0As/KUKDhmG5ElkK5CjYK9jk
kXLNGFXJLGta6CDvjtMLBPc20qkCMBvDs+JnJKVBEJNZVsRBBs+v2YxNU/u2aYJa
dMwXuFveSDWOS7mBeRztX/geEggiSw==
-----END CERTIFICATE-----
+15
View File
@@ -0,0 +1,15 @@
-----BEGIN CERTIFICATE-----
MIICRDCCAcqgAwIBAgIUeVqRrT2mHG5Mc8JD+ErphiAmlgkwCgYIKoZIzj0EAwMw
SDELMAkGA1UEBhMCQ04xJDAiBgNVBAMMG1VuYmxvY2tOZXRlYXNlTXVzaWMgUm9v
dCBDQTETMBEGA1UECgwKMTcxNTE3MzMyOTAeFw0yMTA0MzAwNzIzMDJaFw0yMjA0
MzAwNzIzMDJaMHsxCzAJBgNVBAYTAkNOMREwDwYDVQQHDAhIYW5nemhvdTEsMCoG
A1UECgwjTmV0RWFzZSAoSGFuZ3pob3UpIE5ldHdvcmsgQ28uLCBMdGQxETAPBgNV
BAsMCElUIERlcHQuMRgwFgYDVQQDDA8qLm11c2ljLjE2My5jb20wdjAQBgcqhkjO
PQIBBgUrgQQAIgNiAAQTPyU9RQ1pAFMLmozi+c4pEC1rrxAlPGwO9Em+qV+a5qLW
gQjjsJeabMqJ/UQ7hDtdKVxWuXiAjMiDcXwL63I71MZKPTAEKXdCmNQwb4kXvRUn
oOR4r7BMxEpGlf0CULWjQjBAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMCkGA1UdEQQi
MCCCDW11c2ljLjE2My5jb22CDyoubXVzaWMuMTYzLmNvbTAKBggqhkjOPQQDAwNo
ADBlAjEAs5bdgnNP/DiK919RiWscC0kyuY0ugG1C8m8F2Yod4MI3oTyrkVcag21o
NSzm802uAjBoPuKEbjjFP4ics0BQdICiVd6WCVAsE69FnlmqRteAJqxvdKGpVLi+
Qi3arfomrrc=
-----END CERTIFICATE-----
+9
View File
@@ -0,0 +1,9 @@
-----BEGIN EC PARAMETERS-----
BgUrgQQAIg==
-----END EC PARAMETERS-----
-----BEGIN EC PRIVATE KEY-----
MIGkAgEBBDBfW3twxGaQmMzP9p0/UU5EvHFVCbBw4piVFJ+pm/uFY6CKZkC5LGMa
Uc9vn/KiewGgBwYFK4EEACKhZANiAAQTPyU9RQ1pAFMLmozi+c4pEC1rrxAlPGwO
9Em+qV+a5qLWgQjjsJeabMqJ/UQ7hDtdKVxWuXiAjMiDcXwL63I71MZKPTAEKXdC
mNQwb4kXvRUnoOR4r7BMxEpGlf0CULU=
-----END EC PRIVATE KEY-----
@@ -0,0 +1,144 @@
From f4f5d11b578a1ab2c3d089bbe5453052b43892bb Mon Sep 17 00:00:00 2001
From: tofuliang <tofuliang@gmail.com>
Date: Mon, 24 Jan 2022 18:53:11 +0800
Subject: [PATCH] fix block ad,add web traffic logs
---
app.go | 1 +
config/config.go | 1 +
processor/processor.go | 55 +++++++++++++++++++++++++++++++++---------
3 files changed, 45 insertions(+), 12 deletions(-)
diff --git a/app.go b/app.go
index 73a6070..1018d75 100644
--- a/app.go
+++ b/app.go
@@ -45,6 +45,7 @@ func main() {
log.Println("EnableLocalVip=", *config.EnableLocalVip)
log.Println("UnlockSoundEffects=", *config.UnlockSoundEffects)
log.Println("QQCookieFile=", *config.QQCookieFile)
+ log.Println("LogWebTraffic=", *config.LogWebTraffic)
if host.InitHosts() == nil {
//go func() {
// // // terminal: $ go tool pprof -http=:8081 http://localhost:6060/debug/pprof/heap
diff --git a/config/config.go b/config/config.go
index 6c07873..a653cdf 100644
--- a/config/config.go
+++ b/config/config.go
@@ -31,6 +31,7 @@ var (
EnableLocalVip = flag.Bool("lv", false, "enable local vip")
UnlockSoundEffects = flag.Bool("sef", false, "unlock SoundEffects")
QQCookieFile = flag.String("qc", "./qq.cookie", "specify cookies file ,such as : \"qq.cookie\"")
+ LogWebTraffic = flag.Bool("wl", false, "log request url and response")
)
func ValidParams() bool {
diff --git a/processor/processor.go b/processor/processor.go
index 8d09dbf..d07b9d3 100644
--- a/processor/processor.go
+++ b/processor/processor.go
@@ -6,14 +6,6 @@ import (
"crypto/md5"
"encoding/hex"
"encoding/json"
- "github.com/cnsilvan/UnblockNeteaseMusic/cache"
- "github.com/cnsilvan/UnblockNeteaseMusic/common"
- "github.com/cnsilvan/UnblockNeteaseMusic/config"
- "github.com/cnsilvan/UnblockNeteaseMusic/network"
- "github.com/cnsilvan/UnblockNeteaseMusic/processor/crypto"
- "github.com/cnsilvan/UnblockNeteaseMusic/provider"
- "github.com/cnsilvan/UnblockNeteaseMusic/utils"
- "golang.org/x/text/width"
"io"
"io/ioutil"
"log"
@@ -22,6 +14,15 @@ import (
"regexp"
"strconv"
"strings"
+
+ "github.com/cnsilvan/UnblockNeteaseMusic/cache"
+ "github.com/cnsilvan/UnblockNeteaseMusic/common"
+ "github.com/cnsilvan/UnblockNeteaseMusic/config"
+ "github.com/cnsilvan/UnblockNeteaseMusic/network"
+ "github.com/cnsilvan/UnblockNeteaseMusic/processor/crypto"
+ "github.com/cnsilvan/UnblockNeteaseMusic/provider"
+ "github.com/cnsilvan/UnblockNeteaseMusic/utils"
+ "golang.org/x/text/width"
)
var (
@@ -188,6 +189,9 @@ func RequestAfter(request *http.Request, response *http.Response, netease *Netea
if ok {
code = codeN.String()
}
+
+ logResponse(netease)
+
if strings.EqualFold(netease.Path, "/api/osx/version") {
modified = disableUpdate(netease)
} else if strings.Contains(netease.Path, "/usertool/sound/") {
@@ -197,9 +201,24 @@ func RequestAfter(request *http.Request, response *http.Response, netease *Netea
for key, resp := range netease.JsonBody {
if strings.Contains(key, "/usertool/sound/") {
modified = unblockSoundEffects(resp.(map[string]interface{}))
- } else if *config.BlockAds && strings.Contains(netease.Path, "api/ad/") {
+ } else if *config.BlockAds && strings.Contains(key, "api/ad/") {
+ log.Println("block Ad has been triggered(" + key + ").")
resp = &common.MapType{}
modified = true
+ } else if *config.BlockAds && strings.EqualFold(key, "/api/v2/banner/get") {
+ newInfo := make(common.SliceType, 0)
+ info := netease.JsonBody[key]
+ for _, data := range info.(common.MapType)["banners"].(common.SliceType) {
+ if banner, ok := data.(common.MapType); ok {
+ if banner["adid"] == nil {
+ newInfo = append(newInfo, banner)
+ } else {
+ log.Println("block banner Ad has been triggered.")
+ modified = true
+ }
+ }
+ }
+ info.(common.MapType)["banners"] = newInfo
}
}
} else if !netease.Web && (code == "401" || code == "512") && strings.Contains(netease.Path, "manipulate") {
@@ -220,7 +239,9 @@ func RequestAfter(request *http.Request, response *http.Response, netease *Netea
// log.Println("NeedRepackage")
modifiedJson, _ := json.Marshal(netease.JsonBody)
// log.Println(netease)
- // log.Println(string(modifiedJson))
+ if *config.LogWebTraffic {
+ log.Println("modified =>\n" + string(modifiedJson))
+ }
if netease.Encrypted {
modifiedJson = crypto.AesEncryptECB(modifiedJson, []byte(aeskey))
}
@@ -258,14 +279,24 @@ func disableUpdate(netease *Netease) bool {
if len(value.(common.SliceType)) > 0 {
modified = true
jsonBody["updateFiles"] = make(common.SliceType, 0)
+ log.Println("disable update has been triggered.")
}
default:
}
}
- // modifiedJson, _ := json.Marshal(jsonBody)
- // log.Println(string(modifiedJson))
return modified
}
+
+func logResponse(netease *Netease) {
+ if *config.LogWebTraffic {
+ reqUrl := netease.Path
+ jsonBody := netease.JsonBody
+ modifiedJson, _ := json.Marshal(jsonBody)
+ sep := "===================================\n"
+ log.Println(sep + reqUrl + " => \n" + string(modifiedJson) + "\n")
+ }
+}
+
func localVIP(netease *Netease) bool {
if !*config.EnableLocalVip {
return false
Loaded 100 of 14253 files, more files were not shown because too many files have changed in this diff. Show more