base-files: various enhancements to network.sh
- support reading inactive gateways and DNS information in network_get_gateway(), network_get_dnsserver() and network_get_dnssearch() by passing "true" as optional last argument - internally cache fetched values to speed up subsequent accesses to the same data, introduce network_flush_cache() to clear them - add some inline function documentation SVN-Revision: 34722
This commit is contained in:
		@@ -11,7 +11,7 @@ include $(INCLUDE_DIR)/kernel.mk
 | 
				
			|||||||
include $(INCLUDE_DIR)/version.mk
 | 
					include $(INCLUDE_DIR)/version.mk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PKG_NAME:=base-files
 | 
					PKG_NAME:=base-files
 | 
				
			||||||
PKG_RELEASE:=120
 | 
					PKG_RELEASE:=121
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PKG_FILE_DEPENDS:=$(PLATFORM_DIR)/ $(GENERIC_PLATFORM_DIR)/base-files/
 | 
					PKG_FILE_DEPENDS:=$(PLATFORM_DIR)/ $(GENERIC_PLATFORM_DIR)/base-files/
 | 
				
			||||||
PKG_BUILD_DEPENDS:=opkg/host
 | 
					PKG_BUILD_DEPENDS:=opkg/host
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,11 +1,40 @@
 | 
				
			|||||||
. /usr/share/libubox/jshn.sh
 | 
					. /usr/share/libubox/jshn.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__network_switch_inactive()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						local __tmp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if [ "$1" = 0 ] || [ "$1" = false ]; then
 | 
				
			||||||
 | 
							return 1
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						json_get_type __tmp "inactive"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if [ "$__tmp" = object ]; then
 | 
				
			||||||
 | 
							json_select "inactive"
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__network_set_cache()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						__NETWORK_CACHE="${__NETWORK_CACHE:+$__NETWORK_CACHE }__NETWORK_CV_$1"
 | 
				
			||||||
 | 
						eval "__NETWORK_CV_$1='\$$2'"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__network_get_cache()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						eval "[ -n \"\${__NETWORK_CV_$1+x}\" ] && export -- \"$2=\$__NETWORK_CV_$1\""
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
__network_ipaddr()
 | 
					__network_ipaddr()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	local __var="$1"
 | 
						local __var="$1"
 | 
				
			||||||
	local __iface="$2"
 | 
						local __iface="$2"
 | 
				
			||||||
	local __family="$3"
 | 
						local __family="$3"
 | 
				
			||||||
	local __prefix="${4:-0}"
 | 
						local __prefix="$4"
 | 
				
			||||||
 | 
						local __key="ipaddr_${2}_${3}_${4}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						__network_get_cache "$__key" "$__var" && return 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local __tmp="$(ubus call network.interface."$__iface" status 2>/dev/null)"
 | 
						local __tmp="$(ubus call network.interface."$__iface" status 2>/dev/null)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -27,6 +56,7 @@ __network_ipaddr()
 | 
				
			|||||||
				eval "export -- \"$__var=\${$__var}/$__tmp\""
 | 
									eval "export -- \"$__var=\${$__var}/$__tmp\""
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								__network_set_cache "$__key" "$__var"
 | 
				
			||||||
			return 0
 | 
								return 0
 | 
				
			||||||
		fi
 | 
							fi
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
@@ -34,10 +64,24 @@ __network_ipaddr()
 | 
				
			|||||||
	return 1
 | 
						return 1
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# determine IPv4 address of given logical interface
 | 
				
			||||||
 | 
					# 1: destination variable
 | 
				
			||||||
 | 
					# 2: interface
 | 
				
			||||||
network_get_ipaddr()  { __network_ipaddr "$1" "$2" 4 0; }
 | 
					network_get_ipaddr()  { __network_ipaddr "$1" "$2" 4 0; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# determine IPv6 address of given logical interface
 | 
				
			||||||
 | 
					# 1: destination variable
 | 
				
			||||||
 | 
					# 2: interface
 | 
				
			||||||
network_get_ipaddr6() { __network_ipaddr "$1" "$2" 6 0; }
 | 
					network_get_ipaddr6() { __network_ipaddr "$1" "$2" 6 0; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# determine IPv4 subnet of given logical interface
 | 
				
			||||||
 | 
					# 1: destination variable
 | 
				
			||||||
 | 
					# 2: interface
 | 
				
			||||||
network_get_subnet()  { __network_ipaddr "$1" "$2" 4 1; }
 | 
					network_get_subnet()  { __network_ipaddr "$1" "$2" 4 1; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# determine IPv6 subnet of given logical interface
 | 
				
			||||||
 | 
					# 1: destination variable
 | 
				
			||||||
 | 
					# 2: interface
 | 
				
			||||||
network_get_subnet6() { __network_ipaddr "$1" "$2" 6 1; }
 | 
					network_get_subnet6() { __network_ipaddr "$1" "$2" 6 1; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -46,16 +90,21 @@ __network_gateway()
 | 
				
			|||||||
	local __var="$1"
 | 
						local __var="$1"
 | 
				
			||||||
	local __iface="$2"
 | 
						local __iface="$2"
 | 
				
			||||||
	local __family="$3"
 | 
						local __family="$3"
 | 
				
			||||||
 | 
						local __key="gateway_${2}_${3}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						__network_get_cache "$__key" "$__var" && return 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local __tmp="$(ubus call network.interface."$__iface" status 2>/dev/null)"
 | 
						local __tmp="$(ubus call network.interface."$__iface" status 2>/dev/null)"
 | 
				
			||||||
	local __idx=1
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	json_load "${__tmp:-{}}"
 | 
						json_load "${__tmp:-{}}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for __tmp in 0 1; do
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if json_get_type __tmp route && [ "$__tmp" = array ]; then
 | 
							if json_get_type __tmp route && [ "$__tmp" = array ]; then
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			json_select route
 | 
								json_select route
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								local __idx=1
 | 
				
			||||||
			while json_get_type __tmp "$__idx" && [ "$__tmp" = object ]; do
 | 
								while json_get_type __tmp "$__idx" && [ "$__tmp" = object ]; do
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				json_select "$((__idx++))"
 | 
									json_select "$((__idx++))"
 | 
				
			||||||
@@ -64,6 +113,7 @@ __network_gateway()
 | 
				
			|||||||
				case "${__family}/${__tmp}" in
 | 
									case "${__family}/${__tmp}" in
 | 
				
			||||||
					4/0.0.0.0|6/::)
 | 
										4/0.0.0.0|6/::)
 | 
				
			||||||
						json_get_var "$__var" nexthop
 | 
											json_get_var "$__var" nexthop
 | 
				
			||||||
 | 
											__network_set_cache "$__key" "$__var"
 | 
				
			||||||
						return $?
 | 
											return $?
 | 
				
			||||||
					;;
 | 
										;;
 | 
				
			||||||
				esac
 | 
									esac
 | 
				
			||||||
@@ -71,54 +121,96 @@ __network_gateway()
 | 
				
			|||||||
				json_select ".."
 | 
									json_select ".."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			done
 | 
								done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								json_select ".."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		fi
 | 
							fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							__network_switch_inactive "$4" || break
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 1
 | 
						return 1
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
network_get_gateway()  { __network_gateway "$1" "$2" 4; }
 | 
					# determine IPv4 gateway of given logical interface
 | 
				
			||||||
network_get_gateway6() { __network_gateway "$1" "$2" 6; }
 | 
					# 1: destination variable
 | 
				
			||||||
 | 
					# 2: interface
 | 
				
			||||||
 | 
					# 3: consider inactive gateway if "true" (optional)
 | 
				
			||||||
 | 
					network_get_gateway()  { __network_gateway "$1" "$2" 4 "${3:-0}"; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# determine  IPv6 gateway of given logical interface
 | 
				
			||||||
 | 
					# 1: destination variable
 | 
				
			||||||
 | 
					# 2: interface
 | 
				
			||||||
 | 
					# 3: consider inactive gateway if "true" (optional)
 | 
				
			||||||
 | 
					network_get_gateway6() { __network_gateway "$1" "$2" 6 "${3:-0}"; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
__network_dns() {
 | 
					__network_dns() {
 | 
				
			||||||
	local __var="$1"
 | 
						local __var="$1"
 | 
				
			||||||
	local __iface="$2"
 | 
						local __iface="$2"
 | 
				
			||||||
	local __field="$3"
 | 
						local __field="$3"
 | 
				
			||||||
 | 
						local __key="dns_${2}_${3}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						__network_get_cache "$__key" "$__var" && return 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local __tmp="$(ubus call network.interface."$__iface" status 2>/dev/null)"
 | 
						local __tmp="$(ubus call network.interface."$__iface" status 2>/dev/null)"
 | 
				
			||||||
	local __dns=""
 | 
						local __dns=""
 | 
				
			||||||
	local __idx=1
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	json_load "${__tmp:-{}}"
 | 
						json_load "${__tmp:-{}}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for __tmp in 0 1; do
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if json_get_type __tmp "$__field" && [ "$__tmp" = array ]; then
 | 
							if json_get_type __tmp "$__field" && [ "$__tmp" = array ]; then
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			json_select "$__field"
 | 
								json_select "$__field"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								local __idx=1
 | 
				
			||||||
			while json_get_type __tmp "$__idx" && [ "$__tmp" = string ]; do
 | 
								while json_get_type __tmp "$__idx" && [ "$__tmp" = string ]; do
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				json_get_var __tmp "$((__idx++))"
 | 
									json_get_var __tmp "$((__idx++))"
 | 
				
			||||||
				__dns="${__dns:+$__dns }$__tmp"
 | 
									__dns="${__dns:+$__dns }$__tmp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			done
 | 
								done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								json_select ".."
 | 
				
			||||||
		fi
 | 
							fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							__network_switch_inactive "$4" || break
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if [ -n "$__dns" ]; then
 | 
				
			||||||
		eval "export -- \"$__var=$__dns\""
 | 
							eval "export -- \"$__var=$__dns\""
 | 
				
			||||||
	[ -n "$__dns" ]
 | 
							__network_set_cache "$__key" "$__var"
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
network_get_dnsserver() { __network_dns "$1" "$2" dns_server; }
 | 
					# determine the DNS servers of the given logical interface
 | 
				
			||||||
network_get_dnssearch() { __network_dns "$1" "$2" dns_search; }
 | 
					# 1: destination variable
 | 
				
			||||||
 | 
					# 2: interface
 | 
				
			||||||
 | 
					# 3: consider inactive servers if "true" (optional)
 | 
				
			||||||
 | 
					network_get_dnsserver() { __network_dns "$1" "$2" dns_server "${3:-0}"; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# determine the domains of the given logical interface
 | 
				
			||||||
 | 
					# 1: destination variable
 | 
				
			||||||
 | 
					# 2: interface
 | 
				
			||||||
 | 
					# 3: consider inactive servers if "true" (optional)
 | 
				
			||||||
 | 
					network_get_dnssearch() { __network_dns "$1" "$2" dns_search "${3:-0}"; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
__network_wan() {
 | 
					__network_wan() {
 | 
				
			||||||
	local __var="$1"
 | 
						local __var="$1"
 | 
				
			||||||
	local __family="$2"
 | 
						local __family="$2"
 | 
				
			||||||
 | 
						local __key="wan_${2}"
 | 
				
			||||||
	local __iface
 | 
						local __iface
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						__network_get_cache "$__key" "$__var" && return 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for __iface in $(ubus list | sed -ne 's/^network\.interface\.//p'); do
 | 
						for __iface in $(ubus list | sed -ne 's/^network\.interface\.//p'); do
 | 
				
			||||||
		if __network_gateway "$__var" "$__iface" "$__family"; then
 | 
							if __network_gateway "$__var" "$__iface" "$__family"; then
 | 
				
			||||||
			eval "export -- \"$__var=$__iface\""
 | 
								eval "export -- \"$__var=$__iface\""
 | 
				
			||||||
 | 
								__network_set_cache "$__key" "$__var"
 | 
				
			||||||
			return 0
 | 
								return 0
 | 
				
			||||||
		fi
 | 
							fi
 | 
				
			||||||
	done
 | 
						done
 | 
				
			||||||
@@ -127,7 +219,12 @@ __network_wan() {
 | 
				
			|||||||
	return 1
 | 
						return 1
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# find the logical interface which holds the current IPv4 default route
 | 
				
			||||||
 | 
					# 1: destination variable
 | 
				
			||||||
network_find_wan()  { __network_wan "$1" 4; }
 | 
					network_find_wan()  { __network_wan "$1" 4; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# find the logical interface which holds the current IPv6 default route
 | 
				
			||||||
 | 
					# 1: destination variable
 | 
				
			||||||
network_find_wan6() { __network_wan "$1" 6; }
 | 
					network_find_wan6() { __network_wan "$1" 6; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -136,21 +233,33 @@ __network_device()
 | 
				
			|||||||
	local __var="$1"
 | 
						local __var="$1"
 | 
				
			||||||
	local __iface="$2"
 | 
						local __iface="$2"
 | 
				
			||||||
	local __field="$3"
 | 
						local __field="$3"
 | 
				
			||||||
 | 
						local __key="device_${2}_${3}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						__network_get_cache "$__key" "$__var" && return 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local __tmp="$(ubus call network.interface."$__iface" status 2>/dev/null)"
 | 
						local __tmp="$(ubus call network.interface."$__iface" status 2>/dev/null)"
 | 
				
			||||||
	[ -n "$__tmp" ] || return 1
 | 
						[ -n "$__tmp" ] || return 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	json_load "$__tmp"
 | 
						json_load "$__tmp"
 | 
				
			||||||
	json_get_var "$__var" "$__field"
 | 
						json_get_var "$__var" "$__field" && __network_set_cache "$__key" "$__var"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# test whether the given logical interface is running
 | 
				
			||||||
 | 
					# 1: interface
 | 
				
			||||||
network_is_up()
 | 
					network_is_up()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	local __up
 | 
						local __up
 | 
				
			||||||
	__network_device __up "$1" up && [ $__up -eq 1 ]
 | 
						__network_device __up "$1" up && [ $__up -eq 1 ]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# determine the layer 3 linux network device of the given logical interface
 | 
				
			||||||
 | 
					# 1: destination variable
 | 
				
			||||||
 | 
					# 2: interface
 | 
				
			||||||
network_get_device()  { __network_device "$1" "$2" l3_device; }
 | 
					network_get_device()  { __network_device "$1" "$2" l3_device; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# determine the layer 2 linux network device of the given logical interface
 | 
				
			||||||
 | 
					# 1: destination variable
 | 
				
			||||||
 | 
					# 2: interface
 | 
				
			||||||
network_get_physdev() { __network_device "$1" "$2" device;    }
 | 
					network_get_physdev() { __network_device "$1" "$2" device;    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -166,5 +275,19 @@ __network_defer()
 | 
				
			|||||||
	ubus call network.device set_state "$(json_dump)" 2>/dev/null
 | 
						ubus call network.device set_state "$(json_dump)" 2>/dev/null
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# defer netifd actions on the given linux network device
 | 
				
			||||||
 | 
					# 1: device name
 | 
				
			||||||
network_defer_device() { __network_defer "$1" 1; }
 | 
					network_defer_device() { __network_defer "$1" 1; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# continue netifd actions on the given linux network device
 | 
				
			||||||
 | 
					# 1: device name
 | 
				
			||||||
network_ready_device() { __network_defer "$1" 0; }
 | 
					network_ready_device() { __network_defer "$1" 0; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# flush the internal value cache to force re-reading values from ubus
 | 
				
			||||||
 | 
					network_flush_cache()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						local __tmp
 | 
				
			||||||
 | 
						for __tmp in $__NETWORK_CACHE __NETWORK_CACHE; do
 | 
				
			||||||
 | 
							unset "$__tmp"
 | 
				
			||||||
 | 
						done
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user