mirror of
https://github.com/coolsnowwolf/packages.git
synced 2025-05-02 00:39:12 +08:00
142 lines
2.6 KiB
Bash
Executable File
142 lines
2.6 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
[ -n "$INCLUDE_ONLY" ] || {
|
|
. /lib/functions.sh
|
|
. ../netifd-proto.sh
|
|
init_proto "$@"
|
|
}
|
|
|
|
proto_external_init_config() {
|
|
no_device=0
|
|
available=0
|
|
|
|
proto_config_add_string "device:device"
|
|
proto_config_add_string "searchdomain"
|
|
proto_config_add_int "delay"
|
|
}
|
|
|
|
proto_external_setup() {
|
|
local cfg="$1"
|
|
local iface="$2"
|
|
local device searchdomain delay
|
|
|
|
json_get_vars device searchdomain delay
|
|
|
|
[ -n "$device" ] || {
|
|
echo "External protocol interface is not specified"
|
|
proto_notify_error "$cfg" NO_DEVICE
|
|
proto_set_available "$cfg" 0
|
|
return 1
|
|
}
|
|
|
|
[ -n "$delay" ] && sleep "$delay"
|
|
|
|
[ -L "/sys/class/net/${iface}" ] || {
|
|
echo "External protocol interface $iface is not present"
|
|
proto_notify_error "$cfg" NO_DEVICE
|
|
proto_set_available "$cfg" 0
|
|
return 1
|
|
}
|
|
|
|
IP4ADDRS=
|
|
IP6ADDRS=
|
|
|
|
local addresses="$(ip -json address list dev "$iface")"
|
|
json_init
|
|
json_load "{\"addresses\":${addresses}}"
|
|
|
|
if json_is_a addresses array; then
|
|
json_select addresses
|
|
json_select 1
|
|
|
|
if json_is_a addr_info array; then
|
|
json_select addr_info
|
|
|
|
local i=1
|
|
while json_is_a ${i} object; do
|
|
json_select ${i}
|
|
json_get_vars scope family local prefixlen broadcast
|
|
|
|
if [ "${scope}" == "global" ]; then
|
|
case "${family}" in
|
|
inet)
|
|
append IP4ADDRS "$local/$prefixlen/$broadcast/"
|
|
;;
|
|
|
|
inet6)
|
|
append IP6ADDRS "$local/$prefixlen/$broadcast///"
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
json_select ..
|
|
i=$(( i + 1 ))
|
|
done
|
|
fi
|
|
fi
|
|
|
|
IP4ROUTES=
|
|
IP6ROUTES=
|
|
|
|
local routes="$(ip -json route list dev "$iface")"
|
|
json_init
|
|
json_load "{\"routes\":${routes}}"
|
|
|
|
if json_is_a routes array;then
|
|
json_select routes
|
|
|
|
local i=1
|
|
while json_is_a ${i} object; do
|
|
json_select ${i}
|
|
json_get_vars dst gateway metric prefsrc
|
|
|
|
case "${dst}" in
|
|
*:*/*)
|
|
append IP6ROUTES "$dst/$gateway/$metric///$prefsrc"
|
|
;;
|
|
*.*/*)
|
|
append IP4ROUTES "$dst/$gateway/$metric///$prefsrc"
|
|
;;
|
|
*:*)
|
|
append IP6ROUTES "$dst/128/$gateway/$metric///$prefsrc"
|
|
;;
|
|
*.*)
|
|
append IP4ROUTES "$dst/32/$gateway/$metric///$prefsrc"
|
|
;;
|
|
esac
|
|
|
|
json_select ..
|
|
i=$(( i + 1 ))
|
|
done
|
|
fi
|
|
|
|
[ -z "${IP4ADDRS}" -a -z "${IP6ADDRS}" ] && {
|
|
echo "interface $iface does not have ip address"
|
|
proto_notify_error "$cfg" NO_IPADDRESS
|
|
return 1
|
|
}
|
|
|
|
proto_init_update "$iface" 1
|
|
|
|
PROTO_IPADDR="${IP4ADDRS}"
|
|
PROTO_IP6ADDR="${IP6ADDRS}"
|
|
|
|
PROTO_ROUTE="${IP4ROUTES}"
|
|
PROTO_ROUTE6="${IP6ROUTES}"
|
|
|
|
[ -n "$searchdomain" ] && proto_add_dns_search "$searchdomain"
|
|
|
|
echo "$iface is up"
|
|
|
|
proto_send_update "$cfg"
|
|
}
|
|
|
|
proto_external_teardown() {
|
|
local cfg="$1"
|
|
return 0
|
|
}
|
|
|
|
[ -n "$INCLUDE_ONLY" ] || {
|
|
add_protocol external
|
|
}
|