diff --git a/3ginfo/Makefile b/3ginfo/Makefile deleted file mode 100644 index f8afe67ba..000000000 --- a/3ginfo/Makefile +++ /dev/null @@ -1,121 +0,0 @@ -include $(TOPDIR)/rules.mk - -PKG_NAME:=3ginfo -PKG_VERSION:=20260425 -PKG_RELEASE:=3 - -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 - 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)) diff --git a/3ginfo/files-html-old/etc/init.d/3ginfo b/3ginfo/files-html-old/etc/init.d/3ginfo deleted file mode 100755 index 1f5ac0bdb..000000000 --- a/3ginfo/files-html-old/etc/init.d/3ginfo +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh /etc/rc.common - -# (c) 2010-2019 Cezary Jackiewicz - -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 -} diff --git a/3ginfo/files-html-old/usr/share/3ginfo/cgi-bin/limit.sh b/3ginfo/files-html-old/usr/share/3ginfo/cgi-bin/limit.sh deleted file mode 100755 index 9e26a298a..000000000 --- a/3ginfo/files-html-old/usr/share/3ginfo/cgi-bin/limit.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/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 "
$O
" - else - echo "
Brak możliwości sprawdzenia limitu. Spróbuj za chwilę.
" - fi -else - echo "
Brak skryptu $SCRIPT
" -fi -echo "
" diff --git a/3ginfo/files-html-old/usr/share/3ginfo/cgi-bin/onoff.sh b/3ginfo/files-html-old/usr/share/3ginfo/cgi-bin/onoff.sh deleted file mode 100755 index c0045f7cd..000000000 --- a/3ginfo/files-html-old/usr/share/3ginfo/cgi-bin/onoff.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/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 diff --git a/3ginfo/files-html-old/usr/share/3ginfo/cgi-bin/signal.sh b/3ginfo/files-html-old/usr/share/3ginfo/cgi-bin/signal.sh deleted file mode 100755 index 43b5af3a2..000000000 --- a/3ginfo/files-html-old/usr/share/3ginfo/cgi-bin/signal.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/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 diff --git a/3ginfo/files-html-old/usr/share/3ginfo/cgi-bin/sms.sh b/3ginfo/files-html-old/usr/share/3ginfo/cgi-bin/sms.sh deleted file mode 100755 index 02e34fde3..000000000 --- a/3ginfo/files-html-old/usr/share/3ginfo/cgi-bin/sms.sh +++ /dev/null @@ -1,96 +0,0 @@ -#!/bin/sh - -echo "Content-type: text/html" -echo "" -echo " - - - - SMS - - - -" -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!
" - else - echo "Wystąpił problem z wysłaniem wiadomości!
" - 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 " -
- -
Numer telefonu:

-
Wiadomość:


- -
-" - -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 "
"
-gnokii --config /tmp/gnokiirc --getsms SM 0 end 2>/dev/null | \
-sed -e ' \
-s/ (unread)/<\/pre>Nowa wiadomość<\/strong><\/font>
/g; \
-s/Msg Center.*//g; \
-s/(read)//g; \
-s/^Sender/Nadawca/g;s/Date\/time/Data\/czas/g; \
-s/^Text:/Treść wiadomości:<\/pre>
/g; \
-s/\(^[0-9]*\)..Inbox Message/<\/pre>
<\/form>
/g'
-rm /tmp/gnokiirc
-
-echo "
- -" diff --git a/3ginfo/files-html-old/usr/share/3ginfo/cgi-bin/ussd.sh b/3ginfo/files-html-old/usr/share/3ginfo/cgi-bin/ussd.sh deleted file mode 100755 index 3dde5d842..000000000 --- a/3ginfo/files-html-old/usr/share/3ginfo/cgi-bin/ussd.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/sh - -echo "Content-type: text/html" -echo "" -echo " - - - - USSD - - - -" -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

" - ;; -esac - -echo " - - -
USSD:

- -
- -" diff --git a/3ginfo/files-html-old/usr/share/3ginfo/index.html b/3ginfo/files-html-old/usr/share/3ginfo/index.html deleted file mode 100644 index 9cb10a6d0..000000000 --- a/3ginfo/files-html-old/usr/share/3ginfo/index.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - - 3G/4G - - - - - - - - - - - - -
 
  -
-
-
 
 
- - diff --git a/3ginfo/files-html-old/usr/share/3ginfo/loader.gif b/3ginfo/files-html-old/usr/share/3ginfo/loader.gif deleted file mode 100644 index d428fab74..000000000 Binary files a/3ginfo/files-html-old/usr/share/3ginfo/loader.gif and /dev/null differ diff --git a/3ginfo/files-html-old/usr/share/3ginfo/scripts/cyfrowy_polsat.sh b/3ginfo/files-html-old/usr/share/3ginfo/scripts/cyfrowy_polsat.sh deleted file mode 100644 index 44e5ba121..000000000 --- a/3ginfo/files-html-old/usr/share/3ginfo/scripts/cyfrowy_polsat.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/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/.*\(Okres.*\)\(

Brak możliwości sprawdzenia limitu." -else - echo "$O1" -fi - diff --git a/3ginfo/files-html-old/usr/share/3ginfo/scripts/functions.sh b/3ginfo/files-html-old/usr/share/3ginfo/scripts/functions.sh deleted file mode 100644 index 75531eb45..000000000 --- a/3ginfo/files-html-old/usr/share/3ginfo/scripts/functions.sh +++ /dev/null @@ -1,31 +0,0 @@ -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 -} diff --git a/3ginfo/files-html-old/usr/share/3ginfo/scripts/lycamobile_pdu.gcom b/3ginfo/files-html-old/usr/share/3ginfo/scripts/lycamobile_pdu.gcom deleted file mode 100644 index 9ac15f1c2..000000000 --- a/3ginfo/files-html-old/usr/share/3ginfo/scripts/lycamobile_pdu.gcom +++ /dev/null @@ -1,18 +0,0 @@ -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 diff --git a/3ginfo/files-html-old/usr/share/3ginfo/scripts/lycamobile_pdu.sh b/3ginfo/files-html-old/usr/share/3ginfo/scripts/lycamobile_pdu.sh deleted file mode 100644 index 89fbdc1f3..000000000 --- a/3ginfo/files-html-old/usr/share/3ginfo/scripts/lycamobile_pdu.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/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 diff --git a/3ginfo/files-html-old/usr/share/3ginfo/scripts/mbank.gcom b/3ginfo/files-html-old/usr/share/3ginfo/scripts/mbank.gcom deleted file mode 100644 index f1bc2cd95..000000000 --- a/3ginfo/files-html-old/usr/share/3ginfo/scripts/mbank.gcom +++ /dev/null @@ -1,71 +0,0 @@ -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 diff --git a/3ginfo/files-html-old/usr/share/3ginfo/scripts/mbank_pdu.gcom b/3ginfo/files-html-old/usr/share/3ginfo/scripts/mbank_pdu.gcom deleted file mode 100644 index a8c12894e..000000000 --- a/3ginfo/files-html-old/usr/share/3ginfo/scripts/mbank_pdu.gcom +++ /dev/null @@ -1,71 +0,0 @@ -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 diff --git a/3ginfo/files-html-old/usr/share/3ginfo/scripts/ofnk.gcom b/3ginfo/files-html-old/usr/share/3ginfo/scripts/ofnk.gcom deleted file mode 100644 index b5e1906fa..000000000 --- a/3ginfo/files-html-old/usr/share/3ginfo/scripts/ofnk.gcom +++ /dev/null @@ -1,27 +0,0 @@ -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 diff --git a/3ginfo/files-html-old/usr/share/3ginfo/scripts/ofnk.sh b/3ginfo/files-html-old/usr/share/3ginfo/scripts/ofnk.sh deleted file mode 100644 index 2048b6220..000000000 --- a/3ginfo/files-html-old/usr/share/3ginfo/scripts/ofnk.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/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 diff --git a/3ginfo/files-html-old/usr/share/3ginfo/scripts/ofnk2.gcom b/3ginfo/files-html-old/usr/share/3ginfo/scripts/ofnk2.gcom deleted file mode 100644 index dd93834ed..000000000 --- a/3ginfo/files-html-old/usr/share/3ginfo/scripts/ofnk2.gcom +++ /dev/null @@ -1,19 +0,0 @@ -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 diff --git a/3ginfo/files-html-old/usr/share/3ginfo/scripts/ofnk2.sh b/3ginfo/files-html-old/usr/share/3ginfo/scripts/ofnk2.sh deleted file mode 100644 index b57bb0dc1..000000000 --- a/3ginfo/files-html-old/usr/share/3ginfo/scripts/ofnk2.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/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 diff --git a/3ginfo/files-html-old/usr/share/3ginfo/scripts/play_fresh.gcom b/3ginfo/files-html-old/usr/share/3ginfo/scripts/play_fresh.gcom deleted file mode 100644 index 3880571a9..000000000 --- a/3ginfo/files-html-old/usr/share/3ginfo/scripts/play_fresh.gcom +++ /dev/null @@ -1,37 +0,0 @@ -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 diff --git a/3ginfo/files-html-old/usr/share/3ginfo/scripts/play_fresh2.gcom b/3ginfo/files-html-old/usr/share/3ginfo/scripts/play_fresh2.gcom deleted file mode 100644 index 3eebf3f26..000000000 --- a/3ginfo/files-html-old/usr/share/3ginfo/scripts/play_fresh2.gcom +++ /dev/null @@ -1,28 +0,0 @@ -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 diff --git a/3ginfo/files-html-old/usr/share/3ginfo/scripts/play_fresh2.sh b/3ginfo/files-html-old/usr/share/3ginfo/scripts/play_fresh2.sh deleted file mode 100644 index 1e5119a24..000000000 --- a/3ginfo/files-html-old/usr/share/3ginfo/scripts/play_fresh2.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/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 diff --git a/3ginfo/files-html-old/usr/share/3ginfo/scripts/play_fresh_pdu.gcom b/3ginfo/files-html-old/usr/share/3ginfo/scripts/play_fresh_pdu.gcom deleted file mode 100644 index b99cf2df1..000000000 --- a/3ginfo/files-html-old/usr/share/3ginfo/scripts/play_fresh_pdu.gcom +++ /dev/null @@ -1,28 +0,0 @@ -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 diff --git a/3ginfo/files-html-old/usr/share/3ginfo/scripts/play_fresh_pdu.sh b/3ginfo/files-html-old/usr/share/3ginfo/scripts/play_fresh_pdu.sh deleted file mode 100644 index 3c49e315e..000000000 --- a/3ginfo/files-html-old/usr/share/3ginfo/scripts/play_fresh_pdu.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/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 diff --git a/3ginfo/files-html-old/usr/share/3ginfo/scripts/tmobile_pdu.gcom b/3ginfo/files-html-old/usr/share/3ginfo/scripts/tmobile_pdu.gcom deleted file mode 100644 index adb802345..000000000 --- a/3ginfo/files-html-old/usr/share/3ginfo/scripts/tmobile_pdu.gcom +++ /dev/null @@ -1,20 +0,0 @@ -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 diff --git a/3ginfo/files-html-old/usr/share/3ginfo/scripts/tmobile_pdu.sh b/3ginfo/files-html-old/usr/share/3ginfo/scripts/tmobile_pdu.sh deleted file mode 100644 index c8c1d6ca2..000000000 --- a/3ginfo/files-html-old/usr/share/3ginfo/scripts/tmobile_pdu.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/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 diff --git a/3ginfo/files-html-old/usr/share/3ginfo/scripts/virginmobile.gcom b/3ginfo/files-html-old/usr/share/3ginfo/scripts/virginmobile.gcom deleted file mode 100644 index 4942b2861..000000000 --- a/3ginfo/files-html-old/usr/share/3ginfo/scripts/virginmobile.gcom +++ /dev/null @@ -1,19 +0,0 @@ -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 diff --git a/3ginfo/files-html-old/usr/share/3ginfo/scripts/virginmobile_pdu.gcom b/3ginfo/files-html-old/usr/share/3ginfo/scripts/virginmobile_pdu.gcom deleted file mode 100644 index 1c2fbd31e..000000000 --- a/3ginfo/files-html-old/usr/share/3ginfo/scripts/virginmobile_pdu.gcom +++ /dev/null @@ -1,27 +0,0 @@ -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 diff --git a/3ginfo/files-html-old/usr/share/3ginfo/scripts/virginmobile_pdu.sh b/3ginfo/files-html-old/usr/share/3ginfo/scripts/virginmobile_pdu.sh deleted file mode 100644 index e384ba0e3..000000000 --- a/3ginfo/files-html-old/usr/share/3ginfo/scripts/virginmobile_pdu.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/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 diff --git a/3ginfo/files-html-old/usr/share/3ginfo/signal.html b/3ginfo/files-html-old/usr/share/3ginfo/signal.html deleted file mode 100644 index 4e0f6dfc9..000000000 --- a/3ginfo/files-html-old/usr/share/3ginfo/signal.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - -Siła sygnału - - - - - - - - - - - -
 
  - Siła sygnału: -
-
 
-
-
 
 
- - diff --git a/3ginfo/files-html-old/usr/share/3ginfo/status.html.en b/3ginfo/files-html-old/usr/share/3ginfo/status.html.en deleted file mode 100644 index 1abf4f14a..000000000 --- a/3ginfo/files-html-old/usr/share/3ginfo/status.html.en +++ /dev/null @@ -1,35 +0,0 @@ -Status:{STATUS} -Connection time:{CONN_TIME} -Received:{RX} -Transmitted:{TX} -Operator:{COPS} -Operating mode:{MODE} -Signal strength:{CSQ_PER}% -
-
 
-
-
-
-
-
-
-
-Show details - -
- diff --git a/3ginfo/files-html-old/usr/share/3ginfo/status.html.et b/3ginfo/files-html-old/usr/share/3ginfo/status.html.et deleted file mode 100644 index ada730ea2..000000000 --- a/3ginfo/files-html-old/usr/share/3ginfo/status.html.et +++ /dev/null @@ -1,35 +0,0 @@ -Staatus:{STATUS} -Ühendusaeg:{CONN_TIME} -Vastvõetud:{RX} -Saadetud:{TX} -Operaator:{COPS} -Töörežiim:{MODE} -Signaali tugevus:{CSQ_PER}% -
-
 
-
-
-
-
-
-
-
-Näita detaile - -
- diff --git a/3ginfo/files-html-old/usr/share/3ginfo/status.html.it b/3ginfo/files-html-old/usr/share/3ginfo/status.html.it deleted file mode 100644 index 4eb30ffab..000000000 --- a/3ginfo/files-html-old/usr/share/3ginfo/status.html.it +++ /dev/null @@ -1,35 +0,0 @@ -Stato:{STATUS} -Tempo di connessione:{CONN_TIME} -Ricevuti:{RX} -Trasmessi:{TX} -Operatore:{COPS} -Tipo di connessione:{MODE} -Forza segnale:{CSQ_PER}% -
-
 
-
-
-
-
-
-
-
-Mostra dettagli - -
- diff --git a/3ginfo/files-html-old/usr/share/3ginfo/status.html.pl b/3ginfo/files-html-old/usr/share/3ginfo/status.html.pl deleted file mode 100644 index b8759099f..000000000 --- a/3ginfo/files-html-old/usr/share/3ginfo/status.html.pl +++ /dev/null @@ -1,35 +0,0 @@ -Status:{STATUS} -Czas połączenia:{CONN_TIME} -Pobrano:{RX} -Wysłano:{TX} -Operator:{COPS} -Tryb pracy:{MODE} -Siła sygnału:{CSQ_PER}% -
-
 
-
-
-
-
-
-
-
-Pokaż informacje dodatkowe - -
- diff --git a/3ginfo/files-html-old/usr/share/3ginfo/uhttpd.conf b/3ginfo/files-html-old/usr/share/3ginfo/uhttpd.conf deleted file mode 100644 index 494985ae0..000000000 --- a/3ginfo/files-html-old/usr/share/3ginfo/uhttpd.conf +++ /dev/null @@ -1 +0,0 @@ -E404:/index.html diff --git a/3ginfo/files-html/etc/init.d/3ginfo b/3ginfo/files-html/etc/init.d/3ginfo deleted file mode 100755 index dc57d9dbe..000000000 --- a/3ginfo/files-html/etc/init.d/3ginfo +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh /etc/rc.common - -# -# (c) 2010-2024 Cezary Jackiewicz -# - -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 -} diff --git a/3ginfo/files-html/usr/share/3ginfo/html/3ginfo.css b/3ginfo/files-html/usr/share/3ginfo/html/3ginfo.css deleted file mode 100644 index d16c58dbf..000000000 --- a/3ginfo/files-html/usr/share/3ginfo/html/3ginfo.css +++ /dev/null @@ -1,192 +0,0 @@ -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; -} diff --git a/3ginfo/files-html/usr/share/3ginfo/html/3ginfo.js b/3ginfo/files-html/usr/share/3ginfo/html/3ginfo.js deleted file mode 100644 index 162380b38..000000000 --- a/3ginfo/files-html/usr/share/3ginfo/html/3ginfo.js +++ /dev/null @@ -1,803 +0,0 @@ -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 '
' + key + '

' + value + '

'; -} - -function createRow9ColForModal(arr) { - return '
' + - '

' + arr[0] + '

' + - '

' + arr[1] + '

' + - '

' + arr[2] + '

' + - '

' + arr[3] + '

' + - '

' + arr[4] + '

' + - '

' + arr[5] + '

' + - '

' + arr[6] + '

' + - '

' + arr[7] + '

' + - '

' + arr[8] + '

' + - '
'; -} - -/*****************************************************************************/ - -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 = '
'; - (data1.res).forEach(function callback(value, idx) { - var id = (idx == 0 ? 'id="defaultOpen"' : ''); - htmltab += ''; - html += ('
' + document.getElementById('div_template').innerHTML + '
').replaceAll('_idx', idx); - }); - htmltab += '
'; - setValue('div_modems', ''); - document.getElementById('div_modems').insertAdjacentHTML('beforeend', htmltab + html); - - document.getElementById("defaultOpen").click(); - } else { - setValue('div_modems', ''); - html += ('
' + document.getElementById('div_template').innerHTML + '
').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) { - switch (data.operator_mnc) { - case '01': - case '02': - case '03': - case '06': - document.getElementById('btsearch' + idx).setAttribute('href', 'https://btsearch.pl/stations?mnc=260' + data.operator_mnc + '&q=' + data.cid_dec); - break; - default: - document.getElementById('btsearch' + idx).setAttribute('href', 'https://btsearch.pl/stations?q=' + data.cid_dec); - } - 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 ', ' + description + ''; -} - -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
' + 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
' + e.value + ' UL'; - } - } else { - if (typeof pcc[4] === 'undefined') { - pcc[4] = e.value; - } else { - pcc[4] = e.value + ' DL
' + pcc[4]; - } - } - htmlxs += createRowForModal(_t(e.key), e.value); - break; - case 35: - description = paramdesc('rssi', e.value); - pcc[5] = e.value + description.replace(', ', '
'); - htmlxs += createRowForModal(_t(e.key), e.value + description); - break; - case 36: - description = paramdesc('rsrp', e.value); - pcc[6] = e.value + description.replace(', ', '
'); - htmlxs += createRowForModal(_t(e.key), e.value + description); - break; - case 37: - description = paramdesc('rsrq', e.value); - pcc[7] = e.value + description.replace(', ', '
'); - 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(', ', '
'); - htmlxs += createRowForModal(_t(e.key), e.value + description); - break; - case 56: - description = paramdesc('rsrp', e.value); - scc1[6] = e.value + description.replace(', ', '
'); - htmlxs += createRowForModal(_t(e.key), e.value + description); - break; - case 57: - description = paramdesc('rsrq', e.value); - scc1[7] = e.value + description.replace(', ', '
'); - 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(', ', '
'); - htmlxs += createRowForModal(_t(e.key), e.value + description); - break; - case 66: - description = paramdesc('rsrp', e.value); - scc2[6] = e.value + description.replace(', ', '
'); - htmlxs += createRowForModal(_t(e.key), e.value + description); - break; - case 67: - description = paramdesc('rsrq', e.value); - scc2[7] = e.value + description.replace(', ', '
'); - 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(', ', '
'); - htmlxs += createRowForModal(_t(e.key), e.value + description); - break; - case 76: - description = paramdesc('rsrp', e.value); - scc3[6] = e.value + description.replace(', ', '
'); - htmlxs += createRowForModal(_t(e.key), e.value + description); - break; - case 77: - description = paramdesc('rsrq', e.value); - scc3[7] = e.value + description.replace(', ', '
'); - 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(', ', '
'); - htmlxs += createRowForModal(_t(e.key), e.value + description); - break; - case 86: - description = paramdesc('rsrp', e.value); - scc4[6] = e.value + description.replace(', ', '
'); - htmlxs += createRowForModal(_t(e.key), e.value + description); - break; - case 87: - description = paramdesc('rsrq', e.value); - scc4[7] = e.value + description.replace(', ', '
'); - 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 += '
' + htmlxs + '
'; - if (pcc.length + scc1.length + scc2.length + scc3.length + scc4.length > 0) { - htmlco += ''; - } - showMsg(htmlco); -} - -/*****************************************************************************/ - -window.onload = info_onload; diff --git a/3ginfo/files-html/usr/share/3ginfo/html/bootstrap.min.css b/3ginfo/files-html/usr/share/3ginfo/html/bootstrap.min.css deleted file mode 100644 index 788463e72..000000000 --- a/3ginfo/files-html/usr/share/3ginfo/html/bootstrap.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * 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,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover,a.text-primary:focus{color:#286090}.text-success{color:#3c763d}a.text-success:hover,a.text-success:focus{color:#2b542c}.text-info{color:#31708f}a.text-info:hover,a.text-info:focus{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover,a.text-warning:focus{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover,a.text-danger:focus{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover,a.bg-primary:focus{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover,a.bg-success:focus{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover,a.bg-info:focus{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover,a.bg-warning:focus{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover,a.bg-danger:focus{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:"\2014 \00A0"}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:""}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:"\00A0 \2014"}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.row-no-gutters{margin-right:0;margin-left:0}.row-no-gutters [class*="col-"]{padding-right:0;padding-left:0}.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none;appearance:none}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6);box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:34px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:46px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-top:4px \9;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);opacity:.65;-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:focus,.btn-default.focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;background-image:none;border-color:#adadad}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary:focus,.btn-primary.focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;background-image:none;border-color:#204d74}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;background-image:none;border-color:#398439}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#fff;background-color:#398439;border-color:#255625}.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;background-image:none;border-color:#269abc}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:focus,.btn-warning.focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;background-image:none;border-color:#d58512}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;background-image:none;border-color:#ac2925}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}} \ No newline at end of file diff --git a/3ginfo/files-html/usr/share/3ginfo/html/cgi-bin/info.sh b/3ginfo/files-html/usr/share/3ginfo/html/cgi-bin/info.sh deleted file mode 100755 index 703bb9f91..000000000 --- a/3ginfo/files-html/usr/share/3ginfo/html/cgi-bin/info.sh +++ /dev/null @@ -1,53 +0,0 @@ -#!/bin/sh - -# -# (c) 2024-2025 Cezary Jackiewicz -# - -. /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 diff --git a/3ginfo/files-html/usr/share/3ginfo/html/cgi-bin/infoproducts.sh b/3ginfo/files-html/usr/share/3ginfo/html/cgi-bin/infoproducts.sh deleted file mode 100755 index 1095eb9aa..000000000 --- a/3ginfo/files-html/usr/share/3ginfo/html/cgi-bin/infoproducts.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/sh - -# -# (c) 2024-2025 Cezary Jackiewicz -# - -. /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 diff --git a/3ginfo/files-html/usr/share/3ginfo/html/html5shiv.min.js b/3ginfo/files-html/usr/share/3ginfo/html/html5shiv.min.js deleted file mode 100644 index 355afd106..000000000 --- a/3ginfo/files-html/usr/share/3ginfo/html/html5shiv.min.js +++ /dev/null @@ -1,4 +0,0 @@ -/** -* @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",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="",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); \ No newline at end of file diff --git a/3ginfo/files-html/usr/share/3ginfo/html/i18n/pl.json b/3ginfo/files-html/usr/share/3ginfo/html/i18n/pl.json deleted file mode 100644 index 00553738c..000000000 --- a/3ginfo/files-html/usr/share/3ginfo/html/i18n/pl.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "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" -} diff --git a/3ginfo/files-html/usr/share/3ginfo/html/index.html b/3ginfo/files-html/usr/share/3ginfo/html/index.html deleted file mode 100644 index 8c235fa3b..000000000 --- a/3ginfo/files-html/usr/share/3ginfo/html/index.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - 3G/4G/5G - - - - - - - -
-
- -
-
-
-
Please wait
-
-
-
-
- - - -
 
- - - diff --git a/3ginfo/files-html/usr/share/3ginfo/html/respond.min.js b/3ginfo/files-html/usr/share/3ginfo/html/respond.min.js deleted file mode 100644 index 80a7b69dc..000000000 --- a/3ginfo/files-html/usr/share/3ginfo/html/respond.min.js +++ /dev/null @@ -1,5 +0,0 @@ -/*! 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='­',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 $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 diff --git a/3ginfo/files-lite/usr/share/3ginfo-lite/3ginfo.sh b/3ginfo/files-lite/usr/share/3ginfo-lite/3ginfo.sh deleted file mode 100755 index f79d0f3b7..000000000 --- a/3ginfo/files-lite/usr/share/3ginfo-lite/3ginfo.sh +++ /dev/null @@ -1,118 +0,0 @@ -#!/bin/sh - -# -# (c) 2010-2019 Cezary Jackiewicz -# - -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 < - - - - - - - - QMI - - - - - - -
-

- - - - - - - - - - - -
ParametrWartośćMinMaxJednostka
 
 
 
 
 
-

Trwa zbieranie danych...

-

Interwał 3s, okno 15 minut.

-
- - - - - - - diff --git a/3ginfo/files-qmisignal/www/qmisignal.js b/3ginfo/files-qmisignal/www/qmisignal.js deleted file mode 100644 index 6d0429107..000000000 --- a/3ginfo/files-qmisignal/www/qmisignal.js +++ /dev/null @@ -1,102 +0,0 @@ -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); diff --git a/3ginfo/files-text-old/etc/config/3ginfo b/3ginfo/files-text-old/etc/config/3ginfo deleted file mode 100644 index c062aa8a0..000000000 --- a/3ginfo/files-text-old/etc/config/3ginfo +++ /dev/null @@ -1,7 +0,0 @@ - -config 3ginfo - option device '' - option http_port '81' - option language 'pl' - option network 'wan' - option pincode '' diff --git a/3ginfo/files-text-old/etc/hotplug.d/usb/99-3ginfo b/3ginfo/files-text-old/etc/hotplug.d/usb/99-3ginfo deleted file mode 100755 index d05272faa..000000000 --- a/3ginfo/files-text-old/etc/hotplug.d/usb/99-3ginfo +++ /dev/null @@ -1,4 +0,0 @@ -case "$ACTION" in - remove) - [ -f /tmp/pincode_was_given ] && rm -f /tmp/pincode_was_given;; -esac diff --git a/3ginfo/files-text-old/etc/uci-defaults/99-3ginfo b/3ginfo/files-text-old/etc/uci-defaults/99-3ginfo deleted file mode 100755 index 0124a90f3..000000000 --- a/3ginfo/files-text-old/etc/uci-defaults/99-3ginfo +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -ln -s /usr/share/3ginfo/cgi-bin/3ginfo.sh /usr/bin/3ginfo -exit 0 diff --git a/3ginfo/files-text-old/usr/share/3ginfo/cgi-bin/3ginfo.sh b/3ginfo/files-text-old/usr/share/3ginfo/cgi-bin/3ginfo.sh deleted file mode 100755 index 8cce33054..000000000 --- a/3ginfo/files-text-old/usr/share/3ginfo/cgi-bin/3ginfo.sh +++ /dev/null @@ -1,593 +0,0 @@ -#!/bin/sh - -# -# (c) 2010-2026 Cezary Jackiewicz -# - -# 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 "

$NOTDETECTED

" - [ $FORMAT -eq 1 ] && echo $NOTDETECTED - [ $FORMAT -eq 2 ] && showjsonerror "NOTDETECTED" - exit 0 - fi - - if [ ! -e $DEVICE ]; then - [ $FORMAT -eq 0 ] && echo "

$NODEVICE $DEVICE!

" - [ $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 "

$PINERROR

" - [ $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=""$(zcat "$CLF" | awk -F";" '/'$PAT'/ {gsub(/\!/,"\\!");print $8}')"" - else - BTSINFO=""$(awk -F";" '/'$PAT'/ {gsub(/\!/,"\\!");print $8}' "$CLF")"" - fi - if [ $FORMAT -eq 2 ]; then - BTSINFO=$(echo "$BTSINFO" | sed 's!\(.*\)!\1!g') - fi - fi - - if [ $FORMAT -eq 0 ]; then - case $COPS_NUM in - 260*) CID="$CID";; - 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="$CONNECTED" - [ $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="$DISCONNECTED" - [ $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 diff --git a/3ginfo/files-text-old/usr/share/3ginfo/mccmnc.dat b/3ginfo/files-text-old/usr/share/3ginfo/mccmnc.dat deleted file mode 100644 index 83b56b302..000000000 --- a/3ginfo/files-text-old/usr/share/3ginfo/mccmnc.dat +++ /dev/null @@ -1,39 +0,0 @@ -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 diff --git a/3ginfo/files-text-old/usr/share/3ginfo/msg.dat.en b/3ginfo/files-text-old/usr/share/3ginfo/msg.dat.en deleted file mode 100644 index 93edea8e2..000000000 --- a/3ginfo/files-text-old/usr/share/3ginfo/msg.dat.en +++ /dev/null @@ -1,8 +0,0 @@ -NOTDETECTED="Not detected any device" -NODEVICE="No device" -PINERROR="PIN code error" -CONNECTED="Connected" -CONNECT="Connect" -DISCONNECTED="Disconnected" -DISCONNECT="Disconnect" -NOINFO="No information" diff --git a/3ginfo/files-text-old/usr/share/3ginfo/msg.dat.et b/3ginfo/files-text-old/usr/share/3ginfo/msg.dat.et deleted file mode 100644 index cbd20da97..000000000 --- a/3ginfo/files-text-old/usr/share/3ginfo/msg.dat.et +++ /dev/null @@ -1,8 +0,0 @@ -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" diff --git a/3ginfo/files-text-old/usr/share/3ginfo/msg.dat.it b/3ginfo/files-text-old/usr/share/3ginfo/msg.dat.it deleted file mode 100644 index 65022ba4d..000000000 --- a/3ginfo/files-text-old/usr/share/3ginfo/msg.dat.it +++ /dev/null @@ -1,8 +0,0 @@ -NOTDETECTED="Nessun dispositivo trovato" -NODEVICE="Nessun dispositivo" -PINERROR="Errore codice PIN" -CONNECTED="Connesso" -CONNECT="Connetti" -DISCONNECTED="Disconnesso" -DISCONNECT="Disconnetti" -NOINFO="Nessuna Informazione" diff --git a/3ginfo/files-text-old/usr/share/3ginfo/msg.dat.pl b/3ginfo/files-text-old/usr/share/3ginfo/msg.dat.pl deleted file mode 100644 index 01ea0fb48..000000000 --- a/3ginfo/files-text-old/usr/share/3ginfo/msg.dat.pl +++ /dev/null @@ -1,8 +0,0 @@ -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" diff --git a/3ginfo/files-text-old/usr/share/3ginfo/scripts/3ginfo.gcom b/3ginfo/files-text-old/usr/share/3ginfo/scripts/3ginfo.gcom deleted file mode 100644 index 2c8b80079..000000000 --- a/3ginfo/files-text-old/usr/share/3ginfo/scripts/3ginfo.gcom +++ /dev/null @@ -1,176 +0,0 @@ -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 diff --git a/3ginfo/files-text-old/usr/share/3ginfo/scripts/alcatel_hilink.sh b/3ginfo/files-text-old/usr/share/3ginfo/scripts/alcatel_hilink.sh deleted file mode 100755 index 681d7760b..000000000 --- a/3ginfo/files-text-old/usr/share/3ginfo/scripts/alcatel_hilink.sh +++ /dev/null @@ -1,60 +0,0 @@ -#!/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 diff --git a/3ginfo/files-text-old/usr/share/3ginfo/scripts/huawei_hilink-login.sh b/3ginfo/files-text-old/usr/share/3ginfo/scripts/huawei_hilink-login.sh deleted file mode 100755 index 5e60f9c4d..000000000 --- a/3ginfo/files-text-old/usr/share/3ginfo/scripts/huawei_hilink-login.sh +++ /dev/null @@ -1,172 +0,0 @@ -#!/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="$USER$PASS" - /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="1" -/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 diff --git a/3ginfo/files-text-old/usr/share/3ginfo/scripts/huawei_hilink.sh b/3ginfo/files-text-old/usr/share/3ginfo/scripts/huawei_hilink.sh deleted file mode 100755 index b20373fe7..000000000 --- a/3ginfo/files-text-old/usr/share/3ginfo/scripts/huawei_hilink.sh +++ /dev/null @@ -1,159 +0,0 @@ -#!/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 diff --git a/3ginfo/files-text-old/usr/share/3ginfo/scripts/probeport.gcom b/3ginfo/files-text-old/usr/share/3ginfo/scripts/probeport.gcom deleted file mode 100644 index 5af07239c..000000000 --- a/3ginfo/files-text-old/usr/share/3ginfo/scripts/probeport.gcom +++ /dev/null @@ -1,14 +0,0 @@ -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 diff --git a/3ginfo/files-text-old/usr/share/3ginfo/scripts/zte.sh b/3ginfo/files-text-old/usr/share/3ginfo/scripts/zte.sh deleted file mode 100755 index 3251916b7..000000000 --- a/3ginfo/files-text-old/usr/share/3ginfo/scripts/zte.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/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 diff --git a/3ginfo/files-text-old/usr/share/3ginfo/status.json b/3ginfo/files-text-old/usr/share/3ginfo/status.json deleted file mode 100644 index 9bc09f42f..000000000 --- a/3ginfo/files-text-old/usr/share/3ginfo/status.json +++ /dev/null @@ -1,31 +0,0 @@ -{ -"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}" -} diff --git a/3ginfo/files-text-old/usr/share/3ginfo/status.txt.en b/3ginfo/files-text-old/usr/share/3ginfo/status.txt.en deleted file mode 100644 index fd0c46281..000000000 --- a/3ginfo/files-text-old/usr/share/3ginfo/status.txt.en +++ /dev/null @@ -1,18 +0,0 @@ -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 diff --git a/3ginfo/files-text-old/usr/share/3ginfo/status.txt.et b/3ginfo/files-text-old/usr/share/3ginfo/status.txt.et deleted file mode 100644 index 430fa43b3..000000000 --- a/3ginfo/files-text-old/usr/share/3ginfo/status.txt.et +++ /dev/null @@ -1,18 +0,0 @@ -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 diff --git a/3ginfo/files-text-old/usr/share/3ginfo/status.txt.it b/3ginfo/files-text-old/usr/share/3ginfo/status.txt.it deleted file mode 100644 index e04c3b74e..000000000 --- a/3ginfo/files-text-old/usr/share/3ginfo/status.txt.it +++ /dev/null @@ -1,18 +0,0 @@ -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 diff --git a/3ginfo/files-text-old/usr/share/3ginfo/status.txt.pl b/3ginfo/files-text-old/usr/share/3ginfo/status.txt.pl deleted file mode 100644 index 5c5dfd5c0..000000000 --- a/3ginfo/files-text-old/usr/share/3ginfo/status.txt.pl +++ /dev/null @@ -1,18 +0,0 @@ -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 diff --git a/3ginfo/files-text/etc/config/3ginfo b/3ginfo/files-text/etc/config/3ginfo deleted file mode 100644 index a76c08053..000000000 --- a/3ginfo/files-text/etc/config/3ginfo +++ /dev/null @@ -1,6 +0,0 @@ - -config 3ginfo - option device '' - option http_port '81' - option network 'wan' - option pincode '' diff --git a/3ginfo/files-text/usr/bin/3ginfo b/3ginfo/files-text/usr/bin/3ginfo deleted file mode 100755 index 3b9cc837c..000000000 --- a/3ginfo/files-text/usr/bin/3ginfo +++ /dev/null @@ -1,138 +0,0 @@ -#!/bin/sh - -# -# (c) 2024-2025 Cezary Jackiewicz -# - -. /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/°/°}" - 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 diff --git a/3ginfo/files-text/usr/share/3ginfo/check.gcom b/3ginfo/files-text/usr/share/3ginfo/check.gcom deleted file mode 100644 index ba52ec267..000000000 --- a/3ginfo/files-text/usr/share/3ginfo/check.gcom +++ /dev/null @@ -1,13 +0,0 @@ -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 diff --git a/3ginfo/files-text/usr/share/3ginfo/detectdevice.sh b/3ginfo/files-text/usr/share/3ginfo/detectdevice.sh deleted file mode 100755 index be2b62dd8..000000000 --- a/3ginfo/files-text/usr/share/3ginfo/detectdevice.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/sh - -# -# (c) 2023-2024 Cezary Jackiewicz -# - -# 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 diff --git a/3ginfo/files-text/usr/share/3ginfo/detectsection.sh b/3ginfo/files-text/usr/share/3ginfo/detectsection.sh deleted file mode 100755 index 4eb78dc54..000000000 --- a/3ginfo/files-text/usr/share/3ginfo/detectsection.sh +++ /dev/null @@ -1,60 +0,0 @@ -#!/bin/sh - -# -# (c) 2024 Cezary Jackiewicz -# - -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 diff --git a/dnsproxy/Makefile b/dnsproxy/Makefile index 75eaadd1f..f01eb3570 100644 --- a/dnsproxy/Makefile +++ b/dnsproxy/Makefile @@ -5,8 +5,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=dnsproxy -PKG_VERSION:=0.84.1 -PKG_RELEASE:=17 +PKG_VERSION:=0.84.2 +PKG_RELEASE:=18 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/AdguardTeam/dnsproxy/tar.gz/v$(PKG_VERSION)? diff --git a/geo2txt/Makefile b/geo2txt/Makefile new file mode 100644 index 000000000..09a7b2b2b --- /dev/null +++ b/geo2txt/Makefile @@ -0,0 +1,39 @@ +# +# Copyright (C) 2015-2016 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v3. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=geo2txt +PKG_VERSION:=1.0.0 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://codeload.github.com/sbwml/geo2txt/tar.gz/$(PKG_VERSION)? +PKG_HASH:=skip + +PKG_LICENSE:=GPL-3.0 +PKG_LICENSE_FILE:=LICENSE +PKG_MAINTAINER:=sbwml + +include $(INCLUDE_DIR)/package.mk + +define Package/geo2txt + SECTION:=utils + CATEGORY:=Utilities + TITLE:=V2ray geosite & geoip unpacking CLI tool + URL:=https://github.com/sbwml/geo2txt +endef + +define Package/quickfile/description + A lightweight pure C utility to unpack v2ray geosite.dat and geoip.dat. +endef + +define Package/geo2txt/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/geo2txt $(1)/usr/bin/geo2txt +endef + +$(eval $(call BuildPackage,geo2txt)) diff --git a/linkease-common-bin/Makefile b/linkease-common-bin/Makefile index c53db5944..d3d4e296e 100644 --- a/linkease-common-bin/Makefile +++ b/linkease-common-bin/Makefile @@ -12,7 +12,7 @@ PKG_ARCH_LINKEASE:=$(ARCH) PKG_NAME:=linkease-common-bin # use PKG_SOURCE_DATE instead of PKG_VERSION for compitable PKG_SOURCE_DATE:=1.7.5 -PKG_RELEASE:=22 +PKG_RELEASE:=23 ARCH_HEXCODE:= ifeq ($(ARCH),x86_64) @@ -28,7 +28,7 @@ else ifeq ($(ARCH),mipsel) ARCH_HEXCODE=1b0c endif -PKG_SOURCE_VERSION:=f5227a7df2160100b478dba7880891aed1663eb4 +PKG_SOURCE_VERSION:=82c1daae2ec9dbe7f1fdc1d3b1bc5c9e8342ecc1 PKG_SOURCE:=linkease-common-bin-$(PKG_SOURCE_DATE)-linux-$(PKG_ARCH_LINKEASE).tar.gz PKG_SOURCE_URL:=https://github.com/istoreos/istoreos-app-hub/releases/download/linkease-runtime-v$(PKG_SOURCE_DATE)/ PKG_BUILD_DIR:=$(BUILD_DIR)/linkease-common-bin-$(PKG_SOURCE_DATE)-linux-$(PKG_ARCH_LINKEASE) diff --git a/linkease/Makefile b/linkease/Makefile index 5eb146332..e514edcf3 100644 --- a/linkease/Makefile +++ b/linkease/Makefile @@ -12,7 +12,7 @@ PKG_ARCH_LINKEASE:=$(ARCH) PKG_NAME:=linkease # use PKG_SOURCE_DATE instead of PKG_VERSION for compitable PKG_SOURCE_DATE:=1.7.5 -PKG_RELEASE:=25 +PKG_RELEASE:=26 ARCH_HEXCODE:= ifeq ($(ARCH),x86_64) @@ -28,7 +28,7 @@ else ifeq ($(ARCH),mipsel) ARCH_HEXCODE=1b0c endif -PKG_SOURCE_VERSION:=f5227a7df2160100b478dba7880891aed1663eb4 +PKG_SOURCE_VERSION:=82c1daae2ec9dbe7f1fdc1d3b1bc5c9e8342ecc1 PKG_SOURCE:=linkease-bin-$(PKG_SOURCE_DATE)-linux-$(PKG_ARCH_LINKEASE).tar.gz PKG_SOURCE_URL:=https://github.com/istoreos/istoreos-app-hub/releases/download/linkease-runtime-v$(PKG_SOURCE_DATE)/ PKG_BUILD_DIR:=$(BUILD_DIR)/linkease-bin-$(PKG_SOURCE_DATE)-linux-$(PKG_ARCH_LINKEASE) diff --git a/linkeasefull/Makefile b/linkeasefull/Makefile index e9b06c246..b18ee2595 100644 --- a/linkeasefull/Makefile +++ b/linkeasefull/Makefile @@ -11,7 +11,7 @@ PKG_ARCH_LINKEASE:=$(ARCH) PKG_NAME:=linkeasefull # use PKG_SOURCE_DATE instead of PKG_VERSION for compitable PKG_SOURCE_DATE:=3.0.17 -PKG_RELEASE:=24 +PKG_RELEASE:=25 ARCH_HEXCODE:= ifeq ($(ARCH),x86_64) @@ -24,7 +24,7 @@ LINKEASE_RUNTIME_ARCH:=arm64 PKG_HASH:=skip endif -PKG_SOURCE_VERSION:=f5227a7df2160100b478dba7880891aed1663eb4 +PKG_SOURCE_VERSION:=82c1daae2ec9dbe7f1fdc1d3b1bc5c9e8342ecc1 PKG_SOURCE:=linkease-runtime-$(PKG_SOURCE_DATE)-linux-$(LINKEASE_RUNTIME_ARCH).tar.gz PKG_SOURCE_URL:=https://github.com/istoreos/istoreos-app-hub/releases/download/linkeasefull-runtime-v$(PKG_SOURCE_DATE)/ PKG_BUILD_DIR:=$(BUILD_DIR)/linkease-runtime-$(PKG_SOURCE_DATE)-linux-$(LINKEASE_RUNTIME_ARCH) diff --git a/luci-app-fwlive/Makefile b/luci-app-fwlive/Makefile index 0b5347edd..35f2a9248 100644 --- a/luci-app-fwlive/Makefile +++ b/luci-app-fwlive/Makefile @@ -12,7 +12,7 @@ LUCI_DEPENDS:=+luci-base +logd +jsonfilter LUCI_PKGARCH:=all PKG_VERSION:=0.1.37 -PKG_RELEASE:=5 +PKG_RELEASE:=6 # Reproducible build: honor SOURCE_DATE_EPOCH from the build environment (set by docker-sdk.sh / CI). ifdef SOURCE_DATE_EPOCH diff --git a/luci-app-fwlive/htdocs/luci-static/resources/fwlive/css.js b/luci-app-fwlive/htdocs/luci-static/resources/fwlive/css.js index f565e1404..304a2f821 100644 --- a/luci-app-fwlive/htdocs/luci-static/resources/fwlive/css.js +++ b/luci-app-fwlive/htdocs/luci-static/resources/fwlive/css.js @@ -9,5 +9,5 @@ * GENERATED — do not edit. Edit fwlive.css and run: node scripts/embed-fwlive-css.js */ return baseclass.extend({ - styleText: "\n.fwlive-map {\n\tmax-width: none;\n\twidth: 100%;\n\t--fwlive-pass-color: var(--success-color-high, var(--success-color, #46a546));\n\t--fwlive-deny-color: var(--error-color-high, var(--error-color, #ca3c3c));\n\t--fwlive-bg-medium: var(--background-color-medium, var(--white-color-low, #f9f9f9));\n\t--fwlive-paused-color: #b45309;\n}\n/* Wide page in Detail only — Simple keeps LuCI’s 940px column. */\n#maincontent.container:has(.fwlive-map[data-view=\"detailed\"]) {\n\tmax-width: none;\n\tpadding-left: 16px;\n\tpadding-right: 16px;\n}\n.fwlive-map[data-row-tint=\"accessible\"] {\n\t--fwlive-pass-color: #0d9488;\n\t--fwlive-deny-color: #c2410c;\n}\n.fwlive-map.fwlive-watch-paused .fwlive-title-row,\n.fwlive-map.fwlive-watch-paused .fwlive-watch-strip {\n\tbackground: rgba(180, 83, 9, 0.08);\n\tbackground: color-mix(in srgb, var(--fwlive-paused-color) 8%, transparent);\n}\n.fwlive-map.fwlive-watch-paused .fwlive-title-row {\n\tmargin: 0 -8px;\n\tpadding: 6px 8px 0;\n\tborder-radius: 3px 3px 0 0;\n}\n.fwlive-map.fwlive-watch-paused .fwlive-watch-strip {\n\tmargin: 0 -8px 10px;\n\tpadding: 8px;\n\tborder-radius: 0 0 3px 3px;\n\tborder-bottom-color: transparent;\n}\n.fwlive-title-row {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: baseline;\n\tjustify-content: space-between;\n\tgap: 8px 16px;\n\tmargin: 0 0 4px;\n}\n.fwlive-title-row h2 {\n\tmargin: 0;\n\tflex: 0 1 auto;\n}\n.fwlive-title-status {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 8px;\n\tflex-wrap: wrap;\n\tmin-width: 0;\n\tmargin-left: auto;\n}\n.fwlive-watch-strip {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: stretch;\n\tjustify-content: flex-start;\n\tgap: 0;\n\tmin-height: 40px;\n\tpadding: 8px 0 10px;\n\tborder-bottom: 1px solid var(--border-color-medium);\n\tmargin-bottom: 10px;\n}\n.fwlive-watch-group {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 6px;\n\tmin-height: 28px;\n\tpadding: 0 10px;\n\tborder-left: 1px solid var(--border-color-medium);\n\tflex-wrap: wrap;\n}\n.fwlive-watch-group:last-child {\n\tpadding-right: 0;\n}\n.fwlive-watch-group-label {\n\tmargin-right: 2px;\n\tcolor: var(--text-color-medium);\n\tfont-size: 0.72em;\n\tfont-weight: 700;\n\tletter-spacing: 0.08em;\n\ttext-transform: uppercase;\n\twhite-space: nowrap;\n}\n.fwlive-watch-seg {\n\tdisplay: inline-flex;\n\talign-items: stretch;\n\tborder: 1px solid var(--border-color-medium);\n\tborder-radius: 3px;\n\toverflow: hidden;\n}\n.fwlive-watch-seg .fwlive-seg-btn {\n\tmargin: 0;\n\tborder: 0;\n\tborder-radius: 0;\n\tborder-right: 1px solid var(--border-color-medium);\n\tbackground: transparent;\n\tpadding: 4px 10px;\n\tfont-size: 0.88em;\n\tline-height: 1.25;\n\tmin-height: 28px;\n}\n.fwlive-watch-seg .fwlive-seg-btn:last-child {\n\tborder-right: 0;\n}\n.fwlive-watch-seg .fwlive-seg-btn[aria-pressed=\"true\"] {\n\tbackground: rgba(26, 111, 156, 0.12);\n\tbackground: color-mix(in srgb, var(--primary-color-high) 12%, transparent);\n\tcolor: var(--primary-color-high);\n\tfont-weight: 600;\n}\n.fwlive-watch-label { font-weight: 600; }\n.fwlive-watch-paused .fwlive-watch-label { color: var(--fwlive-paused-color); }\n.fwlive-map.fwlive-watch-paused .fwlive-title-status .fwlive-watch-label { color: var(--fwlive-paused-color); }\n.fwlive-dot {\n\twidth: 8px;\n\theight: 8px;\n\tborder-radius: 50%;\n\tbackground: var(--text-color-low, var(--border-color-high));\n\tdisplay: inline-block;\n\tflex-shrink: 0;\n}\n.fwlive-dot.fwlive-dot-on {\n\tbackground: var(--fwlive-pass-color);\n\tbox-shadow: 0 0 0 3px color-mix(in srgb, var(--fwlive-pass-color) 22%, transparent);\n}\n.fwlive-btn-ghost {\n\tbackground: transparent;\n\tborder-color: var(--border-color-medium);\n}\n.fwlive-btn-quiet {\n\tbackground: transparent;\n\tborder-color: var(--border-color-medium);\n\tcolor: var(--text-color-medium);\n\tfont-weight: 500;\n}\n.fwlive-log-merged {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 6px;\n\tpadding: 4px 10px;\n\tborder: 1px solid var(--border-color-medium);\n\tborder-radius: 3px;\n\tbackground: var(--background-color-medium, var(--white-color-low, var(--background-color-high)));\n\tcolor: var(--text-color-high);\n\tfont-weight: 500;\n\tfont-size: 0.88em;\n\tline-height: 1.25;\n\tmin-height: 28px;\n\tcursor: pointer;\n}\n.fwlive-log-merged:hover {\n\tbackground: var(--background-color-low, var(--background-color-medium));\n}\n.fwlive-log-merged:disabled {\n\topacity: 0.65;\n\tcursor: default;\n}\n.fwlive-log-on-dot {\n\twidth: 6px;\n\theight: 6px;\n\tborder-radius: 50%;\n\tbackground: var(--fwlive-pass-color);\n\tflex-shrink: 0;\n}\n.fwlive-log-rate {\n\tcolor: var(--text-color-medium);\n\tfont-weight: 400;\n}\n.fwlive-display-bar {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 8px 14px;\n\tmargin: 0 0 12px;\n\tpadding: 8px 12px;\n\tborder: 1px solid var(--border-color-medium);\n\tborder-radius: 3px;\n\tbackground: var(--background-color-high);\n}\n.fwlive-display-bar-label {\n\tflex: 0 0 auto;\n\tfont-weight: 600;\n\tfont-size: 0.92em;\n\tcolor: var(--text-color-high);\n\twhite-space: nowrap;\n}\n.fwlive-display-controls {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 8px 14px;\n\tmin-width: 0;\n\tflex: 1 1 auto;\n}\n.fwlive-display-ctl {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 6px;\n\tmargin: 0;\n\tfont-size: 0.92em;\n\twhite-space: nowrap;\n}\n.fwlive-display-ctl input[type=\"checkbox\"] {\n\tmargin: 0;\n\tflex-shrink: 0;\n}\n.fwlive-display-ctl select {\n\tmargin-left: 0;\n}\n.fwlive-display-ctl.fwlive-hidden {\n\tdisplay: none;\n}\n/* Draw our own disclosure arrow — themes that restyle summary drop the native marker. */\n.fwlive-more-filters > summary,\n.fwlive-help > summary {\n\tcursor: pointer;\n\tlist-style: none;\n}\n.fwlive-more-filters > summary::-webkit-details-marker,\n.fwlive-help > summary::-webkit-details-marker { display: none; }\n.fwlive-more-filters > summary::before,\n.fwlive-help > summary::before {\n\tcontent: \"▸ \";\n\tcolor: var(--text-color-medium);\n}\n.fwlive-more-filters[open] > summary::before,\n.fwlive-help[open] > summary::before { content: \"▾ \"; }\n.fwlive-ctl {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 6px;\n\tfont-size: 0.92em;\n\tflex-wrap: wrap;\n}\n.fwlive-ctl select { margin-left: 4px; }\n#fwlive-limit { width: auto; min-width: 4.5em; }\n.fwlive-grid { display: grid; grid-template-columns: repeat(4, minmax(140px, 1fr)); gap: 8px; margin-bottom: 12px; }\n.fwlive-status { margin: 0; color: var(--text-color-medium); font-size: 0.9em; }\n.fwlive-status-paused { color: var(--warn-color-high); font-weight: 600; }\n.fwlive-status-error { color: var(--warn-color-high); font-weight: 600; }\n.fwlive-hint-line {\n\tmargin: 0 0 10px;\n\tfont-size: 0.85em;\n\tcolor: var(--text-color-medium);\n}\n.fwlive-empty-title {\n\tfont-weight: 600;\n\tmargin: 0 0 6px;\n\tcolor: var(--text-color-high);\n}\n.fwlive-find-row .fwlive-grid-core { margin-bottom: 0; }\n.fwlive-proto-pair {\n\tdisplay: grid;\n\tgrid-template-columns: minmax(0, 1.15fr) minmax(0, 0.85fr);\n\tgap: 6px;\n\talign-items: stretch;\n\tmin-width: 0;\n}\n.fwlive-proto-pair select,\n.fwlive-proto-pair input {\n\twidth: 100%;\n\tmin-width: 0;\n}\n@media (max-width: 520px) {\n\t.fwlive-proto-pair { grid-template-columns: 1fr; }\n}\n.fwlive-scroll {\n\tmax-height: 78vh;\n\tmax-height: 78dvh;\n\toverflow: auto;\n\tborder: 1px solid var(--border-color-medium);\n\tborder-radius: 3px;\n\tbackground: var(--background-color-high);\n\twidth: 100%;\n\tscrollbar-gutter: stable;\n}\n#fwlive-table { margin: 0; width: 100%; table-layout: auto; border-collapse: collapse; }\n.fwlive-map[data-view=\"simple\"] #fwlive-table { table-layout: fixed; width: 100%; }\n.fwlive-map[data-view=\"simple\"] col.fwlive-col-action { width: 5rem; }\n.fwlive-map[data-view=\"simple\"] col.fwlive-col-time { width: 5rem; }\n.fwlive-map[data-view=\"simple\"] col.fwlive-col-iface { width: 5.5rem; }\n.fwlive-map[data-view=\"simple\"] col.fwlive-col-proto { width: 4rem; }\n.fwlive-map[data-view=\"simple\"] col.fwlive-col-rule { width: 12rem; }\n.fwlive-map[data-view=\"detailed\"] .fwlive-scroll #fwlive-table {\n\twidth: max-content;\n\tmin-width: 100%;\n}\n.fwlive-map[data-view=\"detailed\"] col.fwlive-col-time { width: 11rem; }\n.fwlive-map[data-view=\"detailed\"] col.fwlive-col-action { width: 4.5rem; }\n.fwlive-map[data-view=\"detailed\"] col.fwlive-col-rule { width: 8rem; }\n.fwlive-map[data-view=\"detailed\"] col.fwlive-col-iface-in,\n.fwlive-map[data-view=\"detailed\"] col.fwlive-col-iface-out { width: 3.5rem; }\n.fwlive-map[data-view=\"detailed\"] col.fwlive-col-dir { width: 3rem; }\n.fwlive-map[data-view=\"detailed\"] col.fwlive-col-proto { width: 3.25rem; }\n.fwlive-map[data-view=\"detailed\"] col.fwlive-col-src,\n.fwlive-map[data-view=\"detailed\"] col.fwlive-col-dst { width: 9rem; }\n.fwlive-map[data-view=\"detailed\"] col.fwlive-col-sport,\n.fwlive-map[data-view=\"detailed\"] col.fwlive-col-dport { width: 3.75rem; }\n.fwlive-map[data-view=\"detailed\"] col.fwlive-col-flags { width: 5rem; }\n.fwlive-map[data-view=\"detailed\"] col.fwlive-col-len { width: 3.25rem; }\n.fwlive-scroll.fwlive-msg-oneline #fwlive-table {\n\twidth: max-content;\n\tmin-width: 100%;\n}\n.fwlive-scroll.fwlive-msg-oneline tbody td { vertical-align: middle; }\n#fwlive-table thead th {\n\tposition: sticky;\n\ttop: 0;\n\tz-index: 2;\n\tbackground: var(--background-color-low);\n\tborder-bottom: 2px solid var(--border-color-high);\n\twhite-space: nowrap;\n\tpadding: 5px 8px;\n\tfont-size: 0.9em;\n\tfont-weight: 600;\n\tvertical-align: top;\n\ttext-align: left;\n}\n#fwlive-table thead th.fwlive-port,\n#fwlive-table thead th.fwlive-len {\n\ttext-align: right;\n}\n.fwlive-map[data-view=\"simple\"] #fwlive-table thead th,\n.fwlive-map[data-view=\"simple\"] #fwlive-table tbody td {\n\tvertical-align: top;\n}\n#fwlive-table thead th.fwlive-action {\n\tfont-weight: 700;\n\ttext-transform: lowercase;\n}\n#fwlive-table tbody td {\n\tpadding: 5px 8px;\n\tborder-bottom: 1px solid var(--border-color-low);\n\tvertical-align: top;\n\tfont-size: 0.92em;\n}\n.fwlive-row-alt td {\n\tbackground: #f9f9f9;\n\tbackground: var(--fwlive-bg-medium);\n}\n.fwlive-time, .fwlive-addr, .fwlive-port, .fwlive-len {\n\tfont-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n\twhite-space: nowrap;\n}\n.fwlive-port, .fwlive-len { text-align: right; }\n.fwlive-rule, .fwlive-iface, .fwlive-proto, .fwlive-dir, .fwlive-flags { white-space: nowrap; }\n.fwlive-rule { font-size: 0.88em; }\n.fwlive-rule-link {\n\tcolor: var(--primary-color-high);\n\ttext-decoration: none;\n\tfont-weight: 500;\n}\n.fwlive-rule-link:hover { text-decoration: underline; }\n.fwlive-iface-badge {\n\tdisplay: inline-block;\n\tpadding: 1px 6px;\n\tbackground: var(--background-color-low);\n\tborder: 1px solid var(--border-color-medium);\n\tborder-radius: 3px;\n\tfont-size: 0.85em;\n\ttext-decoration: none;\n}\n.fwlive-iface-badge:hover {\n\tbackground: var(--background-color-medium);\n\tborder-color: var(--primary-color-medium);\n}\n.fwlive-action {\n\tfont-weight: 700;\n\ttext-transform: lowercase;\n\twhite-space: nowrap;\n}\n.fwlive-deny { color: var(--fwlive-deny-color); }\n.fwlive-pass { color: var(--fwlive-pass-color); }\n#fwlive-table td.fwlive-action.fwlive-pass,\n#fwlive-table td.fwlive-action.fwlive-pass a.fwlive-filter-link {\n\tcolor: var(--fwlive-pass-color);\n}\n#fwlive-table td.fwlive-action.fwlive-deny,\n#fwlive-table td.fwlive-action.fwlive-deny a.fwlive-filter-link {\n\tcolor: var(--fwlive-deny-color);\n}\n.fwlive-map[data-row-tint=\"classic\"] #fwlive-table tbody tr.fwlive-row-pass td {\n\tbackground: rgba(70, 165, 70, 0.12);\n\tbackground: color-mix(in srgb, var(--fwlive-pass-color) 12%, transparent);\n}\n.fwlive-map[data-row-tint=\"classic\"] #fwlive-table tbody tr.fwlive-row-pass.fwlive-row-alt td {\n\tbackground: rgba(70, 165, 70, 0.18);\n\tbackground: color-mix(in srgb, var(--fwlive-pass-color) 12%, var(--fwlive-bg-medium));\n}\n.fwlive-map[data-row-tint=\"classic\"] #fwlive-table tbody tr.fwlive-row-deny td {\n\tbackground: rgba(202, 60, 60, 0.12);\n\tbackground: color-mix(in srgb, var(--fwlive-deny-color) 12%, transparent);\n}\n.fwlive-map[data-row-tint=\"classic\"] #fwlive-table tbody tr.fwlive-row-deny.fwlive-row-alt td {\n\tbackground: rgba(202, 60, 60, 0.18);\n\tbackground: color-mix(in srgb, var(--fwlive-deny-color) 12%, var(--fwlive-bg-medium));\n}\n.fwlive-map[data-row-tint=\"classic\"] #fwlive-table tbody tr.fwlive-row-pass:hover td {\n\tbackground: rgba(70, 165, 70, 0.20);\n\tbackground: color-mix(in srgb, var(--fwlive-pass-color) 20%, transparent);\n}\n.fwlive-map[data-row-tint=\"classic\"] #fwlive-table tbody tr.fwlive-row-deny:hover td {\n\tbackground: rgba(202, 60, 60, 0.20);\n\tbackground: color-mix(in srgb, var(--fwlive-deny-color) 20%, transparent);\n}\n.fwlive-map[data-row-tint=\"classic\"][data-tint-fallback=\"1\"] #fwlive-table tbody tr.fwlive-row-pass td {\n\tbackground: rgba(70, 165, 70, 0.12);\n}\n.fwlive-map[data-row-tint=\"classic\"][data-tint-fallback=\"1\"] #fwlive-table tbody tr.fwlive-row-pass.fwlive-row-alt td {\n\tbackground: rgba(70, 165, 70, 0.18);\n}\n.fwlive-map[data-row-tint=\"classic\"][data-tint-fallback=\"1\"] #fwlive-table tbody tr.fwlive-row-deny td {\n\tbackground: rgba(202, 60, 60, 0.12);\n}\n.fwlive-map[data-row-tint=\"classic\"][data-tint-fallback=\"1\"] #fwlive-table tbody tr.fwlive-row-deny.fwlive-row-alt td {\n\tbackground: rgba(202, 60, 60, 0.18);\n}\n.fwlive-map[data-row-tint=\"classic\"][data-tint-fallback=\"1\"] #fwlive-table tbody tr.fwlive-row-pass:hover td {\n\tbackground: rgba(70, 165, 70, 0.20);\n}\n.fwlive-map[data-row-tint=\"classic\"][data-tint-fallback=\"1\"] #fwlive-table tbody tr.fwlive-row-deny:hover td {\n\tbackground: rgba(202, 60, 60, 0.20);\n}\n.fwlive-map[data-row-tint=\"accessible\"] #fwlive-table tbody tr.fwlive-row-pass td {\n\tbackground: rgba(13, 148, 136, 0.12);\n\tbackground: color-mix(in srgb, var(--fwlive-pass-color) 12%, transparent);\n}\n.fwlive-map[data-row-tint=\"accessible\"] #fwlive-table tbody tr.fwlive-row-pass.fwlive-row-alt td {\n\tbackground: rgba(13, 148, 136, 0.18);\n\tbackground: color-mix(in srgb, var(--fwlive-pass-color) 12%, var(--fwlive-bg-medium));\n}\n.fwlive-map[data-row-tint=\"accessible\"] #fwlive-table tbody tr.fwlive-row-deny td {\n\tbackground: rgba(194, 65, 12, 0.12);\n\tbackground: color-mix(in srgb, var(--fwlive-deny-color) 12%, transparent);\n}\n.fwlive-map[data-row-tint=\"accessible\"] #fwlive-table tbody tr.fwlive-row-deny.fwlive-row-alt td {\n\tbackground: rgba(194, 65, 12, 0.18);\n\tbackground: color-mix(in srgb, var(--fwlive-deny-color) 12%, var(--fwlive-bg-medium));\n}\n.fwlive-map[data-row-tint=\"accessible\"] #fwlive-table tbody tr.fwlive-row-pass:hover td {\n\tbackground: rgba(13, 148, 136, 0.20);\n\tbackground: color-mix(in srgb, var(--fwlive-pass-color) 20%, transparent);\n}\n.fwlive-map[data-row-tint=\"accessible\"] #fwlive-table tbody tr.fwlive-row-deny:hover td {\n\tbackground: rgba(194, 65, 12, 0.20);\n\tbackground: color-mix(in srgb, var(--fwlive-deny-color) 20%, transparent);\n}\n.fwlive-map[data-row-tint=\"accessible\"][data-tint-fallback=\"1\"] #fwlive-table tbody tr.fwlive-row-pass td {\n\tbackground: rgba(13, 148, 136, 0.12);\n}\n.fwlive-map[data-row-tint=\"accessible\"][data-tint-fallback=\"1\"] #fwlive-table tbody tr.fwlive-row-pass.fwlive-row-alt td {\n\tbackground: rgba(13, 148, 136, 0.18);\n}\n.fwlive-map[data-row-tint=\"accessible\"][data-tint-fallback=\"1\"] #fwlive-table tbody tr.fwlive-row-deny td {\n\tbackground: rgba(194, 65, 12, 0.12);\n}\n.fwlive-map[data-row-tint=\"accessible\"][data-tint-fallback=\"1\"] #fwlive-table tbody tr.fwlive-row-deny.fwlive-row-alt td {\n\tbackground: rgba(194, 65, 12, 0.18);\n}\n.fwlive-map[data-row-tint=\"accessible\"][data-tint-fallback=\"1\"] #fwlive-table tbody tr.fwlive-row-pass:hover td {\n\tbackground: rgba(13, 148, 136, 0.20);\n}\n.fwlive-map[data-row-tint=\"accessible\"][data-tint-fallback=\"1\"] #fwlive-table tbody tr.fwlive-row-deny:hover td {\n\tbackground: rgba(194, 65, 12, 0.20);\n}\n.fwlive-unknown { color: var(--text-color-medium); font-weight: 500; }\n.fwlive-message {\n\tfont-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n\tfont-size: 0.85em;\n\tcolor: var(--text-color-high);\n}\n.fwlive-scroll.fwlive-msg-wrap .fwlive-message-wrap {\n\tdisplay: block;\n\tmin-width: 16em;\n\tmax-width: 42em;\n\twhite-space: normal;\n\tword-break: break-word;\n\tword-wrap: break-word;\n}\n.fwlive-scroll.fwlive-msg-oneline .fwlive-message {\n\twhite-space: nowrap;\n\tmax-width: none;\n\tmin-width: 32em;\n}\n#fwlive-table th.fwlive-th-message,\n.fwlive-scroll.fwlive-msg-oneline .fwlive-message {\n\twidth: 99%;\n}\n.fwlive-empty {\n\tmargin: 12px 0;\n\tpadding: 10px;\n\tbackground: var(--background-color-medium);\n\tborder: 1px dashed var(--border-color-high);\n}\n.fwlive-empty-muted {\n\tfont-size: 0.92em;\n\tcolor: var(--text-color-medium);\n\tmargin: 0 0 8px;\n}\n.fwlive-consent {\n\tmargin: 0 0 12px;\n\tpadding: 10px 12px;\n\tbackground: var(--background-color-high);\n\tborder: 1px solid var(--border-color-medium);\n\tborder-radius: 3px;\n}\n.fwlive-consent-list {\n\tmargin: 0 0 10px;\n\tpadding-left: 1.25em;\n}\n.fwlive-consent-list li {\n\tmargin: 0 0 4px;\n}\n.fwlive-consent-check {\n\tmargin: 0 0 10px;\n\tfont-size: 0.92em;\n}\n.fwlive-consent-actions {\n\tmargin: 0;\n}\n.fwlive-logging-bar {\n\tdisplay: contents;\n}\n.fwlive-logging-status {\n\tfont-size: 0.92em;\n\tcolor: var(--text-color-medium);\n\tmargin-right: 4px;\n}\n.fwlive-logging-notice {\n\tcolor: var(--fwlive-pass-color);\n}\n.fwlive-filter-link {\n\tcolor: inherit;\n\ttext-decoration: underline;\n\ttext-decoration-style: dotted;\n\tcursor: pointer;\n}\n.fwlive-filter-link:hover { color: var(--primary-color-high); }\n.fwlive-chips {\n\tdisplay: none;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 6px;\n\tmargin: 0 0 10px;\n}\n.fwlive-chip-label {\n\tline-height: 1.3;\n}\n.fwlive-chip-not {\n\tfont-weight: 700;\n}\n.fwlive-chip {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 4px;\n\tpadding: 2px 8px;\n\tbackground: var(--background-color-low);\n\tborder: 1px solid var(--border-color-medium);\n\tborder-radius: 3px;\n\tfont-size: 0.88em;\n}\n.fwlive-chip-negated {\n\tborder-style: dashed;\n\tbackground: var(--background-color-medium);\n}\n.fwlive-chip-include {\n}\n.fwlive-chip-polarity {\n\tfont-weight: 700;\n\tfont-size: 0.78em;\n\ttext-transform: uppercase;\n\tletter-spacing: 0.03em;\n\tcolor: var(--text-color-medium);\n}\n.fwlive-chip-strike {\n\ttext-decoration: line-through;\n\ttext-decoration-thickness: 1.5px;\n}\n.fwlive-chip-sym {\n\tfont-weight: 700;\n\tline-height: 1;\n\tmin-width: 0.9em;\n\ttext-align: center;\n}\n.fwlive-chip-sym-light {\n\tcolor: var(--text-color-medium);\n\tfont-size: 0.95em;\n}\n#fwlive-row-tint { width: auto; min-width: 9.5em; }\n/* labels (default) */\n.fwlive-chips-labels .fwlive-chip-include {\n\tborder-left: 3px solid var(--primary-color-medium, var(--primary-color-high, var(--border-color-high)));\n}\n.fwlive-chips-labels .fwlive-chip-negated .fwlive-chip-not {\n\tcolor: var(--text-color-high);\n}\n.fwlive-chip-invert-wrap {\n\tposition: relative;\n\tdisplay: inline-flex;\n}\n.fwlive-chip-invert-wrap::before {\n\tcontent: attr(data-tip);\n\tposition: absolute;\n\tbottom: calc(100% + 6px);\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\twhite-space: nowrap;\n\tpadding: 4px 8px;\n\tfont-size: 0.85em;\n\tfont-weight: normal;\n\tcolor: var(--text-color-high);\n\tbackground: var(--background-color-high);\n\tborder: 1px solid var(--border-color-medium);\n\tborder-radius: 3px;\n\tbox-shadow: 0 2px 6px rgba(0, 0, 0, 0.12);\n\topacity: 0;\n\tvisibility: hidden;\n\tpointer-events: none;\n\tz-index: 20;\n\ttransition: opacity 0.15s ease 1.5s, visibility 0s linear 2s;\n}\n.fwlive-chip-invert-wrap:hover::before,\n.fwlive-chip-invert-wrap:focus-within::before {\n\topacity: 1;\n\tvisibility: visible;\n\ttransition: opacity 0.12s ease 0.35s, visibility 0s;\n}\n.fwlive-chip-invert {\n\tcolor: var(--text-color-medium);\n\tbackground: none;\n\tborder: none;\n\tpadding: 0;\n\tfont: inherit;\n\tfont-weight: 700;\n\tline-height: 1;\n\tcursor: pointer;\n}\n.fwlive-chip-invert:hover { color: var(--primary-color-high); }\n.fwlive-chip-remove {\n\tcolor: var(--text-color-medium);\n\ttext-decoration: none;\n\tfont-weight: 700;\n\tline-height: 1;\n}\n.fwlive-chip-remove:hover { color: var(--fwlive-deny-color); }\n.fwlive-chip-clear {\n\tfont-size: 0.88em;\n\tmargin-left: 4px;\n}\n.fwlive-flood {\n\tdisplay: none;\n\tmargin: 0 0 10px;\n\tpadding: 8px 12px;\n\tbackground: var(--background-color-low);\n\tborder: 1px solid var(--warn-color-high);\n\tborder-radius: 3px;\n\tcolor: var(--text-color-high);\n\tfont-size: 0.92em;\n}\n.fwlive-tint-warn {\n\tdisplay: none;\n\tcolor: var(--warn-color-high);\n\tfont-size: 0.78em;\n\tfont-weight: 600;\n\twhite-space: nowrap;\n\tpadding: 2px 8px;\n\tborder: 1px solid var(--warn-color-high);\n\tborder-radius: 999px;\n\tbackground: color-mix(in srgb, var(--warn-color-high) 10%, transparent);\n}\n.fwlive-map[data-view=\"simple\"] #fwlive-msg-group { display: none; }\n@media (max-width: 850px) {\n\t.fwlive-title-status {\n\t\tflex-basis: 100%;\n\t\tmargin-left: 0;\n\t}\n\t.fwlive-watch-group {\n\t\tborder-left: 0;\n\t\tpadding-left: 0;\n\t\tpadding-right: 10px;\n\t}\n\t.fwlive-display-bar {\n\t\talign-items: flex-start;\n\t}\n}\n.fwlive-help-row {\n\tdisplay: flex;\n\talign-items: baseline;\n\tjustify-content: space-between;\n\tgap: 12px;\n\tmargin: 10px 0 0;\n}\n.fwlive-help {\n\tmargin: 0;\n\tfont-size: 0.92em;\n\tcolor: var(--text-color-medium);\n\tmin-width: 0;\n\tflex: 1;\n}\n.fwlive-help ul { margin: 6px 0 0 1.2em; padding: 0; }\n.fwlive-help li { margin: 4px 0; }\n.fwlive-build {\n\tflex-shrink: 0;\n\tfont-size: 0.78em;\n\tcolor: var(--text-color-low, var(--text-color-medium));\n\tfont-variant-numeric: tabular-nums;\n\tuser-select: all;\n\twhite-space: nowrap;\n}\n.fwlive-backend {\n\tfont-size: 0.65em;\n\tfont-weight: normal;\n\tcolor: var(--text-color-medium);\n\tmargin-left: 8px;\n\tvertical-align: middle;\n}\n.fwlive-filter-panel { margin-bottom: 12px; }\n.fwlive-map[data-view=\"simple\"] .fwlive-grid-core {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(3, minmax(140px, 1fr));\n\tgap: 8px;\n}\n.fwlive-map[data-view=\"simple\"] .fwlive-more-filters { margin-top: 8px; }\n.fwlive-map[data-view=\"simple\"] .fwlive-grid-extra {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(4, minmax(140px, 1fr));\n\tgap: 8px;\n\tmargin-top: 8px;\n}\n.fwlive-map[data-view=\"detailed\"] .fwlive-more-filters > summary { display: none; }\n.fwlive-map[data-view=\"detailed\"] .fwlive-filter-panel {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(4, minmax(140px, 1fr));\n\tgap: 8px;\n}\n.fwlive-map[data-view=\"detailed\"] .fwlive-grid-core,\n.fwlive-map[data-view=\"detailed\"] .fwlive-grid-extra,\n.fwlive-map[data-view=\"detailed\"] .fwlive-more-filters { display: contents; }\n.fwlive-row-clickable { cursor: pointer; }\n.fwlive-row-expanded td { border-bottom-color: transparent; }\n.fwlive-msg-expand td {\n\tbackground: var(--background-color-low);\n\tpadding: 8px 12px 10px;\n\tborder-bottom: 1px solid var(--border-color-medium);\n}\n.fwlive-msg-expand-label {\n\tfont-size: 0.82em;\n\tcolor: var(--text-color-medium);\n\tmargin-bottom: 4px;\n\tfont-weight: 600;\n}\n.fwlive-msg-expand-body {\n\tmargin: 0;\n\twhite-space: pre-wrap;\n\tword-break: break-word;\n\tfont-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n\tfont-size: 0.85em;\n\tcolor: var(--text-color-high);\n}\n.fwlive-flow-arrow {\n\tcolor: var(--text-color-low);\n\tfont-weight: 700;\n}\n.fwlive-flow-cell { white-space: nowrap; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 0.9em; }\n.fwlive-map[data-view=\"simple\"] #fwlive-table td.fwlive-action.fwlive-pass,\n.fwlive-map[data-view=\"simple\"] #fwlive-table td.fwlive-action.fwlive-pass a.fwlive-filter-link {\n\tcolor: var(--fwlive-pass-color);\n}\n.fwlive-map[data-view=\"simple\"] #fwlive-table td.fwlive-action.fwlive-deny,\n.fwlive-map[data-view=\"simple\"] #fwlive-table td.fwlive-action.fwlive-deny a.fwlive-filter-link {\n\tcolor: var(--fwlive-deny-color);\n}\n.fwlive-iface-badge {\n\tborder-radius: 10px;\n\tpadding: 2px 8px;\n}\n" + styleText: "\n.fwlive-map {\n\tmax-width: none;\n\twidth: 100%;\n\t--fwlive-pass-color: var(--success-color-high, var(--success-color, #46a546));\n\t--fwlive-deny-color: var(--error-color-high, var(--error-color, #ca3c3c));\n\t--fwlive-bg-medium: var(--background-color-medium, var(--white-color-low, #f9f9f9));\n\t--fwlive-paused-color: #b45309;\n}\n/* Wide page in Detail only — Simple keeps LuCI’s 940px column. */\n#maincontent.container:has(.fwlive-map[data-view=\"detailed\"]) {\n\tmax-width: none;\n\tpadding-left: 16px;\n\tpadding-right: 16px;\n}\n.fwlive-map[data-row-tint=\"accessible\"] {\n\t--fwlive-pass-color: #0d9488;\n\t--fwlive-deny-color: #c2410c;\n}\n.fwlive-map.fwlive-watch-paused .fwlive-title-row,\n.fwlive-map.fwlive-watch-paused .fwlive-watch-strip {\n\tbackground: rgba(180, 83, 9, 0.08);\n\tbackground: color-mix(in srgb, var(--fwlive-paused-color) 8%, transparent);\n}\n.fwlive-map.fwlive-watch-paused .fwlive-title-row {\n\tmargin: 0 -8px;\n\tpadding: 6px 8px 0;\n\tborder-radius: 3px 3px 0 0;\n}\n.fwlive-map.fwlive-watch-paused .fwlive-watch-strip {\n\tmargin: 0 -8px 10px;\n\tpadding: 8px;\n\tborder-radius: 0 0 3px 3px;\n\tborder-bottom-color: transparent;\n}\n.fwlive-title-row {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: baseline;\n\tjustify-content: space-between;\n\tgap: 8px 16px;\n\tmargin: 0 0 4px;\n}\n.fwlive-title-row h2 {\n\tmargin: 0;\n\tflex: 0 1 auto;\n}\n.fwlive-title-status {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 8px;\n\tflex-wrap: wrap;\n\tmin-width: 0;\n\tmargin-left: auto;\n}\n.fwlive-watch-strip {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: stretch;\n\tjustify-content: flex-start;\n\tgap: 0;\n\tmin-height: 40px;\n\tpadding: 8px 0 10px;\n\tborder-bottom: 1px solid var(--border-color-medium);\n\tmargin-bottom: 10px;\n}\n.fwlive-watch-group {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 6px;\n\tmin-height: 28px;\n\tpadding: 0 10px;\n\tborder-left: 1px solid var(--border-color-medium);\n\tflex-wrap: wrap;\n}\n.fwlive-watch-group:last-child {\n\tpadding-right: 0;\n}\n.fwlive-watch-group-label {\n\tmargin-right: 2px;\n\tcolor: var(--text-color-medium);\n\tfont-size: 0.72em;\n\tfont-weight: 700;\n\tletter-spacing: 0.08em;\n\ttext-transform: uppercase;\n\twhite-space: nowrap;\n}\n.fwlive-watch-seg {\n\tdisplay: inline-flex;\n\talign-items: stretch;\n\tborder: 1px solid var(--border-color-medium);\n\tborder-radius: 3px;\n\toverflow: hidden;\n}\n.fwlive-watch-seg .fwlive-seg-btn {\n\tmargin: 0;\n\tborder: 0;\n\tborder-radius: 0;\n\tborder-right: 1px solid var(--border-color-medium);\n\tbackground: transparent;\n\tpadding: 4px 10px;\n\tfont-size: 0.88em;\n\tline-height: 1.25;\n\tmin-height: 28px;\n}\n.fwlive-watch-seg .fwlive-seg-btn:last-child {\n\tborder-right: 0;\n}\n.fwlive-watch-seg .fwlive-seg-btn[aria-pressed=\"true\"] {\n\tbackground: rgba(26, 111, 156, 0.12);\n\tbackground: color-mix(in srgb, var(--primary-color-high) 12%, transparent);\n\tcolor: var(--primary-color-high);\n\tfont-weight: 600;\n}\n.fwlive-watch-label { font-weight: 600; }\n.fwlive-watch-paused .fwlive-watch-label { color: var(--fwlive-paused-color); }\n.fwlive-map.fwlive-watch-paused .fwlive-title-status .fwlive-watch-label { color: var(--fwlive-paused-color); }\n.fwlive-dot {\n\twidth: 8px;\n\theight: 8px;\n\tborder-radius: 50%;\n\tbackground: var(--text-color-low, var(--border-color-high));\n\tdisplay: inline-block;\n\tflex-shrink: 0;\n}\n.fwlive-dot.fwlive-dot-on {\n\tbackground: var(--fwlive-pass-color);\n\tbox-shadow: 0 0 0 3px color-mix(in srgb, var(--fwlive-pass-color) 22%, transparent);\n}\n.fwlive-btn-ghost {\n\tbackground: transparent;\n\tborder-color: var(--border-color-medium);\n}\n.fwlive-btn-quiet {\n\tbackground: transparent;\n\tborder-color: var(--border-color-medium);\n\tcolor: var(--text-color-medium);\n\tfont-weight: 500;\n}\n.fwlive-log-merged {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 6px;\n\tpadding: 4px 10px;\n\tborder: 1px solid var(--border-color-medium);\n\tborder-radius: 3px;\n\tbackground: var(--background-color-medium, var(--white-color-low, var(--background-color-high)));\n\tcolor: var(--text-color-high);\n\tfont-weight: 500;\n\tfont-size: 0.88em;\n\tline-height: 1.25;\n\tmin-height: 28px;\n\tcursor: pointer;\n}\n.fwlive-log-merged:hover {\n\tbackground: var(--background-color-low, var(--background-color-medium));\n}\n.fwlive-log-merged:disabled {\n\topacity: 0.65;\n\tcursor: default;\n}\n.fwlive-log-on-dot {\n\twidth: 6px;\n\theight: 6px;\n\tborder-radius: 50%;\n\tbackground: var(--fwlive-pass-color);\n\tflex-shrink: 0;\n}\n.fwlive-log-rate {\n\tcolor: var(--text-color-medium);\n\tfont-weight: 400;\n}\n.fwlive-display-bar {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 8px 14px;\n\tmargin: 0 0 12px;\n\tpadding: 8px 12px;\n\tborder: 1px solid var(--border-color-medium);\n\tborder-radius: 3px;\n\tbackground: var(--background-color-high);\n}\n.fwlive-display-bar-label {\n\tflex: 0 0 auto;\n\tfont-weight: 600;\n\tfont-size: 0.92em;\n\tcolor: var(--text-color-high);\n\twhite-space: nowrap;\n}\n.fwlive-display-controls {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 8px 14px;\n\tmin-width: 0;\n\tflex: 1 1 auto;\n}\n.fwlive-display-ctl {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 6px;\n\tmargin: 0;\n\tfont-size: 0.92em;\n\twhite-space: nowrap;\n}\n.fwlive-display-ctl input[type=\"checkbox\"] {\n\tmargin: 0;\n\tflex-shrink: 0;\n}\n.fwlive-display-ctl select {\n\tmargin-left: 0;\n}\n.fwlive-display-ctl.fwlive-hidden {\n\tdisplay: none;\n}\n/* Draw our own disclosure arrow — themes that restyle summary drop the native marker. */\n.fwlive-more-filters > summary,\n.fwlive-help > summary {\n\tcursor: pointer;\n\tlist-style: none;\n}\n.fwlive-more-filters > summary::-webkit-details-marker,\n.fwlive-help > summary::-webkit-details-marker { display: none; }\n.fwlive-more-filters > summary::before,\n.fwlive-help > summary::before {\n\tcontent: \"▸ \";\n\tcolor: var(--text-color-medium);\n}\n.fwlive-more-filters[open] > summary::before,\n.fwlive-help[open] > summary::before { content: \"▾ \"; }\n.fwlive-ctl {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 6px;\n\tfont-size: 0.92em;\n\tflex-wrap: wrap;\n}\n.fwlive-ctl select { margin-left: 4px; }\n#fwlive-limit { width: auto; min-width: 4.5em; }\n.fwlive-grid { display: grid; grid-template-columns: repeat(4, minmax(140px, 1fr)); gap: 8px; margin-bottom: 12px; }\n.fwlive-status { margin: 0; color: var(--text-color-medium); font-size: 0.9em; }\n.fwlive-status-paused { color: var(--warn-color-high); font-weight: 600; }\n.fwlive-status-error { color: var(--warn-color-high); font-weight: 600; }\n.fwlive-hint-line {\n\tmargin: 0 0 10px;\n\tfont-size: 0.85em;\n\tcolor: var(--text-color-medium);\n}\n.fwlive-empty-title {\n\tfont-weight: 600;\n\tmargin: 0 0 6px;\n\tcolor: var(--text-color-high);\n}\n.fwlive-find-row .fwlive-grid-core { margin-bottom: 0; }\n.fwlive-proto-pair {\n\tdisplay: grid;\n\tgrid-template-columns: minmax(0, 1.15fr) minmax(0, 0.85fr);\n\tgap: 6px;\n\talign-items: stretch;\n\tmin-width: 0;\n}\n.fwlive-proto-pair select,\n.fwlive-proto-pair input {\n\twidth: 100%;\n\tmin-width: 0;\n}\n@media (max-width: 520px) {\n\t.fwlive-proto-pair { grid-template-columns: 1fr; }\n}\n.fwlive-scroll {\n\tmax-height: 78vh;\n\tmax-height: 78dvh;\n\toverflow: auto;\n\tborder: 1px solid var(--border-color-medium);\n\tborder-radius: 3px;\n\tbackground: var(--background-color-high);\n\twidth: 100%;\n\tscrollbar-gutter: stable;\n}\n#fwlive-table { margin: 0; width: 100%; table-layout: auto; border-collapse: collapse; }\n.fwlive-map[data-view=\"simple\"] #fwlive-table { table-layout: fixed; width: 100%; }\n.fwlive-map[data-view=\"simple\"] col.fwlive-col-action { width: 5rem; }\n.fwlive-map[data-view=\"simple\"] col.fwlive-col-time { width: 5rem; }\n.fwlive-map[data-view=\"simple\"] col.fwlive-col-iface { width: 5.5rem; }\n.fwlive-map[data-view=\"simple\"] col.fwlive-col-proto { width: 4rem; }\n.fwlive-map[data-view=\"simple\"] col.fwlive-col-rule { width: 12rem; }\n.fwlive-map[data-view=\"detailed\"] .fwlive-scroll #fwlive-table {\n\twidth: max-content;\n\tmin-width: 100%;\n}\n.fwlive-map[data-view=\"detailed\"] col.fwlive-col-time { width: 11rem; }\n.fwlive-map[data-view=\"detailed\"] col.fwlive-col-action { width: 4.5rem; }\n.fwlive-map[data-view=\"detailed\"] col.fwlive-col-rule { width: 8rem; }\n.fwlive-map[data-view=\"detailed\"] col.fwlive-col-iface-in,\n.fwlive-map[data-view=\"detailed\"] col.fwlive-col-iface-out { width: 3.5rem; }\n.fwlive-map[data-view=\"detailed\"] col.fwlive-col-dir { width: 3rem; }\n.fwlive-map[data-view=\"detailed\"] col.fwlive-col-proto { width: 3.25rem; }\n.fwlive-map[data-view=\"detailed\"] col.fwlive-col-src,\n.fwlive-map[data-view=\"detailed\"] col.fwlive-col-dst { width: 9rem; }\n.fwlive-map[data-view=\"detailed\"] col.fwlive-col-sport,\n.fwlive-map[data-view=\"detailed\"] col.fwlive-col-dport { width: 3.75rem; }\n.fwlive-map[data-view=\"detailed\"] col.fwlive-col-flags { width: 5rem; }\n.fwlive-map[data-view=\"detailed\"] col.fwlive-col-len { width: 3.25rem; }\n.fwlive-scroll.fwlive-msg-oneline #fwlive-table {\n\twidth: max-content;\n\tmin-width: 100%;\n}\n.fwlive-scroll.fwlive-msg-oneline tbody td { vertical-align: middle; }\n#fwlive-table thead th {\n\tposition: sticky;\n\ttop: 0;\n\tz-index: 2;\n\tbackground: var(--background-color-low);\n\tborder-bottom: 2px solid var(--border-color-high);\n\twhite-space: nowrap;\n\tpadding: 5px 8px;\n\tfont-size: 0.9em;\n\tfont-weight: 600;\n\tvertical-align: top;\n\ttext-align: left;\n}\n#fwlive-table thead th.fwlive-port,\n#fwlive-table thead th.fwlive-len {\n\ttext-align: right;\n}\n.fwlive-map[data-view=\"simple\"] #fwlive-table thead th,\n.fwlive-map[data-view=\"simple\"] #fwlive-table tbody td {\n\tvertical-align: top;\n}\n#fwlive-table thead th.fwlive-action {\n\tfont-weight: 700;\n\ttext-transform: lowercase;\n}\n#fwlive-table tbody td {\n\tpadding: 5px 8px;\n\tborder-bottom: 1px solid var(--border-color-low);\n\tvertical-align: top;\n\tfont-size: 0.92em;\n}\n.fwlive-row-alt td {\n\tbackground: #f9f9f9;\n\tbackground: var(--fwlive-bg-medium);\n}\n.fwlive-time, .fwlive-addr, .fwlive-port, .fwlive-len {\n\tfont-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n\twhite-space: nowrap;\n}\n.fwlive-port, .fwlive-len { text-align: right; }\n.fwlive-rule, .fwlive-iface, .fwlive-proto, .fwlive-dir, .fwlive-flags { white-space: nowrap; }\n.fwlive-rule { font-size: 0.88em; }\n.fwlive-rule-link {\n\tcolor: var(--primary-color-high);\n\ttext-decoration: none;\n\tfont-weight: 500;\n}\n.fwlive-rule-link:hover { text-decoration: underline; }\n.fwlive-iface-badge {\n\tdisplay: inline-block;\n\tpadding: 1px 6px;\n\tbackground: var(--background-color-low);\n\tborder: 1px solid var(--border-color-medium);\n\tborder-radius: 3px;\n\tfont-size: 0.85em;\n\ttext-decoration: none;\n}\n.fwlive-iface-badge:hover {\n\tbackground: var(--background-color-medium);\n\tborder-color: var(--primary-color-medium);\n}\n.fwlive-action {\n\tfont-weight: 700;\n\ttext-transform: lowercase;\n\twhite-space: nowrap;\n}\n.fwlive-deny { color: var(--fwlive-deny-color); }\n.fwlive-pass { color: var(--fwlive-pass-color); }\n#fwlive-table td.fwlive-action.fwlive-pass,\n#fwlive-table td.fwlive-action.fwlive-pass a.fwlive-filter-link {\n\tcolor: var(--fwlive-pass-color);\n}\n#fwlive-table td.fwlive-action.fwlive-deny,\n#fwlive-table td.fwlive-action.fwlive-deny a.fwlive-filter-link {\n\tcolor: var(--fwlive-deny-color);\n}\n.fwlive-map[data-row-tint=\"classic\"] #fwlive-table tbody tr.fwlive-row-pass td {\n\tbackground: rgba(70, 165, 70, 0.12);\n\tbackground: color-mix(in srgb, var(--fwlive-pass-color) 12%, transparent);\n}\n.fwlive-map[data-row-tint=\"classic\"] #fwlive-table tbody tr.fwlive-row-pass.fwlive-row-alt td {\n\tbackground: rgba(70, 165, 70, 0.18);\n\tbackground: color-mix(in srgb, var(--fwlive-pass-color) 12%, var(--fwlive-bg-medium));\n}\n.fwlive-map[data-row-tint=\"classic\"] #fwlive-table tbody tr.fwlive-row-deny td {\n\tbackground: rgba(202, 60, 60, 0.12);\n\tbackground: color-mix(in srgb, var(--fwlive-deny-color) 12%, transparent);\n}\n.fwlive-map[data-row-tint=\"classic\"] #fwlive-table tbody tr.fwlive-row-deny.fwlive-row-alt td {\n\tbackground: rgba(202, 60, 60, 0.18);\n\tbackground: color-mix(in srgb, var(--fwlive-deny-color) 12%, var(--fwlive-bg-medium));\n}\n.fwlive-map[data-row-tint=\"classic\"] #fwlive-table tbody tr.fwlive-row-pass:hover td {\n\tbackground: rgba(70, 165, 70, 0.20);\n\tbackground: color-mix(in srgb, var(--fwlive-pass-color) 20%, transparent);\n}\n.fwlive-map[data-row-tint=\"classic\"] #fwlive-table tbody tr.fwlive-row-deny:hover td {\n\tbackground: rgba(202, 60, 60, 0.20);\n\tbackground: color-mix(in srgb, var(--fwlive-deny-color) 20%, transparent);\n}\n.fwlive-map[data-row-tint=\"classic\"][data-tint-fallback=\"1\"] #fwlive-table tbody tr.fwlive-row-pass td {\n\tbackground: rgba(70, 165, 70, 0.12);\n}\n.fwlive-map[data-row-tint=\"classic\"][data-tint-fallback=\"1\"] #fwlive-table tbody tr.fwlive-row-pass.fwlive-row-alt td {\n\tbackground: rgba(70, 165, 70, 0.18);\n}\n.fwlive-map[data-row-tint=\"classic\"][data-tint-fallback=\"1\"] #fwlive-table tbody tr.fwlive-row-deny td {\n\tbackground: rgba(202, 60, 60, 0.12);\n}\n.fwlive-map[data-row-tint=\"classic\"][data-tint-fallback=\"1\"] #fwlive-table tbody tr.fwlive-row-deny.fwlive-row-alt td {\n\tbackground: rgba(202, 60, 60, 0.18);\n}\n.fwlive-map[data-row-tint=\"classic\"][data-tint-fallback=\"1\"] #fwlive-table tbody tr.fwlive-row-pass:hover td {\n\tbackground: rgba(70, 165, 70, 0.20);\n}\n.fwlive-map[data-row-tint=\"classic\"][data-tint-fallback=\"1\"] #fwlive-table tbody tr.fwlive-row-deny:hover td {\n\tbackground: rgba(202, 60, 60, 0.20);\n}\n.fwlive-map[data-row-tint=\"accessible\"] #fwlive-table tbody tr.fwlive-row-pass td {\n\tbackground: rgba(13, 148, 136, 0.12);\n\tbackground: color-mix(in srgb, var(--fwlive-pass-color) 12%, transparent);\n}\n.fwlive-map[data-row-tint=\"accessible\"] #fwlive-table tbody tr.fwlive-row-pass.fwlive-row-alt td {\n\tbackground: rgba(13, 148, 136, 0.18);\n\tbackground: color-mix(in srgb, var(--fwlive-pass-color) 12%, var(--fwlive-bg-medium));\n}\n.fwlive-map[data-row-tint=\"accessible\"] #fwlive-table tbody tr.fwlive-row-deny td {\n\tbackground: rgba(194, 65, 12, 0.12);\n\tbackground: color-mix(in srgb, var(--fwlive-deny-color) 12%, transparent);\n}\n.fwlive-map[data-row-tint=\"accessible\"] #fwlive-table tbody tr.fwlive-row-deny.fwlive-row-alt td {\n\tbackground: rgba(194, 65, 12, 0.18);\n\tbackground: color-mix(in srgb, var(--fwlive-deny-color) 12%, var(--fwlive-bg-medium));\n}\n.fwlive-map[data-row-tint=\"accessible\"] #fwlive-table tbody tr.fwlive-row-pass:hover td {\n\tbackground: rgba(13, 148, 136, 0.20);\n\tbackground: color-mix(in srgb, var(--fwlive-pass-color) 20%, transparent);\n}\n.fwlive-map[data-row-tint=\"accessible\"] #fwlive-table tbody tr.fwlive-row-deny:hover td {\n\tbackground: rgba(194, 65, 12, 0.20);\n\tbackground: color-mix(in srgb, var(--fwlive-deny-color) 20%, transparent);\n}\n.fwlive-map[data-row-tint=\"accessible\"][data-tint-fallback=\"1\"] #fwlive-table tbody tr.fwlive-row-pass td {\n\tbackground: rgba(13, 148, 136, 0.12);\n}\n.fwlive-map[data-row-tint=\"accessible\"][data-tint-fallback=\"1\"] #fwlive-table tbody tr.fwlive-row-pass.fwlive-row-alt td {\n\tbackground: rgba(13, 148, 136, 0.18);\n}\n.fwlive-map[data-row-tint=\"accessible\"][data-tint-fallback=\"1\"] #fwlive-table tbody tr.fwlive-row-deny td {\n\tbackground: rgba(194, 65, 12, 0.12);\n}\n.fwlive-map[data-row-tint=\"accessible\"][data-tint-fallback=\"1\"] #fwlive-table tbody tr.fwlive-row-deny.fwlive-row-alt td {\n\tbackground: rgba(194, 65, 12, 0.18);\n}\n.fwlive-map[data-row-tint=\"accessible\"][data-tint-fallback=\"1\"] #fwlive-table tbody tr.fwlive-row-pass:hover td {\n\tbackground: rgba(13, 148, 136, 0.20);\n}\n.fwlive-map[data-row-tint=\"accessible\"][data-tint-fallback=\"1\"] #fwlive-table tbody tr.fwlive-row-deny:hover td {\n\tbackground: rgba(194, 65, 12, 0.20);\n}\n.fwlive-unknown { color: var(--text-color-medium); font-weight: 500; }\n.fwlive-message {\n\tfont-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n\tfont-size: 0.85em;\n\tcolor: var(--text-color-high);\n}\n.fwlive-scroll.fwlive-msg-wrap .fwlive-message-wrap {\n\tdisplay: block;\n\tmin-width: 16em;\n\tmax-width: 42em;\n\twhite-space: normal;\n\tword-break: break-word;\n\tword-wrap: break-word;\n}\n.fwlive-scroll.fwlive-msg-oneline .fwlive-message {\n\twhite-space: nowrap;\n\tmax-width: none;\n\tmin-width: 32em;\n}\n#fwlive-table th.fwlive-th-message,\n.fwlive-scroll.fwlive-msg-oneline .fwlive-message {\n\twidth: 99%;\n}\n.fwlive-empty {\n\tmargin: 12px 0;\n\tpadding: 10px;\n\tbackground: var(--background-color-medium);\n\tborder: 1px dashed var(--border-color-high);\n}\n.fwlive-empty-muted {\n\tfont-size: 0.92em;\n\tcolor: var(--text-color-medium);\n\tmargin: 0 0 8px;\n}\n.fwlive-consent {\n\tmargin: 0 0 12px;\n\tpadding: 10px 12px;\n\tbackground: var(--background-color-high);\n\tborder: 1px solid var(--border-color-medium);\n\tborder-radius: 3px;\n}\n.fwlive-consent-list {\n\tmargin: 0 0 10px;\n\tpadding-left: 1.25em;\n}\n.fwlive-consent-list li {\n\tmargin: 0 0 4px;\n}\n.fwlive-consent-check {\n\tmargin: 0 0 10px;\n\tfont-size: 0.92em;\n}\n.fwlive-consent-actions {\n\tmargin: 0;\n}\n.fwlive-logging-bar {\n\tdisplay: contents;\n}\n.fwlive-logging-status {\n\tfont-size: 0.92em;\n\tcolor: var(--text-color-medium);\n\tmargin-right: 4px;\n}\n.fwlive-logging-notice {\n\tcolor: var(--fwlive-pass-color);\n}\n.fwlive-filter-link {\n\tcolor: inherit;\n\ttext-decoration: underline;\n\ttext-decoration-style: dotted;\n\tcursor: pointer;\n}\n.fwlive-filter-link:hover { color: var(--primary-color-high); }\n.fwlive-chips {\n\tdisplay: none;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 6px;\n\tmargin: 0 0 10px;\n}\n.fwlive-chip-label {\n\tline-height: 1.3;\n}\n.fwlive-chip-not {\n\tfont-weight: 700;\n}\n.fwlive-chip {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 4px;\n\tpadding: 2px 8px;\n\tbackground: var(--background-color-low);\n\tborder: 1px solid var(--border-color-medium);\n\tborder-radius: 3px;\n\tfont-size: 0.88em;\n}\n.fwlive-chip-negated {\n\tborder-style: dashed;\n\tbackground: var(--background-color-medium);\n}\n.fwlive-chip-include {\n}\n.fwlive-chip-polarity {\n\tfont-weight: 700;\n\tfont-size: 0.78em;\n\ttext-transform: uppercase;\n\tletter-spacing: 0.03em;\n\tcolor: var(--text-color-medium);\n}\n.fwlive-chip-strike {\n\ttext-decoration: line-through;\n\ttext-decoration-thickness: 1.5px;\n}\n.fwlive-chip-sym {\n\tfont-weight: 700;\n\tline-height: 1;\n\tmin-width: 0.9em;\n\ttext-align: center;\n}\n.fwlive-chip-sym-light {\n\tcolor: var(--text-color-medium);\n\tfont-size: 0.95em;\n}\n#fwlive-row-tint { width: auto; min-width: 9.5em; }\n/* labels (default) */\n.fwlive-chips-labels .fwlive-chip-include {\n\tborder-left: 3px solid var(--primary-color-medium, var(--primary-color-high, var(--border-color-high)));\n}\n.fwlive-chips-labels .fwlive-chip-negated .fwlive-chip-not {\n\tcolor: var(--text-color-high);\n}\n.fwlive-chip-invert-wrap {\n\tposition: relative;\n\tdisplay: inline-flex;\n}\n.fwlive-chip-invert-wrap::before {\n\tcontent: attr(data-tip);\n\tposition: absolute;\n\tbottom: calc(100% + 6px);\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\twhite-space: nowrap;\n\tpadding: 4px 8px;\n\tfont-size: 0.85em;\n\tfont-weight: normal;\n\tcolor: var(--text-color-high);\n\tbackground: var(--background-color-high);\n\tborder: 1px solid var(--border-color-medium);\n\tborder-radius: 3px;\n\tbox-shadow: 0 2px 6px rgba(0, 0, 0, 0.12);\n\topacity: 0;\n\tvisibility: hidden;\n\tpointer-events: none;\n\tz-index: 20;\n\ttransition: opacity 0.15s ease 1.5s, visibility 0s linear 2s;\n}\n.fwlive-chip-invert-wrap:hover::before,\n.fwlive-chip-invert-wrap:focus-within::before {\n\topacity: 1;\n\tvisibility: visible;\n\ttransition: opacity 0.12s ease 0.35s, visibility 0s;\n}\n.fwlive-chip-invert {\n\tcolor: var(--text-color-medium);\n\tbackground: none;\n\tborder: none;\n\tpadding: 0;\n\tfont: inherit;\n\tfont-weight: 700;\n\tline-height: 1;\n\tcursor: pointer;\n}\n.fwlive-chip-invert:hover { color: var(--primary-color-high); }\n.fwlive-chip-remove {\n\tcolor: var(--text-color-medium);\n\ttext-decoration: none;\n\tfont-weight: 700;\n\tline-height: 1;\n}\n.fwlive-chip-remove:hover { color: var(--fwlive-deny-color); }\n.fwlive-chip-clear {\n\tfont-size: 0.88em;\n\tmargin-left: 4px;\n}\n.fwlive-flood {\n\tdisplay: none;\n\tmargin: 0 0 10px;\n\tpadding: 8px 12px;\n\tbackground: var(--background-color-low);\n\tborder: 1px solid var(--warn-color-high);\n\tborder-radius: 3px;\n\tcolor: var(--text-color-high);\n\tfont-size: 0.92em;\n}\n.fwlive-tint-warn {\n\tdisplay: none;\n\tcolor: var(--warn-color-high);\n\tfont-size: 0.78em;\n\tfont-weight: 600;\n\twhite-space: nowrap;\n\tpadding: 2px 8px;\n\tborder: 1px solid var(--warn-color-high);\n\tborder-radius: 999px;\n\tbackground: color-mix(in srgb, var(--warn-color-high) 10%, transparent);\n}\n.fwlive-map[data-view=\"simple\"] #fwlive-msg-group { display: none; }\n@media (max-width: 850px) {\n\t.fwlive-title-status {\n\t\tflex-basis: 100%;\n\t\tmargin-left: 0;\n\t}\n\t.fwlive-watch-group {\n\t\tborder-left: 0;\n\t\tpadding-left: 0;\n\t\tpadding-right: 10px;\n\t}\n\t.fwlive-display-bar {\n\t\talign-items: flex-start;\n\t}\n}\n.fwlive-help-row {\n\tdisplay: flex;\n\talign-items: baseline;\n\tjustify-content: space-between;\n\tgap: 12px;\n\tmargin: 10px 0 0;\n}\n.fwlive-help {\n\tmargin: 0;\n\tfont-size: 0.92em;\n\tcolor: var(--text-color-medium);\n\tmin-width: 0;\n\tflex: 1;\n}\n.fwlive-help ul { margin: 6px 0 0 1.2em; padding: 0; }\n.fwlive-help li { margin: 4px 0; }\n.fwlive-build {\n\tflex-shrink: 0;\n\tfont-size: 0.78em;\n\tcolor: var(--text-color-low, var(--text-color-medium));\n\tfont-variant-numeric: tabular-nums;\n\tuser-select: all;\n\twhite-space: nowrap;\n}\n.fwlive-backend {\n\tfont-size: 0.65em;\n\tfont-weight: normal;\n\tcolor: var(--text-color-medium);\n\tmargin-left: 8px;\n\tvertical-align: middle;\n}\n.fwlive-backend.fwlive-backend-warn {\n\tcolor: var(--warn-color-high);\n\tfont-weight: 600;\n}\n.fwlive-filter-panel { margin-bottom: 12px; }\n.fwlive-map[data-view=\"simple\"] .fwlive-grid-core {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(3, minmax(140px, 1fr));\n\tgap: 8px;\n}\n.fwlive-map[data-view=\"simple\"] .fwlive-more-filters { margin-top: 8px; }\n.fwlive-map[data-view=\"simple\"] .fwlive-grid-extra {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(4, minmax(140px, 1fr));\n\tgap: 8px;\n\tmargin-top: 8px;\n}\n.fwlive-map[data-view=\"detailed\"] .fwlive-more-filters > summary { display: none; }\n.fwlive-map[data-view=\"detailed\"] .fwlive-filter-panel {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(4, minmax(140px, 1fr));\n\tgap: 8px;\n}\n.fwlive-map[data-view=\"detailed\"] .fwlive-grid-core,\n.fwlive-map[data-view=\"detailed\"] .fwlive-grid-extra,\n.fwlive-map[data-view=\"detailed\"] .fwlive-more-filters { display: contents; }\n.fwlive-row-clickable { cursor: pointer; }\n.fwlive-row-expanded td { border-bottom-color: transparent; }\n.fwlive-msg-expand td {\n\tbackground: var(--background-color-low);\n\tpadding: 8px 12px 10px;\n\tborder-bottom: 1px solid var(--border-color-medium);\n}\n.fwlive-msg-expand-label {\n\tfont-size: 0.82em;\n\tcolor: var(--text-color-medium);\n\tmargin-bottom: 4px;\n\tfont-weight: 600;\n}\n.fwlive-msg-expand-body {\n\tmargin: 0;\n\twhite-space: pre-wrap;\n\tword-break: break-word;\n\tfont-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n\tfont-size: 0.85em;\n\tcolor: var(--text-color-high);\n}\n.fwlive-flow-arrow {\n\tcolor: var(--text-color-low);\n\tfont-weight: 700;\n}\n.fwlive-flow-cell { white-space: nowrap; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 0.9em; }\n.fwlive-map[data-view=\"simple\"] #fwlive-table td.fwlive-action.fwlive-pass,\n.fwlive-map[data-view=\"simple\"] #fwlive-table td.fwlive-action.fwlive-pass a.fwlive-filter-link {\n\tcolor: var(--fwlive-pass-color);\n}\n.fwlive-map[data-view=\"simple\"] #fwlive-table td.fwlive-action.fwlive-deny,\n.fwlive-map[data-view=\"simple\"] #fwlive-table td.fwlive-action.fwlive-deny a.fwlive-filter-link {\n\tcolor: var(--fwlive-deny-color);\n}\n.fwlive-iface-badge {\n\tborder-radius: 10px;\n\tpadding: 2px 8px;\n}\n" }); diff --git a/luci-app-fwlive/htdocs/luci-static/resources/fwlive/fwlive.css b/luci-app-fwlive/htdocs/luci-static/resources/fwlive/fwlive.css index 080e8249a..ea0d9913e 100644 --- a/luci-app-fwlive/htdocs/luci-static/resources/fwlive/fwlive.css +++ b/luci-app-fwlive/htdocs/luci-static/resources/fwlive/fwlive.css @@ -717,6 +717,10 @@ margin-left: 8px; vertical-align: middle; } +.fwlive-backend.fwlive-backend-warn { + color: var(--warn-color-high); + font-weight: 600; +} .fwlive-filter-panel { margin-bottom: 12px; } .fwlive-map[data-view="simple"] .fwlive-grid-core { display: grid; diff --git a/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js b/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js index 5bcab5e69..6aeefd25b 100644 --- a/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js +++ b/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js @@ -47,7 +47,8 @@ const callFwliveLoggingStatus = rpc.declare({ nf_log_ipv4: false, nf_log_ipv6: false, ready: false, - blockers: [] + blockers: [], + warnings: [] } } }); @@ -521,6 +522,7 @@ return view.extend({ const label = document.getElementById('fwlive-backend'); if (label) { let text = this.backendDisplayLabel(); + let degraded = false; if (this.lastRulesError) { let err = ''; if (this.lastRulesError === 'rules_truncated') @@ -530,13 +532,16 @@ return view.extend({ else err = _('Rule labels unavailable'); text = text ? text + ' \u00b7 ' + err : err; + degraded = true; } const warnings = (this.loggingStatus && this.loggingStatus.warnings) || []; if (warnings.indexOf('timeout_missing') >= 0) { const warn = _('Limited diagnostics — timeout command missing'); text = text ? text + ' \u00b7 ' + warn : warn; + degraded = true; } label.textContent = text; + label.classList.toggle('fwlive-backend-warn', degraded); } this.updateEmptyStateUi(); @@ -1296,17 +1301,11 @@ return view.extend({ const scroll = document.getElementById('fwlive-scroll'); const wrapBtn = document.getElementById('fwlive-msg-wrap'); const onelineBtn = document.getElementById('fwlive-msg-oneline'); - if (scroll) { - /* add/remove — classList.toggle(name, force) is unsupported on some 21.02-era browsers */ - if (this.messageLayout === 'oneline') { - scroll.classList.add('fwlive-msg-oneline'); - scroll.classList.remove('fwlive-msg-wrap'); - } else { - scroll.classList.add('fwlive-msg-wrap'); - scroll.classList.remove('fwlive-msg-oneline'); - } - } const oneline = this.messageLayout === 'oneline'; + if (scroll) { + scroll.classList.toggle('fwlive-msg-oneline', oneline); + scroll.classList.toggle('fwlive-msg-wrap', !oneline); + } if (wrapBtn) wrapBtn.setAttribute('aria-pressed', oneline ? 'false' : 'true'); if (onelineBtn) diff --git a/luci-app-fwlive/po/templates/luci-app-fwlive.pot b/luci-app-fwlive/po/templates/luci-app-fwlive.pot index a24775950..88cf6ab9d 100644 --- a/luci-app-fwlive/po/templates/luci-app-fwlive.pot +++ b/luci-app-fwlive/po/templates/luci-app-fwlive.pot @@ -1,652 +1,652 @@ msgid "" msgstr "Content-Type: text/plain; charset=UTF-8" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:926 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:926 msgid "%d matching · %d/%d stored" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:929 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:929 msgid "0 matching · %d/%d stored" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:251 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:251 msgid "Accessible (teal/orange)" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:32 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:32 msgid "Action" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:618 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:618 msgid "Administrator access is required to disable logging." msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:586 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:586 msgid "Administrator access is required to enable logging." msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1092 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1092 msgid "Also seen" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:571 -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:607 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:571 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:607 msgid "Another change is staged for the firewall; apply or revert it first." msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1658 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1658 msgid "Any action" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1085 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1085 msgid "Any protocol" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:113 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:113 msgid "Before you enable logging" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:569 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:569 msgid "Cannot enable logging until kernel log modules are installed." msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:116 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:116 msgid "Changes:" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:250 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:250 msgid "Classic (green/red)" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1642 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1642 msgid "Classic uses green/red; Accessible uses teal/orange" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:116 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:116 msgid "Clear all" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1698 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1698 msgid "" "Click a cell to filter · ≠ on a chip to exclude · Ctrl+click a rule for " "firewall settings · in Simple view, click a row for the full message" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1719 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1719 msgid "" "Click a row (Time or other non-link cells) to see the full log line (Simple " "view)." msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:113 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:113 msgid "Click a row for the full message" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1720 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1720 msgid "" "Click an IP, action, or protocol to filter; use the Protocol menu (or ≠ on a " "chip) to exclude." msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1086 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1086 msgid "Common" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:944 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:944 msgid "Connection lost — retrying…" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:609 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:609 msgid "Could not disable logging." msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:573 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:573 msgid "Could not enable logging." msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1680 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1680 msgid "Custom protocol (prefix ! to exclude). Overrides the menu when set." msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:42 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:42 msgid "DPort" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:40 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:40 msgid "Destination" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1691 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1691 msgid "Destination IP contains (! to exclude)" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1692 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1692 msgid "Destination port (! to exclude)" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1583 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1583 msgid "Detail" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:37 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:37 msgid "Dir" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:85 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:85 msgid "Disabling…" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1616 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1616 msgid "Display options" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1716 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1716 msgid "Display options on the bar set Limit, row tint, palette, and hostnames." msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:121 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:121 msgid "Does not change:" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:138 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:138 msgid "Don’t show this again" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:150 -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:230 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:150 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:230 msgid "Enable WAN drop/reject logging" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:104 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:104 msgid "Enable WAN zone drop/reject logging (same as Network → Firewall)." msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:107 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:107 msgid "Enable logging" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1715 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1715 msgid "" "Enable logging turns on WAN zone drop/reject logging only (same as Network → " "Firewall). It does not add rules or log normal LAN browsing." msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:107 -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:150 -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:230 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:107 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:150 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:230 msgid "Enabling…" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1099 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1099 msgid "Exclude" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:80 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:80 msgid "Exclude instead" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:53 -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:71 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:53 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:71 msgid "Filter by %s" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:136 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:136 msgid "Filter by interface" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:112 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:112 msgid "Filter logs by rule (hint: %s). Ctrl+click to open firewall settings." msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1540 -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/root/usr/share/luci/menu.d/luci-app-fwlive.json:3 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1540 +#: openwrt-feed/luci-app-fwlive/root/usr/share/luci/menu.d/luci-app-fwlive.json:3 msgid "Firewall Live View" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:43 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:43 msgid "Flags" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:45 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:45 msgid "Flow" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/root/usr/share/rpcd/acl.d/luci-app-fwlive.json:3 +#: openwrt-feed/luci-app-fwlive/root/usr/share/rpcd/acl.d/luci-app-fwlive.json:3 msgid "Grant access to firewall live log view" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1712 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1712 msgid "Help" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:895 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:895 msgid "" "High event rate — table refresh is throttled to protect the browser. The " "buffer still updates; refresh will resume automatically." msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1090 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1090 msgid "ICMPv6" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:35 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:35 msgid "IN" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1723 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1723 msgid "" "If Row tint looks missing, the active LuCI theme may omit success/error or " "info/warn CSS variables; fwlive falls back to local colors (air-gapped, no " "data leaves the device)." msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:205 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:205 msgid "" "If the WAN is quiet, wait for probes or use the optional ping check in " "Help / the enabling-logs guide." msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:80 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:80 msgid "Include instead" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:34 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:34 msgid "Interface" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1688 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1688 msgid "Interface (prefix ! to exclude)" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:165 -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:232 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:165 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:232 msgid "I’ll configure this under Network → Firewall" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:194 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:194 msgid "Kernel log modules missing" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:195 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:195 msgid "" "Kernel netfilter log modules are missing. Install kmod-nf-log-ipv4 and kmod-" "nf-log-ipv6 (or kmod-nf-log / kmod-nf-log6), then reload the firewall." msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:44 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:44 msgid "Len" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1619 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1619 msgid "Limit" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:536 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:536 msgid "Limited diagnostics — timeout command missing" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:210 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:210 msgid "Logging is off on this router" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:252 -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:256 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:252 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:256 msgid "Manual test (System → Terminal):" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:46 -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:221 -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1590 -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1595 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:46 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:221 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1590 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1595 msgid "Message" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1686 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1686 msgid "More filters" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:37 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/links.js:37 msgid "Network → Firewall" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:187 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:187 msgid "" "No WAN firewall zone found in /etc/config/firewall. Configure zones under" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:185 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:185 msgid "No WAN zone found" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:163 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:163 msgid "Not now" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:220 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:220 msgid "Nothing changes until you click Enable." msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:36 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:36 msgid "OUT" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1610 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1610 msgid "One line" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:206 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:206 msgid "Open firewall zone settings" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:211 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:211 msgid "" "OpenWrt does not write firewall events to the log until you turn logging on. " "Live View only shows what the firewall already logs — it does not add allow/" "deny rules." msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1638 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1638 msgid "Palette" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:995 -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1560 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:995 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1560 msgid "Pause" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:993 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:993 msgid "Paused" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:38 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:38 msgid "Proto" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1674 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1674 msgid "Protocol — common values" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1656 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1656 msgid "Quick search" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:91 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:91 msgid "Remove filter" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:995 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:995 msgid "Resume" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1631 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1631 msgid "Row tint" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1721 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1721 msgid "" "Row tint shows pass/deny row backgrounds when checked. Choose Classic (green/" "red, default) or Accessible (teal/orange). Action text stays colored either " "way." msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1550 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1550 msgid "" "Row tint used a local color fallback because the active LuCI theme did not " "apply pass/deny backgrounds." msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:33 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:33 msgid "Rule" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:527 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:527 msgid "Rule labels incomplete — map truncated" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:531 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:531 msgid "Rule labels unavailable" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:529 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:529 msgid "Rule labels unavailable — temp file failed" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:41 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:41 msgid "SPort" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1650 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1650 msgid "Show hostnames" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1629 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1629 msgid "Show pass/deny row background colors" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1576 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1576 msgid "Simple" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:39 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:39 msgid "Source" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1689 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1689 msgid "Source IP contains (! to exclude)" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1690 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1690 msgid "Source port (! to exclude)" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1717 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1717 msgid "" "The rate shown for WAN logging is the firewall zone log_limit. OpenWrt " "defaults to 10/minute when no explicit limit is configured; fwlive does not " "impose this cap." msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1714 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1714 msgid "" "The table updates automatically when your firewall logs traffic. Use Pause " "if it moves too fast." msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1551 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1551 msgid "Theme tint fallback" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:31 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/table.js:31 msgid "Time" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:219 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:219 msgid "" "Turns on WAN zone drop/reject logging (same as Network → Firewall → wan → " "Log). Rate-limited by the zone log_limit (OpenWrt default 10/minute). Normal " "LAN browsing is not logged." msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:126 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:126 msgid "Undo:" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1722 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1722 msgid "Use Detail for all columns (flags, length, raw message)." msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1564 -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1568 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1564 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1568 msgid "View" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:615 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:615 msgid "WAN drop/reject logging is off." msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:204 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:204 msgid "" "WAN drop/reject logging is on. Blocked inbound WAN traffic will show up " "here. Normal LAN browsing will not." msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:579 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:579 msgid "" "WAN drop/reject logging is on. Blocked inbound traffic should appear here as " "it happens — not normal LAN browsing." msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:581 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:581 msgid "WAN logging is already enabled." msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:88 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:88 msgid "WAN logging on" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:94 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:94 msgid "WAN logging on (%s). Click to disable." msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:77 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:77 msgid "WAN logging unavailable: missing kernel log modules" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:70 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:70 msgid "WAN logging unavailable: no WAN zone" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:203 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:203 msgid "Waiting for firewall events" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:993 -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1545 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:993 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1545 msgid "Watching" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1603 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1603 msgid "Wrap" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:123 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:123 msgid "allow/deny rules, LAN logging, or anything else." msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:828 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:828 msgid "buffer full" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:81 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:81 msgid "default 10/minute" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:28 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:28 msgid "is" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:823 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:823 msgid "loading buffer" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:923 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:923 msgid "loading…" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:37 -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:44 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:37 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/chips.js:44 msgid "not" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1107 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1107 msgid "not AH" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1106 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1106 msgid "not ESP" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1105 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1105 msgid "not GRE" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1102 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1102 msgid "not ICMP" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1103 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1103 msgid "not ICMPv6" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1104 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1104 msgid "not IGMP" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1108 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1108 msgid "not SCTP" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1100 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1100 msgid "not TCP" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1101 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1101 msgid "not UDP" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1666 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1666 msgid "not block" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1665 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1665 msgid "not drop" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1664 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1664 msgid "not pass" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1667 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1667 msgid "not reject" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1668 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1668 msgid "not unknown" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1679 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:1679 msgid "or type…" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:830 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:830 msgid "render paused (high rate)" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:832 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:832 msgid "scroll frozen — scroll to top to follow live" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:118 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:118 msgid "sets log on the WAN firewall zone and reloads the firewall." msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:254 -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:258 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:254 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:258 msgid "then ping the router." msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:128 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:128 msgid "turn it back off with the WAN logging on control on the watch strip." msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:512 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:512 msgid "using fw4" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:510 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:510 msgid "using iptables" msgstr "" -#: /home/lalbers/gitroot/fwlive/openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:89 +#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:89 msgid "· %s" msgstr "" diff --git a/luci-proto-wwan/Makefile b/luci-proto-wwan/Makefile deleted file mode 100644 index d1a4d5fb4..000000000 --- a/luci-proto-wwan/Makefile +++ /dev/null @@ -1,40 +0,0 @@ -include $(TOPDIR)/rules.mk - -PKG_NAME:=luci-proto-wwan -PKG_VERSION:=20151207 -PKG_RELEASE:=1 - -PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) -PKG_BUILD_DEPENDS:=luci-base - -include $(INCLUDE_DIR)/package.mk - -define Package/luci-proto-wwan - CATEGORY:=LuCI - SUBMENU:=5. Protocols - TITLE:=Support for WWAN/QMI/NCM - MAINTAINER:=Cezary Jackiewicz - PKGARCH:=all -endef - -define Build/Compile -endef - -define Package/luci-proto-wwan/install - $(CP) ./files/* $(1) - $(FIND) $(1) -type f -name '*.lua' | while read src; do \ - if $(STAGING_DIR_HOST)/bin/lua $(STAGING_DIR_HOST)/bin/LuaSrcDiet \ - --noopt-binequiv -o "$$$$src.o" "$$$$src"; \ - then mv "$$$$src.o" "$$$$src"; fi; \ - done -endef - -define Package/luci-proto-wwan/postinst -#!/bin/sh -[ -n "$${IPKG_INSTROOT}" ] || { -rm -f /var/luci-indexcache -} -exit 0 -endef - -$(eval $(call BuildPackage,luci-proto-wwan)) diff --git a/luci-proto-wwan/files/usr/lib/lua/luci/model/cbi/admin_network/proto_ncm.lua b/luci-proto-wwan/files/usr/lib/lua/luci/model/cbi/admin_network/proto_ncm.lua deleted file mode 100644 index 8237d161f..000000000 --- a/luci-proto-wwan/files/usr/lib/lua/luci/model/cbi/admin_network/proto_ncm.lua +++ /dev/null @@ -1,78 +0,0 @@ ---[[ -LuCI - Lua Configuration Interface - -Copyright 2015 Cezary Jackiewicz - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 -]]-- - -local map, section, net = ... - -local device, apn, service, pincode, username, password -local ipv6, metric, dns - - -device = section:taboption("general", Value, "device", translate("Modem device")) -device.rmempty = false - -local device_suggestions = nixio.fs.glob("/dev/ttyUSB*") - or nixio.fs.glob("/dev/cdc-wdm*") - -if device_suggestions then - local node - for node in device_suggestions do - device:value(node) - end -end - - -mode = section:taboption("general", Value, "mode", translate("Service Type")) -mode.default = "auto" -mode:value("preferlte", translate("Prefer LTE")) -mode:value("preferumts", translate("Prefer UMTS")) -mode:value("lte", "LTE") -mode:value("umts", "UMTS/GPRS") -mode:value("gsm", translate("GPRS only")) -mode:value("auto", translate("auto")) - - -apn = section:taboption("general", Value, "apn", translate("APN")) - - -pincode = section:taboption("general", Value, "pincode", translate("PIN")) - - -username = section:taboption("general", Value, "username", translate("PAP/CHAP username")) - - -password = section:taboption("general", Value, "password", translate("PAP/CHAP password")) -password.password = true - - -if luci.model.network:has_ipv6() then - - ipv6 = section:taboption("advanced", Flag, "ipv6", - translate("Enable IPv6 negotiation on the PPP link")) - - ipv6.default = ipv6.disabled - ipv6.rmempty = false - -end - - -metric = section:taboption("advanced", Value, "metric", - translate("Use gateway metric")) - -metric.placeholder = "0" -metric.datatype = "uinteger" - - -dns = section:taboption("advanced", DynamicList, "dns", - translate("Use custom DNS servers")) - -dns.datatype = "ipaddr" -dns.cast = "string" diff --git a/luci-proto-wwan/files/usr/lib/lua/luci/model/cbi/admin_network/proto_qmi.lua b/luci-proto-wwan/files/usr/lib/lua/luci/model/cbi/admin_network/proto_qmi.lua deleted file mode 100644 index a29c98a77..000000000 --- a/luci-proto-wwan/files/usr/lib/lua/luci/model/cbi/admin_network/proto_qmi.lua +++ /dev/null @@ -1,77 +0,0 @@ ---[[ -LuCI - Lua Configuration Interface - -Copyright 2015 Cezary Jackiewicz - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 -]]-- - -local map, section, net = ... - -local device, apn, service, pincode, username, password -local ipv6, metric, dns - - -device = section:taboption("general", Value, "device", translate("Modem device")) -device.rmempty = false - -local device_suggestions = nixio.fs.glob("/dev/cdc-wdm*") - -if device_suggestions then - local node - for node in device_suggestions do - device:value(node) - end -end - - -mode = section:taboption("general", Value, "mode", translate("Service Type")) -mode.default = "all" -mode:value("all", translate("all")) -mode:value("lte", "LTE") -mode:value("umts", "UMTS/GPRS") -mode:value("gsm", translate("GPRS only")) -mode:value("cdma", "CDMA") -mode:value("td-scdma", "TD-SCDMA") - - -apn = section:taboption("general", Value, "apn", translate("APN")) - - -pincode = section:taboption("general", Value, "pincode", translate("PIN")) - - -username = section:taboption("general", Value, "username", translate("PAP/CHAP username")) - - -password = section:taboption("general", Value, "password", translate("PAP/CHAP password")) -password.password = true - - -if luci.model.network:has_ipv6() then - - ipv6 = section:taboption("advanced", Flag, "ipv6", - translate("Enable IPv6 negotiation on the PPP link")) - - ipv6.default = ipv6.disabled - ipv6.rmempty = false - -end - - -metric = section:taboption("advanced", Value, "metric", - translate("Use gateway metric")) - -metric.placeholder = "0" -metric.datatype = "uinteger" - - -dns = section:taboption("advanced", DynamicList, "dns", - translate("Use custom DNS servers")) - -dns.datatype = "ipaddr" -dns.cast = "string" diff --git a/luci-proto-wwan/files/usr/lib/lua/luci/model/cbi/admin_network/proto_wwan.lua b/luci-proto-wwan/files/usr/lib/lua/luci/model/cbi/admin_network/proto_wwan.lua deleted file mode 100644 index 63336d9c2..000000000 --- a/luci-proto-wwan/files/usr/lib/lua/luci/model/cbi/admin_network/proto_wwan.lua +++ /dev/null @@ -1,131 +0,0 @@ ---[[ -LuCI - Lua Configuration Interface - -Copyright 2015 Aleksandr Kolesnik - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 -]]-- - -local map, section, net = ... - -local apn, service, pincode, username, password -local ipv6, maxwait, defaultroute, metric, peerdns, dns, - keepalive_failure, keepalive_interval, demand - -apn = section:taboption("general", Value, "apn", translate("APN")) - - -pincode = section:taboption("general", Value, "pincode", translate("PIN")) - - -username = section:taboption("general", Value, "username", translate("PAP/CHAP username")) - - -password = section:taboption("general", Value, "password", translate("PAP/CHAP password")) -password.password = true - - -if luci.model.network:has_ipv6() then - - ipv6 = section:taboption("advanced", Flag, "ipv6", - translate("Enable IPv6 negotiation on the PPP link")) - - ipv6.default = ipv6.disabled - ipv6.rmempty = false - -end - - -maxwait = section:taboption("advanced", Value, "maxwait", - translate("Modem init timeout"), - translate("Maximum amount of seconds to wait for the modem to become ready")) - -maxwait.placeholder = "20" -maxwait.datatype = "min(1)" - - -defaultroute = section:taboption("advanced", Flag, "defaultroute", - translate("Use default gateway"), - translate("If unchecked, no default route is configured")) - -defaultroute.default = defaultroute.enabled - - -metric = section:taboption("advanced", Value, "metric", - translate("Use gateway metric")) - -metric.placeholder = "0" -metric.datatype = "uinteger" -metric:depends("defaultroute", defaultroute.enabled) - - -peerdns = section:taboption("advanced", Flag, "peerdns", - translate("Use DNS servers advertised by peer"), - translate("If unchecked, the advertised DNS server addresses are ignored")) - -peerdns.default = peerdns.enabled - - -dns = section:taboption("advanced", DynamicList, "dns", - translate("Use custom DNS servers")) - -dns:depends("peerdns", "") -dns.datatype = "ipaddr" -dns.cast = "string" - - -keepalive_failure = section:taboption("advanced", Value, "_keepalive_failure", - translate("LCP echo failure threshold"), - translate("Presume peer to be dead after given amount of LCP echo failures, use 0 to ignore failures")) - -function keepalive_failure.cfgvalue(self, section) - local v = m:get(section, "keepalive") - if v and #v > 0 then - return tonumber(v:match("^(%d+)[ ,]+%d+") or v) - end -end - -function keepalive_failure.write() end -function keepalive_failure.remove() end - -keepalive_failure.placeholder = "0" -keepalive_failure.datatype = "uinteger" - - -keepalive_interval = section:taboption("advanced", Value, "_keepalive_interval", - translate("LCP echo interval"), - translate("Send LCP echo requests at the given interval in seconds, only effective in conjunction with failure threshold")) - -function keepalive_interval.cfgvalue(self, section) - local v = m:get(section, "keepalive") - if v and #v > 0 then - return tonumber(v:match("^%d+[ ,]+(%d+)")) - end -end - -function keepalive_interval.write(self, section, value) - local f = tonumber(keepalive_failure:formvalue(section)) or 0 - local i = tonumber(value) or 5 - if i < 1 then i = 1 end - if f > 0 then - m:set(section, "keepalive", "%d %d" %{ f, i }) - else - m:del(section, "keepalive") - end -end - -keepalive_interval.remove = keepalive_interval.write -keepalive_interval.placeholder = "5" -keepalive_interval.datatype = "min(1)" - - -demand = section:taboption("advanced", Value, "demand", - translate("Inactivity timeout"), - translate("Close inactive connection after the given amount of seconds, use 0 to persist connection")) - -demand.placeholder = "0" -demand.datatype = "uinteger" diff --git a/luci-proto-wwan/files/usr/lib/lua/luci/model/network/proto_ncm.lua b/luci-proto-wwan/files/usr/lib/lua/luci/model/network/proto_ncm.lua deleted file mode 100644 index 6c5b34e08..000000000 --- a/luci-proto-wwan/files/usr/lib/lua/luci/model/network/proto_ncm.lua +++ /dev/null @@ -1,61 +0,0 @@ ---[[ -LuCI - Network model - NCM protocol extension - -Copyright 2015 Cezary Jackiewicz - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -]]-- - -local netmod = luci.model.network - -local proto = netmod:register_protocol("ncm") -local interface = luci.model.network.interface - -function proto.get_i18n(self) - return luci.i18n.translate("NCM") -end - -function proto.opkg_package(self) - return "comgt-ncm" -end - -function proto.is_installed(self) - return nixio.fs.access("/lib/netifd/proto/ncm.sh") -end - -function proto.is_floating(self) - return true -end - -function proto.is_virtual(self) - return true -end - -function proto.get_interface(self) - local _ifname=netmod.protocol.ifname(self) - if not _ifname then - _ifname = "wan" - end - return interface(_ifname, self) -end - -function proto.get_interfaces(self) - return nil -end - -function proto.contains_interface(self, ifc) - return (netmod:ifnameof(ifc) == self:ifname()) -end - -netmod:register_pattern_virtual("^ncm-%%w") diff --git a/luci-proto-wwan/files/usr/lib/lua/luci/model/network/proto_qmi.lua b/luci-proto-wwan/files/usr/lib/lua/luci/model/network/proto_qmi.lua deleted file mode 100644 index 679a3357a..000000000 --- a/luci-proto-wwan/files/usr/lib/lua/luci/model/network/proto_qmi.lua +++ /dev/null @@ -1,61 +0,0 @@ ---[[ -LuCI - Network model - QMI protocol extension - -Copyright 2015 Cezary Jackiewicz - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -]]-- - -local netmod = luci.model.network - -local proto = netmod:register_protocol("qmi") -local interface = luci.model.network.interface - -function proto.get_i18n(self) - return luci.i18n.translate("QMI") -end - -function proto.opkg_package(self) - return "uqmi" -end - -function proto.is_installed(self) - return nixio.fs.access("/lib/netifd/proto/qmi.sh") -end - -function proto.is_floating(self) - return true -end - -function proto.is_virtual(self) - return true -end - -function proto.get_interface(self) - local _ifname=netmod.protocol.ifname(self) - if not _ifname then - _ifname = "wan" - end - return interface(_ifname, self) -end - -function proto.get_interfaces(self) - return nil -end - -function proto.contains_interface(self, ifc) - return (netmod:ifnameof(ifc) == self:ifname()) -end - -netmod:register_pattern_virtual("^qmi-%%w") diff --git a/luci-proto-wwan/files/usr/lib/lua/luci/model/network/proto_wwan.lua b/luci-proto-wwan/files/usr/lib/lua/luci/model/network/proto_wwan.lua deleted file mode 100644 index a0a034ef7..000000000 --- a/luci-proto-wwan/files/usr/lib/lua/luci/model/network/proto_wwan.lua +++ /dev/null @@ -1,61 +0,0 @@ ---[[ -LuCI - Network model - WWAN protocol extension - -Copyright 2015 Cezary Jackiewicz - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -]]-- - -local netmod = luci.model.network - -local proto = netmod:register_protocol("wwan") -local interface = luci.model.network.interface - -function proto.get_i18n(self) - return luci.i18n.translate("WWAN") -end - -function proto.opkg_package(self) - return "wwan" -end - -function proto.is_installed(self) - return nixio.fs.access("/lib/netifd/proto/wwan.sh") -end - -function proto.is_floating(self) - return true -end - -function proto.is_virtual(self) - return true -end - -function proto.get_interface(self) - local _ifname=netmod.protocol.ifname(self) - if not _ifname then - _ifname = "wan" - end - return interface(_ifname, self) -end - -function proto.get_interfaces(self) - return nil -end - -function proto.contains_interface(self, ifc) - return (netmod:ifnameof(ifc) == self:ifname()) -end - -netmod:register_pattern_virtual("^wwan-%%w") diff --git a/luci-theme-aurora/.dev/src/media/_layout.css b/luci-theme-aurora/.dev/src/media/_layout.css index 3801d6488..ff2da3a21 100644 --- a/luci-theme-aurora/.dev/src/media/_layout.css +++ b/luci-theme-aurora/.dev/src/media/_layout.css @@ -497,10 +497,8 @@ body[data-nav-type="sidebar"] { } } - & .sidebar-list .navigation-direct { - /* flex, matching .nav-category: icon + label on one row (the label - span owns the truncation). */ - @apply flex items-center gap-2 text-lg; + & .sidebar-list .nav-row { + @apply gap-2 rounded-xl px-3 py-2 text-lg font-semibold tracking-wide; } & .sidebar-list .nav-icon { diff --git a/luci-theme-aurora/.dev/src/media/components/_nav.css b/luci-theme-aurora/.dev/src/media/components/_nav.css index 3810f717c..ce3eeaac7 100644 --- a/luci-theme-aurora/.dev/src/media/components/_nav.css +++ b/luci-theme-aurora/.dev/src/media/components/_nav.css @@ -7,6 +7,10 @@ * show/hide state only — never duplicate these recipes there. */ +.nav-row { + @apply focus-visible:ring-focus-ring flex w-full cursor-pointer appearance-none items-center border-0 bg-transparent text-left no-underline shadow-none transition-colors duration-150 select-none hover:no-underline focus-visible:ring-2 focus-visible:outline-none; +} + .nav-link { /* hover:no-underline: the global `a:hover { underline }` in _elements.css outranks a bare class (a:hover is 0,1,1), so nav rows must opt out at @@ -21,15 +25,17 @@ /* Direct destinations use the same selected state in both navigation modes: a filled brand pill, matching the active sublink. */ .navigation-direct.is-active-page { - @apply text-brand hover:text-brand bg-brand-subtle font-medium; + @apply text-brand hover:text-brand bg-brand-subtle; } -/* Category rows are group labels, not buttons: no hover surface, just a - text-color shift. Block highlights belong to child links exclusively. - appearance-none + border-0 + shadow-none strip the theme's global -