From 9646815e7d1bc57dd77e1a250c62bc944a0ea5b2 Mon Sep 17 00:00:00 2001 From: Pau Escrich Date: Thu, 23 Mar 2017 19:09:22 +0100 Subject: [PATCH] luci-app-bmx6: add new methods to bmx6-info and clean/sanityze the code Signed-off-by: Pau Escrich --- luci-app-bmx6/files/www/cgi-bin/bmx6-info | 179 +++++++++++----------- 1 file changed, 89 insertions(+), 90 deletions(-) mode change 100644 => 100755 luci-app-bmx6/files/www/cgi-bin/bmx6-info diff --git a/luci-app-bmx6/files/www/cgi-bin/bmx6-info b/luci-app-bmx6/files/www/cgi-bin/bmx6-info old mode 100644 new mode 100755 index 5263081..6518c8d --- a/luci-app-bmx6/files/www/cgi-bin/bmx6-info +++ b/luci-app-bmx6/files/www/cgi-bin/bmx6-info @@ -1,119 +1,118 @@ #!/bin/sh -# Copyright (C) 2011 Pau Escrich -# Contributors Jo-Philipp Wich -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -# -# The full GNU General Public License is included in this distribution in -# the file called "COPYING". -# -# This script gives information about bmx6 -# Can be executed from a linux shell: ./bmx6-info -s links -# Or from web interfae (with cgi enabled): http://host/cgi-bin/bmx6-info?links -# If you ask for a directory you wil get the directory contents in JSON forman +# This script gives information about bmx6 +# Can be executed from a linux shell: ./bmx6-info -s links +# Or from web interfae (with cgi enabled): http://host/cgi-bin/bmx6-info?links +# Special methods are tagged with '$', like $myself or $neighbours: http://host/cgi-bin/bmx6-info?$myself +# When '$' is not used, raw bmx6 information from the filesystem is returned (/var/runb/bmx6/json/) BMX6_DIR="$(uci get bmx6.general.runtimeDir 2>/dev/null)" || BMX6_DIR="/var/run/bmx6/json" #Checking if shell mode or cgi-bin mode if [ "$1" == "-s" ]; then - QUERY="$2" + QUERY="$2" else - QUERY="${QUERY_STRING%%=*}" - echo "Content-type: application/json" - echo "" - + QUERY="${QUERY_STRING%%=*}" + QUERY="${QUERY%%\?*}" + QUERY="${QUERY%%\&*}" + echo "Content-type: application/json" + echo "" fi check_path() { - [ -d "$1" ] && path=$(cd $1; pwd) - [ -f "$1" ] && path=$(cd $1/..; pwd) - [ $(echo "$path" | grep -c "^$BMX6_DIR") -ne 1 ] && exit 1 + [ -d "$1" ] && path=$(cd $1; pwd) + [ -f "$1" ] && path=$(cd $1/..; pwd) + [ $(echo "$path" | grep -c "^$BMX6_DIR") -ne 1 ] && exit 1 } print_query() { - # If the query is a directory - [ -d "$BMX6_DIR/$1" ] && + # If the query is a directory + [ -d "$BMX6_DIR/$1" ] && + { + # If /all has not been specified + [ -z "$QALL" ] && + { + total=$(ls $BMX6_DIR/$1 | wc -w) + i=1 + echo -n "{ \"$1\": [ " + for f in $(ls $BMX6_DIR/$1); do + echo -n "{ \"name\": \"$f\" }" + [ $i -lt $total ] && echo -n ',' + i=$(( $i + 1 )) + done + echo -n " ] }" + + # If /all has been specified, printing all the files together + } || { + comma="" + echo -n "[ " + for entry in "$BMX6_DIR/$1/"*; do + [ -f "$entry" ] && { - # If /all has not been specified - [ -z "$QALL" ] && - { - total=$(ls $BMX6_DIR/$1 | wc -w) - i=1 - echo -n "{ \"$1\": [ " - for f in $(ls $BMX6_DIR/$1); do - echo -n "{ \"name\": \"$f\" }" - [ $i -lt $total ] && echo -n ',' - i=$(( $i + 1 )) - done - echo -n " ] }" - - # If /all has been specified, printing all the files together - } || { - comma="" - echo -n "[ " - for entry in "$BMX6_DIR/$1/"*; do - [ -f "$entry" ] && - { - ${comma:+echo "$comma"} - tr -d '\n' < "$entry" - comma="," - } - done - echo -n " ]" - } + ${comma:+echo -n "$comma"} + tr -d '\n' < "$entry" + comma="," } - - # If the query is a file, just printing the file - [ -f "$BMX6_DIR/$1" ] && cat "$BMX6_DIR/$1"; + done + echo -n " ]" + } + } + # If the query is a file, just printing the file + [ -f "$BMX6_DIR/$1" ] && cat "$BMX6_DIR/$1"; } if [ "${QUERY##*/}" == "all" ]; then - QUERY="${QUERY%/all}" - QALL=1 + QUERY="${QUERY%/all}" + QALL=1 fi +if [ "$QUERY" == '$myself' ]; then + hostname="$(cat /proc/sys/kernel/hostname)" + ip6="$(bmx6 -c show=status | grep ^BMX | awk '{print $5}')" + ip4="$(bmx6 -c show=status | grep ^BMX | awk '{print $6}')" + cidr6=$(lua -l luci.ip -e "ip=luci.ip.new(\"$ip6\"); print(ip:network():string()..'/'..ip:prefix())") + cidr4=$(lua -l luci.ip -e "ip=luci.ip.new(\"$ip4\"); print(ip:network():string()..'/'..ip:prefix())") + echo -n "{\"myself\":{\"hostname\":\"$hostname\",\"ip6\":\"$ip6\",\"ip4\":\"$ip4\",\"net6\":\"$cidr6\",\"net4\":\"$cidr4\"}}" + exit 0 +fi + if [ "$QUERY" == '$info' ]; then - echo '{ "info": [ ' - print_query status - echo -n "," - print_query interfaces - echo "] }" + echo -n '{ "info": [ ' + print_query status + echo -n "," + print_query interfaces + echo -n "] }" + exit 0 fi if [ "$QUERY" == '$neighbours' ]; then - QALL=1 - echo '{ "neighbours": [ ' - echo '{ "originators": ' - print_query originators - echo '}, ' - echo '{ "descriptions": ' - print_query descriptions - echo "} ] }" - exit 0 - -else if [ "$QUERY" == '$tunnels' ]; then - bmx6 -c --jshow tunnels /r=0 - exit 0 + QALL=1 + echo -n '{ "neighbours": [ ' + echo -n '{ "originators": ' + print_query originators + echo -n '}, ' + echo -n '{ "descriptions": ' + print_query descriptions + echo -n "} ] }" + exit 0 +fi -else - check_path "$BMX6_DIR/$QUERY" - print_query $QUERY - exit 0 +if [ "$QUERY" == '$tunnels' ]; then + bmx6 -c --jshow tunnels /r=0 + exit 0 fi + +if [ "$QUERY" == "" ]; then + echo -n '{ "queries": [' + echo -n '{ "name": "$myself", "info": "basic network information of self node" },' + echo -n '{ "name": "$info", "info": "full network and device information of self node" },' + echo -n '{ "name": "$tunnels", "info": "accnouncements (tunnels) published by the mesh network" },' + echo -n '{ "name": "$neighbours", "info": "list of all my neighbours and their information" },' + echo -n '{ "name": "/", "info": "raw bmx6 json API" }]}' + exit 0 fi -ls -1F "$BMX6_DIR" -exit 0 +check_path "$BMX6_DIR/$QUERY" +print_query $QUERY +#ls -1F "$BMX6_DIR" +exit 0 -- 2.35.1