summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Huwald <jh@sotun.de>2012-04-27 20:43:14 (GMT)
committerJan Huwald <jh@sotun.de>2012-04-27 20:43:14 (GMT)
commitc3797238329c40150a308bb3a76bf90f9eb1b499 (patch)
tree69db8b612f460cc58b2012a7ba54df15355883d8
parenta64dc292331211e84e9996a78f184d066f1cab60 (diff)
webif ccfg: implement server side handler
-rw-r--r--files/common/www/service/cgi-bin/cfg_client.commit49
-rwxr-xr-xfiles/common/www/service/cgi-bin/cfg_client.json62
2 files changed, 105 insertions, 6 deletions
diff --git a/files/common/www/service/cgi-bin/cfg_client.commit b/files/common/www/service/cgi-bin/cfg_client.commit
new file mode 100644
index 0000000..bf5d50c
--- /dev/null
+++ b/files/common/www/service/cgi-bin/cfg_client.commit
@@ -0,0 +1,49 @@
+update_cfgtbl() {
+ if [ "$cmode" == $cmode_default ]; then cmode=; fi
+ if [ "$csplash" == $csplash_default ]; then csplash=; fi
+ p2ptbl update $tbl $mac "$cname,$cmode,$csplash,$cip"
+}
+
+# parse changes
+while read key val; do
+ case "$key" in
+ client_access)
+ case "$val" in
+ bridged|routed|isolated) cmode=$val;;
+ *) fail;;
+ esac
+ lazy 20 splash_sync
+ ;;
+ client_name)
+ [ -z "$(echo "$val" | tr -d '0-9a-z_')" ] \
+ || fail 400 'Unerlaubte Zeichen verwendet'
+ [ "$val" != "$cname" ] \
+ || continue
+ [ -z "$(p2ptbl show $tbl | cut -f2 | grep "^$val,")" ] \
+ || fail 403 'Name bereits vergeben'
+ cname=$val
+ lazy 10 sync_dhcp
+ ;;
+ # client_splash is send iff. it is checked; update_splash is
+ # send in every case
+ update_splash)
+ update_splash=${update_splash-false}
+ lazy 20 splash_sync
+ ;;
+ client_splash)
+ update_splash=true
+ ;;
+ *)
+ fail 400 "wtf is $key?"
+ ;;
+ esac
+done <<EOF
+$(tr '=&' ' \n')
+EOF
+
+if [ -n "$update_splash" ]; then
+ csplash=$update_splash
+fi
+
+# update p2ptbl entry
+lazy 00 update_cfgtbl
diff --git a/files/common/www/service/cgi-bin/cfg_client.json b/files/common/www/service/cgi-bin/cfg_client.json
index dc675c9..fc74393 100755
--- a/files/common/www/service/cgi-bin/cfg_client.json
+++ b/files/common/www/service/cgi-bin/cfg_client.json
@@ -1,9 +1,59 @@
-#!/bin/sh
+#!/bin/sh -e
+. /www/service/cgi-bin/common.sh
-echo -e 'Status: 200 OK\r
+# determine for which mac we get/put
+read mac iface <<EOF
+$(grep ^$REMOTE_HOST </proc/net/arp \
+ | awk 'BEGIN { FS = " " } ; { print $4, $6 }')
+EOF
+[ -n "$mac" ]
+
+if [ -n "$QUERY_STRING" ]; then
+ check_node_auth
+ mac="$(echo "$QUERY_STRING" | tr -dc '0-9a-fA-F')"
+fi
+
+# get current settings and default settings
+case $iface in
+ br-lan)
+ tbl=/tmp/p2ptbl/ccfg_wire
+ cmode_default=$(uci get system.mesh.lan_client_mode)
+ ;;
+ br-mesh)
+ tbl=/tmp/p2ptbl/ccfg_wire
+ cmode_default=bridged
+ ;;
+ *) fail;;
+esac
+csplash_default=false
+
+# get config from p2ptbl; parse it only if existent; hint: the default
+# value for each config value is empty
+cfg_line=$(p2ptbl get $tbl $mac)
+if [ -n "$cfg_line" ]; then
+ IFS="," read cname cmode csplash cip <<EOF
+$cfg_line
+EOF
+fi
+cmode=${cmode-$cmode_default}
+csplash=${csplash-$csplash_default}
+
+if [ $REQUEST_METHOD == POST ]; then
+ . /www/service/cgi-bin/cfg_client.commit
+fi
+
+# set all empty variables to their default values
+if [ "$csplash" != true ]; then
+ csplash=false
+fi
+
+# respond with [updated] settings
+echo -e "Status: 200 OK\r
Content-Type: application/json\r
\r
-{"client_name": "mobilaptop",
- "client_splash": [false],
- "client_access": ["bridged"]
-}'
+{\"client_name\": \"$cname\",
+ \"client_splash\": [$csplash],
+ \"client_access\": [\"$cmode\"]
+}"
+
+exec_lazy
contact: Jan Huwald // Impressum