mirror of
				https://github.com/Ysurac/openmptcprouter.git
				synced 2025-03-09 15:40:20 +00:00 
			
		
		
		
	Fixes for RUTX50/12 with 6.1 kernel
This commit is contained in:
		
							parent
							
								
									facff1658d
								
							
						
					
					
						commit
						501a471507
					
				
					 5 changed files with 493 additions and 1235 deletions
				
			
		
							
								
								
									
										249
									
								
								6.1/target/linux/ipq40xx/base-files/etc/board.d/02_network
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										249
									
								
								6.1/target/linux/ipq40xx/base-files/etc/board.d/02_network
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,249 @@
 | 
			
		|||
#
 | 
			
		||||
# Copyright (c) 2015 The Linux Foundation. All rights reserved.
 | 
			
		||||
# Copyright (c) 2011-2015 OpenWrt.org
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
. /lib/functions/uci-defaults.sh
 | 
			
		||||
. /lib/functions/system.sh
 | 
			
		||||
 | 
			
		||||
ipq40xx_setup_interfaces()
 | 
			
		||||
{
 | 
			
		||||
	local board="$1"
 | 
			
		||||
 | 
			
		||||
	case "$board" in
 | 
			
		||||
	8dev,habanero-dvk|\
 | 
			
		||||
	avm,fritzbox-4040|\
 | 
			
		||||
	asus,rt-ac42u|\
 | 
			
		||||
	asus,rt-ac58u|\
 | 
			
		||||
	linksys,ea6350v3|\
 | 
			
		||||
	linksys,ea8300|\
 | 
			
		||||
	linksys,mr8300|\
 | 
			
		||||
	mikrotik,hap-ac2|\
 | 
			
		||||
	mikrotik,hap-ac3|\
 | 
			
		||||
	mikrotik,hap-ac3-lte6-kit|\
 | 
			
		||||
	p2w,r619ac-64m|\
 | 
			
		||||
	p2w,r619ac-128m|\
 | 
			
		||||
	pakedge,wr-1|\
 | 
			
		||||
	teltonika,rutx12|\
 | 
			
		||||
	teltonika,rutx50|\
 | 
			
		||||
	yyets,le1|\
 | 
			
		||||
	zyxel,nbg6617)
 | 
			
		||||
		ucidef_set_interfaces_lan_wan "lan1 lan2 lan3 lan4" "wan"
 | 
			
		||||
		;;
 | 
			
		||||
	8dev,jalapeno|\
 | 
			
		||||
	alfa-network,ap120c-ac|\
 | 
			
		||||
	asus,map-ac2200|\
 | 
			
		||||
	cilab,meshpoint-one|\
 | 
			
		||||
	edgecore,ecw5211|\
 | 
			
		||||
	glinet,gl-ap1300|\
 | 
			
		||||
	glinet,gl-b2200|\
 | 
			
		||||
	google,wifi|\
 | 
			
		||||
	linksys,whw03v2|\
 | 
			
		||||
	luma,wrtq-329acn|\
 | 
			
		||||
	mikrotik,cap-ac|\
 | 
			
		||||
	netgear,wac510|\
 | 
			
		||||
	sony,ncp-hg100-cellular|\
 | 
			
		||||
	wallys,dr40x9|\
 | 
			
		||||
	zte,mf18a|\
 | 
			
		||||
	zte,mf289f)
 | 
			
		||||
		ucidef_set_interfaces_lan_wan "lan" "wan"
 | 
			
		||||
		;;
 | 
			
		||||
	aruba,ap-303|\
 | 
			
		||||
	aruba,ap-365|\
 | 
			
		||||
	avm,fritzrepeater-1200|\
 | 
			
		||||
	dlink,dap-2610|\
 | 
			
		||||
	extreme-networks,ws-ap3915i|\
 | 
			
		||||
	meraki,mr33|\
 | 
			
		||||
	meraki,mr74|\
 | 
			
		||||
	mikrotik,lhgg-60ad|\
 | 
			
		||||
	mikrotik,sxtsq-5-ac|\
 | 
			
		||||
	netgear,ex6100v2|\
 | 
			
		||||
	netgear,ex6150v2|\
 | 
			
		||||
	zte,mf282plus)
 | 
			
		||||
		ucidef_set_interface_lan "lan"
 | 
			
		||||
		;;
 | 
			
		||||
	avm,fritzbox-7530)
 | 
			
		||||
		ucidef_set_interface_lan "lan1 lan2 lan3 lan4"
 | 
			
		||||
		;;
 | 
			
		||||
	avm,fritzrepeater-3000|\
 | 
			
		||||
	cellc,rtl30vw)
 | 
			
		||||
		ucidef_set_interface_lan "lan1 lan2"
 | 
			
		||||
		;;
 | 
			
		||||
	compex,wpj428)
 | 
			
		||||
		ucidef_set_interface_lan "lan1 lan2"
 | 
			
		||||
		;;
 | 
			
		||||
	devolo,magic-2-wifi-next)
 | 
			
		||||
		ucidef_set_interface_lan "lan1 lan2 ghn"
 | 
			
		||||
		;;
 | 
			
		||||
	extreme-networks,ws-ap391x)
 | 
			
		||||
		ucidef_set_interfaces_lan_wan "sw-eth1 sw-eth2 sw-eth3 sw-eth5" "sw-eth4"
 | 
			
		||||
		;;
 | 
			
		||||
	linksys,whw01)
 | 
			
		||||
		ucidef_set_interface_lan "eth1 eth2"
 | 
			
		||||
		;;
 | 
			
		||||
	glinet,gl-a1300|\
 | 
			
		||||
	glinet,gl-b1300|\
 | 
			
		||||
	mobipromo,cm520-79f)
 | 
			
		||||
		ucidef_set_interfaces_lan_wan "lan1 lan2" "wan"
 | 
			
		||||
		;;
 | 
			
		||||
	mikrotik,wap-ac|\
 | 
			
		||||
	mikrotik,wap-ac-lte|\
 | 
			
		||||
	mikrotik,wap-r-ac)
 | 
			
		||||
		ucidef_set_interface_lan "sw-eth1 sw-eth2"
 | 
			
		||||
		;;
 | 
			
		||||
	aruba,ap-303h|\
 | 
			
		||||
	buffalo,wtr-m2133hp|\
 | 
			
		||||
	ezviz,cs-w3-wd1200g-eup|\
 | 
			
		||||
	netgear,rbr40|\
 | 
			
		||||
	netgear,rbs40|\
 | 
			
		||||
	netgear,rbr50|\
 | 
			
		||||
	netgear,rbs50|\
 | 
			
		||||
	netgear,srr60|\
 | 
			
		||||
	netgear,srs60)
 | 
			
		||||
		ucidef_set_interfaces_lan_wan "lan1 lan2 lan3" "wan"
 | 
			
		||||
		;;
 | 
			
		||||
	openmesh,a42|\
 | 
			
		||||
	openmesh,a62)
 | 
			
		||||
		ucidef_set_interfaces_lan_wan "ethernet2" "ethernet1"
 | 
			
		||||
		;;
 | 
			
		||||
	plasmacloud,pa1200|\
 | 
			
		||||
	plasmacloud,pa2200)
 | 
			
		||||
		ucidef_set_interfaces_lan_wan "ethernet1" "ethernet2"
 | 
			
		||||
		;;
 | 
			
		||||
	qxwlan,e2600ac-c1)
 | 
			
		||||
		ucidef_set_interfaces_lan_wan "sw-eth1" "sw-eth2"
 | 
			
		||||
		;;
 | 
			
		||||
	qxwlan,e2600ac-c2)
 | 
			
		||||
		ucidef_set_interfaces_lan_wan "sw-eth1 sw-eth2" "sw-eth3"
 | 
			
		||||
		;;
 | 
			
		||||
	zte,mf286d)
 | 
			
		||||
		ucidef_set_interfaces_lan_wan "lan2 lan3 lan4" "wan"
 | 
			
		||||
		;;
 | 
			
		||||
	zte,mf287|\
 | 
			
		||||
	zte,mf287plus|\
 | 
			
		||||
	zte,mf287pro)
 | 
			
		||||
		ucidef_set_interface_lan "lan1 lan2 lan3 lan4"
 | 
			
		||||
		ucidef_set_interface "wan" device "/dev/cdc-wdm0" protocol "qmi"
 | 
			
		||||
		;;
 | 
			
		||||
	*)
 | 
			
		||||
		echo "Unsupported hardware. Network interfaces not initialized"
 | 
			
		||||
		;;
 | 
			
		||||
	esac
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ipq40xx_setup_dsl()
 | 
			
		||||
{
 | 
			
		||||
	local board="$1"
 | 
			
		||||
	local annex="j"
 | 
			
		||||
	local tone="b"
 | 
			
		||||
	local xfer_mode=""
 | 
			
		||||
 | 
			
		||||
	case "$board" in
 | 
			
		||||
	avm,fritzbox-7530)
 | 
			
		||||
		;;
 | 
			
		||||
	*)
 | 
			
		||||
		return 0
 | 
			
		||||
		;;
 | 
			
		||||
	esac
 | 
			
		||||
 | 
			
		||||
	ucidef_add_atm_bridge "1" "32" "llc" "bridged" "dsl"
 | 
			
		||||
	ucidef_add_vdsl_modem "$annex" "$tone" "$xfer_mode"
 | 
			
		||||
	ucidef_set_interface_wan "dsl0" "pppoe"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ipq40xx_setup_macs()
 | 
			
		||||
{
 | 
			
		||||
	local board="$1"
 | 
			
		||||
	local lan_mac=""
 | 
			
		||||
	local wan_mac=""
 | 
			
		||||
	local label_mac=""
 | 
			
		||||
 | 
			
		||||
	case "$board" in
 | 
			
		||||
	8dev,habanero-dvk)
 | 
			
		||||
		label_mac=$(mtd_get_mac_binary "ART" 0x1006)
 | 
			
		||||
		;;
 | 
			
		||||
	asus,rt-ac42u)
 | 
			
		||||
		label_mac=$(mtd_get_mac_binary_ubi Factory 0x1006)
 | 
			
		||||
		;;
 | 
			
		||||
	asus,rt-ac58u)
 | 
			
		||||
		wan_mac=$(mtd_get_mac_binary_ubi Factory 0x1006)
 | 
			
		||||
		lan_mac=$(mtd_get_mac_binary_ubi Factory 0x5006)
 | 
			
		||||
		label_mac=$wan_mac
 | 
			
		||||
		;;
 | 
			
		||||
	avm,fritzbox-7530)
 | 
			
		||||
		local tffsdev=$(find_mtd_chardev "nand-tffs")
 | 
			
		||||
		wan_mac=$(/usr/bin/fritz_tffs_nand -b -d $tffsdev -n macdsl)
 | 
			
		||||
		;;
 | 
			
		||||
	cilab,meshpoint-one)
 | 
			
		||||
		label_mac=$(mtd_get_mac_binary "ART" 0x1006)
 | 
			
		||||
		;;
 | 
			
		||||
	devolo,magic-2-wifi-next)
 | 
			
		||||
		lan_mac=$(mtd_get_mac_ascii APPSBLENV MacAddress0)
 | 
			
		||||
		label_mac=$lan_mac
 | 
			
		||||
		;;
 | 
			
		||||
	dlink,dap-2610)
 | 
			
		||||
		lan_mac=$(mtd_get_mac_ascii bdcfg lanmac)
 | 
			
		||||
		label_mac=$lan_mac
 | 
			
		||||
		;;
 | 
			
		||||
	engenius,eap2200|\
 | 
			
		||||
	engenius,emd1)
 | 
			
		||||
		lan_mac=$(mtd_get_mac_ascii 0:APPSBLENV ethaddr)
 | 
			
		||||
		label_mac=$lan_mac
 | 
			
		||||
		;;
 | 
			
		||||
	engenius,emr3500)
 | 
			
		||||
		wan_mac=$(mtd_get_mac_ascii 0:APPSBLENV wanaddr)
 | 
			
		||||
		lan_mac=$(mtd_get_mac_ascii 0:APPSBLENV ethaddr)
 | 
			
		||||
		label_mac=$wan_mac
 | 
			
		||||
		;;
 | 
			
		||||
	engenius,ens620ext)
 | 
			
		||||
		wan_mac=$(mtd_get_mac_ascii u-boot-env ethaddr)
 | 
			
		||||
		lan_mac=$(macaddr_add "$wan_mac" 1)
 | 
			
		||||
		;;
 | 
			
		||||
	ezviz,cs-w3-wd1200g-eup)
 | 
			
		||||
		label_mac=$(mtd_get_mac_binary "ART" 0x6)
 | 
			
		||||
		;;
 | 
			
		||||
	google,wifi)
 | 
			
		||||
		wan_mac=$(get_mac_label)
 | 
			
		||||
		lan_mac=$(macaddr_add "$wan_mac" 1)
 | 
			
		||||
		;;
 | 
			
		||||
	linksys,ea6350v3|\
 | 
			
		||||
	linksys,ea8300  |\
 | 
			
		||||
	linksys,mr8300)
 | 
			
		||||
		wan_mac=$(mtd_get_mac_ascii devinfo hw_mac_addr)
 | 
			
		||||
		lan_mac=$(macaddr_add "$wan_mac" 1)
 | 
			
		||||
		;;
 | 
			
		||||
	mikrotik,cap-ac |\
 | 
			
		||||
	mikrotik,hap-ac2|\
 | 
			
		||||
	mikrotik,hap-ac3|\
 | 
			
		||||
	mikrotik,hap-ac3-lte6-kit)
 | 
			
		||||
		wan_mac=$(cat /sys/firmware/mikrotik/hard_config/mac_base)
 | 
			
		||||
		lan_mac=$(macaddr_add $wan_mac 1)
 | 
			
		||||
		label_mac="$wan_mac"
 | 
			
		||||
		;;
 | 
			
		||||
	mikrotik,lhgg-60ad|\
 | 
			
		||||
	mikrotik,sxtsq-5-ac)
 | 
			
		||||
		lan_mac=$(cat /sys/firmware/mikrotik/hard_config/mac_base)
 | 
			
		||||
		label_mac="$lan_mac"
 | 
			
		||||
		;;
 | 
			
		||||
	netgear,rbr50|\
 | 
			
		||||
	netgear,rbs50|\
 | 
			
		||||
	netgear,srr60|\
 | 
			
		||||
	netgear,srs60|\
 | 
			
		||||
	pakedge,wr-1)
 | 
			
		||||
		wan_mac=$(macaddr_add $(get_mac_label) 1)
 | 
			
		||||
		;;
 | 
			
		||||
	esac
 | 
			
		||||
 | 
			
		||||
	[ -n "$lan_mac" ] && ucidef_set_interface_macaddr "lan" $lan_mac
 | 
			
		||||
	[ -n "$wan_mac" ] && ucidef_set_interface_macaddr "wan" $wan_mac
 | 
			
		||||
	[ -n "$label_mac" ] && ucidef_set_label_macaddr $label_mac
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
board_config_update
 | 
			
		||||
board=$(board_name)
 | 
			
		||||
ipq40xx_setup_interfaces $board
 | 
			
		||||
ipq40xx_setup_dsl $board
 | 
			
		||||
ipq40xx_setup_macs $board
 | 
			
		||||
board_config_flush
 | 
			
		||||
 | 
			
		||||
exit 0
 | 
			
		||||
| 
						 | 
				
			
			@ -1,196 +0,0 @@
 | 
			
		|||
#!/bin/sh
 | 
			
		||||
 | 
			
		||||
. /lib/functions.sh
 | 
			
		||||
. /usr/share/libubox/jshn.sh
 | 
			
		||||
 | 
			
		||||
CFG_PATH="/etc/config/"
 | 
			
		||||
 | 
			
		||||
get_section_name() {
 | 
			
		||||
	local ___var="$1"
 | 
			
		||||
	[ "$#" -ge 1 ] && shift
 | 
			
		||||
	local ___type="$1"
 | 
			
		||||
	[ "$#" -ge 1 ] && shift
 | 
			
		||||
	local section cfgtype
 | 
			
		||||
 | 
			
		||||
	[ -z "$CONFIG_SECTIONS" ] && return 0
 | 
			
		||||
	for section in ${CONFIG_SECTIONS}; do
 | 
			
		||||
		config_get cfgtype "$section" TYPE
 | 
			
		||||
		[ -n "$___type" -a "x$cfgtype" != "x$___type" ] && continue
 | 
			
		||||
		eval export "${___var}=\${section}"
 | 
			
		||||
		return 0
 | 
			
		||||
	done
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
_set_option() {
 | 
			
		||||
	local option="$1"
 | 
			
		||||
	local value="$2"
 | 
			
		||||
 | 
			
		||||
	uci_set "$_NEW_CONFIG" "$_NEW_SEC_NAME" "$option" "$value"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
_set_list_option() {
 | 
			
		||||
	local option="$1"
 | 
			
		||||
	local value="$2"
 | 
			
		||||
 | 
			
		||||
	for element in $value; do
 | 
			
		||||
		uci_add_list "$_NEW_CONFIG" "$_NEW_SEC_NAME" "$option" "$element"
 | 
			
		||||
	done
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
_del_uci_element() {
 | 
			
		||||
	local section="$1"
 | 
			
		||||
	local option="$2"
 | 
			
		||||
 | 
			
		||||
	uci_remove "$_OLD_CONFIG" "$section" "$option"
 | 
			
		||||
}
 | 
			
		||||
_option_cond_cb() {
 | 
			
		||||
	local value=$3
 | 
			
		||||
 | 
			
		||||
	json_select $2
 | 
			
		||||
	json_get_var old 1
 | 
			
		||||
	json_get_var new 2
 | 
			
		||||
 | 
			
		||||
	[ "$old" = "$value" ] && _COND_VALUE="$new"
 | 
			
		||||
 | 
			
		||||
	json_select ..
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
_parse_condition(){
 | 
			
		||||
	local value="$1"
 | 
			
		||||
 | 
			
		||||
	_COND_VALUE=
 | 
			
		||||
	json_for_each_item _option_cond_cb "if" "$value"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
_option_rule_cb(){
 | 
			
		||||
	local rule="$1"
 | 
			
		||||
	local option="$2"
 | 
			
		||||
	local value
 | 
			
		||||
 | 
			
		||||
	[ -n "$rule" ] || return 0
 | 
			
		||||
 | 
			
		||||
	json_select "$option"
 | 
			
		||||
	json_get_vars new_name "if" default cb type
 | 
			
		||||
 | 
			
		||||
	if [ -n "$cb" ]; then
 | 
			
		||||
		eval "$cb \"\$option\" \"\$_OLD_SEC_NAME\" \"\$_NEW_SEC_NAME\""
 | 
			
		||||
		[ "$?" -eq 0 ] && {
 | 
			
		||||
			json_select ..
 | 
			
		||||
			return 0
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		value="$_OPTION_VALUE"
 | 
			
		||||
	else
 | 
			
		||||
		config_get value $_OLD_SEC_NAME "$option" "$default"
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	[ -n "$if" ] && {
 | 
			
		||||
		_parse_condition "$value"
 | 
			
		||||
		value="${_COND_VALUE:-${value:-$default}}"
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if [ -n "$type" -a "$type" = "list" ]; then
 | 
			
		||||
		_set_list_option "${new_name:-$option}" "$value"
 | 
			
		||||
	else
 | 
			
		||||
		_set_option "${new_name:-$option}" "$value"
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	json_select ..
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
_init_section() {
 | 
			
		||||
	local sec_t
 | 
			
		||||
 | 
			
		||||
	json_get_vars old_name new_name new_type old_type
 | 
			
		||||
	[ -n "$old_name" -o -n "$old_type" ] || return 1
 | 
			
		||||
 | 
			
		||||
	if [ -z "$old_name" ]; then
 | 
			
		||||
		get_section_name _OLD_SEC_NAME "$old_type"
 | 
			
		||||
	else
 | 
			
		||||
		_OLD_SEC_NAME=$old_name
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	_NEW_SEC_NAME=$new_name
 | 
			
		||||
	_OLD_SEC_TYPE=$old_type
 | 
			
		||||
	_NEW_SEC_TYPE=${new_type:-$old_type}
 | 
			
		||||
	[ -n "$_NEW_SEC_TYPE" ] || \
 | 
			
		||||
		eval "_NEW_SEC_TYPE=\$CONFIG_${_OLD_SEC_NAME}_TYPE"
 | 
			
		||||
 | 
			
		||||
	if [ -n "$_NEW_SEC_NAME" ]; then
 | 
			
		||||
		uci set "$_NEW_CONFIG"."$_NEW_SEC_NAME"="$_NEW_SEC_TYPE"
 | 
			
		||||
	else
 | 
			
		||||
		_NEW_SEC_NAME="$(uci -q add "$_NEW_CONFIG" "$_NEW_SEC_TYPE")"
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	[ -n "$_NEW_SEC_NAME" ] || return 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
_section_rule_cb(){
 | 
			
		||||
	local rule="$1"
 | 
			
		||||
	local section="$2"
 | 
			
		||||
	local value
 | 
			
		||||
 | 
			
		||||
	[ -n "$rule" ] || return 0
 | 
			
		||||
 | 
			
		||||
	json_select "$section"
 | 
			
		||||
	json_get_vars cb old_name new_name new_type old_type remove
 | 
			
		||||
	[ -n "$cb" ] && {
 | 
			
		||||
		eval "$cb \"\$old_name\" \"\$new_name\" \"\$old_type\" \"\$new_type\""
 | 
			
		||||
		[ "$?" -eq 0 ] && {
 | 
			
		||||
			json_select ..
 | 
			
		||||
			return 0
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_init_section
 | 
			
		||||
	[ $? -ne 0 ] && {
 | 
			
		||||
		logger -t "Migration" "Unable to init section"
 | 
			
		||||
		json_select ..
 | 
			
		||||
 | 
			
		||||
		return 1
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	json_for_each_item _option_rule_cb options
 | 
			
		||||
	json_select ..
 | 
			
		||||
	[ -n "$remove" ] && {
 | 
			
		||||
		_del_uci_element "$old_name"
 | 
			
		||||
		uci_commit "$_OLD_CONFIG"
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
_init_config() {
 | 
			
		||||
	json_select config
 | 
			
		||||
	json_get_vars old_name new_name
 | 
			
		||||
 | 
			
		||||
	[ -n "$old_name" ] || return 1
 | 
			
		||||
	[ -f "$CFG_PATH$old_name" ] || return 1
 | 
			
		||||
	[ -f "$CFG_PATH$new_name" ] || touch $CFG_PATH$new_name
 | 
			
		||||
 | 
			
		||||
	config_load "$old_name"
 | 
			
		||||
	_NEW_CONFIG="${new_name:-$old_name}"
 | 
			
		||||
	_OLD_CONFIG="$old_name"
 | 
			
		||||
 | 
			
		||||
	json_select ..
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
migrate() {
 | 
			
		||||
	local remove
 | 
			
		||||
	local json_file="$1"
 | 
			
		||||
 | 
			
		||||
	[ -f "$json_file" ] || return 0
 | 
			
		||||
 | 
			
		||||
	json_init
 | 
			
		||||
	json_load_file "$json_file"
 | 
			
		||||
	json_select
 | 
			
		||||
	_init_config
 | 
			
		||||
	[ $? -ne 0 ] && {
 | 
			
		||||
		logger -t "Migration" "Unable to load config"
 | 
			
		||||
		return 1
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	json_for_each_item _section_rule_cb sections
 | 
			
		||||
	uci_commit "$_NEW_CONFIG"
 | 
			
		||||
 | 
			
		||||
	json_get_vars remove
 | 
			
		||||
	[ -n "$remove" ] && rm "$CFG_PATH$_OLD_CONFIG"
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,313 +0,0 @@
 | 
			
		|||
# 1: destination variable
 | 
			
		||||
# 2: interface
 | 
			
		||||
# 3: path
 | 
			
		||||
# 4: separator
 | 
			
		||||
# 5: limit
 | 
			
		||||
__network_ifstatus() {
 | 
			
		||||
	local __tmp
 | 
			
		||||
 | 
			
		||||
	[ -z "$__NETWORK_CACHE" ] && {
 | 
			
		||||
		__tmp="$(ubus call network.interface dump 2>&1)"
 | 
			
		||||
		case "$?" in
 | 
			
		||||
			4) : ;;
 | 
			
		||||
			0) export __NETWORK_CACHE="$__tmp" ;;
 | 
			
		||||
			*) echo "$__tmp" >&2 ;;
 | 
			
		||||
		esac
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	__tmp="$(jsonfilter ${4:+-F "$4"} ${5:+-l "$5"} -s "${__NETWORK_CACHE:-{}}" -e "$1=@.interface${2:+[@.interface='$2']}$3")"
 | 
			
		||||
 | 
			
		||||
	[ -z "$__tmp" ] && \
 | 
			
		||||
		unset "$1" && \
 | 
			
		||||
		return 1
 | 
			
		||||
 | 
			
		||||
	eval "$__tmp"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# determine first IPv4 address of given logical interface
 | 
			
		||||
# 1: destination variable
 | 
			
		||||
# 2: interface
 | 
			
		||||
network_get_ipaddr() {
 | 
			
		||||
	__network_ifstatus "$1" "$2" "['ipv4-address'][0].address";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# determine first IPv6 address of given logical interface
 | 
			
		||||
# 1: destination variable
 | 
			
		||||
# 2: interface
 | 
			
		||||
network_get_ipaddr6() {
 | 
			
		||||
	__network_ifstatus "$1" "$2" "['ipv6-address'][0].address" || \
 | 
			
		||||
		__network_ifstatus "$1" "$2" "['ipv6-prefix-assignment'][0]['local-address'].address" || \
 | 
			
		||||
		return 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# determine first IPv4 subnet of given logical interface
 | 
			
		||||
# 1: destination variable
 | 
			
		||||
# 2: interface
 | 
			
		||||
network_get_subnet() {
 | 
			
		||||
	__network_ifstatus "$1" "$2" "['ipv4-address'][0]['address','mask']" "/"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# determine first IPv6 subnet of given logical interface
 | 
			
		||||
# 1: destination variable
 | 
			
		||||
# 2: interface
 | 
			
		||||
network_get_subnet6() {
 | 
			
		||||
	local __nets __addr
 | 
			
		||||
 | 
			
		||||
	if network_get_subnets6 __nets "$2"; then
 | 
			
		||||
		# Attempt to return first non-fe80::/10, non-fc::/7 range
 | 
			
		||||
		for __addr in $__nets; do
 | 
			
		||||
			case "$__addr" in fe[8ab]?:*|f[cd]??:*)
 | 
			
		||||
				continue
 | 
			
		||||
			esac
 | 
			
		||||
			export "$1=$__addr"
 | 
			
		||||
			return 0
 | 
			
		||||
		done
 | 
			
		||||
 | 
			
		||||
		# Attempt to return first non-fe80::/10 range
 | 
			
		||||
		for __addr in $__nets; do
 | 
			
		||||
			case "$__addr" in fe[8ab]?:*)
 | 
			
		||||
				continue
 | 
			
		||||
			esac
 | 
			
		||||
			export "$1=$__addr"
 | 
			
		||||
			return 0
 | 
			
		||||
		done
 | 
			
		||||
 | 
			
		||||
		# Return first item
 | 
			
		||||
		for __addr in $__nets; do
 | 
			
		||||
			export "$1=$__addr"
 | 
			
		||||
			return 0
 | 
			
		||||
		done
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	unset "$1"
 | 
			
		||||
	return 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# determine first IPv6 prefix of given logical interface
 | 
			
		||||
# 1: destination variable
 | 
			
		||||
# 2: interface
 | 
			
		||||
network_get_prefix6() {
 | 
			
		||||
	__network_ifstatus "$1" "$2" "['ipv6-prefix'][0]['address','mask']" "/"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# determine all IPv4 addresses of given logical interface
 | 
			
		||||
# 1: destination variable
 | 
			
		||||
# 2: interface
 | 
			
		||||
network_get_ipaddrs() {
 | 
			
		||||
	__network_ifstatus "$1" "$2" "['ipv4-address'][*].address"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# determine all IPv6 addresses of given logical interface
 | 
			
		||||
# 1: destination variable
 | 
			
		||||
# 2: interface
 | 
			
		||||
network_get_ipaddrs6() {
 | 
			
		||||
	local __addr
 | 
			
		||||
	local __list=""
 | 
			
		||||
 | 
			
		||||
	if __network_ifstatus "__addr" "$2" "['ipv6-address'][*].address"; then
 | 
			
		||||
		for __addr in $__addr; do
 | 
			
		||||
			__list="${__list:+$__list }${__addr}"
 | 
			
		||||
		done
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	if __network_ifstatus "__addr" "$2" "['ipv6-prefix-assignment'][*]['local-address'].address"; then
 | 
			
		||||
		for __addr in $__addr; do
 | 
			
		||||
			__list="${__list:+$__list }${__addr}"
 | 
			
		||||
		done
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	if [ -n "$__list" ]; then
 | 
			
		||||
		export "$1=$__list"
 | 
			
		||||
		return 0
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	unset "$1"
 | 
			
		||||
	return 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# determine all IP addresses of given logical interface
 | 
			
		||||
# 1: destination variable
 | 
			
		||||
# 2: interface
 | 
			
		||||
network_get_ipaddrs_all() {
 | 
			
		||||
	local __addr __addr6
 | 
			
		||||
 | 
			
		||||
	network_get_ipaddrs __addr "$2"
 | 
			
		||||
	network_get_ipaddrs6 __addr6 "$2"
 | 
			
		||||
 | 
			
		||||
	if [ -n "$__addr" -o -n "$__addr6" ]; then
 | 
			
		||||
		export "$1=${__addr:+$__addr }$__addr6"
 | 
			
		||||
		return 0
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	unset "$1"
 | 
			
		||||
	return 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# determine all IPv4 subnets of given logical interface
 | 
			
		||||
# 1: destination variable
 | 
			
		||||
# 2: interface
 | 
			
		||||
network_get_subnets() {
 | 
			
		||||
	__network_ifstatus "$1" "$2" "['ipv4-address'][*]['address','mask']" "/ "
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# determine all IPv6 subnets of given logical interface
 | 
			
		||||
# 1: destination variable
 | 
			
		||||
# 2: interface
 | 
			
		||||
network_get_subnets6() {
 | 
			
		||||
	local __addr __mask
 | 
			
		||||
	local __list=""
 | 
			
		||||
 | 
			
		||||
	if __network_ifstatus "__addr" "$2" "['ipv6-address'][*]['address','mask']" "/ "; then
 | 
			
		||||
		for __addr in $__addr; do
 | 
			
		||||
			__list="${__list:+$__list }${__addr}"
 | 
			
		||||
		done
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	if __network_ifstatus "__addr" "$2" "['ipv6-prefix-assignment'][*]['local-address'].address" && \
 | 
			
		||||
	   __network_ifstatus "__mask" "$2" "['ipv6-prefix-assignment'][*].mask"; then
 | 
			
		||||
		for __addr in $__addr; do
 | 
			
		||||
			__list="${__list:+$__list }${__addr}/${__mask%% *}"
 | 
			
		||||
			__mask="${__mask#* }"
 | 
			
		||||
		done
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	if [ -n "$__list" ]; then
 | 
			
		||||
		export "$1=$__list"
 | 
			
		||||
		return 0
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	unset "$1"
 | 
			
		||||
	return 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# determine all IPv6 prefixes of given logical interface
 | 
			
		||||
# 1: destination variable
 | 
			
		||||
# 2: interface
 | 
			
		||||
network_get_prefixes6() {
 | 
			
		||||
	__network_ifstatus "$1" "$2" "['ipv6-prefix'][*]['address','mask']" "/ "
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# determine IPv4 gateway of given logical interface
 | 
			
		||||
# 1: destination variable
 | 
			
		||||
# 2: interface
 | 
			
		||||
# 3: consider inactive gateway if "true" (optional)
 | 
			
		||||
network_get_gateway() {
 | 
			
		||||
	__network_ifstatus "$1" "$2" ".route[@.target='0.0.0.0' && !@.table].nexthop" "" 1 && \
 | 
			
		||||
		return 0
 | 
			
		||||
 | 
			
		||||
	[ "$3" = 1 -o "$3" = "true" ] && \
 | 
			
		||||
		__network_ifstatus "$1" "$2" ".inactive.route[@.target='0.0.0.0' && !@.table].nexthop" "" 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# determine IPv6 gateway of given logical interface
 | 
			
		||||
# 1: destination variable
 | 
			
		||||
# 2: interface
 | 
			
		||||
# 3: consider inactive gateway if "true" (optional)
 | 
			
		||||
network_get_gateway6() {
 | 
			
		||||
	__network_ifstatus "$1" "$2" ".route[@.target='::' && !@.table].nexthop" "" 1 && \
 | 
			
		||||
		return 0
 | 
			
		||||
 | 
			
		||||
	[ "$3" = 1 -o "$3" = "true" ] && \
 | 
			
		||||
		__network_ifstatus "$1" "$2" ".inactive.route[@.target='::' && !@.table].nexthop" "" 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# determine the DNS servers of the given logical interface
 | 
			
		||||
# 1: destination variable
 | 
			
		||||
# 2: interface
 | 
			
		||||
# 3: consider inactive servers if "true" (optional)
 | 
			
		||||
network_get_dnsserver() {
 | 
			
		||||
	__network_ifstatus "$1" "$2" "['dns-server'][*]" && return 0
 | 
			
		||||
 | 
			
		||||
	[ "$3" = 1 -o "$3" = "true" ] && \
 | 
			
		||||
		__network_ifstatus "$1" "$2" ".inactive['dns-server'][*]"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# determine the domains of the given logical interface
 | 
			
		||||
# 1: destination variable
 | 
			
		||||
# 2: interface
 | 
			
		||||
# 3: consider inactive domains if "true" (optional)
 | 
			
		||||
network_get_dnssearch() {
 | 
			
		||||
	__network_ifstatus "$1" "$2" "['dns-search'][*]" && return 0
 | 
			
		||||
 | 
			
		||||
	[ "$3" = 1 -o "$3" = "true" ] && \
 | 
			
		||||
		__network_ifstatus "$1" "$2" ".inactive['dns-search'][*]"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# 1: destination variable
 | 
			
		||||
# 2: addr
 | 
			
		||||
# 3: inactive
 | 
			
		||||
# 4: limit
 | 
			
		||||
__network_wan()
 | 
			
		||||
{
 | 
			
		||||
	limit=1
 | 
			
		||||
	[ -n "$4" ] && limit="$4"
 | 
			
		||||
	__network_ifstatus "$1" "" \
 | 
			
		||||
		"[@.route[@.target='$2' && !@.table]].interface" "" $limit && \
 | 
			
		||||
			return 0
 | 
			
		||||
 | 
			
		||||
	[ "$3" = 1 -o "$3" = "true" ] && \
 | 
			
		||||
		__network_ifstatus "$1" "" \
 | 
			
		||||
			"[@.inactive.route[@.target='$2' && !@.table]].interface" "" $limit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# find the logical interface which holds the current IPv4 default route
 | 
			
		||||
# 1: destination variable
 | 
			
		||||
# 2: consider inactive default routes if "true" (optional)
 | 
			
		||||
network_find_wan() { __network_wan "$1" "0.0.0.0" "$2" "$3"; }
 | 
			
		||||
 | 
			
		||||
# find the logical interface which holds the current IPv6 default route
 | 
			
		||||
# 1: destination variable
 | 
			
		||||
# 2: consider inactive default routes if "true" (optional)
 | 
			
		||||
network_find_wan6() { __network_wan "$1" "::" "$2"; }
 | 
			
		||||
 | 
			
		||||
# test whether the given logical interface is running
 | 
			
		||||
# 1: interface
 | 
			
		||||
network_is_up()
 | 
			
		||||
{
 | 
			
		||||
	local __up
 | 
			
		||||
	__network_ifstatus "__up" "$1" ".up" && [ "$__up" = 1 ]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# determine the protocol of the given logical interface
 | 
			
		||||
# 1: destination variable
 | 
			
		||||
# 2: interface
 | 
			
		||||
network_get_protocol() { __network_ifstatus "$1" "$2" ".proto"; }
 | 
			
		||||
 | 
			
		||||
# determine the uptime of the given logical interface
 | 
			
		||||
# 1: destination variable
 | 
			
		||||
# 2: interface
 | 
			
		||||
network_get_uptime() { __network_ifstatus "$1" "$2" ".uptime"; }
 | 
			
		||||
 | 
			
		||||
# determine the metric of the given logical interface
 | 
			
		||||
# 1: destination variable
 | 
			
		||||
# 2: interface
 | 
			
		||||
network_get_metric() { __network_ifstatus "$1" "$2" ".metric"; }
 | 
			
		||||
 | 
			
		||||
# determine the layer 3 linux network device of the given logical interface
 | 
			
		||||
# 1: destination variable
 | 
			
		||||
# 2: interface
 | 
			
		||||
network_get_device() { __network_ifstatus "$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_ifstatus "$1" "$2" ".device"; }
 | 
			
		||||
 | 
			
		||||
# defer netifd actions on the given linux network device
 | 
			
		||||
# 1: device name
 | 
			
		||||
network_defer_device()
 | 
			
		||||
{
 | 
			
		||||
	ubus call network.device set_state \
 | 
			
		||||
		"$(printf '{ "name": "%s", "defer": true }' "$1")" 2>/dev/null
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# continue netifd actions on the given linux network device
 | 
			
		||||
# 1: device name
 | 
			
		||||
network_ready_device()
 | 
			
		||||
{
 | 
			
		||||
	ubus call network.device set_state \
 | 
			
		||||
		"$(printf '{ "name": "%s", "defer": false }' "$1")" 2>/dev/null
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# flush the internal value cache to force re-reading values from ubus
 | 
			
		||||
network_flush_cache() { unset __NETWORK_CACHE; }
 | 
			
		||||
| 
						 | 
				
			
			@ -1,726 +0,0 @@
 | 
			
		|||
#!/bin/ash
 | 
			
		||||
 | 
			
		||||
. /lib/functions.sh
 | 
			
		||||
. /usr/share/libubox/jshn.sh
 | 
			
		||||
 | 
			
		||||
json_select_array() {
 | 
			
		||||
	local _json_no_warning=1
 | 
			
		||||
 | 
			
		||||
	json_select "$1"
 | 
			
		||||
	[ $? = 0 ] && return
 | 
			
		||||
 | 
			
		||||
	json_add_array "$1"
 | 
			
		||||
	json_close_array
 | 
			
		||||
 | 
			
		||||
	json_select "$1"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
json_select_object() {
 | 
			
		||||
	local _json_no_warning=1
 | 
			
		||||
 | 
			
		||||
	json_select "$1"
 | 
			
		||||
	[ $? = 0 ] && return
 | 
			
		||||
 | 
			
		||||
	json_add_object "$1"
 | 
			
		||||
	json_close_object
 | 
			
		||||
 | 
			
		||||
	json_select "$1"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_set_interface() {
 | 
			
		||||
	local network=$1; shift
 | 
			
		||||
 | 
			
		||||
	[ -z "$network" ] && return
 | 
			
		||||
 | 
			
		||||
	json_select_object network
 | 
			
		||||
	json_select_object "$network"
 | 
			
		||||
 | 
			
		||||
	while [ -n "$1" ]; do
 | 
			
		||||
		local opt=$1; shift
 | 
			
		||||
		local val=$1; shift
 | 
			
		||||
 | 
			
		||||
		[ -n "$opt" -a -n "$val" ] || break
 | 
			
		||||
 | 
			
		||||
		[ "$opt" = "device" -a "$val" != "${val/ //}" ] && {
 | 
			
		||||
			json_select_array "ports"
 | 
			
		||||
			for e in $val; do json_add_string "" "$e"; done
 | 
			
		||||
			json_close_array
 | 
			
		||||
		} || {
 | 
			
		||||
			json_add_string "$opt" "$val"
 | 
			
		||||
		}
 | 
			
		||||
	done
 | 
			
		||||
 | 
			
		||||
	if ! json_is_a proto string; then
 | 
			
		||||
		case "$network" in
 | 
			
		||||
			lan) json_add_string proto static ;;
 | 
			
		||||
			wan) json_add_string proto dhcp ;;
 | 
			
		||||
			*) json_add_string proto none ;;
 | 
			
		||||
		esac
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	json_select ..
 | 
			
		||||
	json_select ..
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_set_interface_default_macaddr() {
 | 
			
		||||
	local network="$1" ifname
 | 
			
		||||
 | 
			
		||||
	json_select_object 'network'
 | 
			
		||||
		json_select_object "$network"
 | 
			
		||||
		if json_is_a ports array; then
 | 
			
		||||
			json_select_array 'ports'
 | 
			
		||||
			json_get_keys port_id
 | 
			
		||||
			for i in $port_id; do
 | 
			
		||||
				json_get_var port "$i"
 | 
			
		||||
				ifname="${ifname} $port"
 | 
			
		||||
			done
 | 
			
		||||
			json_select ..
 | 
			
		||||
		else
 | 
			
		||||
			json_get_var ifname 'device'
 | 
			
		||||
		fi
 | 
			
		||||
		json_select ..
 | 
			
		||||
	json_select ..
 | 
			
		||||
 | 
			
		||||
	for i in $ifname; do
 | 
			
		||||
		local macaddr="$2"; shift
 | 
			
		||||
		[ -n "$macaddr" ] || break
 | 
			
		||||
		json_select_object 'network-device'
 | 
			
		||||
			json_select_object "$i"
 | 
			
		||||
				json_add_string 'macaddr' "$macaddr"
 | 
			
		||||
			json_select ..
 | 
			
		||||
		json_select ..
 | 
			
		||||
	done
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_set_board_id() {
 | 
			
		||||
	json_select_object model
 | 
			
		||||
	json_add_string id "$1"
 | 
			
		||||
	json_select ..
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_set_board_platform() {
 | 
			
		||||
	json_select_object model
 | 
			
		||||
	json_add_string platform "$1"
 | 
			
		||||
	json_select ..
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_set_model_name() {
 | 
			
		||||
	json_select_object model
 | 
			
		||||
	json_add_string name "$1"
 | 
			
		||||
	json_select ..
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_set_compat_version() {
 | 
			
		||||
	json_select_object system
 | 
			
		||||
	json_add_string compat_version "${1:-1.0}"
 | 
			
		||||
	json_select ..
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_set_interface_lan() {
 | 
			
		||||
	ucidef_set_interface "lan" device "$1" proto "${2:-static}"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_set_interface_wan() {
 | 
			
		||||
	ucidef_set_interface "wan" device "$1" proto "${2:-dhcp}"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_set_interfaces_lan_wan() {
 | 
			
		||||
	local lan_if="$1"
 | 
			
		||||
	local wan_if="$2"
 | 
			
		||||
 | 
			
		||||
	ucidef_set_interface_lan "$lan_if"
 | 
			
		||||
	ucidef_set_interface_wan "$wan_if"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
_ucidef_add_switch_port() {
 | 
			
		||||
	# inherited: $num $device $need_tag $want_untag $role $index $prev_role
 | 
			
		||||
	# inherited: $n_cpu $n_ports $n_vlan $cpu0 $cpu1 $cpu2 $cpu3 $cpu4 $cpu5
 | 
			
		||||
 | 
			
		||||
	n_ports=$((n_ports + 1))
 | 
			
		||||
 | 
			
		||||
	json_select_array ports
 | 
			
		||||
		json_add_object
 | 
			
		||||
			json_add_int num "$num"
 | 
			
		||||
			[ -n "$device"     ] && json_add_string  device     "$device"
 | 
			
		||||
			[ -n "$need_tag"   ] && json_add_boolean need_tag   "$need_tag"
 | 
			
		||||
			[ -n "$want_untag" ] && json_add_boolean want_untag "$want_untag"
 | 
			
		||||
			[ -n "$role"       ] && json_add_string  role       "$role"
 | 
			
		||||
			[ -n "$index"      ] && json_add_int     index      "$index"
 | 
			
		||||
		json_close_object
 | 
			
		||||
	json_select ..
 | 
			
		||||
 | 
			
		||||
	# record pointer to cpu entry for lookup in _ucidef_finish_switch_roles()
 | 
			
		||||
	[ -n "$device" ] && {
 | 
			
		||||
		export "cpu$n_cpu=$n_ports"
 | 
			
		||||
		n_cpu=$((n_cpu + 1))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	# create/append object to role list
 | 
			
		||||
	[ -n "$role" ] && {
 | 
			
		||||
		json_select_array roles
 | 
			
		||||
 | 
			
		||||
		if [ "$role" != "$prev_role" ]; then
 | 
			
		||||
			json_add_object
 | 
			
		||||
				json_add_string role "$role"
 | 
			
		||||
				json_add_string ports "$num"
 | 
			
		||||
			json_close_object
 | 
			
		||||
 | 
			
		||||
			prev_role="$role"
 | 
			
		||||
			n_vlan=$((n_vlan + 1))
 | 
			
		||||
		else
 | 
			
		||||
			json_select_object "$n_vlan"
 | 
			
		||||
				json_get_var port ports
 | 
			
		||||
				json_add_string ports "$port $num"
 | 
			
		||||
			json_select ..
 | 
			
		||||
		fi
 | 
			
		||||
 | 
			
		||||
		json_select ..
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
_ucidef_finish_switch_roles() {
 | 
			
		||||
	# inherited: $name $n_cpu $n_vlan $cpu0 $cpu1 $cpu2 $cpu3 $cpu4 $cpu5
 | 
			
		||||
	local index role roles num device need_tag want_untag port ports
 | 
			
		||||
 | 
			
		||||
	json_select switch
 | 
			
		||||
		json_select "$name"
 | 
			
		||||
			json_get_keys roles roles
 | 
			
		||||
		json_select ..
 | 
			
		||||
	json_select ..
 | 
			
		||||
 | 
			
		||||
	for index in $roles; do
 | 
			
		||||
		eval "port=\$cpu$(((index - 1) % n_cpu))"
 | 
			
		||||
 | 
			
		||||
		json_select switch
 | 
			
		||||
			json_select "$name"
 | 
			
		||||
				json_select ports
 | 
			
		||||
					json_select "$port"
 | 
			
		||||
						json_get_vars num device need_tag want_untag
 | 
			
		||||
					json_select ..
 | 
			
		||||
				json_select ..
 | 
			
		||||
 | 
			
		||||
				if [ ${need_tag:-0} -eq 1 -o ${want_untag:-0} -ne 1 ]; then
 | 
			
		||||
					num="${num}t"
 | 
			
		||||
					device="${device}.${index}"
 | 
			
		||||
				fi
 | 
			
		||||
 | 
			
		||||
				json_select roles
 | 
			
		||||
					json_select "$index"
 | 
			
		||||
						json_get_vars role ports
 | 
			
		||||
						json_add_string ports "$ports $num"
 | 
			
		||||
						json_add_string device "$device"
 | 
			
		||||
					json_select ..
 | 
			
		||||
				json_select ..
 | 
			
		||||
			json_select ..
 | 
			
		||||
		json_select ..
 | 
			
		||||
 | 
			
		||||
		json_select_object network
 | 
			
		||||
			local devices
 | 
			
		||||
 | 
			
		||||
			json_select_object "$role"
 | 
			
		||||
				# attach previous interfaces (for multi-switch devices)
 | 
			
		||||
				json_get_var devices device
 | 
			
		||||
				if ! list_contains devices "$device"; then
 | 
			
		||||
					devices="${devices:+$devices }$device"
 | 
			
		||||
				fi
 | 
			
		||||
			json_select ..
 | 
			
		||||
		json_select ..
 | 
			
		||||
 | 
			
		||||
		ucidef_set_interface "$role" device "$devices"
 | 
			
		||||
	done
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_set_ar8xxx_switch_mib() {
 | 
			
		||||
	local name="$1"
 | 
			
		||||
	local type="$2"
 | 
			
		||||
	local interval="$3"
 | 
			
		||||
 | 
			
		||||
	json_select_object switch
 | 
			
		||||
		json_select_object "$name"
 | 
			
		||||
			json_add_int ar8xxx_mib_type $type
 | 
			
		||||
			json_add_int ar8xxx_mib_poll_interval $interval
 | 
			
		||||
		json_select ..
 | 
			
		||||
	json_select ..
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_add_switch() {	
 | 
			
		||||
	local enabled=1
 | 
			
		||||
	if [ "$1" = "enabled" ]; then
 | 
			
		||||
		shift
 | 
			
		||||
		enabled="$1"
 | 
			
		||||
		shift
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	local name="$1"; shift
 | 
			
		||||
	local port num role device index need_tag prev_role
 | 
			
		||||
	local cpu0 cpu1 cpu2 cpu3 cpu4 cpu5
 | 
			
		||||
	local n_cpu=0 n_vlan=0 n_ports=0
 | 
			
		||||
 | 
			
		||||
	json_select_object switch
 | 
			
		||||
		json_select_object "$name"
 | 
			
		||||
			json_add_boolean enable "$enabled"
 | 
			
		||||
			json_add_boolean reset 1
 | 
			
		||||
 | 
			
		||||
			for port in "$@"; do
 | 
			
		||||
				case "$port" in
 | 
			
		||||
					[0-9]*@*)
 | 
			
		||||
						num="${port%%@*}"
 | 
			
		||||
						device="${port##*@}"
 | 
			
		||||
						need_tag=0
 | 
			
		||||
						want_untag=0
 | 
			
		||||
						[ "${num%t}" != "$num" ] && {
 | 
			
		||||
							num="${num%t}"
 | 
			
		||||
							need_tag=1
 | 
			
		||||
						}
 | 
			
		||||
						[ "${num%u}" != "$num" ] && {
 | 
			
		||||
							num="${num%u}"
 | 
			
		||||
							want_untag=1
 | 
			
		||||
						}
 | 
			
		||||
					;;
 | 
			
		||||
					[0-9]*:*:[0-9]*)
 | 
			
		||||
						num="${port%%:*}"
 | 
			
		||||
						index="${port##*:}"
 | 
			
		||||
						role="${port#[0-9]*:}"; role="${role%:*}"
 | 
			
		||||
					;;
 | 
			
		||||
					[0-9]*:*)
 | 
			
		||||
						num="${port%%:*}"
 | 
			
		||||
						role="${port##*:}"
 | 
			
		||||
					;;
 | 
			
		||||
				esac
 | 
			
		||||
 | 
			
		||||
				if [ -n "$num" ] && [ -n "$device$role" ]; then
 | 
			
		||||
					_ucidef_add_switch_port
 | 
			
		||||
				fi
 | 
			
		||||
 | 
			
		||||
				unset num device role index need_tag want_untag
 | 
			
		||||
			done
 | 
			
		||||
		json_select ..
 | 
			
		||||
	json_select ..
 | 
			
		||||
 | 
			
		||||
	_ucidef_finish_switch_roles
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_add_switch_attr() {
 | 
			
		||||
	local name="$1"
 | 
			
		||||
	local key="$2"
 | 
			
		||||
	local val="$3"
 | 
			
		||||
 | 
			
		||||
	json_select_object switch
 | 
			
		||||
		json_select_object "$name"
 | 
			
		||||
 | 
			
		||||
		case "$val" in
 | 
			
		||||
			true|false) [ "$val" != "true" ]; json_add_boolean "$key" $? ;;
 | 
			
		||||
			[0-9]) json_add_int "$key" "$val" ;;
 | 
			
		||||
			*) json_add_string "$key" "$val" ;;
 | 
			
		||||
		esac
 | 
			
		||||
 | 
			
		||||
		json_select ..
 | 
			
		||||
	json_select ..
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_add_switch_port_attr() {
 | 
			
		||||
	local name="$1"
 | 
			
		||||
	local port="$2"
 | 
			
		||||
	local key="$3"
 | 
			
		||||
	local val="$4"
 | 
			
		||||
	local ports i num
 | 
			
		||||
 | 
			
		||||
	json_select_object switch
 | 
			
		||||
	json_select_object "$name"
 | 
			
		||||
 | 
			
		||||
	json_get_keys ports ports
 | 
			
		||||
	json_select_array ports
 | 
			
		||||
 | 
			
		||||
	for i in $ports; do
 | 
			
		||||
		json_select "$i"
 | 
			
		||||
		json_get_var num num
 | 
			
		||||
 | 
			
		||||
		if [ -n "$num" ] && [ $num -eq $port ]; then
 | 
			
		||||
			json_select_object attr
 | 
			
		||||
 | 
			
		||||
			case "$val" in
 | 
			
		||||
				true|false) [ "$val" != "true" ]; json_add_boolean "$key" $? ;;
 | 
			
		||||
				[0-9]) json_add_int "$key" "$val" ;;
 | 
			
		||||
				*) json_add_string "$key" "$val" ;;
 | 
			
		||||
			esac
 | 
			
		||||
 | 
			
		||||
			json_select ..
 | 
			
		||||
		fi
 | 
			
		||||
 | 
			
		||||
		json_select ..
 | 
			
		||||
	done
 | 
			
		||||
 | 
			
		||||
	json_select ..
 | 
			
		||||
	json_select ..
 | 
			
		||||
	json_select ..
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_set_interface_macaddr() {
 | 
			
		||||
	local network="$1"
 | 
			
		||||
	local macaddr="$2"
 | 
			
		||||
 | 
			
		||||
	ucidef_set_interface "$network" macaddr "$macaddr"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_add_atm_bridge() {
 | 
			
		||||
	local vpi="$1"
 | 
			
		||||
	local vci="$2"
 | 
			
		||||
	local encaps="$3"
 | 
			
		||||
	local payload="$4"
 | 
			
		||||
	local nameprefix="$5"
 | 
			
		||||
 | 
			
		||||
	json_select_object dsl
 | 
			
		||||
		json_select_object atmbridge
 | 
			
		||||
			json_add_int vpi "$vpi"
 | 
			
		||||
			json_add_int vci "$vci"
 | 
			
		||||
			json_add_string encaps "$encaps"
 | 
			
		||||
			json_add_string payload "$payload"
 | 
			
		||||
			json_add_string nameprefix "$nameprefix"
 | 
			
		||||
		json_select ..
 | 
			
		||||
	json_select ..
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_add_adsl_modem() {
 | 
			
		||||
	local annex="$1"
 | 
			
		||||
	local firmware="$2"
 | 
			
		||||
 | 
			
		||||
	json_select_object dsl
 | 
			
		||||
		json_select_object modem
 | 
			
		||||
			json_add_string type "adsl"
 | 
			
		||||
			json_add_string annex "$annex"
 | 
			
		||||
			json_add_string firmware "$firmware"
 | 
			
		||||
		json_select ..
 | 
			
		||||
	json_select ..
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_add_vdsl_modem() {
 | 
			
		||||
	local annex="$1"
 | 
			
		||||
	local tone="$2"
 | 
			
		||||
	local xfer_mode="$3"
 | 
			
		||||
 | 
			
		||||
	json_select_object dsl
 | 
			
		||||
		json_select_object modem
 | 
			
		||||
			json_add_string type "vdsl"
 | 
			
		||||
			json_add_string annex "$annex"
 | 
			
		||||
			json_add_string tone "$tone"
 | 
			
		||||
			json_add_string xfer_mode "$xfer_mode"
 | 
			
		||||
		json_select ..
 | 
			
		||||
	json_select ..
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_set_led_ataport() {
 | 
			
		||||
	_ucidef_set_led_trigger "$1" "$2" "$3" ata"$4"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
_ucidef_set_led_common() {
 | 
			
		||||
	local cfg="led_$1"
 | 
			
		||||
	local name="$2"
 | 
			
		||||
	local sysfs="$3"
 | 
			
		||||
 | 
			
		||||
	json_select_object led
 | 
			
		||||
 | 
			
		||||
	json_select_object "$1"
 | 
			
		||||
	json_add_string name "$name"
 | 
			
		||||
	json_add_string sysfs "$sysfs"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_set_led_default() {
 | 
			
		||||
	local default="$4"
 | 
			
		||||
 | 
			
		||||
	_ucidef_set_led_common "$1" "$2" "$3"
 | 
			
		||||
 | 
			
		||||
	json_add_string default "$default"
 | 
			
		||||
	json_select ..
 | 
			
		||||
 | 
			
		||||
	json_select ..
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_set_led_gpio() {
 | 
			
		||||
	local gpio="$4"
 | 
			
		||||
	local inverted="$5"
 | 
			
		||||
 | 
			
		||||
	_ucidef_set_led_common "$1" "$2" "$3"
 | 
			
		||||
 | 
			
		||||
	json_add_string trigger "$trigger"
 | 
			
		||||
	json_add_string type gpio
 | 
			
		||||
	json_add_int gpio "$gpio"
 | 
			
		||||
	json_add_boolean inverted "$inverted"
 | 
			
		||||
	json_select ..
 | 
			
		||||
 | 
			
		||||
	json_select ..
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_set_led_ide() {
 | 
			
		||||
	_ucidef_set_led_trigger "$1" "$2" "$3" disk-activity
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_set_led_netdev() {
 | 
			
		||||
	local dev="$4"
 | 
			
		||||
	local mode="${5:-link tx rx}"
 | 
			
		||||
 | 
			
		||||
	_ucidef_set_led_common "$1" "$2" "$3"
 | 
			
		||||
 | 
			
		||||
	json_add_string type netdev
 | 
			
		||||
	json_add_string device "$dev"
 | 
			
		||||
	json_add_string mode "$mode"
 | 
			
		||||
	json_select ..
 | 
			
		||||
 | 
			
		||||
	json_select ..
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_set_led_oneshot() {
 | 
			
		||||
	_ucidef_set_led_timer $1 $2 $3 "oneshot" $4 $5
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_set_led_portstate() {
 | 
			
		||||
	local port_state="$4"
 | 
			
		||||
 | 
			
		||||
	_ucidef_set_led_common "$1" "$2" "$3"
 | 
			
		||||
 | 
			
		||||
	json_add_string trigger port_state
 | 
			
		||||
	json_add_string type portstate
 | 
			
		||||
	json_add_string port_state "$port_state"
 | 
			
		||||
	json_select ..
 | 
			
		||||
 | 
			
		||||
	json_select ..
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_set_led_rssi() {
 | 
			
		||||
	local iface="$4"
 | 
			
		||||
	local minq="$5"
 | 
			
		||||
	local maxq="$6"
 | 
			
		||||
	local offset="${7:-0}"
 | 
			
		||||
	local factor="${8:-1}"
 | 
			
		||||
 | 
			
		||||
	_ucidef_set_led_common "$1" "$2" "$3"
 | 
			
		||||
 | 
			
		||||
	json_add_string type rssi
 | 
			
		||||
	json_add_string name "$name"
 | 
			
		||||
	json_add_string iface "$iface"
 | 
			
		||||
	json_add_string minq "$minq"
 | 
			
		||||
	json_add_string maxq "$maxq"
 | 
			
		||||
	json_add_string offset "$offset"
 | 
			
		||||
	json_add_string factor "$factor"
 | 
			
		||||
	json_select ..
 | 
			
		||||
 | 
			
		||||
	json_select ..
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_set_led_switch() {
 | 
			
		||||
	local trigger_name="$4"
 | 
			
		||||
	local port_mask="$5"
 | 
			
		||||
	local speed_mask="$6"
 | 
			
		||||
	local mode="$7"
 | 
			
		||||
 | 
			
		||||
	_ucidef_set_led_common "$1" "$2" "$3"
 | 
			
		||||
 | 
			
		||||
	json_add_string trigger "$trigger_name"
 | 
			
		||||
	json_add_string type switch
 | 
			
		||||
	json_add_string mode "$mode"
 | 
			
		||||
	json_add_string port_mask "$port_mask"
 | 
			
		||||
	json_add_string speed_mask "$speed_mask"
 | 
			
		||||
	json_select ..
 | 
			
		||||
 | 
			
		||||
	json_select ..
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
_ucidef_set_led_timer() {
 | 
			
		||||
	local trigger_name="$4"
 | 
			
		||||
	local delayon="$5"
 | 
			
		||||
	local delayoff="$6"
 | 
			
		||||
 | 
			
		||||
	_ucidef_set_led_common "$1" "$2" "$3"
 | 
			
		||||
 | 
			
		||||
	json_add_string type "$trigger_name"
 | 
			
		||||
	json_add_string trigger "$trigger_name"
 | 
			
		||||
	json_add_int delayon "$delayon"
 | 
			
		||||
	json_add_int delayoff "$delayoff"
 | 
			
		||||
	json_select ..
 | 
			
		||||
 | 
			
		||||
	json_select ..
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_set_led_timer() {
 | 
			
		||||
	_ucidef_set_led_timer $1 $2 $3 "timer" $4 $5
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
_ucidef_set_led_trigger() {
 | 
			
		||||
	local trigger_name="$4"
 | 
			
		||||
 | 
			
		||||
	_ucidef_set_led_common "$1" "$2" "$3"
 | 
			
		||||
 | 
			
		||||
	json_add_string trigger "$trigger_name"
 | 
			
		||||
	json_select ..
 | 
			
		||||
 | 
			
		||||
	json_select ..
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_set_led_usbdev() {
 | 
			
		||||
	local dev="$4"
 | 
			
		||||
 | 
			
		||||
	_ucidef_set_led_common "$1" "$2" "$3"
 | 
			
		||||
 | 
			
		||||
	json_add_string type usb
 | 
			
		||||
	json_add_string device "$dev"
 | 
			
		||||
	json_select ..
 | 
			
		||||
 | 
			
		||||
	json_select ..
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_set_led_usbhost() {
 | 
			
		||||
	_ucidef_set_led_trigger "$1" "$2" "$3" usb-host
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_set_led_usbport() {
 | 
			
		||||
	local obj="$1"
 | 
			
		||||
	local name="$2"
 | 
			
		||||
	local sysfs="$3"
 | 
			
		||||
	shift
 | 
			
		||||
	shift
 | 
			
		||||
	shift
 | 
			
		||||
 | 
			
		||||
	_ucidef_set_led_common "$obj" "$name" "$sysfs"
 | 
			
		||||
 | 
			
		||||
	json_add_string type usbport
 | 
			
		||||
	json_select_array ports
 | 
			
		||||
		for port in "$@"; do
 | 
			
		||||
			json_add_string port "$port"
 | 
			
		||||
		done
 | 
			
		||||
	json_select ..
 | 
			
		||||
	json_select ..
 | 
			
		||||
 | 
			
		||||
	json_select ..
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_set_led_wlan() {
 | 
			
		||||
	_ucidef_set_led_trigger "$1" "$2" "$3" "$4"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_set_rssimon() {
 | 
			
		||||
	local dev="$1"
 | 
			
		||||
	local refresh="$2"
 | 
			
		||||
	local threshold="$3"
 | 
			
		||||
 | 
			
		||||
	json_select_object rssimon
 | 
			
		||||
 | 
			
		||||
	json_select_object "$dev"
 | 
			
		||||
	[ -n "$refresh" ] && json_add_int refresh "$refresh"
 | 
			
		||||
	[ -n "$threshold" ] && json_add_int threshold "$threshold"
 | 
			
		||||
	json_select ..
 | 
			
		||||
 | 
			
		||||
	json_select ..
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_add_gpio_switch() {
 | 
			
		||||
	local cfg="$1"
 | 
			
		||||
	local name="$2"
 | 
			
		||||
	local pin="$3"
 | 
			
		||||
	local default="${4:-0}"
 | 
			
		||||
 | 
			
		||||
	json_select_object gpioswitch
 | 
			
		||||
		json_select_object "$cfg"
 | 
			
		||||
			json_add_string name "$name"
 | 
			
		||||
			json_add_int pin "$pin"
 | 
			
		||||
			json_add_int default "$default"
 | 
			
		||||
		json_select ..
 | 
			
		||||
	json_select ..
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_set_hostname() {
 | 
			
		||||
	local hostname="$1"
 | 
			
		||||
 | 
			
		||||
	json_select_object system
 | 
			
		||||
		json_add_string hostname "$hostname"
 | 
			
		||||
	json_select ..
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_set_ntpserver() {
 | 
			
		||||
	local server
 | 
			
		||||
 | 
			
		||||
	json_select_object system
 | 
			
		||||
		json_select_array ntpserver
 | 
			
		||||
			for server in "$@"; do
 | 
			
		||||
				json_add_string "" "$server"
 | 
			
		||||
			done
 | 
			
		||||
		json_select ..
 | 
			
		||||
	json_select ..
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_set_network_options() {
 | 
			
		||||
	json_add_object "network_options"
 | 
			
		||||
	n=$#
 | 
			
		||||
 | 
			
		||||
	for i in $(seq $((n / 2))); do
 | 
			
		||||
		opt="$1"
 | 
			
		||||
		val="$2"
 | 
			
		||||
 | 
			
		||||
		if [ "$val" -eq "$val" ] 2>/dev/null; then
 | 
			
		||||
			json_add_int "$opt" "$val"
 | 
			
		||||
		else
 | 
			
		||||
			[ "$val" = "true" ] && val=1 || val=0
 | 
			
		||||
			json_add_boolean "$opt" "$val"
 | 
			
		||||
		fi
 | 
			
		||||
		shift; shift
 | 
			
		||||
	done
 | 
			
		||||
	json_close_object
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_set_poe() {
 | 
			
		||||
	json_add_object poe
 | 
			
		||||
		json_add_int "chip_count" "$1"
 | 
			
		||||
		json_add_int "budget" "$2"
 | 
			
		||||
		json_add_int "poe_ports" "$3"
 | 
			
		||||
		shift 3
 | 
			
		||||
		json_add_array ports
 | 
			
		||||
			while [ $# -gt 0 ]
 | 
			
		||||
			do
 | 
			
		||||
				json_add_object ""
 | 
			
		||||
					json_add_string "name" "$1"
 | 
			
		||||
					json_add_string "class" "$2"
 | 
			
		||||
					json_add_int "budget" "$3"
 | 
			
		||||
				json_close_object
 | 
			
		||||
				shift 3
 | 
			
		||||
			done
 | 
			
		||||
		json_close_array
 | 
			
		||||
		json_add_array poe_chips
 | 
			
		||||
		json_close_array
 | 
			
		||||
	json_close_object
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ucidef_set_poe_chip() {
 | 
			
		||||
	json_select_object poe
 | 
			
		||||
		json_select_array poe_chips
 | 
			
		||||
			json_add_object ""
 | 
			
		||||
				for port in "$@"; do
 | 
			
		||||
					case "$port" in
 | 
			
		||||
						0X*)
 | 
			
		||||
							json_add_string address "$port"
 | 
			
		||||
						;;
 | 
			
		||||
						[0-9]:*)
 | 
			
		||||
							json_add_string chan"${port%%:*}" "${port##*:}"
 | 
			
		||||
						;;
 | 
			
		||||
					esac
 | 
			
		||||
				done
 | 
			
		||||
			json_close_object
 | 
			
		||||
		json_select ..
 | 
			
		||||
	json_select ..
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
board_config_update() {
 | 
			
		||||
	json_init
 | 
			
		||||
	[ -f ${CFG} ] && json_load "$(cat ${CFG})"
 | 
			
		||||
 | 
			
		||||
	# auto-initialize model id and name if applicable
 | 
			
		||||
	if ! json_is_a model object; then
 | 
			
		||||
		json_select_object model
 | 
			
		||||
			[ -f "/tmp/sysinfo/board_name" ] && \
 | 
			
		||||
				json_add_string id "$(cat /tmp/sysinfo/board_name)"
 | 
			
		||||
			[ -f "/tmp/sysinfo/model" ] && \
 | 
			
		||||
				json_add_string name "$(cat /tmp/sysinfo/model)"
 | 
			
		||||
		json_select ..
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
board_config_flush() {
 | 
			
		||||
	json_dump -i -o ${CFG}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										244
									
								
								6.1/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										244
									
								
								6.1/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,244 @@
 | 
			
		|||
PART_NAME=firmware
 | 
			
		||||
REQUIRE_IMAGE_METADATA=1
 | 
			
		||||
 | 
			
		||||
RAMFS_COPY_BIN='fw_printenv fw_setenv'
 | 
			
		||||
RAMFS_COPY_DATA='/etc/fw_env.config /var/lock/fw_printenv.lock'
 | 
			
		||||
 | 
			
		||||
platform_check_image() {
 | 
			
		||||
	case "$(board_name)" in
 | 
			
		||||
	asus,rt-ac42u |\
 | 
			
		||||
	asus,rt-ac58u)
 | 
			
		||||
		local ubidev=$(nand_find_ubi $CI_UBIPART)
 | 
			
		||||
		local asus_root=$(nand_find_volume $ubidev jffs2)
 | 
			
		||||
 | 
			
		||||
		[ -n "$asus_root" ] || return 0
 | 
			
		||||
 | 
			
		||||
		cat << EOF
 | 
			
		||||
jffs2 partition is still present.
 | 
			
		||||
There's probably no space left
 | 
			
		||||
to install the filesystem.
 | 
			
		||||
 | 
			
		||||
You need to delete the jffs2 partition first:
 | 
			
		||||
# ubirmvol /dev/ubi0 --name=jffs2
 | 
			
		||||
 | 
			
		||||
Once this is done. Retry.
 | 
			
		||||
EOF
 | 
			
		||||
		return 1
 | 
			
		||||
		;;
 | 
			
		||||
	zte,mf18a |\
 | 
			
		||||
	zte,mf282plus|\
 | 
			
		||||
	zte,mf286d |\
 | 
			
		||||
	zte,mf287|\
 | 
			
		||||
	zte,mf287plus |\
 | 
			
		||||
	zte,mf287pro |\
 | 
			
		||||
	zte,mf289f)
 | 
			
		||||
		CI_UBIPART="rootfs"
 | 
			
		||||
		local mtdnum="$( find_mtd_index $CI_UBIPART )"
 | 
			
		||||
		[ ! "$mtdnum" ] && return 1
 | 
			
		||||
		ubiattach -m "$mtdnum" || true
 | 
			
		||||
		local ubidev="$( nand_find_ubi $CI_UBIPART )"
 | 
			
		||||
		local ubi_rootfs=$(nand_find_volume $ubidev ubi_rootfs)
 | 
			
		||||
		local ubi_rootfs_data=$(nand_find_volume $ubidev ubi_rootfs_data)
 | 
			
		||||
 | 
			
		||||
		[ -n "$ubi_rootfs" ] || [ -n "$ubi_rootfs_data" ] || return 0
 | 
			
		||||
 | 
			
		||||
		cat << EOF
 | 
			
		||||
ubi_rootfs partition is still present.
 | 
			
		||||
 | 
			
		||||
You need to delete the stock partition first:
 | 
			
		||||
# ubirmvol /dev/ubi0 -N ubi_rootfs
 | 
			
		||||
Please also delete ubi_rootfs_data, if exist:
 | 
			
		||||
# ubirmvol /dev/ubi0 -N ubi_rootfs_data
 | 
			
		||||
 | 
			
		||||
Once this is done. Retry.
 | 
			
		||||
EOF
 | 
			
		||||
		return 1
 | 
			
		||||
		;;
 | 
			
		||||
	esac
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
askey_do_upgrade() {
 | 
			
		||||
	local tar_file="$1"
 | 
			
		||||
 | 
			
		||||
	local board_dir=$(tar tf $tar_file | grep -m 1 '^sysupgrade-.*/$')
 | 
			
		||||
	board_dir=${board_dir%/}
 | 
			
		||||
 | 
			
		||||
	tar Oxf $tar_file ${board_dir}/root | mtd write - rootfs
 | 
			
		||||
 | 
			
		||||
	nand_do_upgrade "$1"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
zyxel_do_upgrade() {
 | 
			
		||||
	local tar_file="$1"
 | 
			
		||||
 | 
			
		||||
	local board_dir=$(tar tf $tar_file | grep -m 1 '^sysupgrade-.*/$')
 | 
			
		||||
	board_dir=${board_dir%/}
 | 
			
		||||
 | 
			
		||||
	tar Oxf $tar_file ${board_dir}/kernel | mtd write - kernel
 | 
			
		||||
 | 
			
		||||
	if [ -n "$UPGRADE_BACKUP" ]; then
 | 
			
		||||
		tar Oxf $tar_file ${board_dir}/root | mtd -j "$UPGRADE_BACKUP" write - rootfs
 | 
			
		||||
	else
 | 
			
		||||
		tar Oxf $tar_file ${board_dir}/root | mtd write - rootfs
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
platform_do_upgrade_mikrotik_nand() {
 | 
			
		||||
	local fw_mtd=$(find_mtd_part kernel)
 | 
			
		||||
	fw_mtd="${fw_mtd/block/}"
 | 
			
		||||
	[ -n "$fw_mtd" ] || return
 | 
			
		||||
 | 
			
		||||
	local board_dir=$(tar tf "$1" | grep -m 1 '^sysupgrade-.*/$')
 | 
			
		||||
	board_dir=${board_dir%/}
 | 
			
		||||
	[ -n "$board_dir" ] || return
 | 
			
		||||
 | 
			
		||||
	local kernel_len=$(tar xf "$1" ${board_dir}/kernel -O | wc -c)
 | 
			
		||||
	[ -n "$kernel_len" ] || return
 | 
			
		||||
 | 
			
		||||
	tar xf "$1" ${board_dir}/kernel -O | ubiformat "$fw_mtd" -y -S $kernel_len -f -
 | 
			
		||||
 | 
			
		||||
	CI_KERNPART="none"
 | 
			
		||||
	nand_do_upgrade "$1"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
platform_do_upgrade() {
 | 
			
		||||
	case "$(board_name)" in
 | 
			
		||||
	8dev,jalapeno |\
 | 
			
		||||
	aruba,ap-303 |\
 | 
			
		||||
	aruba,ap-303h |\
 | 
			
		||||
	aruba,ap-365 |\
 | 
			
		||||
	avm,fritzbox-7530 |\
 | 
			
		||||
	avm,fritzrepeater-1200 |\
 | 
			
		||||
	avm,fritzrepeater-3000 |\
 | 
			
		||||
	buffalo,wtr-m2133hp |\
 | 
			
		||||
	cilab,meshpoint-one |\
 | 
			
		||||
	edgecore,ecw5211 |\
 | 
			
		||||
	edgecore,oap100 |\
 | 
			
		||||
	engenius,eap2200 |\
 | 
			
		||||
	glinet,gl-a1300 |\
 | 
			
		||||
	glinet,gl-ap1300 |\
 | 
			
		||||
	luma,wrtq-329acn |\
 | 
			
		||||
	mobipromo,cm520-79f |\
 | 
			
		||||
	netgear,wac510 |\
 | 
			
		||||
	p2w,r619ac-64m |\
 | 
			
		||||
	p2w,r619ac-128m |\
 | 
			
		||||
	qxwlan,e2600ac-c2 |\
 | 
			
		||||
	wallys,dr40x9)
 | 
			
		||||
		nand_do_upgrade "$1"
 | 
			
		||||
		;;
 | 
			
		||||
	glinet,gl-b2200)
 | 
			
		||||
		CI_KERNPART="0:HLOS"
 | 
			
		||||
		CI_ROOTPART="rootfs"
 | 
			
		||||
		CI_DATAPART="rootfs_data"
 | 
			
		||||
		emmc_do_upgrade "$1"
 | 
			
		||||
		;;
 | 
			
		||||
	alfa-network,ap120c-ac)
 | 
			
		||||
		part="$(awk -F 'ubi.mtd=' '{printf $2}' /proc/cmdline | sed -e 's/ .*$//')"
 | 
			
		||||
		if [ "$part" = "rootfs1" ]; then
 | 
			
		||||
			fw_setenv active 2 || exit 1
 | 
			
		||||
			CI_UBIPART="rootfs2"
 | 
			
		||||
		else
 | 
			
		||||
			fw_setenv active 1 || exit 1
 | 
			
		||||
			CI_UBIPART="rootfs1"
 | 
			
		||||
		fi
 | 
			
		||||
		nand_do_upgrade "$1"
 | 
			
		||||
		;;
 | 
			
		||||
	asus,map-ac2200)
 | 
			
		||||
		CI_KERNPART="linux"
 | 
			
		||||
		nand_do_upgrade "$1"
 | 
			
		||||
		;;
 | 
			
		||||
	asus,rt-ac42u |\
 | 
			
		||||
	asus,rt-ac58u)
 | 
			
		||||
		CI_KERNPART="linux"
 | 
			
		||||
		nand_do_upgrade "$1"
 | 
			
		||||
		;;
 | 
			
		||||
	cellc,rtl30vw)
 | 
			
		||||
		CI_UBIPART="ubifs"
 | 
			
		||||
		askey_do_upgrade "$1"
 | 
			
		||||
		;;
 | 
			
		||||
	compex,wpj419)
 | 
			
		||||
		nand_do_upgrade "$1"
 | 
			
		||||
		;;
 | 
			
		||||
	google,wifi)
 | 
			
		||||
		export_bootdevice
 | 
			
		||||
		export_partdevice CI_ROOTDEV 0
 | 
			
		||||
		CI_KERNPART="kernel"
 | 
			
		||||
		CI_ROOTPART="rootfs"
 | 
			
		||||
		emmc_do_upgrade "$1"
 | 
			
		||||
		;;
 | 
			
		||||
	linksys,ea6350v3 |\
 | 
			
		||||
	linksys,ea8300 |\
 | 
			
		||||
	linksys,mr8300 |\
 | 
			
		||||
	linksys,whw01 |\
 | 
			
		||||
	linksys,whw03v2)
 | 
			
		||||
		platform_do_upgrade_linksys "$1"
 | 
			
		||||
		;;
 | 
			
		||||
	meraki,mr33 |\
 | 
			
		||||
	meraki,mr74)
 | 
			
		||||
		CI_KERNPART="part.safe"
 | 
			
		||||
		nand_do_upgrade "$1"
 | 
			
		||||
		;;
 | 
			
		||||
	mikrotik,cap-ac|\
 | 
			
		||||
	mikrotik,hap-ac2|\
 | 
			
		||||
	mikrotik,hap-ac3-lte6-kit|\
 | 
			
		||||
	mikrotik,lhgg-60ad|\
 | 
			
		||||
	mikrotik,sxtsq-5-ac|\
 | 
			
		||||
	mikrotik,wap-ac|\
 | 
			
		||||
	mikrotik,wap-ac-lte|\
 | 
			
		||||
	mikrotik,wap-r-ac)
 | 
			
		||||
		[ "$(rootfs_type)" = "tmpfs" ] && mtd erase firmware
 | 
			
		||||
		default_do_upgrade "$1"
 | 
			
		||||
		;;
 | 
			
		||||
	mikrotik,hap-ac3)
 | 
			
		||||
		platform_do_upgrade_mikrotik_nand "$1"
 | 
			
		||||
		;;
 | 
			
		||||
	netgear,rbr40|\
 | 
			
		||||
	netgear,rbs40|\
 | 
			
		||||
	netgear,rbr50 |\
 | 
			
		||||
	netgear,rbs50 |\
 | 
			
		||||
	netgear,srr60 |\
 | 
			
		||||
	netgear,srs60)
 | 
			
		||||
		platform_do_upgrade_netgear_orbi_upgrade "$1"
 | 
			
		||||
		;;
 | 
			
		||||
	openmesh,a42 |\
 | 
			
		||||
	openmesh,a62 |\
 | 
			
		||||
	plasmacloud,pa1200 |\
 | 
			
		||||
	plasmacloud,pa2200)
 | 
			
		||||
		PART_NAME="inactive"
 | 
			
		||||
		platform_do_upgrade_dualboot_datachk "$1"
 | 
			
		||||
		;;
 | 
			
		||||
	sony,ncp-hg100-cellular)
 | 
			
		||||
		sony_emmc_do_upgrade "$1"
 | 
			
		||||
		;;
 | 
			
		||||
	teltonika,rutx10 |\
 | 
			
		||||
	teltonika,rutx12 |\
 | 
			
		||||
	teltonika,rutx50 |\
 | 
			
		||||
	zte,mf18a |\
 | 
			
		||||
	zte,mf282plus |\
 | 
			
		||||
	zte,mf286d |\
 | 
			
		||||
	zte,mf287 |\
 | 
			
		||||
	zte,mf287plus |\
 | 
			
		||||
	zte,mf287pro |\
 | 
			
		||||
	zte,mf289f)
 | 
			
		||||
		CI_UBIPART="rootfs"
 | 
			
		||||
		nand_do_upgrade "$1"
 | 
			
		||||
		;;
 | 
			
		||||
	zyxel,nbg6617)
 | 
			
		||||
		zyxel_do_upgrade "$1"
 | 
			
		||||
		;;
 | 
			
		||||
	*)
 | 
			
		||||
		default_do_upgrade "$1"
 | 
			
		||||
		;;
 | 
			
		||||
	esac
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
platform_copy_config() {
 | 
			
		||||
	case "$(board_name)" in
 | 
			
		||||
	glinet,gl-b2200 |\
 | 
			
		||||
	google,wifi)
 | 
			
		||||
		emmc_copy_config
 | 
			
		||||
		;;
 | 
			
		||||
	esac
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue