From df22da013b657e753b0f7578e621f530eac7a5f9 Mon Sep 17 00:00:00 2001 From: virmaior <70625876+virmaior@users.noreply.github.com> Date: Wed, 13 Jul 2022 21:02:32 +0900 Subject: [PATCH 01/55] Create wz_mini_web.css css part --- SD_ROOT/wz_mini/web/cgi-bin/wz_mini_web.css | 22 +++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 SD_ROOT/wz_mini/web/cgi-bin/wz_mini_web.css diff --git a/SD_ROOT/wz_mini/web/cgi-bin/wz_mini_web.css b/SD_ROOT/wz_mini/web/cgi-bin/wz_mini_web.css new file mode 100644 index 0000000..e3719b0 --- /dev/null +++ b/SD_ROOT/wz_mini/web/cgi-bin/wz_mini_web.css @@ -0,0 +1,22 @@ +.ii_info_line { + font-weight:bold; +} +.ii { + width:100%; + position:relative; + display:flex; +} +.ii_key_DIV { + + flex:0 0 40vw; + font-weight:bold; +} +.ii_value_DIV { + flex: 0 0 40vw; + text-align:right; +} +.ii_value { + width:75%; +} + + From 815afe9083703798740ededa6a9084084e5a5d03 Mon Sep 17 00:00:00 2001 From: virmaior <70625876+virmaior@users.noreply.github.com> Date: Wed, 13 Jul 2022 21:03:30 +0900 Subject: [PATCH 02/55] Create wz_mini_web.sh --- SD_ROOT/wz_mini/web/cgi-bin/wz_mini_web.sh | 64 ++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 SD_ROOT/wz_mini/web/cgi-bin/wz_mini_web.sh diff --git a/SD_ROOT/wz_mini/web/cgi-bin/wz_mini_web.sh b/SD_ROOT/wz_mini/web/cgi-bin/wz_mini_web.sh new file mode 100644 index 0000000..86db43e --- /dev/null +++ b/SD_ROOT/wz_mini/web/cgi-bin/wz_mini_web.sh @@ -0,0 +1,64 @@ +#!/bin/sh +# This serves a rudimentary webpage based on wz_mini.conf +hack_ini=/opt/wz_mini/wz_mini.conf +camver=V3 +camfirmware=$(tail -n1 /configs/app.ver | cut -f2 -d= ) +hackver="unknown" +hostname=$(uname -n) +title="Wyze $camver on $camfirmware running wz_mini $hackver as $hostname" + + +echo "HTTP/1.1 200" +echo "" +#echo "Content Length: 100000" + +function ini_to_html_free +{ + printf '
%s
' $1 $1 $2 +} + +function ini_to_html_tf +{ + printf '
%s
' $1 + printf '
' + if [[ "$2" == "true" ]]; then + printf ' True  ' $1 + printf ' False  ' $1 + else + printf ' True  ' $1 + printf ' False  ' $1 + + fi + printf '
' +} + + +echo -ne "$title" +echo -ne "'; +echo -ne "" +echo -ne '' +echo -ne "

$title

"; +echo -ne '
' + +IFS=$'\n' +for ARGUMENT in $(cat $hack_ini) +do + if [[ ${ARGUMENT:0:1} == "#" ]] ; then + echo -ne '
'$ARGUMENT'
' + else + KEY=$(echo $ARGUMENT | cut -f1 -d=) + VAL=$(echo $ARGUMENT | cut -f2 -d=) + VALUE=${VAL//\"/} + case "$VALUE" in + "true") ini_to_html_tf $KEY $VALUE ;; + "false") ini_to_html_tf $KEY $VALUE ;; + *) ini_to_html_free $KEY $VALUE + esac + fi +done + +echo -ne '' +echo -ne '
' +echo -ne '' From 9c065b078fde7645c6610202d238c80e03d8f420 Mon Sep 17 00:00:00 2001 From: virmaior <70625876+virmaior@users.noreply.github.com> Date: Thu, 14 Jul 2022 23:39:25 +0900 Subject: [PATCH 03/55] Update wz_mini_web.sh --- SD_ROOT/wz_mini/web/cgi-bin/wz_mini_web.sh | 111 +++++++++++++++++---- 1 file changed, 93 insertions(+), 18 deletions(-) diff --git a/SD_ROOT/wz_mini/web/cgi-bin/wz_mini_web.sh b/SD_ROOT/wz_mini/web/cgi-bin/wz_mini_web.sh index 86db43e..c863b13 100644 --- a/SD_ROOT/wz_mini/web/cgi-bin/wz_mini_web.sh +++ b/SD_ROOT/wz_mini/web/cgi-bin/wz_mini_web.sh @@ -7,29 +7,100 @@ hackver="unknown" hostname=$(uname -n) title="Wyze $camver on $camfirmware running wz_mini $hackver as $hostname" - echo "HTTP/1.1 200" +echo -e "Content-type: text/html\n\n" echo "" -#echo "Content Length: 100000" + + +shft() { + # https://stackoverflow.com/questions/3690936/change-file-name-suffixes-using-sed/3691279#3691279 + # Change this '8' to one less than your desired maximum rollover file. + # Must be in reverse order for renames to work (n..1, not 1..n). + for suff in {8..1} ; do + if [[ -f "$1.${suff}" ]] ; then + ((nxt = suff + 1)) + mv -f "$1.${suff}" "$1.${nxt}" + fi + done + mv -f "$1" "$1.1" +} + +#test for post +if [[ $REQUEST_METHOD = 'POST' ]]; then + if [ "$CONTENT_LENGTH" -gt 0 ]; then + read -n $CONTENT_LENGTH POST_DATA <&0 + while read line + do eval "echo ${line}" + done + fi + + #since ash does not handle arrays we create variables using eval + IFS='&' + for PAIR in $POST_DATA + do + K=$(echo $PAIR | cut -f1 -d=) + VA=$(echo $PAIR | cut -f2 -d=) + VB=\"${VA//%3A/:}\" + #echo "
$K=$VB
" + eval POST_$K=\"$VB\" + done + + + #switch back to going through the config file + IFS=$'\n' + output=wz_mini.conf.new + shft $output + + #name our output file + for ARGUMENT in $(cat $hack_ini) + do + #cycle through each line of the current config + + #copy through all comments + if [[ ${ARGUMENT:0:1} == "#" ]] ; then + #echo $ARGUMENT $'\n' + echo $ARGUMENT >> $output + else + #for non-comments check to see if we have an entry in the POST data by deciphering the key from the ini file and using eval for our fake array + KEY=$(echo $ARGUMENT | cut -f1 -d=) + test=$(eval echo \$POST_$KEY) + #echo "key was $KEY test was ... $test
" + if [[ "$test" ]]; then + #if in the fake array then we use the new value + #echo "
matched
" + echo $KEY="$test" >> $output + else + #if not in the fake array we use the current value + #echo "
key not found
" + echo $ARGUMENT >> $output + fi + + fi + done + + + +fi + function ini_to_html_free { - printf '
%s
' $1 $1 $2 + printf '
%s
' $1 $1 $2 } function ini_to_html_tf { printf '
%s
' $1 - printf '
' - if [[ "$2" == "true" ]]; then - printf ' True  ' $1 - printf ' False  ' $1 - else + printf '
' + if [[ "$2" == "true" ]]; then + printf ' True  ' $1 + printf ' False  ' $1 + else printf ' True  ' $1 printf ' False  ' $1 - fi - printf '
' + fi + printf '
' } @@ -38,27 +109,31 @@ echo -ne "'; echo -ne "" + + echo -ne '' echo -ne "

$title

"; -echo -ne '
' +echo -ne '' IFS=$'\n' for ARGUMENT in $(cat $hack_ini) do if [[ ${ARGUMENT:0:1} == "#" ]] ; then - echo -ne '
'$ARGUMENT'
' + echo -ne '
'$ARGUMENT'
' else KEY=$(echo $ARGUMENT | cut -f1 -d=) - VAL=$(echo $ARGUMENT | cut -f2 -d=) - VALUE=${VAL//\"/} + VAL=$(echo $ARGUMENT | cut -f2 -d=) + VALUE=${VAL//\"/} case "$VALUE" in - "true") ini_to_html_tf $KEY $VALUE ;; - "false") ini_to_html_tf $KEY $VALUE ;; - *) ini_to_html_free $KEY $VALUE + "true") ini_to_html_tf $KEY $VALUE ;; + "false") ini_to_html_tf $KEY $VALUE ;; + *) ini_to_html_free $KEY $VALUE esac fi done - + echo -ne '' echo -ne '
' + + echo -ne '' From d51afff1b857fbc2c14d39f335d11b148055b39b Mon Sep 17 00:00:00 2001 From: virmaior <70625876+virmaior@users.noreply.github.com> Date: Fri, 15 Jul 2022 17:55:36 +0900 Subject: [PATCH 04/55] add webserver check --- SD_ROOT/wz_mini/etc/init.d/wz_user.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/SD_ROOT/wz_mini/etc/init.d/wz_user.sh b/SD_ROOT/wz_mini/etc/init.d/wz_user.sh index 383b028..eee249b 100755 --- a/SD_ROOT/wz_mini/etc/init.d/wz_user.sh +++ b/SD_ROOT/wz_mini/etc/init.d/wz_user.sh @@ -591,6 +591,10 @@ if [[ "$NIGHT_DROP_DISABLE" == "true" ]]; then touch /opt/wz_mini/tmp/.nd fi +if [[ "$WEB_SERVER_ENABLED" == "true" ]]; then + httpd -p 80 -h /opt/wz_mini/web +fi + hostname_set touch /opt/wz_mini/tmp/.wz_user_firstrun pkill -f dumpload #Kill dumpload so it won't waste cpu or ram gathering cores and uploading them when something crashes From f76a5f1db6c951247e6d44083329f339fa387f21 Mon Sep 17 00:00:00 2001 From: virmaior <70625876+virmaior@users.noreply.github.com> Date: Fri, 15 Jul 2022 18:03:00 +0900 Subject: [PATCH 05/55] Update wz_mini_web.sh --- SD_ROOT/wz_mini/web/cgi-bin/wz_mini_web.sh | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/SD_ROOT/wz_mini/web/cgi-bin/wz_mini_web.sh b/SD_ROOT/wz_mini/web/cgi-bin/wz_mini_web.sh index c863b13..f286c5a 100644 --- a/SD_ROOT/wz_mini/web/cgi-bin/wz_mini_web.sh +++ b/SD_ROOT/wz_mini/web/cgi-bin/wz_mini_web.sh @@ -1,5 +1,6 @@ #!/bin/sh # This serves a rudimentary webpage based on wz_mini.conf +base_dir=/opt/wz_mini/ hack_ini=/opt/wz_mini/wz_mini.conf camver=V3 camfirmware=$(tail -n1 /configs/app.ver | cut -f2 -d= ) @@ -13,6 +14,7 @@ echo "" shft() { + cd $base_dir # https://stackoverflow.com/questions/3690936/change-file-name-suffixes-using-sed/3691279#3691279 # Change this '8' to one less than your desired maximum rollover file. # Must be in reverse order for renames to work (n..1, not 1..n). @@ -48,8 +50,7 @@ if [[ $REQUEST_METHOD = 'POST' ]]; then #switch back to going through the config file IFS=$'\n' - output=wz_mini.conf.new - shft $output + output="$hack_ini.new" #name our output file for ARGUMENT in $(cat $hack_ini) @@ -59,7 +60,7 @@ if [[ $REQUEST_METHOD = 'POST' ]]; then #copy through all comments if [[ ${ARGUMENT:0:1} == "#" ]] ; then #echo $ARGUMENT $'\n' - echo $ARGUMENT >> $output + echo -ne $ARGUMENT"\n" >> $output else #for non-comments check to see if we have an entry in the POST data by deciphering the key from the ini file and using eval for our fake array KEY=$(echo $ARGUMENT | cut -f1 -d=) @@ -68,18 +69,21 @@ if [[ $REQUEST_METHOD = 'POST' ]]; then if [[ "$test" ]]; then #if in the fake array then we use the new value #echo "
matched
" - echo $KEY="$test" >> $output + echo -ne $KEY=\"$test\""\n" >> $output else #if not in the fake array we use the current value #echo "
key not found
" - echo $ARGUMENT >> $output + echo -ne $ARGUMENT"\n" >> $output fi fi done - - + shft $hack_ini + mv $output $hack_ini + echo "rebooting! wait a bit -- and go the same url" + reboot + exit fi From 440bfc353db44f1cc56bbd5be147f9a282623db8 Mon Sep 17 00:00:00 2001 From: virmaior <70625876+virmaior@users.noreply.github.com> Date: Fri, 15 Jul 2022 18:05:08 +0900 Subject: [PATCH 06/55] Update wz_mini.conf --- SD_ROOT/wz_mini/wz_mini.conf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/SD_ROOT/wz_mini/wz_mini.conf b/SD_ROOT/wz_mini/wz_mini.conf index d1ca139..0f95523 100644 --- a/SD_ROOT/wz_mini/wz_mini.conf +++ b/SD_ROOT/wz_mini/wz_mini.conf @@ -99,5 +99,8 @@ DEBUG_ENABLED="false" DEBUG_INITRAMFS_ENABLED="false" DEBUG_PASSWORD="false" +####WEB#### +WEB_SERVER_ENABLED="true" + #####SCRIPTING##### CUSTOM_SCRIPT_PATH="" From 1fee46a051429086f6e0b7b577100ac25645c72c Mon Sep 17 00:00:00 2001 From: Alfonso Gamboa Date: Fri, 15 Jul 2022 16:48:10 -0700 Subject: [PATCH 07/55] add honking feature --- SD_ROOT/wz_mini/bin/car_control.sh | 4 ++++ SD_ROOT/wz_mini/usr/bin/app.ver | 2 +- SD_ROOT/wz_mini/usr/share/audio/honk.wav | Bin 0 -> 33644 bytes file.chk | 5 +++-- 4 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 SD_ROOT/wz_mini/usr/share/audio/honk.wav diff --git a/SD_ROOT/wz_mini/bin/car_control.sh b/SD_ROOT/wz_mini/bin/car_control.sh index ffc7b36..045f405 100755 --- a/SD_ROOT/wz_mini/bin/car_control.sh +++ b/SD_ROOT/wz_mini/bin/car_control.sh @@ -16,6 +16,7 @@ echo "CAR: c: reverse right" echo "CAR: x: all stop" echo "CAR: h: headlight on/off" echo "CAR: j: irled on/off" +echo "CAR: b: honk" echo -e "" echo "CAR: 1: quit ASAP!" echo -e "" @@ -133,6 +134,9 @@ elif [ "$input" = "h" ]; then elif [ "$input" = "j" ]; then irled +elif [ "$input" = "b" ]; then + /opt/wz_mini/bin/cmd aplay /opt/wz_mini/usr/share/audio/honk.wav 70 > /dev/null 2>&1 & + elif [ "$input" = "1" ]; then #exit echo -ne "\xaa\x55\x43\x06\x29\x80\x80\x00\x02\x71" > /dev/ttyUSB0 diff --git a/SD_ROOT/wz_mini/usr/bin/app.ver b/SD_ROOT/wz_mini/usr/bin/app.ver index 4ee604f..267404a 100644 --- a/SD_ROOT/wz_mini/usr/bin/app.ver +++ b/SD_ROOT/wz_mini/usr/bin/app.ver @@ -1 +1 @@ -Fri Jul 15 11:46:04 AM PDT 2022 +Fri Jul 15 04:47:54 PM PDT 2022 diff --git a/SD_ROOT/wz_mini/usr/share/audio/honk.wav b/SD_ROOT/wz_mini/usr/share/audio/honk.wav new file mode 100644 index 0000000000000000000000000000000000000000..23c64b484fac5f02b942bb2380dae1ab67b16031 GIT binary patch literal 33644 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 literal 0 HcmV?d00001 diff --git a/file.chk b/file.chk index e476669..f88d929 100644 --- a/file.chk +++ b/file.chk @@ -42,7 +42,7 @@ c77675d150e2274de3cfe08c5c295f8f SD_ROOT/wz_mini/bin/ld 14e944353e335cff9430080e1ca007f6 SD_ROOT/wz_mini/bin/busybox aba4bad7530f7f702d4c27b103cc970d SD_ROOT/wz_mini/bin/scp c5d2801b7117b8db6275647110e6c8f1 SD_ROOT/wz_mini/bin/iwconfig.sh -649430b2d519d279e8c6095665266480 SD_ROOT/wz_mini/bin/car_control.sh +877b9603d5435aced2be7787473ea476 SD_ROOT/wz_mini/bin/car_control.sh 67ab51181a29f16e60d879d793d4407f SD_ROOT/wz_mini/bin/audioplay_t20 78aaf46b312749d71c1f93a97f80fa74 SD_ROOT/wz_mini/bin/nm e6bcaf0465750b67cff55eb3e380e624 SD_ROOT/wz_mini/bin/curl @@ -79,6 +79,7 @@ e2e7f9190edcfb31af42fb00c59919ab SD_ROOT/wz_mini/usr/share/audio/upgrade_mode_v eaf86f91cb1b15b2191a8845ae88e3c8 SD_ROOT/wz_mini/usr/share/audio/init_v2.wav 02fed0e4b2382d839f630ce0477aba26 SD_ROOT/wz_mini/usr/share/audio/init.wav 5754f767c1334df202983aed2a20a050 SD_ROOT/wz_mini/usr/share/audio/binbin_v3.wav +6e01838f67f7e6e51a6891e1c411318a SD_ROOT/wz_mini/usr/share/audio/honk.wav ac9f3a5d097d25d5d972c3d2ad288df9 SD_ROOT/wz_mini/usr/bin/ucamera_v2 7626ba23cc36b88491b010dd6eff72de SD_ROOT/wz_mini/usr/bin/iCamera 1e64fdad40c82ecce420f71701ec3d6d SD_ROOT/wz_mini/usr/bin/watch_up.sh @@ -86,7 +87,7 @@ b339aee882a5d1c943ad08e4282ec3fd SD_ROOT/wz_mini/usr/bin/iCamera-dbg 20b061689308b2cee7edf3b9b906bca7 SD_ROOT/wz_mini/usr/bin/ucamera 3777d9e80c8b517c01a124e6360b6525 SD_ROOT/wz_mini/usr/bin/imp_helper.sh 580b1b6e91e72b4a4fef7b21d8954403 SD_ROOT/wz_mini/usr/bin/getSensorType -94b88087a273ecdfea996b88e1f9c419 SD_ROOT/wz_mini/usr/bin/app.ver +d13b4da22fb1f5878284395ae8da398f SD_ROOT/wz_mini/usr/bin/app.ver 4c780f0455481d106d47d89f0ae04ed5 SD_ROOT/wz_mini/lib/uClibc.tar 9afeb088e4cbabbe0b04033b560204d0 SD_ROOT/wz_mini/lib/libimp.so 4100755cb6cc6e3b76da20c7e3690e16 SD_ROOT/wz_mini/lib/libalog.so From a19d6f3552f327225bb6b7780e7a6a2766785a20 Mon Sep 17 00:00:00 2001 From: virmaior <70625876+virmaior@users.noreply.github.com> Date: Sat, 16 Jul 2022 21:21:55 +0900 Subject: [PATCH 08/55] Update wz_mini_web.sh correctly identify wz_mini version --- SD_ROOT/wz_mini/web/cgi-bin/wz_mini_web.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SD_ROOT/wz_mini/web/cgi-bin/wz_mini_web.sh b/SD_ROOT/wz_mini/web/cgi-bin/wz_mini_web.sh index f286c5a..22049f7 100644 --- a/SD_ROOT/wz_mini/web/cgi-bin/wz_mini_web.sh +++ b/SD_ROOT/wz_mini/web/cgi-bin/wz_mini_web.sh @@ -4,7 +4,7 @@ base_dir=/opt/wz_mini/ hack_ini=/opt/wz_mini/wz_mini.conf camver=V3 camfirmware=$(tail -n1 /configs/app.ver | cut -f2 -d= ) -hackver="unknown" +hackver=$(cat /opt/wz_mini/usr/bin/app.ver) hostname=$(uname -n) title="Wyze $camver on $camfirmware running wz_mini $hackver as $hostname" From a9a76e733599e950144cbbbc4f67b9fcef145bda Mon Sep 17 00:00:00 2001 From: virmaior <70625876+virmaior@users.noreply.github.com> Date: Sat, 16 Jul 2022 21:22:58 +0900 Subject: [PATCH 09/55] Rename wz_mini_web.sh to index.cgi --- SD_ROOT/wz_mini/web/cgi-bin/{wz_mini_web.sh => index.cgi} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename SD_ROOT/wz_mini/web/cgi-bin/{wz_mini_web.sh => index.cgi} (100%) diff --git a/SD_ROOT/wz_mini/web/cgi-bin/wz_mini_web.sh b/SD_ROOT/wz_mini/web/cgi-bin/index.cgi similarity index 100% rename from SD_ROOT/wz_mini/web/cgi-bin/wz_mini_web.sh rename to SD_ROOT/wz_mini/web/cgi-bin/index.cgi From 9a76c39f673605e594f44c2922f87bcfa2e5e232 Mon Sep 17 00:00:00 2001 From: virmaior <70625876+virmaior@users.noreply.github.com> Date: Sat, 16 Jul 2022 21:35:35 +0900 Subject: [PATCH 10/55] Update wz_mini_web.css --- SD_ROOT/wz_mini/web/cgi-bin/wz_mini_web.css | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/SD_ROOT/wz_mini/web/cgi-bin/wz_mini_web.css b/SD_ROOT/wz_mini/web/cgi-bin/wz_mini_web.css index e3719b0..046cff7 100644 --- a/SD_ROOT/wz_mini/web/cgi-bin/wz_mini_web.css +++ b/SD_ROOT/wz_mini/web/cgi-bin/wz_mini_web.css @@ -1,5 +1,6 @@ -.ii_info_line { +.ii_info { font-weight:bold; + background-color:#ccc; } .ii { width:100%; @@ -8,7 +9,7 @@ } .ii_key_DIV { - flex:0 0 40vw; + flex:0 0 30vw; font-weight:bold; } .ii_value_DIV { @@ -18,5 +19,8 @@ .ii_value { width:75%; } - - +.ii_explain { + width:29vw; + overflow:scroll; + max-height:140px; +} From 218a5ce26f81c02a4df2dfad1d66a46ef8a929b3 Mon Sep 17 00:00:00 2001 From: virmaior <70625876+virmaior@users.noreply.github.com> Date: Sat, 16 Jul 2022 21:36:21 +0900 Subject: [PATCH 11/55] Update index.cgi --- SD_ROOT/wz_mini/web/cgi-bin/index.cgi | 37 ++++++++++++++++++--------- 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/SD_ROOT/wz_mini/web/cgi-bin/index.cgi b/SD_ROOT/wz_mini/web/cgi-bin/index.cgi index 22049f7..a18f801 100644 --- a/SD_ROOT/wz_mini/web/cgi-bin/index.cgi +++ b/SD_ROOT/wz_mini/web/cgi-bin/index.cgi @@ -87,27 +87,40 @@ if [[ $REQUEST_METHOD = 'POST' ]]; then fi + +function documentation_to_html +{ + if [[ -f "$web_dir$1.md" ]]; then + printf '
'
+                cat $web_dir$1.md
+                printf '
' + fi +} + + function ini_to_html_free { - printf '
%s
' $1 $1 $2 + printf '
%s
' $1 $1 $2 + documentation_to_html $1 + printf '
' } - + function ini_to_html_tf { printf '
%s
' $1 - printf '
' - if [[ "$2" == "true" ]]; then - printf ' True  ' $1 - printf ' False  ' $1 - else + printf '
' + if [[ "$2" == "true" ]]; then + printf ' True  ' $1 + printf ' False  ' $1 + else printf ' True  ' $1 printf ' False  ' $1 - - fi - printf '
' + + fi + printf '
' + documentation_to_html $1 + printf '' } - - echo -ne "$title" echo -ne "'; +echo '' echo -ne "" @@ -164,4 +166,7 @@ echo -ne '' echo -ne '' + +html_cam_feed_js + echo -ne '' diff --git a/SD_ROOT/wz_mini/www/cgi-bin/jpeg.cgi b/SD_ROOT/wz_mini/www/cgi-bin/jpeg.cgi index 9422882..3b6efe8 100644 --- a/SD_ROOT/wz_mini/www/cgi-bin/jpeg.cgi +++ b/SD_ROOT/wz_mini/www/cgi-bin/jpeg.cgi @@ -1,3 +1,29 @@ #!/bin/sh -cmd jpeg 0 + + +#test for jpeg +if [[ $REQUEST_METHOD = 'GET' ]]; then + + echo "entered GET" + #since ash does not handle arrays we create variables using eval + IFS='&' + for PAIR in $QUERY_STRING + do + K=$(echo $PAIR | cut -f1 -d=) + VA=$(echo $PAIR | cut -f2 -d=) + #VB=${VA//%3A/:} + #echo "
$K=$VA
" + eval GET_$K=$VA + done +fi + +if [ -z "$GET_channel" ]; +then + echo "X-Channel-Override: 0" + GET_channel=0 +fi + +echo "X-Channel: $GET_channel" + +cmd jpeg "$GET_channel" diff --git a/SD_ROOT/wz_mini/www/cgi-bin/wz_mini_web.css b/SD_ROOT/wz_mini/www/cgi-bin/wz_mini_web.css index 102868c..1432587 100644 --- a/SD_ROOT/wz_mini/www/cgi-bin/wz_mini_web.css +++ b/SD_ROOT/wz_mini/www/cgi-bin/wz_mini_web.css @@ -38,4 +38,48 @@ H1 { height:calc(108px * var(--feed_ratio)); z-index:10; } - +.ii_explain { + height:25px; + overflow:hidden; + width:25px; + position:relative; +} +.ii_explain:hover { + height: auto; + position: absolute; + left: 10%; + width: 80%; + border-radius: 3px; + padding: 5px; + background-color: #ccc; + z-index: 10; + border: 3px solid blue; + font-family: monospace; + white-space:pre-wrap; +} +.ii_explain:hover PRE { + white-space:pre-wrap; +} +.ii_explain:hover:after { + content:""; + border:none; + margin:0; + padding:0; + width:0; + height:0; +} +.ii_explain:after { + color:white; + content:"?"; + text-align:center; + background-color:blue; + border:2px solid #ccc; + border-radius:3px; + padding-left:2px; + padding-right:2px; + position:absolute; + left:0; + top:0; + width:100%; + height:100%; +} diff --git a/SD_ROOT/wz_mini/www/config.js b/SD_ROOT/wz_mini/www/config.js new file mode 100644 index 0000000..6aaa7d6 --- /dev/null +++ b/SD_ROOT/wz_mini/www/config.js @@ -0,0 +1,10 @@ + +window.onload = function() +{ + var feed = document.getElementById("current_feed"); + function update_image() + { + feed.src = feed.src.split("&")[0] + "&load=" + new Date().getTime(); + } + setInterval(update_image, 1000); +} From 57bd0e8d9470f759ea4af85773f56e2210244316 Mon Sep 17 00:00:00 2001 From: Alfonso Gamboa Date: Mon, 18 Jul 2022 21:35:05 -0700 Subject: [PATCH 42/55] add lsusb output --- SD_ROOT/wz_mini/bin/gather_wz_logs.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SD_ROOT/wz_mini/bin/gather_wz_logs.sh b/SD_ROOT/wz_mini/bin/gather_wz_logs.sh index 92d57b9..9e21b76 100755 --- a/SD_ROOT/wz_mini/bin/gather_wz_logs.sh +++ b/SD_ROOT/wz_mini/bin/gather_wz_logs.sh @@ -55,6 +55,8 @@ cp /system/bin/app.ver /opt/wz_mini/tmp/log_gather/system_app.ver echo "gather mmc info" cat /sys/bus/mmc/devices/mmc1\:0001/mmc1\:0001\:1/* > /opt/wz_mini/tmp/log_gather/mmc_sys.log +echo "gather lsusb" +lsusb > /opt/wz_mini/tmp/log_gather/lsusb.log if [ -f /tmp/sd_check_result.txt ]; then echo "copy sd_check_result.txt" From 9a96eec5a1b02e34fac23c015041ed74881a4d50 Mon Sep 17 00:00:00 2001 From: Alfonso Gamboa Date: Wed, 20 Jul 2022 19:33:48 -0700 Subject: [PATCH 43/55] update checksum --- SD_ROOT/wz_mini/usr/bin/app.ver | 2 +- file.chk | 19 ++++++++++++++----- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/SD_ROOT/wz_mini/usr/bin/app.ver b/SD_ROOT/wz_mini/usr/bin/app.ver index fa95458..6ef16c5 100644 --- a/SD_ROOT/wz_mini/usr/bin/app.ver +++ b/SD_ROOT/wz_mini/usr/bin/app.ver @@ -1 +1 @@ -Mon Jul 18 08:00:07 AM PDT 2022 +Wed Jul 20 07:33:26 PM PDT 2022 diff --git a/file.chk b/file.chk index 05dcd94..94d609c 100644 --- a/file.chk +++ b/file.chk @@ -1,12 +1,21 @@ 6324f7357788d664bae80bc9d41c04c6 SD_ROOT/factory_t31_ZMC6tiIDQN d41d8cd98f00b204e9800998ecf8427e SD_ROOT/wz_mini/mnt/.gitignore -cf52c3c5cab9dc155923490ae4a685fd SD_ROOT/wz_mini/www/cgi-bin/jpeg.cgi -f7eb7797812a1bb3e2049754a0cbb5b4 SD_ROOT/wz_mini/www/cgi-bin/wz_mini_web.css +e17a4aeac39b2dbb5a71d05c4ba0a067 SD_ROOT/wz_mini/www/cgi-bin/WEB_CAM_ENABLE.md +53fc10943d0ee83ed92e58123d24fc02 SD_ROOT/wz_mini/www/cgi-bin/jpeg.cgi +46fdb93e7065b52eee8cc1deb7968d4b SD_ROOT/wz_mini/www/cgi-bin/wz_mini_web.css ffc9d653967b2c25d9635d3240209db0 SD_ROOT/wz_mini/www/cgi-bin/DISABLE_FW_UPGRADE.md +8a756026f05a35173b8748260b694e7d SD_ROOT/wz_mini/www/cgi-bin/RTSP_HI_RES_ENABLED.md +d5012a6758e30050b1dc8528e7968ac0 SD_ROOT/wz_mini/www/cgi-bin/ENABLE_USB_STORAGE.md b8f611d1dee2db10c8adf9f57e7274ad SD_ROOT/wz_mini/www/cgi-bin/ENABLE_USB_ETH.md +4c911538bfc2f9190f6be19f6a63513c SD_ROOT/wz_mini/www/cgi-bin/BONDING_ENABLED.md +bd74b1a5dfb722ea1109ea89a039a3e5 SD_ROOT/wz_mini/www/cgi-bin/RTMP_STREAM_ENABLED.md +8e14bf2616556d8a45dbb9b183d86d57 SD_ROOT/wz_mini/www/cgi-bin/ENABLE_MP4_WRITE.md 1013ee7201755bcf9047635b637e17c9 SD_ROOT/wz_mini/www/cgi-bin/ENABLE_WIREGUARD.md -a8bc9d5cfe8fc94e57f454174437c92e SD_ROOT/wz_mini/www/cgi-bin/config.cgi +842b228d85468ab31c99e1521b35e37e SD_ROOT/wz_mini/www/cgi-bin/REMOTE_SPOTLIGHT.md +b1e6e35b81031a838201ecfcf79fc6f8 SD_ROOT/wz_mini/www/cgi-bin/config.cgi 38b9920ac65f5cf3179ece26b5fde345 SD_ROOT/wz_mini/www/cgi-bin/car.sh +042848359c3840f5973baffca2457a5d SD_ROOT/wz_mini/www/cgi-bin/ENABLE_USB_DIRECT.md +ddfa6179dc16a38d3b53a4353460dc25 SD_ROOT/wz_mini/www/config.js 5f01772968d1d1472c6d6343761da2b3 SD_ROOT/wz_mini/www/car/car.js fc4ff21fb45c4be143efd78c196f021a SD_ROOT/wz_mini/www/car/car.css 39a383f2b1f704738bfeec00f7914d77 SD_ROOT/wz_mini/www/car/car.html @@ -73,7 +82,7 @@ e6a6a9dd8ce138686083a3d4303cea40 SD_ROOT/wz_mini/bin/iperf3 79d69cd251a8cdadd9957cdaec2034fc SD_ROOT/wz_mini/bin/rtmp-stream.sh 5d1359af0c7c5d326b8682a62f910620 SD_ROOT/wz_mini/bin/strace 516118bfcc0f0ddc93fb9339b3c6a315 SD_ROOT/wz_mini/bin/xtables-multi -17a23742c599a262e4144c499fa66845 SD_ROOT/wz_mini/bin/gather_wz_logs.sh +9be9aab45620d83fecc8b963954cf4f1 SD_ROOT/wz_mini/bin/gather_wz_logs.sh 097cd91a56f2b0caea1dd87ae0e51a54 SD_ROOT/wz_mini/bin/screen fbbc2a8f362d05fc31557b1a534b42c6 SD_ROOT/wz_mini/bin/wget 35420095a770c9bb6177788842f55bba SD_ROOT/wz_mini/bin/dropbearconvert @@ -99,7 +108,7 @@ b339aee882a5d1c943ad08e4282ec3fd SD_ROOT/wz_mini/usr/bin/iCamera-dbg 20b061689308b2cee7edf3b9b906bca7 SD_ROOT/wz_mini/usr/bin/ucamera 3777d9e80c8b517c01a124e6360b6525 SD_ROOT/wz_mini/usr/bin/imp_helper.sh 580b1b6e91e72b4a4fef7b21d8954403 SD_ROOT/wz_mini/usr/bin/getSensorType -20f24e93d0bedb945e16074d2ef5bf72 SD_ROOT/wz_mini/usr/bin/app.ver +88ffb5c502a33fd110f372c0acf1b2bf SD_ROOT/wz_mini/usr/bin/app.ver 4c780f0455481d106d47d89f0ae04ed5 SD_ROOT/wz_mini/lib/uClibc.tar 9afeb088e4cbabbe0b04033b560204d0 SD_ROOT/wz_mini/lib/libimp.so 4100755cb6cc6e3b76da20c7e3690e16 SD_ROOT/wz_mini/lib/libalog.so From 16def56fc9c17933ca6415795377a726e861cdeb Mon Sep 17 00:00:00 2001 From: virmaior <70625876+virmaior@users.noreply.github.com> Date: Fri, 22 Jul 2022 14:06:35 +0900 Subject: [PATCH 44/55] no longer auto reboots, allows reverting to previous edits (#198) * updates to config.cgi and jpeg.cgi * Update config.cgi --- SD_ROOT/wz_mini/www/cgi-bin/config.cgi | 95 ++++++++++++++++++++++---- 1 file changed, 82 insertions(+), 13 deletions(-) diff --git a/SD_ROOT/wz_mini/www/cgi-bin/config.cgi b/SD_ROOT/wz_mini/www/cgi-bin/config.cgi index ac31462..d9083c1 100644 --- a/SD_ROOT/wz_mini/www/cgi-bin/config.cgi +++ b/SD_ROOT/wz_mini/www/cgi-bin/config.cgi @@ -7,26 +7,81 @@ camver=V3 camfirmware=$(tail -n1 /configs/app.ver | cut -f2 -d= ) hackver=$(cat /opt/wz_mini/usr/bin/app.ver) title="Wyze $camver on $camfirmware running wz_mini $hackver as $HOSTNAME" +updated=false echo "HTTP/1.1 200" echo -e "Content-type: text/html\n\n" echo "" +reboot_camera() { + echo "rebooting camera (refreshing screen in 90 seconds)" + echo '' + exit +} + shft() { - cd $base_dir - # https://stackoverflow.com/questions/3690936/change-file-name-suffixes-using-sed/3691279#3691279 - # Change this '8' to one less than your desired maximum rollover file. - # Must be in reverse order for renames to work (n..1, not 1..n). - for suff in {8..1} ; do - if [[ -f "$1.${suff}" ]] ; then - ((nxt = suff + 1)) - mv -f "$1.${suff}" "$1.${nxt}" + # SE loop did not work -- thanks ash! + suff=8 + while [ "$suff" -gt 0 ] ; + do + if [[ -f "$1.$suff" ]] ; then + nxt=$((suff + 1)) + mv -f "$1.$suff" "$1.$nxt" + fi + suff=$((suff-1)) + done + mv -f "$1" "$1.1" +} + + +function revert_config +{ + mv "$hack_ini" "$hack_ini.old" + mv "$hack_ini.$1" "$hack_ini" + +} + + +function revert_menu +{ + echo 'Revert Menu' + echo '
' + echo 'Prior Versions : ' + xuff=0 + while [ "$xuff" -lt 9 ] ; + do + xuff=$((xuff + 1)) + if [[ -f "$1.$xuff" ]] ; then + echo ' '"$xuff" fi done - mv -f "$1" "$1.1" + echo '
' } + + +if [[ $REQUEST_METHOD = 'GET' ]]; then + + #since ash does not handle arrays we create variables using eval + IFS='&' + for PAIR in $QUERY_STRING + do + K=$(echo $PAIR | cut -f1 -d=) + VA=$(echo $PAIR | cut -f2 -d=) + eval GET_$K=$VA + done + + if [[ "$GET_action" = "reboot" ]]; then + reboot_camera + fi + if [[ "$GET_action" = "revert" ]]; then + revert_config "$GET_version" + fi + +fi + + #test for post if [[ $REQUEST_METHOD = 'POST' ]]; then if [ "$CONTENT_LENGTH" -gt 0 ]; then @@ -81,18 +136,18 @@ if [[ $REQUEST_METHOD = 'POST' ]]; then shft $hack_ini mv $output $hack_ini - echo "rebooting! wait a bit -- and go the same url" - reboot - exit + updated=true + fi + function documentation_to_html { if [[ -f "$www_dir$1.md" ]]; then printf '
'
-                cat $web_dir$1.md
+                cat "$web_dir$1.md"
                 printf '
' fi } @@ -130,6 +185,7 @@ function html_cam_feed + echo -ne "$title" echo -ne "'; +} + echo -ne "$title" -echo -ne "'; +handle_css wz_mini_web.css + echo '' echo -ne "" - - - echo -ne '' echo -ne "

$title

"; @@ -208,13 +235,32 @@ fi html_cam_feed -echo -ne '
' -IFS=$'\n' -for ARGUMENT in $(cat $hack_ini) -do - if [[ ${ARGUMENT:0:1} == "#" ]] ; then - echo -ne '
'$ARGUMENT'
' +if [ $base_hack_ini != $hack_ini ]; then + + echo '
Revert to this version
' +fi + +echo -ne '' + + +CONFIG_BLOCK=0 + +while IFS= read -r ARGUMENT; do + if [ -z "$ARGUMENT" ] ; then + echo -ne "" + elif [[ ${ARGUMENT:0:1} == "#" ]] ; then + if [[ ${ARGUMENT:0:4} == "####" ]]; then + if [ "$CONFIG_BLOCK" -gt 0 ]; then + echo '' + fi + CONFIG_BLOCK=$((CONFIG_BLOCK + 1)) + echo '
' + BTITLE=${ARGUMENT//#/ } + echo -ne '
'$BTITLE'
' + else + echo -ne '
'$ARGUMENT'
' + fi else KEY=$(echo $ARGUMENT | cut -f1 -d=) VAL=$(echo $ARGUMENT | cut -f2 -d=) @@ -225,17 +271,20 @@ do *) ini_to_html_free $KEY $VALUE esac fi -done +done < $hack_ini + if [ "$CONFIG_BLOCK" -gt 0 ]; then + echo '
' + fi + + echo -ne '' echo -ne '
' -revert_menu $hack_ini +revert_menu $base_hack_ini $hack_ini - -html_cam_feed_js - +version_info "display_BAR" echo -ne '' diff --git a/SD_ROOT/wz_mini/www/cgi-bin/config.css b/SD_ROOT/wz_mini/www/cgi-bin/config.css new file mode 100644 index 0000000..29a7e98 --- /dev/null +++ b/SD_ROOT/wz_mini/www/cgi-bin/config.css @@ -0,0 +1,145 @@ +BODY { + --feed_ratio: 2.5; + --display_bar_height: 20px; + --border-color: #ccc; + padding-bottom: var(--display_bar_height); +} +H1 { + background-color:blue; + color:white; + height:calc(108px * (var(--feed_ratio) - 1)); + margin-top:0; + padding:5px; + margin-bottom:108px; + width:calc(100% - (192px * var(--feed_ratio))); +} + +.ii_block { + border:3px solid var(--border-color); + margin-bottom:5px; + padding:2px; + border-radius:3px; +} +.ii_block_name { + background-color:var(--border-color); + text-align:center; + font-weight:bold; + color:#fff; + margin:-2px; + margin-bottom:3px; +} +.ii_info { + color:#333; +} +.ii { + width:100%; + position:relative; + display:flex; +} +.ii_key_DIV { + + flex:0 0 40vw; + font-weight:bold; +} +.ii_value_DIV { + flex: 0 0 40vw; + text-align:right; +} +.ii_value { + width:75%; +} +.feed { + position:absolute; + top:10px; + right:0px; + width:calc(192px * var(--feed_ratio)); + height:calc(108px * var(--feed_ratio)); + z-index:10; +} +.ii_explain { + height:25px; + overflow:hidden; + width:25px; + position:relative; +} +.ii_explain:hover { + height: auto; + position: absolute; + left: 10%; + width: 80%; + border-radius: 3px; + padding: 5px; + background-color: #ccc; + z-index: 10; + border: 3px solid blue; + font-family: monospace; + white-space:pre-wrap; +} +.ii_explain:hover PRE { + white-space:pre-wrap; +} +.ii_explain:hover:after { + content:""; + border:none; + margin:0; + padding:0; + width:0; + height:0; +} +.ii_explain:after { + color:white; + content:"?"; + text-align:center; + background-color:blue; + border:2px solid #ccc; + border-radius:3px; + padding-left:2px; + padding-right:2px; + position:absolute; + left:0; + top:0; + width:100%; + height:100%; +} + +.revert_DIV { + display:flex; + width:100%; +} +.revert_DIV DIV:nth-child(1) { + width:30px; +} +.current_revert { + background-color:#edf054; +} + +#display_BAR { + position:fixed; + bottom:0; + background-color:blue; + border-top:1px solid lightblue; + color:#fff; + display:flex; + width:100%; + height:var(--display_bar_height); +} +#display_BAR DIV { + padding-right:15px; +} +.ver_DIV { + padding-left:60px; + min-width:120px; + font-family:monospace; + flex: 1 0 120px; +} +.ver_DIV:before { + content:attr(vertype); + font-weight:bold; + padding-right:10px; +} +.ver_DIV[vertype="wz_mini"] { + flex:1 0 400px; +} +.fail_val { + background-color:#fcc; +} diff --git a/SD_ROOT/wz_mini/www/cgi-bin/numerics.txt b/SD_ROOT/wz_mini/www/cgi-bin/numerics.txt new file mode 100644 index 0000000..bb6a0b1 --- /dev/null +++ b/SD_ROOT/wz_mini/www/cgi-bin/numerics.txt @@ -0,0 +1,8 @@ +WEB_CAM_BIT_RATE +WEB_CAM_FPS_RATE +BONDING_LINK_MONITORING_FREQ_MS +BONDING_DOWN_DELAY_MS +BONDING_UP_DELAY_MS +RTSP_PORT +AUDIO_PROMPT_VOLUME + diff --git a/SD_ROOT/wz_mini/www/config.js b/SD_ROOT/wz_mini/www/config.js index 6aaa7d6..6ede20b 100644 --- a/SD_ROOT/wz_mini/www/config.js +++ b/SD_ROOT/wz_mini/www/config.js @@ -1,4 +1,23 @@ +var feed_interval_frequency = 1000; +var mac_re = /^[0-9a-f]{1,2}([\.:-])(?:[0-9a-f]{1,2}\1){4}[0-9a-f]{1,2}$/mi; + +// https://stackoverflow.com/questions/14636536/how-to-check-if-a-variable-is-an-integer-in-javascript#14794066 +function isInt(value) { + return !isNaN(value) && + parseInt(Number(value)) == value && + !isNaN(parseInt(value, 10)); +} + +function scrollTop() +{ +window.scrollTo({ + top: 0, + behavior: "smooth" + }); +} + + window.onload = function() { var feed = document.getElementById("current_feed"); @@ -6,5 +25,35 @@ window.onload = function() { feed.src = feed.src.split("&")[0] + "&load=" + new Date().getTime(); } - setInterval(update_image, 1000); + feed_interval = setInterval(update_image, feed_interval_frequency); + + + document.querySelector('[name="update_config"]').addEventListener('submit', + function(e){ + const mac_addrs = document.getElementsByClassName('mac_addr'); + for (let i=0; i < mac_addrs.length; i++) { + mac_addrs[i].classList.remove("fail_val"); + if (mac_addrs[i].value == "") { continue; } + if (!mac_re.test(mac_addrs[i].value)) { + mac_addrs[i].classList.add("fail_val"); + scrollTop(); + console.log("failed on mac address test for " + mac_addrs[i].name + " for value " + mac_addrs[i].value); + e.preventDefault(); + } + } + + const numerics = document.getElementsByClassName('numeric'); + for (let i=0; i < numerics.length; i++) { + numerics[i].classList.remove("fail_val"); + if (numerics[i].value == "") { continue; } + if (!isInt(numerics[i].value)) { + numerics[i].classList.add("fail_val"); + scrollTop(); + console.log("failed on integer test for " + numerics[i].name); + e.preventDefault(); + } + } + + } + ); } From 1a48a779e33303f8ace3234e7e85de9670b6965f Mon Sep 17 00:00:00 2001 From: Alfonso Gamboa Date: Sat, 23 Jul 2022 23:40:12 -0700 Subject: [PATCH 49/55] add all stop to car_control.sh --- SD_ROOT/wz_mini/bin/car_control.sh | 3 +++ SD_ROOT/wz_mini/usr/bin/app.ver | 2 +- file.chk | 10 ++++++---- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/SD_ROOT/wz_mini/bin/car_control.sh b/SD_ROOT/wz_mini/bin/car_control.sh index 045f405..043b5e0 100755 --- a/SD_ROOT/wz_mini/bin/car_control.sh +++ b/SD_ROOT/wz_mini/bin/car_control.sh @@ -134,6 +134,9 @@ elif [ "$input" = "h" ]; then elif [ "$input" = "j" ]; then irled +elif [ "$input" = "x" ]; then + echo -ne "\xaa\x55\x43\x06\x29\x80\x80\x00\x02\x71" > /dev/ttyUSB0 + elif [ "$input" = "b" ]; then /opt/wz_mini/bin/cmd aplay /opt/wz_mini/usr/share/audio/honk.wav 70 > /dev/null 2>&1 & diff --git a/SD_ROOT/wz_mini/usr/bin/app.ver b/SD_ROOT/wz_mini/usr/bin/app.ver index 5289113..d121f62 100644 --- a/SD_ROOT/wz_mini/usr/bin/app.ver +++ b/SD_ROOT/wz_mini/usr/bin/app.ver @@ -1 +1 @@ -Fri Jul 22 08:41:00 PM PDT 2022 +Sat Jul 23 11:40:03 PM PDT 2022 diff --git a/file.chk b/file.chk index 3f2b383..dec57af 100644 --- a/file.chk +++ b/file.chk @@ -8,14 +8,16 @@ ffc9d653967b2c25d9635d3240209db0 SD_ROOT/wz_mini/www/cgi-bin/DISABLE_FW_UPGRADE d5012a6758e30050b1dc8528e7968ac0 SD_ROOT/wz_mini/www/cgi-bin/ENABLE_USB_STORAGE.md b8f611d1dee2db10c8adf9f57e7274ad SD_ROOT/wz_mini/www/cgi-bin/ENABLE_USB_ETH.md 4c911538bfc2f9190f6be19f6a63513c SD_ROOT/wz_mini/www/cgi-bin/BONDING_ENABLED.md +111c98593be14b3ac82526aa0e233b70 SD_ROOT/wz_mini/www/cgi-bin/config.css bd74b1a5dfb722ea1109ea89a039a3e5 SD_ROOT/wz_mini/www/cgi-bin/RTMP_STREAM_ENABLED.md 8e14bf2616556d8a45dbb9b183d86d57 SD_ROOT/wz_mini/www/cgi-bin/ENABLE_MP4_WRITE.md +a2820a7dcfb92bb21fe17de185a16ee9 SD_ROOT/wz_mini/www/cgi-bin/numerics.txt 1013ee7201755bcf9047635b637e17c9 SD_ROOT/wz_mini/www/cgi-bin/ENABLE_WIREGUARD.md 842b228d85468ab31c99e1521b35e37e SD_ROOT/wz_mini/www/cgi-bin/REMOTE_SPOTLIGHT.md -555bb860c40d1f39e0fa0d2b1d698a4a SD_ROOT/wz_mini/www/cgi-bin/config.cgi +2c026425a683013f4d7eb06c544a75ce SD_ROOT/wz_mini/www/cgi-bin/config.cgi d43f6b975afedc1f7a5e5c4999dbcbbd SD_ROOT/wz_mini/www/cgi-bin/car.sh 042848359c3840f5973baffca2457a5d SD_ROOT/wz_mini/www/cgi-bin/ENABLE_USB_DIRECT.md -ddfa6179dc16a38d3b53a4353460dc25 SD_ROOT/wz_mini/www/config.js +f3ce2f03c67b1996b2ea33c02baffcfe SD_ROOT/wz_mini/www/config.js e344ffc55222c029c5d324037a5aa1f3 SD_ROOT/wz_mini/www/car/car.js 540acfdf2638c341e1d168f1af5203de SD_ROOT/wz_mini/www/car/car.css 63b23f78d6703f0c9a2e970604104996 SD_ROOT/wz_mini/www/car/car.html @@ -65,7 +67,7 @@ c77675d150e2274de3cfe08c5c295f8f SD_ROOT/wz_mini/bin/ld 14e944353e335cff9430080e1ca007f6 SD_ROOT/wz_mini/bin/busybox aba4bad7530f7f702d4c27b103cc970d SD_ROOT/wz_mini/bin/scp c5d2801b7117b8db6275647110e6c8f1 SD_ROOT/wz_mini/bin/iwconfig.sh -877b9603d5435aced2be7787473ea476 SD_ROOT/wz_mini/bin/car_control.sh +982eb631746ad427d96d28c9a2ea7b25 SD_ROOT/wz_mini/bin/car_control.sh 67ab51181a29f16e60d879d793d4407f SD_ROOT/wz_mini/bin/audioplay_t20 78aaf46b312749d71c1f93a97f80fa74 SD_ROOT/wz_mini/bin/nm e6bcaf0465750b67cff55eb3e380e624 SD_ROOT/wz_mini/bin/curl @@ -111,7 +113,7 @@ b339aee882a5d1c943ad08e4282ec3fd SD_ROOT/wz_mini/usr/bin/iCamera-dbg 20b061689308b2cee7edf3b9b906bca7 SD_ROOT/wz_mini/usr/bin/ucamera 3777d9e80c8b517c01a124e6360b6525 SD_ROOT/wz_mini/usr/bin/imp_helper.sh 580b1b6e91e72b4a4fef7b21d8954403 SD_ROOT/wz_mini/usr/bin/getSensorType -45463b5b7537ce512a177574b2a5a820 SD_ROOT/wz_mini/usr/bin/app.ver +516d785d98365c61d646b1c45b134bb4 SD_ROOT/wz_mini/usr/bin/app.ver 4c780f0455481d106d47d89f0ae04ed5 SD_ROOT/wz_mini/lib/uClibc.tar 9afeb088e4cbabbe0b04033b560204d0 SD_ROOT/wz_mini/lib/libimp.so 4100755cb6cc6e3b76da20c7e3690e16 SD_ROOT/wz_mini/lib/libalog.so From 79a25ff33120afef8254e913370a5d46bf3ab740 Mon Sep 17 00:00:00 2001 From: Alfonso Gamboa Date: Mon, 25 Jul 2022 07:14:10 -0700 Subject: [PATCH 50/55] improve v2 install script --- SD_ROOT/wz_mini/usr/bin/app.ver | 2 +- file.chk | 4 ++-- v2_install/compile_image.sh | 32 +++++++++++++++++++++++++++++++- 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/SD_ROOT/wz_mini/usr/bin/app.ver b/SD_ROOT/wz_mini/usr/bin/app.ver index d121f62..caafda1 100644 --- a/SD_ROOT/wz_mini/usr/bin/app.ver +++ b/SD_ROOT/wz_mini/usr/bin/app.ver @@ -1 +1 @@ -Sat Jul 23 11:40:03 PM PDT 2022 +Mon Jul 25 07:14:00 AM PDT 2022 diff --git a/file.chk b/file.chk index dec57af..361dfe8 100644 --- a/file.chk +++ b/file.chk @@ -113,7 +113,7 @@ b339aee882a5d1c943ad08e4282ec3fd SD_ROOT/wz_mini/usr/bin/iCamera-dbg 20b061689308b2cee7edf3b9b906bca7 SD_ROOT/wz_mini/usr/bin/ucamera 3777d9e80c8b517c01a124e6360b6525 SD_ROOT/wz_mini/usr/bin/imp_helper.sh 580b1b6e91e72b4a4fef7b21d8954403 SD_ROOT/wz_mini/usr/bin/getSensorType -516d785d98365c61d646b1c45b134bb4 SD_ROOT/wz_mini/usr/bin/app.ver +65e466ffca31c323ec43391db68fe7d2 SD_ROOT/wz_mini/usr/bin/app.ver 4c780f0455481d106d47d89f0ae04ed5 SD_ROOT/wz_mini/lib/uClibc.tar 9afeb088e4cbabbe0b04033b560204d0 SD_ROOT/wz_mini/lib/libimp.so 4100755cb6cc6e3b76da20c7e3690e16 SD_ROOT/wz_mini/lib/libalog.so @@ -264,7 +264,7 @@ bd383994491e4bdca81788c168feb2eb SD_ROOT/wz_mini/lib/libasound.so.2 f6f0d5a9ebd916de6bdb9695067809ae SD_ROOT/wz_mini/lib/libaudioProcess.so ac436b39b69f26fb65e993c2dfefb421 SD_ROOT/wz_mini/wz_mini.conf d41d8cd98f00b204e9800998ecf8427e SD_ROOT/wz_mini/tmp/.gitignore -30cd28d6e52753c4afe5d6bca209bfc7 v2_install/compile_image.sh +283fca97d62c1c199eb2b04877998879 v2_install/compile_image.sh 53db8da5b90bc9b219dbb1d58e934bda v2_install/fw_tool.sh 71f103530794f9cb15aa6bb7f1e5b8a7 v2_install/v2_kernel.bin f01d641b98388e273c1f0ba682ebc75b v2_install/.gitignore diff --git a/v2_install/compile_image.sh b/v2_install/compile_image.sh index 436e773..abff205 100755 --- a/v2_install/compile_image.sh +++ b/v2_install/compile_image.sh @@ -4,10 +4,16 @@ UA_STRING="Mozilla/5.0 (Macintosh; Intel Mac OS X 12_4) AppleWebKit/605.1.15 (KH DL_URL=$(wget --header="Accept: text/html" --user-agent="$UA_STRING" -qO- https://support.wyze.com/hc/en-us/articles/360024852172-Release-Notes-Firmware | grep -Eo "(http|https)://[a-zA-Z0-9./?=_-]*" | grep /v2/ | sort -t . -k2r,5 | grep demo | head -1) PAN_DL_URL=$(wget --header="Accept: text/html" --user-agent="$UA_STRING" -qO- https://support.wyze.com/hc/en-us/articles/360024852172-Release-Notes-Firmware | grep -Eo "(http|https)://[a-zA-Z0-9./?=_-]*" | grep /pan/ | sort -t . -k2r,5 | grep demo | head -1) +tools() { echo "checking for tools" command -v wget >/dev/null 2>&1 || { echo >&2 "wget is not installed. Aborting."; exit 1; } command -v mkimage >/dev/null 2>&1 || { echo >&2 "mkimage is not installed. Aborting."; exit 1; } command -v unzip >/dev/null 2>&1 || { echo >&2 "unzip is not installed. Aborting."; exit 1; } +echo "tools OK" +} + +download(){ +rm -f demo.bin echo "create temporary work directory" mkdir v2_ro @@ -22,12 +28,23 @@ else if [[ "$1" == "pan" ]]; then echo "build for pan" wget $PAN_DL_URL -O ./v2_ro/demo.zip - elif [[ "$1" == "" ]]; then + else echo "build for v2" wget $DL_URL -O ./v2_ro/demo.zip fi + + if [[ $(md5sum ./v2_ro/demo.zip) == *"a69b6d5ffdbce89463fa83f7f06ec10b"* ]]; then + echo "v2 4.9.8.1002" + elif [[ $(md5sum ./v2_ro/demo.zip) == *"91793d32fd797a10df572f4f5d72bc55"* ]]; then + echo "pan v1 4.10.8.1002" + else + echo "md5sum failed check, please manually supply file" + rm -rf v2_ro + exit 1 + fi fi + echo "extracting firmware to temporary work directory" unzip v2_ro/demo*.zip -d ./v2_ro/ @@ -47,3 +64,16 @@ echo "remove temporary work directory" rm -rf v2_ro echo "demo.bin ready. Please copy demo.bin to your memory card" +} + + +read -r -p "wz_mini: this will download the latest firmware version from the vendor and compile a modified demo.bin. Are you sure? [y/N]" response + case "$response" in + [yY][eE][sS]|[yY]) + tools + download $1 + ;; + *) + echo "User declined, exit" + ;; + esac From bc0c6b0c13c8b97e09f0724517e1b18aa3f9f254 Mon Sep 17 00:00:00 2001 From: Alfonso Gamboa Date: Mon, 25 Jul 2022 08:22:51 -0700 Subject: [PATCH 51/55] update readme --- README.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/README.md b/README.md index 433ebfb..90728a5 100644 --- a/README.md +++ b/README.md @@ -281,6 +281,7 @@ ENABLE_NFSv4="true" ``` --- + RTSP streaming: The RTSP server supports the two video streams provided by the camera, 1080p/360p (1296p/480p for the DB3). You can choose to enable a single stream of your choice, or both. Audio is also available. Set your login credentials here, server listening port, and the stream bitrate. (ENC_PARAMETER variable accepts numbers only. 0=FIXQP, 1=CBR, 2=VBR, 4=CAPPED VBR, 8=CAPPED QUALITY. Currently only 2, 4, and 8 are working) @@ -342,6 +343,8 @@ Run a custom script: CUSTOM_SCRIPT_PATH="" ``` +Note: any executable files placed in `wz_mini/etc/rc.local.d` will be automatically run at boot time, regardless of the custom script specified in the configuration. + --- RTMP Streaming: @@ -444,19 +447,25 @@ Enabled by default. These options control the WiFi Drivers. V2/V3 use the 8189 --- +``` DISABLE_MOTOR="true" +``` Disable the movement capability on motorized devices. You will no longer be able to move the device from the mobile app, or command line. Best used to convert a motorized unit to fixed --- +``` ENABLE_FSCK_ON_BOOT="true" +``` run fsck.vfat on boot. This runs fsck.vfat, the FAT disk repair utility on the micro sd card, automatically repairing most issues, including corruption. Increases boot time. During the repair process, the LEDs on the camera will flash RED-off-BLUE-off-PURPLE-off to inform the user the repair program is running. Once the program has completed, the LED will switch to RED, resuming the normal boot process. --- +``` ENABLE_CAR_DRIVER="true" +``` Loads the appropriate driver for the car to function. On devices other than a V2 with the car firmware, the car may be controlled via `car_control.sh` on the command line. experimental! @@ -467,8 +476,25 @@ Loads the appropriate driver for the car to function. On devices other than a V --- +``` +"ENABLE_LOCAL_DNS" == "true" +``` + +Enables `dnsmasq`, a lightweight, local, caching DNS server on the camera. Fixes DNS flooding on the network. + +--- + +``` +WEB_SERVER_ENABLED="true" +``` + +Enables the local webserver, for configuration, car control, or to retreive an image snapshot via a web browser. Available at : `http:///` Thank you @virmaior! + +--- + ## Latest Updates +* 07-25-22: Add dnsmasq local dns option in configuration to prevent dns flooding on local networks. Added web server capability for configuration and car control. * 07-14-22: Add car compatability with normally unsupported devices. * 07-13-22: Includes latest build of libcallback, better RTSP video and audio performance: fixed broken audio caused by motor_stop on T20 devices, fixed waitMotion errors. `cmd jpeg` currently still broken on T20 devices, updated scripts to account for changed. Some usage of `cmd` has changes, please see command output. Kernel & modules updated to prepare for H265 support on T31. * 07-08-22: Added support for multiple custom scripts, simply create scripts ending in .sh in wz_mini/etc/rc.local.d. You can prefix them with numbers to order execution if desired. From 82101dcc6a9b70173413aa613f28475467efa849 Mon Sep 17 00:00:00 2001 From: virmaior <70625876+virmaior@users.noreply.github.com> Date: Tue, 26 Jul 2022 07:17:42 +0900 Subject: [PATCH 52/55] fix bad anchor (#206) * updates to config.cgi and jpeg.cgi * Update config.cgi * config.cgi: type checks, blank line keep, css * renamed to config.css (other css not used) * fix bad link --- SD_ROOT/wz_mini/www/cgi-bin/config.cgi | 2 +- SD_ROOT/wz_mini/www/cgi-bin/wz_mini_web.css | 85 --------------------- 2 files changed, 1 insertion(+), 86 deletions(-) delete mode 100644 SD_ROOT/wz_mini/www/cgi-bin/wz_mini_web.css diff --git a/SD_ROOT/wz_mini/www/cgi-bin/config.cgi b/SD_ROOT/wz_mini/www/cgi-bin/config.cgi index df6a7e6..260be33 100644 --- a/SD_ROOT/wz_mini/www/cgi-bin/config.cgi +++ b/SD_ROOT/wz_mini/www/cgi-bin/config.cgi @@ -45,7 +45,7 @@ function revert_config function revert_menu { - echo 'Revert Menu' + echo '

Revert Menu' echo '
' echo 'Prior Versions : ' xuff=0 diff --git a/SD_ROOT/wz_mini/www/cgi-bin/wz_mini_web.css b/SD_ROOT/wz_mini/www/cgi-bin/wz_mini_web.css deleted file mode 100644 index 1432587..0000000 --- a/SD_ROOT/wz_mini/www/cgi-bin/wz_mini_web.css +++ /dev/null @@ -1,85 +0,0 @@ -BODY { - --feed_ratio: 2.5; -} -H1 { - background-color:blue; - color:white; - height:calc(108px * (var(--feed_ratio) - 1)); - margin-top:0; - padding:5px; - margin-bottom:108px; - width:calc(100% - (192px * var(--feed_ratio))); -} -.ii_info_line { - font-weight:bold; -} -.ii { - width:100%; - position:relative; - display:flex; -} -.ii_key_DIV { - - flex:0 0 40vw; - font-weight:bold; -} -.ii_value_DIV { - flex: 0 0 40vw; - text-align:right; -} -.ii_value { - width:75%; -} -.feed { - position:absolute; - top:10px; - right:0px; - width:calc(192px * var(--feed_ratio)); - height:calc(108px * var(--feed_ratio)); - z-index:10; -} -.ii_explain { - height:25px; - overflow:hidden; - width:25px; - position:relative; -} -.ii_explain:hover { - height: auto; - position: absolute; - left: 10%; - width: 80%; - border-radius: 3px; - padding: 5px; - background-color: #ccc; - z-index: 10; - border: 3px solid blue; - font-family: monospace; - white-space:pre-wrap; -} -.ii_explain:hover PRE { - white-space:pre-wrap; -} -.ii_explain:hover:after { - content:""; - border:none; - margin:0; - padding:0; - width:0; - height:0; -} -.ii_explain:after { - color:white; - content:"?"; - text-align:center; - background-color:blue; - border:2px solid #ccc; - border-radius:3px; - padding-left:2px; - padding-right:2px; - position:absolute; - left:0; - top:0; - width:100%; - height:100%; -} From f713534805fb6bf027932cefe8b72e938c1bd4fb Mon Sep 17 00:00:00 2001 From: Alfonso Gamboa Date: Mon, 25 Jul 2022 15:19:33 -0700 Subject: [PATCH 53/55] update readme --- README.md | 15 +++++++++------ SD_ROOT/wz_mini/usr/bin/app.ver | 2 +- file.chk | 5 ++--- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 90728a5..e46aabd 100644 --- a/README.md +++ b/README.md @@ -229,7 +229,11 @@ Note: In my testing, the micro-usb cables included with the various cameras do n Remote Accessories: -When USB Direct connectivity is enabled, the camera will be unable to communicate with accessories. To enable remote spotlight accessory support, enable the following variable and set the IP Address of the host as follows: +When USB Direct connectivity is enabled, the camera will be unable to communicate with accessories. To enable remote usb accessory support, enable the following variable and set the IP Address of the host as follows: + +Scenario: Spotlight accessory needs to be located away from the camera, yet we desire spotlight control from within the app and camera. Plug the Spotlight into the nearby router running linux. Configure variables as below on camera, and run socat on the router. The app will now detect the spotlight accessory, just as if it was plugged in to the camera directly! + + ``` REMOTE_SPOTLIGHT="true" REMOTE_SPOTLIGHT_HOST="0.0.0.0" @@ -241,7 +245,7 @@ Then, run the following command on the host where the spotlight is attached to: socat TCP4-LISTEN:9000,reuseaddr,fork /dev/ttyUSB0,raw,echo=0 ``` -Change ```/dev/ttyUSB0``` to whatever path your spotlight enumerated to if necessary. The camera will now be able to control the spotlight. +Change ```/dev/ttyUSB0``` to whatever path your accessory enumerated to if necessary. The camera will now be able to control the usb accessory. --- @@ -304,7 +308,6 @@ RTSP_LOW_RES_MAX_BITRATE="" RTSP_LOW_RES_TARGET_BITRATE="" RTSP_LOW_RES_ENC_PARAMETER="" RTSP_LOW_RES_FPS="" - ``` the singular stream will be located at ```rtsp://login:password@IP_ADDRESS:8554/unicast``` multiple streams are located at ```rtsp://login:password@IP_ADDRESS:8554/video1_unicast``` and ```rtsp://login:password@IP_ADDRESS:8554/video2_unicast``` @@ -343,7 +346,7 @@ Run a custom script: CUSTOM_SCRIPT_PATH="" ``` -Note: any executable files placed in `wz_mini/etc/rc.local.d` will be automatically run at boot time, regardless of the custom script specified in the configuration. +Note: any executable files placed in `wz_mini/etc/rc.local.d` will be automatically run at boot time, irregardless of the custom script variable specified in the configuration. --- @@ -477,10 +480,10 @@ Loads the appropriate driver for the car to function. On devices other than a V --- ``` -"ENABLE_LOCAL_DNS" == "true" +ENABLE_LOCAL_DNS="true" ``` -Enables `dnsmasq`, a lightweight, local, caching DNS server on the camera. Fixes DNS flooding on the network. +Enables `dnsmasq`, a lightweight, local, caching DNS server on the camera. Fixes potential DNS flooding on the local network. Upstream DNS servers may be specified at `/wz_mini/etc/resolv.dnsmasq` --- diff --git a/SD_ROOT/wz_mini/usr/bin/app.ver b/SD_ROOT/wz_mini/usr/bin/app.ver index caafda1..7cd96d7 100644 --- a/SD_ROOT/wz_mini/usr/bin/app.ver +++ b/SD_ROOT/wz_mini/usr/bin/app.ver @@ -1 +1 @@ -Mon Jul 25 07:14:00 AM PDT 2022 +Mon Jul 25 03:19:14 PM PDT 2022 diff --git a/file.chk b/file.chk index 361dfe8..1b0d6c7 100644 --- a/file.chk +++ b/file.chk @@ -2,7 +2,6 @@ d41d8cd98f00b204e9800998ecf8427e SD_ROOT/wz_mini/mnt/.gitignore e17a4aeac39b2dbb5a71d05c4ba0a067 SD_ROOT/wz_mini/www/cgi-bin/WEB_CAM_ENABLE.md 53fc10943d0ee83ed92e58123d24fc02 SD_ROOT/wz_mini/www/cgi-bin/jpeg.cgi -46fdb93e7065b52eee8cc1deb7968d4b SD_ROOT/wz_mini/www/cgi-bin/wz_mini_web.css ffc9d653967b2c25d9635d3240209db0 SD_ROOT/wz_mini/www/cgi-bin/DISABLE_FW_UPGRADE.md 8a756026f05a35173b8748260b694e7d SD_ROOT/wz_mini/www/cgi-bin/RTSP_HI_RES_ENABLED.md d5012a6758e30050b1dc8528e7968ac0 SD_ROOT/wz_mini/www/cgi-bin/ENABLE_USB_STORAGE.md @@ -14,7 +13,7 @@ bd74b1a5dfb722ea1109ea89a039a3e5 SD_ROOT/wz_mini/www/cgi-bin/RTMP_STREAM_ENABLE a2820a7dcfb92bb21fe17de185a16ee9 SD_ROOT/wz_mini/www/cgi-bin/numerics.txt 1013ee7201755bcf9047635b637e17c9 SD_ROOT/wz_mini/www/cgi-bin/ENABLE_WIREGUARD.md 842b228d85468ab31c99e1521b35e37e SD_ROOT/wz_mini/www/cgi-bin/REMOTE_SPOTLIGHT.md -2c026425a683013f4d7eb06c544a75ce SD_ROOT/wz_mini/www/cgi-bin/config.cgi +389958bbebb7ba74d15cddb8b66e3d27 SD_ROOT/wz_mini/www/cgi-bin/config.cgi d43f6b975afedc1f7a5e5c4999dbcbbd SD_ROOT/wz_mini/www/cgi-bin/car.sh 042848359c3840f5973baffca2457a5d SD_ROOT/wz_mini/www/cgi-bin/ENABLE_USB_DIRECT.md f3ce2f03c67b1996b2ea33c02baffcfe SD_ROOT/wz_mini/www/config.js @@ -113,7 +112,7 @@ b339aee882a5d1c943ad08e4282ec3fd SD_ROOT/wz_mini/usr/bin/iCamera-dbg 20b061689308b2cee7edf3b9b906bca7 SD_ROOT/wz_mini/usr/bin/ucamera 3777d9e80c8b517c01a124e6360b6525 SD_ROOT/wz_mini/usr/bin/imp_helper.sh 580b1b6e91e72b4a4fef7b21d8954403 SD_ROOT/wz_mini/usr/bin/getSensorType -65e466ffca31c323ec43391db68fe7d2 SD_ROOT/wz_mini/usr/bin/app.ver +baaeb14b4980dc10167edd0a8bc496f7 SD_ROOT/wz_mini/usr/bin/app.ver 4c780f0455481d106d47d89f0ae04ed5 SD_ROOT/wz_mini/lib/uClibc.tar 9afeb088e4cbabbe0b04033b560204d0 SD_ROOT/wz_mini/lib/libimp.so 4100755cb6cc6e3b76da20c7e3690e16 SD_ROOT/wz_mini/lib/libalog.so From 46d65b87ce0995a3e88fa703ce091f3d401f3b47 Mon Sep 17 00:00:00 2001 From: Alfonso Gamboa Date: Tue, 26 Jul 2022 07:46:32 -0700 Subject: [PATCH 54/55] update dnsmasq --- README.md | 2 +- SD_ROOT/wz_mini/bin/dnsmasq | Bin 305708 -> 374296 bytes SD_ROOT/wz_mini/etc/dnsmasq.conf | 1 + SD_ROOT/wz_mini/usr/bin/app.ver | 2 +- file.chk | 6 +++--- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index e46aabd..bbe1bdf 100644 --- a/README.md +++ b/README.md @@ -483,7 +483,7 @@ Loads the appropriate driver for the car to function. On devices other than a V ENABLE_LOCAL_DNS="true" ``` -Enables `dnsmasq`, a lightweight, local, caching DNS server on the camera. Fixes potential DNS flooding on the local network. Upstream DNS servers may be specified at `/wz_mini/etc/resolv.dnsmasq` +Enables `dnsmasq`, a lightweight, local, caching DNS server on the camera. Fixes potential DNS flooding on the local network. Upstream DNS servers may be specified in `wz_mini/etc/resolv.dnsmasq` --- diff --git a/SD_ROOT/wz_mini/bin/dnsmasq b/SD_ROOT/wz_mini/bin/dnsmasq index f014f58e753d4578de82f0857417c859042608ea..5dfc6cbc1eeccf3c5d43f2f8ed78392ba976d4fa 100755 GIT binary patch delta 71694 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

+-cinrn9l38re1S*Gtmm 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 L`HG$N#o|u@vb!wW delta 2702 zcmZ`*3s98T6+Y+Re?j5`|Gy6&L58L7u4~l+v$4?e_45eA!~}>#TI*vNLrPjp3D$J9 zQwONp$e@6^F<08@m}CMIlBH;AW@8&#Y?G#zS|n;)Yb_6LMi2z#P0;PRyDTE9|IFR* z-t(Pv?m6e4duLDfN4PH=YpkZ5^)du2@bZ&j1wA;y0_HQWJRL4?uFzex;J)S;qjx`n zx0*Yijw_8d8Z_np{aubk*!5MDK{Ka=e%(dyE=Lxmtqf~ZR^F41Ev%zw5VtpXbpa zf4f==aSnR;EtQPVp*c@UE;HZ+pUUhs(l>uy3cV{g(6LFA_=sRoiRhD;W3p!ZCol;C^%LkX*yT&Q*PwQ+3NKO2UpoE3d6?XKRKIt|=T;wN20N%$4k``EycOMTrZ)#jvyZ1wOae2wiNUaJ=SIO`mj%03ysff=mf?lz2J`jIq@ zWmzLGRM~+MrZ$a%GI_qvcF(IB#UAgo_)#yu%i_n{@D(;NR*4q2f82#TStI@0Soe4u znwWjUg+XlV#1>291Skrmxn(Hxb&2rtM|N&vBIGW477@GIxyi!l`cY5{AlE(P1;q*_ zZu`4sQbGH3j`vu~RGhkPG+(hht&$G3h13k%+$7!UPi~tcSyJbf5R&zjKOQX zP9oFO{Jex)u#d;;(2Lu6tc=_6Uwpre8}WDitc<02g@0X-G0}hPRpof=8z9_f&>gf} zH4xoW&Wngv|C6iAOQ60<&^5H%IIq=XoEouQm1{nI$`_2#{;uadi4iyO-XLUH#}5RP z@wXNj@8J!>n6ReG2}&ZgEK5IFTTSJ)o!m?%FQe;%K{kM|RN0*%b#G7%nUH=|?3+n? zjXZP_ZIH}YEyCYpoo8SXwj+L*ZfcHT?uY?7CU;U-liCmu+#k0`x^Uk$^9n8tU6<8J(npAV-9 zk9zD1HX)AiD=Gz{^JEz@7^y9CO_+c-UM`@EpD|Hc?0n2bP1nv(m`Qkwe`2QGGI*~U zU6vE2qOw-W?kw|Fa|zvpC4997Bh?6^-0&2=?fy7^%C}mmtgZX2qO@oUa56kBBf%!W(G`QKVft&OLvH;$^tU*3;f%QWCYp({AG)P_w z!qLh;zw*p&4YYCp+&1=T2g2cz9zTEb*28+v*^T?BAC|XXdaxcPo6Qt}`4aEDuM3+i z!sKTf=W~I41yA{x!jFeFP-dO(9elJC zVHiaP6Naa|9-Y!2VqtdB?<^LmTt Date: Tue, 26 Jul 2022 07:58:11 -0700 Subject: [PATCH 55/55] update dnsmasq.conf to allow local hosts file --- SD_ROOT/wz_mini/etc/dnsmasq.conf | 1 + SD_ROOT/wz_mini/usr/bin/app.ver | 2 +- file.chk | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/SD_ROOT/wz_mini/etc/dnsmasq.conf b/SD_ROOT/wz_mini/etc/dnsmasq.conf index 5e658dc..760adaa 100644 --- a/SD_ROOT/wz_mini/etc/dnsmasq.conf +++ b/SD_ROOT/wz_mini/etc/dnsmasq.conf @@ -12,5 +12,6 @@ min-cache-ttl=86400 neg-ttl=3600 no-poll resolv-file=/opt/wz_mini/etc/resolv.dnsmasq +addn-hosts=/opt/wz_mini/etc/hosts #log-facility=- #log-queries diff --git a/SD_ROOT/wz_mini/usr/bin/app.ver b/SD_ROOT/wz_mini/usr/bin/app.ver index ab1939f..d483a1b 100644 --- a/SD_ROOT/wz_mini/usr/bin/app.ver +++ b/SD_ROOT/wz_mini/usr/bin/app.ver @@ -1 +1 @@ -Tue Jul 26 07:46:24 AM PDT 2022 +Tue Jul 26 07:57:02 AM PDT 2022 diff --git a/file.chk b/file.chk index d92a889..b2d4e86 100644 --- a/file.chk +++ b/file.chk @@ -21,7 +21,7 @@ e344ffc55222c029c5d324037a5aa1f3 SD_ROOT/wz_mini/www/car/car.js 540acfdf2638c341e1d168f1af5203de SD_ROOT/wz_mini/www/car/car.css 63b23f78d6703f0c9a2e970604104996 SD_ROOT/wz_mini/www/car/car.html bd11d9a8352eca6a16554c87be50b2f5 SD_ROOT/wz_mini/www/index.html -809cd9f67067ee07d85908dff88f477d SD_ROOT/wz_mini/etc/dnsmasq.conf +32373fa3531a11c1aad41d12830b9c04 SD_ROOT/wz_mini/etc/dnsmasq.conf 34c6a4c3a941ff2becd9f487826d7692 SD_ROOT/wz_mini/etc/uvc.config ad7d1a2f9db3079617731b5854ce3b6a SD_ROOT/wz_mini/etc/init.d/wz_cam.sh f97ffcb1482d564bf2557684a4c68846 SD_ROOT/wz_mini/etc/init.d/wz_init.sh @@ -112,7 +112,7 @@ b339aee882a5d1c943ad08e4282ec3fd SD_ROOT/wz_mini/usr/bin/iCamera-dbg 20b061689308b2cee7edf3b9b906bca7 SD_ROOT/wz_mini/usr/bin/ucamera 3777d9e80c8b517c01a124e6360b6525 SD_ROOT/wz_mini/usr/bin/imp_helper.sh 580b1b6e91e72b4a4fef7b21d8954403 SD_ROOT/wz_mini/usr/bin/getSensorType -1522783abe3a3bf3f5989968c0fcaecd SD_ROOT/wz_mini/usr/bin/app.ver +e2c5fb721593fe52f7bf43a81d78b302 SD_ROOT/wz_mini/usr/bin/app.ver 4c780f0455481d106d47d89f0ae04ed5 SD_ROOT/wz_mini/lib/uClibc.tar 9afeb088e4cbabbe0b04033b560204d0 SD_ROOT/wz_mini/lib/libimp.so 4100755cb6cc6e3b76da20c7e3690e16 SD_ROOT/wz_mini/lib/libalog.so