From patchwork Wed Jun 17 21:46:51 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [1/2] fff-vpn-select: make vpn-select modular From: Robert Langhammer X-Patchwork-Id: 1398 Message-Id: <20200617214652.4933-1-rlanghammer@web.de> To: franken-dev@freifunk.net Date: Wed, 17 Jun 2020 23:46:51 +0200 vpn-select is an old relic and did not reflect the opportunities of our hoodfile. This rewrite makes vpn-select modular to easely add new vpn-protocols. The stuff dependent on the vpn-protocol is outsourced to files in /etc/vpn-select.d and comes in with the respective vpn package. Signed-off-by: Robert Langhammer --- .../fff-vpn-select/files/usr/sbin/vpn-select | 83 ++++++------------- 1 file changed, 27 insertions(+), 56 deletions(-) -- 2.20.1 diff --git a/src/packages/fff/fff-vpn-select/files/usr/sbin/vpn-select b/src/packages/fff/fff-vpn-select/files/usr/sbin/vpn-select index 30883f5..bf9c199 100755 --- a/src/packages/fff/fff-vpn-select/files/usr/sbin/vpn-select +++ b/src/packages/fff/fff-vpn-select/files/usr/sbin/vpn-select @@ -1,65 +1,36 @@ #!/bin/sh # Usage: vpn-select +# To add a new protocol, put a file with two functions to /etc/vpn-select.d/ . +# The function ${protocol}_config is called for every peer in hoodfile. +# The second function ${protocol}_start_stop is called once per installed protocol . /usr/share/libubox/jshn.sh hoodfile="$1" - -make_config() { - # remove old config - rm /tmp/fastd_fff_peers/* - - # prepare - Index=1 - json_load "$(cat "$hoodfile")" - json_select vpn - - # get fastd peers - while json_select "$Index" > /dev/null - do - json_get_var protocol protocol - if [ "$protocol" = "fastd" ]; then - # set up fastd - json_get_var servername name - filename="/etc/fastd/fff/peers/$servername" - echo "#name \"${servername}\";" > "$filename" - json_get_var key key - echo "key \"${key}\";" >> "$filename" - json_get_var address address - json_get_var port port - echo "remote \"${address}\" port ${port};" >> "$filename" - echo "" >> "$filename" - echo "float yes;" >> "$filename" - fi - json_select ".." # back to vpn - Index=$(( Index + 1 )) - done - json_select ".." # back to root -} - # Only do something if file is there and not empty; otherwise exit 1 -if [ -s "$hoodfile" ]; then - if [ ! -d /tmp/fastd_fff_peers ]; then - # first run after reboot - mkdir /tmp/fastd_fff_peers - make_config - # start fastd only if there are some peers - [ "$(ls /etc/fastd/fff/peers/* 2>/dev/null)" ] && /etc/init.d/fastd start - else - make_config - /etc/init.d/fastd reload +[ -s "$hoodfile" ] || exit 1 + +# source functions +for file in /etc/vpn-select.d/*; do + . "$file" +done + +# load hoodfile +json_load "$(cat "$hoodfile")" +json_select vpn + +# configure vpn +index=1 +while json_select "$index" > /dev/null ; do + json_get_var protocol protocol + "${protocol}_config" + json_select ".." # back to vpn + index=$(( index + 1 )) +done + +# start/restart/stop vpnservices +for protocol in $(grep "_start_stop()" /etc/vpn-select.d/* | cut -f1 -d\(); do + "${protocol}" +done - # fastd start/stop for various situations - pidfile="/tmp/run/fastd.fff.pid" - if [ "$(ls /etc/fastd/fff/peers/* 2>/dev/null)" ]; then - ([ -s "$pidfile" ] && [ -d "/proc/$(cat "$pidfile")" ]) || /etc/init.d/fastd start - else - ([ -s "$pidfile" ] && [ -d "/proc/$(cat "$pidfile")" ]) && /etc/init.d/fastd stop - fi - fi - exit 0 -else - echo "vpn-select: Hood file not found or empty!" - exit 1 -fi