tag rc6
[openwrt/svn-archive/openwrt.git] / package / webif / files / www / cgi-bin / webif / network-hosts.sh
diff --git a/package/webif/files/www/cgi-bin/webif/network-hosts.sh b/package/webif/files/www/cgi-bin/webif/network-hosts.sh
new file mode 100755 (executable)
index 0000000..aeb58e1
--- /dev/null
@@ -0,0 +1,158 @@
+#!/usr/bin/webif-page
+<? 
+. /usr/lib/webif/webif.sh
+
+exists /tmp/.webif/file-hosts  && HOSTS_FILE=/tmp/.webif/file-hosts || HOSTS_FILE=/etc/hosts
+exists /tmp/.webif/file-ethers  && ETHERS_FILE=/tmp/.webif/file-ethers || ETHERS_FILE=/etc/ethers
+exists $HOSTS_FILE || touch $HOSTS_FILE >&- 2>&-
+exists $ETHERS_FILE || touch $ETHERS_FILE >&- 2>&-
+
+update_hosts() {
+       exists /tmp/.webif/* || mkdir -p /tmp/.webif
+       awk -v "mode=$1" -v "ip=$2" -v "name=$3" '
+BEGIN {
+       FS="[ \t]"
+       host_added = 0
+}
+{ processed = 0 }
+(mode == "del") && (ip == $1) {
+       names_found = 0
+       n = split($0, names, "[ \t]")
+       output = $1 "   "
+       for (i = 2; i <= n; i++) {
+               if ((names[i] != "") && (names[i] != name)) {
+                       output = output names[i] " "
+                       names_found++
+               }
+       }
+       if (names_found > 0) print output
+       processed = 1
+}
+(mode == "add") && (ip == $1) {
+       print $0 " " name
+       host_added = 1
+       processed = 1
+}
+processed == 0 {
+       print $0
+}
+END {
+       if ((mode == "add") && (host_added == 0)) print ip "    " name
+}' "$HOSTS_FILE" > /tmp/.webif/file-hosts-new
+       mv "/tmp/.webif/file-hosts-new" "/tmp/.webif/file-hosts"
+       HOSTS_FILE=/tmp/.webif/file-hosts
+}
+
+update_ethers() {
+       exists /tmp/.webif/* || mkdir -p /tmp/.webif
+       case "$1" in
+               add)
+                       grep -E -v "^[ \t]*$2" $ETHERS_FILE > /tmp/.webif/file-ethers-new
+                       echo "$2        $3" >> /tmp/.webif/file-ethers-new
+                       mv /tmp/.webif/file-ethers-new  /tmp/.webif/file-ethers
+               ;;
+               del)
+                       grep -E -v "^[ \t]*$2" $ETHERS_FILE > /tmp/.webif/file-ethers-new
+                       mv /tmp/.webif/file-ethers-new  /tmp/.webif/file-ethers
+               ;;      
+       esac
+       ETHERS_FILE=/tmp/.webif/file-ethers
+}
+
+empty "$FORM_add_host" || {
+       # add a host to /etc/hosts
+       validate <<EOF
+ip|FORM_host_ip|@TR<<IP Address>>|required|$FORM_host_ip
+hostname|FORM_host_name|@TR<<Host Name>>|required|$FORM_host_name
+EOF
+       equal "$?" 0 && update_hosts add "$FORM_host_ip" "$FORM_host_name"
+}
+empty "$FORM_add_dhcp" || {
+       # add a host to /etc/ethers
+       validate <<EOF
+mac|FORM_dhcp_mac|@TR<<MAC Address>>|required|$FORM_dhcp_mac
+ip|FORM_dhcp_ip|@TR<<IP Address>>|required|$FORM_dhcp_ip
+EOF
+       equal "$?" 0 && update_ethers add "$FORM_dhcp_mac" "$FORM_dhcp_ip"
+}
+
+empty "$FORM_remove_host" || update_hosts del "$FORM_remove_ip" "$FORM_remove_name"
+empty "$FORM_remove_dhcp" || update_ethers del "$FORM_remove_mac"
+
+header "Network" "Hosts" "@TR<<Configured Hosts>>" ''
+
+# Hosts in /etc/hosts
+awk -v "url=$SCRIPT_NAME" \
+       -v "ip=$FORM_host_ip" \
+       -v "name=$FORM_host_name" \
+       -f /usr/lib/webif/common.awk \
+       -f - $HOSTS_FILE <<EOF
+BEGIN {
+       FS="[ \t]"
+       start_form("@TR<<Host Names>>")
+       print "<table width=\"70%\" summary=\"Settings\">"
+       print "<tr><th>@TR<<IP Address>></th><th>@TR<<Host Name>></th><th></th></tr>"
+       print "<tr><td colspan=\"3\"><hr class=\"separator\" /></td></tr>"
+}
+
+# only for valid IPv4 addresses
+(\$1 ~ /^[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$/) {
+       gsub(/#.*$/, "");
+       output = ""
+       names_found = 0
+       n = split(\$0, names, "[ \\t]")
+       first = 1
+       for (i = 2; i <= n; i++) {
+               if (names[i] != "") {
+                       if (first != 1) output = output "<tr>"
+                       output = output "<td>" names[i] "</td><td align=\\"right\\" width=\\"10%\\"><a href=\\"" url "?remove_host=1&remove_ip=" \$1 "&remove_name=" names[i] "\\">@TR<<Remove>></a></td></tr>"
+                       first = 0
+                       names_found++
+               }
+       }
+       if (names_found > 0) {
+               print "<tr><td rowspan=\\"" names_found "\\">" \$1 "</td>" output
+               print "<tr><td colspan=\\"3\\"><hr class=\\"separator\\" /></td></tr>"
+       }
+}
+
+END {
+       print "<form enctype=\\"multipart/form-data\\" method=\\"post\\">"
+       print "<tr><td>" textinput("host_ip", ip) "</td><td>" textinput("host_name", name) "</td><td style=\\"width: 10em\\">" button("add_host", "Add") "</td></tr>"
+       print "</form>"
+       print "</table>"
+       end_form()
+}
+EOF
+
+# Static DHCP mappings (/etc/ethers)
+awk -v "url=$SCRIPT_NAME" \
+       -v "mac=$FORM_dhcp_mac" \
+       -v "ip=$FORM_dhcp_ip" -f /usr/lib/webif/common.awk -f - $ETHERS_FILE <<EOF
+       
+BEGIN {
+       FS="[ \\t]"
+       print "<form enctype=\\"multipart/form-data\\" method=\\"post\\">"
+       start_form("@TR<<DHCP Static|Static IP addresses (for DHCP)>>")
+       print "<table width=\\"70%\\" summary=\\"Settings\\">"
+       print "<tr><th>@TR<<MAC Address>></th><th>@TR<<IP Address>></th><th></th></tr>"
+}
+
+# only for valid MAC addresses
+(\$1 ~ /^[0-9A-Fa-f][0-9A-Fa-f]:[0-9A-Fa-f][0-9A-Fa-f]:[0-9A-Fa-f][0-9A-Fa-f]:[0-9A-Fa-f][0-9A-Fa-f]:[0-9A-Fa-f][0-9A-Fa-f]:[0-9A-Fa-f][0-9A-Fa-f]$/) {
+       gsub(/#.*$/, "");
+       print "<tr><td>" \$1 "</td><td>" \$2 "</td><td align=\\"right\\" width=\\"10%\\"><a href=\\"" url "?remove_dhcp=1&remove_mac=" \$1 "\\">@TR<<Remove>></a></td></tr>"
+}
+
+END {
+       print "<tr><td>" textinput("dhcp_mac", mac) "</td><td>" textinput("dhcp_ip", ip) "</td><td style=\\"width: 10em\\">" button("add_dhcp", "Add") "</td></tr>"
+       print "</table>"
+       print "</form>"
+       end_form();
+}
+EOF
+
+footer ?>
+<!--
+##WEBIF:name:Network:300:Hosts
+-->