b.liu | e958203 | 2025-04-17 19:18:16 +0800 | [diff] [blame] | 1 | #!/bin/sh |
| 2 | |
| 3 | . /usr/share/libubox/jshn.sh |
| 4 | |
| 5 | hostsfile_getname() |
| 6 | { |
| 7 | local config="$1" |
| 8 | local i=0 |
| 9 | local value file |
| 10 | |
| 11 | while value="$( uci -q get $config.@LoadPlugin[$i].library )"; do { |
| 12 | case "$value" in |
| 13 | 'olsrd_nameservice'*) |
| 14 | file="$( uci -q get $config.@LoadPlugin[$i].hosts_file )" |
| 15 | break |
| 16 | ;; |
| 17 | esac |
| 18 | |
| 19 | i=$(( i + 1 )) |
| 20 | } done |
| 21 | |
| 22 | echo "${file:-/var/run/hosts_olsr}" |
| 23 | } |
| 24 | |
| 25 | read_hostnames() |
| 26 | { |
| 27 | local file_list=" $( hostsfile_getname 'olsrd' ) $(hostsfile_getname 'olsrd6' ) " |
| 28 | local line ip hostname file file_list_uniq |
| 29 | |
| 30 | for file in $file_list; do { |
| 31 | case " $file_list_uniq " in |
| 32 | *" $file "*) |
| 33 | ;; |
| 34 | *) |
| 35 | file_list_uniq="$file_list_uniq $file" |
| 36 | ;; |
| 37 | esac |
| 38 | } done |
| 39 | |
| 40 | for file in $file_list_uniq; do { |
| 41 | [ -e "$file" ] || continue |
| 42 | |
| 43 | while read -r line; do { |
| 44 | case "$line" in |
| 45 | [0-9]*) |
| 46 | # 2001:ffff:ffff:ffff::1 SomeNode-core.olsr # myself |
| 47 | # 10.0.0.1 SomeNode # 10.0.0.1 |
| 48 | set -f |
| 49 | set +f -- $line |
| 50 | ip="$1" |
| 51 | hostname="$2" |
| 52 | |
| 53 | # global vars, e.g. |
| 54 | # IP_1_2_3_4='foo' or IP_2001_ffff_ffff_ffff__1='bar' |
| 55 | eval IP_${ip//[.:]/_}="$hostname" |
| 56 | ;; |
| 57 | esac |
| 58 | } done <"$file" |
| 59 | } done |
| 60 | } |
| 61 | |
| 62 | read_hostnames |
| 63 | |
| 64 | VARS='localIP:Local remoteIP:Remote validityTime:vTime linkQuality:LQ' |
| 65 | VARS="$VARS neighborLinkQuality:NLQ linkCost:Cost remoteHostname:Host" |
| 66 | |
| 67 | for HOST in '127.0.0.1' '::1';do |
| 68 | # check for availability of HOST |
| 69 | nc $HOST 9090 >/dev/null 2>&1 |
| 70 | if [ $? != 0 ]; then |
| 71 | continue |
| 72 | fi |
| 73 | |
| 74 | json_init |
| 75 | json_load "$( echo /links | nc $HOST 9090 | sed -n '/^[}{ ]/p' )" # remove header/non-json |
| 76 | |
| 77 | if json_is_a links array;then |
| 78 | json_select links |
| 79 | for v in ${VARS};do |
| 80 | eval _${v%:*}=0 |
| 81 | done |
| 82 | for j in 0 1;do |
| 83 | case ${j} in 1) |
| 84 | for v in ${VARS};do |
| 85 | eval printf \"%-\${_${v%:*}}s \" ${v#*:} |
| 86 | done |
| 87 | echo |
| 88 | ;;esac |
| 89 | i=1;while json_is_a ${i} object;do |
| 90 | json_select ${i} |
| 91 | json_get_vars $(for v in ${VARS};do echo ${v%:*};done) |
| 92 | case ${j} in 0) |
| 93 | for v in ${VARS};do |
| 94 | eval "test \${_${v%:*}} -lt \${#${v%:*}} && _${v%:*}=\${#${v%:*}}" |
| 95 | done |
| 96 | ;;*) |
| 97 | for v in ${VARS};do |
| 98 | eval printf \"%-\${_${v%:*}}s \" \$${v%:*} |
| 99 | eval remoteHostname="\$IP_${remoteIP//[.:]/_}" |
| 100 | done |
| 101 | echo |
| 102 | ;;esac |
| 103 | json_select .. |
| 104 | i=$(( i + 1 )) |
| 105 | done |
| 106 | done |
| 107 | fi |
| 108 | echo |
| 109 | done |