#!/bin/sh # This serves a rudimentary webpage based on wz_mini.conf . /opt/wz_mini/www/cgi-bin/shared.cgi title="$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() { # 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 filedate=$(date -r "$1.$xuff" ) class="" if [ "$1.$xuff" = "$2" ]; then class="current_revert" fi echo '
'"$xuff
$filedate
" fi done 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 if [[ "$GET_action" = "show_revert" ]]; then hack_ini="$hack_ini.$GET_version" fi fi #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 output="$hack_ini.new" #name our output file while IFS= read -r \ARGUMENT; do #cycle through each line of the current config #copy through all comments if [ -z "$ARGUMENT" ]; then echo -ne "\n" >> $output elif [[ ${ARGUMENT:0:1} == "#" ]] ; then #echo $ARGUMENT $'\n' 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=) 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 -ne $KEY=\"$test\""\n" >> $output else #if not in the fake array we use the current value #echo "
key not found
" echo -ne $ARGUMENT"\n" >> $output fi fi done < $hack_ini shft $hack_ini mv $output $hack_ini updated=true fi function documentation_to_html { if [[ -f "$www_dir$1.md" ]]; then printf '
'
                cat "$web_dir$1.md"
                printf '
' fi } function ini_to_html_free { classes="" if [ "$1" = "USB_DIRECT_MAC_ADDR" ]; then classes=" mac_addr" fi if grep -q -wi "$1" numerics.txt; then classes=" numeric" fi 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 ' True  ' $1 printf ' False  ' $1 fi printf '
' documentation_to_html $1 printf '
' } #function to handle camera feed function html_cam_feed { printf '' } function handle_css { echo -ne "'; } echo -ne "$title" handle_css wz_mini_web.css echo '' echo -ne "" echo -ne '' echo -ne "

$title

"; if [ "$updated" = true ]; then echo '
configuration file updated. Reboot to use changes. Or Revert to a prior configuration
'; fi html_cam_feed 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=) 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 < $hack_ini if [ "$CONFIG_BLOCK" -gt 0 ]; then echo '
' fi echo -ne '' echo -ne '
' revert_menu $base_hack_ini $hack_ini version_info "display_BAR" echo -ne ''