summaryrefslogtreecommitdiff
path: root/package/webif/files/usr/lib/webif/webif.sh
diff options
context:
space:
mode:
Diffstat (limited to 'package/webif/files/usr/lib/webif/webif.sh')
-rwxr-xr-xpackage/webif/files/usr/lib/webif/webif.sh286
1 files changed, 286 insertions, 0 deletions
diff --git a/package/webif/files/usr/lib/webif/webif.sh b/package/webif/files/usr/lib/webif/webif.sh
new file mode 100755
index 000000000..e6147fd6d
--- /dev/null
+++ b/package/webif/files/usr/lib/webif/webif.sh
@@ -0,0 +1,286 @@
+libdir=/usr/lib/webif
+wwwdir=/www
+cgidir=/www/cgi-bin/webif
+rootdir=/cgi-bin/webif
+indexpage=index.sh
+
+# workarounds for stupid busybox slowness on [ ]
+empty() {
+ case "$1" in
+ "") return 0 ;;
+ *) return 255 ;;
+ esac
+}
+equal() {
+ case "$1" in
+ "$2") return 0 ;;
+ *) return 255 ;;
+ esac
+}
+neq() {
+ case "$1" in
+ "$2") return 255 ;;
+ *) return 0 ;;
+ esac
+}
+# very crazy, but also very fast :-)
+exists() {
+ ( < $1 ) 2>&-
+}
+
+categories() {
+ grep '##WEBIF:' $cgidir/.categories $cgidir/*.sh 2>/dev/null | \
+ awk -v "selected=$1" \
+ -v "rootdir=$rootdir" \
+ -v "indexpage=$indexpage" \
+ -f /usr/lib/webif/categories.awk -
+}
+
+subcategories() {
+ grep -H "##WEBIF:name:$1:" $cgidir/*.sh 2>/dev/null | \
+ sed -e 's,^.*/\([a-zA-Z0-9_\.\-]*\):\(.*\)$,\2:\1,' | \
+ sort -n | \
+ awk -v "selected=$2" \
+ -v "rootdir=$rootdir" \
+ -f /usr/lib/webif/subcategories.awk -
+}
+
+update_changes() {
+ CHANGES=$(($( (cat /tmp/.webif/config-* ; ls /tmp/.webif/file-*) 2>&- | wc -l)))
+}
+
+header() {
+ empty "$ERROR" && {
+ _saved_title="${SAVED:+: @TR<<Settings saved>>}"
+ } || {
+ FORM_submit="";
+ ERROR="<h3>$ERROR</h3><br /><br />"
+ _saved_title=": @TR<<Settings not saved>>"
+ }
+
+ _category="$1"
+ _uptime="$(uptime)"
+ _loadavg="${_uptime#*load average: }"
+ _uptime="${_uptime#*up }"
+ _uptime="${_uptime%%,*}"
+ _hostname=$(cat /proc/sys/kernel/hostname)
+ _version=$( grep "(" /etc/banner )
+ _version="${_version%% ---*}"
+ _head="${3:+<div class=\"settings-block-title\"><h2>$3$_saved_title</h2></div>}"
+ _form="${5:+<form enctype=\"multipart/form-data\" action=\"$5\" method=\"post\"><input type=\"hidden\" name=\"submit\" value=\"1\" />}"
+ _savebutton="${5:+<p><input type=\"submit\" name=\"action\" value=\"@TR<<Save Changes>>\" /></p>}"
+ _categories=$(categories $1)
+ _subcategories=${2:+$(subcategories "$1" "$2")}
+
+ empty "$REMOTE_USER" && neq "${SCRIPT_NAME#/cgi-bin/}" "webif.sh" && grep 'root:!' /etc/passwd >&- 2>&- && {
+ _nopasswd=1
+ _form=""
+ _savebutton=""
+ }
+
+ update_changes
+ cat <<EOF
+Content-Type: text/html
+Pragma: no-cache
+
+<?xml version="1.0" encoding="@TR<<Encoding|ISO-8859-1>>"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+ <head>
+ <title>@TR<<Web Status Console>></title>
+ <link rel="stylesheet" type="text/css" href="/webif.css" />
+ <!--[if IE]> <style> #container { height: 100%; }</style> <![endif]-->
+ <meta http-equiv="Content-Type" content="text/html; charset=@TR<<Encoding|ISO-8859-1>>" />
+ </head>
+ <body $4><div id="container">
+ <div id="header">
+ <div id="header-title">
+ <div id="openwrt-title"><h1>Web Status Console</h1></div>
+ <div id="short-status">
+ <h3><strong>Status:</strong></h3>
+ <ul>
+ <li><strong>@TR<<Host Name>>:</strong> $_hostname</li>
+ <li><strong>@TR<<Uptime>>:</strong> $_uptime</li>
+ <li><strong>@TR<<Load>>:</strong> $_loadavg</li>
+ <li><strong>@TR<<Version>>:</strong> $_version</li>
+ </ul>
+ </div>
+ </div>
+ $_categories
+ $_subcategories
+ </div>
+ $_form
+ <div id="content">
+ <div class="settings-block">
+ $_head
+ $ERROR
+EOF
+ empty "$REMOTE_USER" && neq "${SCRIPT_NAME#/cgi-bin/}" "webif.sh" && {
+ empty "$FORM_passwd1" || {
+ echo '<pre>'
+ (
+ echo "$FORM_passwd1"
+ sleep 1
+ echo "$FORM_passwd2"
+ ) | passwd root 2>&1 && apply_passwd
+ echo '</pre>'
+ footer
+ exit
+ }
+
+ equal "$_nopasswd" 1 && {
+ cat <<EOF
+<br />
+<br />
+<br />
+<h3>@TR<<Warning>>: @TR<<Password_warning|you haven't set a password for the Web interface and SSH access<br />Please enter one now (the user name in your browser will be 'root').>></h3>
+<br />
+<br />
+EOF
+ empty "$NOINPUT" && cat <<EOF
+<form enctype="multipart/form-data" action="$SCRIPT_NAME" method="POST">
+<table>
+ <tr>
+ <td>@TR<<New Password>>:</td>
+ <td><input type="password" name="passwd1" /></td>
+ </tr>
+ <tr>
+ <td>@TR<<Confirm Password>>: &nbsp; </td>
+ <td><input type="password" name="passwd2" /></td>
+ </tr>
+ <tr>
+ <td />
+ <td><input type="submit" name="action" value="@TR<<Set>>" /></td>
+ </tr>
+</table>
+</form>
+EOF
+ footer
+ exit
+ } || {
+ apply_passwd
+ }
+ }
+}
+
+footer() {
+ _changes=${CHANGES#0}
+ _changes=${_changes:+(${_changes})}
+ _endform=${_savebutton:+</form>}
+ cat <<EOF
+ </div>
+ <hr width="40%" />
+ </div>
+ <br />
+ <div id="save">
+ <div class="page-save">
+ <div> </div>
+ </div>
+ <div class="apply">
+ <div> </div>
+ </div>
+ </div>
+ $_endform
+ </div></body>
+</html>
+EOF
+}
+
+apply_passwd() {
+ case ${SERVER_SOFTWARE%% *} in
+ mini_httpd/*)
+ grep '^root:' /etc/passwd | cut -d: -f1,2 > $cgidir/.htpasswd
+ killall -HUP mini_httpd
+ ;;
+ esac
+}
+
+display_form() {
+ if empty "$1"; then
+ awk -F'|' -f /usr/lib/webif/common.awk -f /usr/lib/webif/form.awk
+ else
+ echo "$1" | awk -F'|' -f /usr/lib/webif/common.awk -f /usr/lib/webif/form.awk
+ fi
+}
+
+list_remove() {
+ echo "$1 " | awk '
+BEGIN {
+ RS=" "
+ FS=":"
+}
+($0 !~ /^'"$2"'/) && ($0 != "") {
+ printf " " $0
+ first = 0
+}'
+}
+
+handle_list() {
+ # $1 - remove
+ # $2 - add
+ # $3 - submit
+ # $4 - validate
+
+ empty "$1" || {
+ LISTVAL="$(list_remove "$LISTVAL" "$1") "
+ LISTVAL="${LISTVAL# }"
+ LISTVAL="${LISTVAL%% }"
+ _changed=1
+ }
+
+ empty "$3" || {
+ validate "${4:-none}|$2" && {
+ if empty "$LISTVAL"; then
+ LISTVAL="$2"
+ else
+ LISTVAL="$LISTVAL $2"
+ fi
+ _changed=1
+ }
+ }
+
+ LISTVAL="${LISTVAL# }"
+ LISTVAL="${LISTVAL%% }"
+ LISTVAL="${LISTVAL:- }"
+
+ if empty "$_changed"; then
+ return 255
+ else
+ return 0
+ fi
+}
+
+load_settings() {
+ equal "$1" "nvram" || {
+ exists /etc/config/$1 && . /etc/config/$1
+ }
+ exists /tmp/.webif/config-$1 && . /tmp/.webif/config-$1
+}
+
+validate() {
+ if empty "$1"; then
+ eval "$(awk -f /usr/lib/webif/validate.awk)"
+ else
+ eval "$(echo "$1" | awk -f /usr/lib/webif/validate.awk)"
+ fi
+}
+
+
+save_setting() {
+ exists /tmp/.webif/* || mkdir -p /tmp/.webif
+ oldval=$(eval "echo \${$2}")
+ oldval=${oldval:-$(nvram get "$2")}
+ grep "^$2=" /tmp/.webif/config-$1 >&- 2>&- && {
+ grep -v "^$2=" /tmp/.webif/config-$1 > /tmp/.webif/config-$1-new 2>&-
+ mv /tmp/.webif/config-$1-new /tmp/.webif/config-$1 2>&- >&-
+ oldval=""
+ }
+ equal "$oldval" "$3" || echo "$2=\"$3\"" >> /tmp/.webif/config-$1
+}
+
+
+is_bcm947xx() {
+ read _systype < /proc/cpuinfo
+ equal "${_systype##* }" "BCM947XX"
+}
+