#!/bin/sh


BOARD_NAME=$(ubus call system board | jsonfilter -e '@.board_name')
case "$BOARD_NAME" in
	routerich,ax3000*)
		RADIO0_HTMODE="HE40"
		RADIO1_HTMODE="HE160"
		PHY="phy"
		;;
	routerich,be3600|routerich,be7200)
		RADIO0_HTMODE="EHT40"
		RADIO1_HTMODE="EHT160"
		PHY="phy0."
		;;
	*)
		exit 1
		;;
esac


copy_routerich_firmware() {
	case "$BOARD_NAME" in
		routerich,ax3000*)
			factory_mtd=/dev/$(cat /proc/mtd | grep -i factory | awk '{print $1}' | sed 's/://')
			dd if=$factory_mtd of=/lib/firmware/mediatek/mt7981_eeprom_mt7976_dbdc.bin bs=1 count=32 conv=notrunc >/dev/null 2>&1
			;;
		*)
			return 0
			;;
	esac
}


add_repository() {
	rrver=$(ubus call system board | jsonfilter -e '@.release.version')
	rrrev=${rrver%.*}
	rrid=$(sed -n 's/^RRID="\([^"]*\)"/\1/p' /etc/os-release)

	if command -v opkg >/dev/null 2>&1; then
		opkgfeeds="/etc/opkg/distfeeds.conf"

		if [ "${rrver##*.}" -ge 6 ]; then
			if [ "$rrid" = "1" ]; then
				sed -i "s|src/gz openwrt_core https://downloads.openwrt.org/releases/$rrver/targets/mediatek/filogic/packages|src/gz routerich_core https://packages.routerich.ru/$rrrev/mediatek/filogic/$rrver/rr-core|" "$opkgfeeds"
				sed -i "s|src/gz openwrt_base https://downloads.openwrt.org/releases/$rrver/packages/aarch64_cortex-a53/base|src/gz routerich_base https://packages.routerich.ru/$rrrev/mediatek/filogic/$rrver/rr-base|" "$opkgfeeds"
			elif [ "$rrid" = "2" ]; then
				sed -i "s|src/gz openwrt_core https://downloads.openwrt.org/releases/$rrver/targets/mediatek/filogic/packages|src/gz routerich_core https://packages.routerich.ru/$rrrev/mediatek/filogic/$rrver/beta-core|" "$opkgfeeds"
				sed -i "s|src/gz openwrt_base https://downloads.openwrt.org/releases/$rrver/packages/aarch64_cortex-a53/base|src/gz routerich_base https://packages.routerich.ru/$rrrev/mediatek/filogic/$rrver/beta-base|" "$opkgfeeds"
			else
				sed -i "s|src/gz openwrt_core https://downloads.openwrt.org/releases/$rrver/targets/mediatek/filogic/packages|src/gz routerich_core https://packages.routerich.ru/$rrrev/mediatek/filogic/$rrver/core|" "$opkgfeeds"
				sed -i "s|src/gz openwrt_base https://downloads.openwrt.org/releases/$rrver/packages/aarch64_cortex-a53/base|src/gz routerich_base https://packages.routerich.ru/$rrrev/mediatek/filogic/$rrver/base|" "$opkgfeeds"
			fi
			sed -i "s|src/gz openwrt_luci https://downloads.openwrt.org/releases/$rrver/packages/aarch64_cortex-a53/luci|src/gz routerich_luci https://packages.routerich.ru/$rrrev/mediatek/filogic/$rrver/luci|" "$opkgfeeds"
			sed -i "s|src/gz openwrt_packages https://downloads.openwrt.org/releases/$rrver/packages/aarch64_cortex-a53/packages|src/gz routerich_packages https://packages.routerich.ru/$rrrev/mediatek/filogic/$rrver/packages|" "$opkgfeeds"
			sed -i "s|src/gz openwrt_routing https://downloads.openwrt.org/releases/$rrver/packages/aarch64_cortex-a53/routing|src/gz routerich_routing https://packages.routerich.ru/$rrrev/mediatek/filogic/$rrver/routing|" "$opkgfeeds"
			sed -i "s|src/gz openwrt_telephony https://downloads.openwrt.org/releases/$rrver/packages/aarch64_cortex-a53/telephony|src/gz routerich_telephony https://packages.routerich.ru/$rrrev/mediatek/filogic/$rrver/telephony|" "$opkgfeeds"

			sed -i '/^src\/gz openwrt_kmods /d' "$opkgfeeds"
			if ! grep -q "src/gz routerich https://packages.routerich.ru/$rrrev/mediatek/filogic/routerich" "$opkgfeeds"; then
				echo "src/gz routerich https://packages.routerich.ru/$rrrev/mediatek/filogic/routerich" >> "$opkgfeeds"
			fi
		else
			sed -i "s|src/gz openwrt_core https://downloads.openwrt.org/releases/$rrver/targets/mediatek/filogic/packages|src/gz routerich_core https://github.com/routerich/packages.routerich/raw/$rrver/core|" "$opkgfeeds"
			sed -i "s|src/gz openwrt_base https://downloads.openwrt.org/releases/$rrver/packages/aarch64_cortex-a53/base|src/gz routerich_base https://github.com/routerich/packages.routerich/raw/$rrver/base|" "$opkgfeeds"

			sed -i '/^src\/gz openwrt_kmods /d' "$opkgfeeds"

			if ! grep -q "src/gz routerich https://github.com/routerich/packages.routerich/raw/$rrver/routerich" "$opkgfeeds"; then
				echo "src/gz routerich https://github.com/routerich/packages.routerich/raw/$rrver/routerich" >> "$opkgfeeds"
			fi

			sed -i '/^src\/gz routerich http/d' /etc/opkg/customfeeds.conf
		fi
	elif command -v apk >/dev/null 2>&1; then
		apkfeeds="/etc/apk/repositories.d/distfeeds.list"

		if [ "$rrid" = "1" ]; then
			sed -i "s|https://downloads.openwrt.org/releases/$rrver/targets/mediatek/filogic/packages/packages.adb|https://packages.routerich.ru/$rrrev/mediatek/filogic/$rrver/rr-core/packages.adb|" "$apkfeeds"
			sed -i "s|https://downloads.openwrt.org/releases/$rrver/packages/aarch64_cortex-a53/base/packages.adb|https://packages.routerich.ru/$rrrev/mediatek/filogic/$rrver/rr-base/packages.adb|" "$apkfeeds"
		elif [ "$rrid" = "2" ]; then
			sed -i "s|https://downloads.openwrt.org/releases/$rrver/targets/mediatek/filogic/packages/packages.adb|https://packages.routerich.ru/$rrrev/mediatek/filogic/$rrver/beta-core/packages.adb|" "$apkfeeds"
			sed -i "s|https://downloads.openwrt.org/releases/$rrver/packages/aarch64_cortex-a53/base/packages.adb|https://packages.routerich.ru/$rrrev/mediatek/filogic/$rrver/beta-base/packages.adb|" "$apkfeeds"
		else
			sed -i "s|https://downloads.openwrt.org/releases/$rrver/targets/mediatek/filogic/packages/packages.adb|https://packages.routerich.ru/$rrrev/mediatek/filogic/$rrver/core/packages.adb|" "$apkfeeds"
			sed -i "s|https://downloads.openwrt.org/releases/$rrver/packages/aarch64_cortex-a53/base/packages.adb|https://packages.routerich.ru/$rrrev/mediatek/filogic/$rrver/base/packages.adb|" "$apkfeeds"
		fi

		sed -i "s|https://downloads.openwrt.org/releases/$rrver/targets/mediatek/filogic/packages/packages.adb|https://packages.routerich.ru/$rrrev/mediatek/filogic/$rrver/core/packages.adb|" "$apkfeeds"
		sed -i "s|https://downloads.openwrt.org/releases/$rrver/packages/aarch64_cortex-a53/base/packages.adb|https://packages.routerich.ru/$rrrev/mediatek/filogic/$rrver/base/packages.adb|" "$apkfeeds"

		sed -i "s|https://downloads.openwrt.org/releases/$rrver/packages/aarch64_cortex-a53/luci/packages.adb|https://packages.routerich.ru/$rrrev/mediatek/filogic/$rrver/luci/packages.adb|" "$apkfeeds"
		sed -i "s|https://downloads.openwrt.org/releases/$rrver/packages/aarch64_cortex-a53/packages/packages.adb|https://packages.routerich.ru/$rrrev/mediatek/filogic/$rrver/packages/packages.adb|" "$apkfeeds"
		sed -i "s|https://downloads.openwrt.org/releases/$rrver/packages/aarch64_cortex-a53/routing/packages.adb|https://packages.routerich.ru/$rrrev/mediatek/filogic/$rrver/routing/packages.adb|" "$apkfeeds"
		sed -i "s|https://downloads.openwrt.org/releases/$rrver/packages/aarch64_cortex-a53/telephony/packages.adb|https://packages.routerich.ru/$rrrev/mediatek/filogic/$rrver/telephony/packages.adb|" "$apkfeeds"
		sed -i "s|https://downloads.openwrt.org/releases/$rrver/packages/aarch64_cortex-a53/video/packages.adb|https://packages.routerich.ru/$rrrev/mediatek/filogic/$rrver/video/packages.adb|" "$apkfeeds"

		sed -i '\|/targets/mediatek/filogic/kmods/|d' "$apkfeeds"

		# Source-only/private feeds have no published OpenWrt repository. Remove
		# their generated downloads URLs so one nonexistent index cannot make the
		# native APK refresh fail for every healthy RouteRich feed.
		for feed in authrr automodem awg_openwrt modeminfo_mqtt mqtt \
			natflow_openwrt routerich routerich_diag rr_modemfeed wdoc \
			zapret2 zeroblock; do
			sed -i "\|/packages/aarch64_cortex-a53/$feed/packages.adb\$|d" "$apkfeeds"
		done

		if ! grep -q "https://packages.routerich.ru/$rrrev/mediatek/filogic/routerich/packages.adb" "$apkfeeds"; then
			echo "https://packages.routerich.ru/$rrrev/mediatek/filogic/routerich/packages.adb" >> "$apkfeeds"
		fi

		sed -i '\|http://packages.routerich.ru|d' "$apkfeeds"
	fi
}


is_rr_inited() {
	[ -f /etc/config/.rr-init ]
}


pkg_installed() {
	for pkg in "$@"; do
		if command -v opkg >/dev/null 2>&1; then
			opkg list-installed 2>/dev/null | grep -qE "^$pkg " && return 0
		elif command -v apk >/dev/null 2>&1; then
			apk info 2>/dev/null | grep -qE "^$pkg$" && return 0
		fi
	done
	return 1
}


add_rr_version() {
	if [ -s /etc/routerich_release ]; then
		v="$(cat /etc/routerich_release)"
	else
		v="ASU"
	fi

	if ! grep -qF "$v" /etc/openwrt_release; then
		sed -i "s|\(DISTRIB_DESCRIPTION='[^']*\)'|\1 $v'|" /etc/openwrt_release
	fi

	if ! grep -qF "$v" /usr/lib/os-release; then
		sed -i "s|\(OPENWRT_RELEASE=\"[^\"]*\)\"|\1 $v\"|" /usr/lib/os-release
	fi
}


set_wan() {
	BOARD_NAME=$(ubus call system board | jsonfilter -e '@.board_name')
	case "$BOARD_NAME" in
		routerich,ax3000|routerich,ax3000-multi|routerich,be3600|routerich,be7200)
			WANDEV="wan"
			;;
		routerich,ax3000-v1)
			WANDEV="eth1"
			;;
		*)
			WANDEV="wan"
			;;
	esac
	# On the migration boot the WAN port does not exist yet: the legacy
	# bootloader applies no device tree overlay. Reading its address then
	# yields nothing, and pinning an empty MAC is worse than pinning none
	# at all, so the address is left to the next boot - by which time the
	# right overlay is in place and the port is real.
	MAC=$(cat /sys/class/net/$WANDEV/address 2>/dev/null)
	FOUND=""
	for s in $(uci show network | grep "=device" | sed -E 's/([^=]+)=device.*/\1/'); do
		name=$(uci -q get $s.name)
		if [ "$name" = "$WANDEV" ]; then
			FOUND="$s"
			break
		fi
	done
	if [ -n "$MAC" ]; then
		if [ -n "$FOUND" ]; then
			CURRENT_MAC=$(uci -q get $FOUND.macaddr)
			if [ -z "$CURRENT_MAC" ]; then
				uci -q set $FOUND.macaddr="$MAC"
			fi
		else
			uci add network device >/dev/null
			uci -q set network.@device[-1].name="$WANDEV"
			uci -q set network.@device[-1].macaddr="$MAC"
		fi
		uci commit network
		uci -q set wizard.default.hw_mac="$MAC"
	fi
	uci -q set wizard.default.hw_wan="$WANDEV"
	uci commit wizard
}


set_lan() {
	is_rr_inited && return
	VAL="$(uci -q get network.lan.ipaddr)"

	case "$VAL" in
		*/*)
			IP="${VAL%%/*}"
			NETMASK="$(ipcalc.sh "$VAL" | awk -F= '/NETMASK/ {print $2}')"
			uci -q set network.lan.ipaddr="$IP"
			uci -q set network.lan.netmask="$NETMASK"
			uci commit network
		;;
	esac
}


set_init_wizard() {
	if is_rr_inited; then
		uci -q set wizard.default.wizard_complete='1'
	else
		uci -q set wizard.default.wizard_complete='0'
	fi
	uci commit wizard
}


set_packet_steering() {
	is_rr_inited && return
	uci -q set network.globals.packet_steering='2'
	uci commit network
}


set_hw_offloading() {
	is_rr_inited && return
	uci -q del firewall.@defaults[0].syn_flood
	uci -q set firewall.@defaults[0].synflood_protect='1'
	uci -q set firewall.@defaults[0].flow_offloading='1'
	uci -q set firewall.@defaults[0].flow_offloading_hw='1'
	uci commit firewall
}


set_offload_delay() {
	sed -i 's/meta l4proto { tcp, udp } flow offload @ft;/meta l4proto { tcp, udp } ct original packets ge 30 flow offload @ft;/' /usr/share/firewall4/templates/ruleset.uc
}


set_firewall() {
	for s in $(uci show firewall | grep '=zone' | sed -E 's/([^=]+)=.*/\1/'); do
		name=$(uci -q get $s.name)
		[ "$name" = "wan" ] || continue
		current="$(uci -q get $s.network)"

		for proto in pppoe l2tp pptp; do
			found=0
			for n in $current; do
				[ "$n" = "$proto" ] && found=1
			done
			[ $found -eq 0 ] && uci add_list $s.network="$proto"
		done
	done
	uci commit firewall
}


set_upnp() {
	is_rr_inited && return
	uci -q set upnpd.config.enabled='1'
	uci -q set upnpd.config.enable_natpmp='1'
	uci -q set upnpd.config.enable_upnp='1'
	uci -q set upnpd.config.secure_mode='1'
	uci -q set upnpd.config.log_output='0'
	uci -q set upnpd.config.igdv1='1'
	uci -q set upnpd.config.ipv6_disable='1'
	uci commit upnpd

	cat <<'EOF' >/etc/hotplug.d/iface/99-upnpd
[ "$ACTION" = "ifup" ] || exit 0
[ "$INTERFACE" = "lan" ] || exit 0

/etc/init.d/miniupnpd restart 2>/dev/null
EOF
}


set_luci_nas() {
	cat <<EOF > /usr/share/luci/menu.d/luci-nas.json
{
	"admin/nas": {
		"title": "NAS",
		"order": 44
	}
}
EOF
}


set_ntp() {
	is_rr_inited && return
	uci -q del system.ntp.server
	uci add_list system.ntp.server="0.ru.pool.ntp.org" 2>/dev/null
	uci add_list system.ntp.server="1.ru.pool.ntp.org" 2>/dev/null
	uci add_list system.ntp.server="2.ru.pool.ntp.org" 2>/dev/null
	uci add_list system.ntp.server="3.ru.pool.ntp.org" 2>/dev/null
	uci commit system
}


set_system() {
	is_rr_inited && return
	current_hostname=$(uci get system.@system[0].hostname)
	if [ "$current_hostname" = "OpenWrt" ]; then
		uci -q set system.@system[0].hostname="RouteRich" 2>/dev/null
		uci -q set system.@system[0].timezone='MSK-3' 2>/dev/null
		uci -q set system.@system[0].zonename='Europe/Moscow' 2>/dev/null
		uci -q set system.@system[0].log_size='1280' 2>/dev/null
		uci commit system
		/etc/init.d/system reload 2>/dev/null
	fi
}


set_uhttpd() {
	is_rr_inited && return
	uci -q set uhttpd.main.rfc1918_filter='0'
	uci -q set uhttpd.main.script_timeout=180
	uci commit uhttpd
}


set_zram() {
	pkg_installed zram-swap || return
	echo "vm.swappiness=100" > /etc/sysctl.d/10-zram.conf
	uci set system.@system[0].zram_comp_algo='lzo-rle'
	uci commit system 2>/dev/null
}


set_wifi() {
	[ ! -f /etc/config/wireless ] && return
	current_ssid0=$(uci get wireless.default_radio0.ssid)
	current_ssid1=$(uci get wireless.default_radio1.ssid)
	if [ "$current_ssid0" = "OpenWrt" ]; then
		uci -q set wireless.radio0.htmode='HE40' 2>/dev/null
		uci -q set wireless.radio0.country='RU' 2>/dev/null
		uci -q set wireless.radio0.cell_density='0' 2>/dev/null
		uci -q set wireless.radio0.channel='6' 2>/dev/null
		uci -q set wireless.radio0.htmode="$RADIO0_HTMODE" 2>/dev/null
		uci -q set wireless.default_radio0.ssid='RouteRich_2' 2>/dev/null
		uci -q del wireless.radio0.disabled
		uci -q del wireless.default_radio0.disabled
	fi
	if [ "$current_ssid1" = "OpenWrt" ]; then
		uci -q set wireless.radio1.htmode='HE160' 2>/dev/null
		uci -q set wireless.radio1.country='RU' 2>/dev/null
		uci -q set wireless.radio1.cell_density='0' 2>/dev/null
		uci -q set wireless.radio1.channel='36' 2>/dev/null
		uci -q set wireless.radio1.htmode="$RADIO1_HTMODE" 2>/dev/null
		uci -q set wireless.default_radio1.ssid='RouteRich_5' 2>/dev/null
		uci -q del wireless.radio1.disabled
		uci -q del wireless.default_radio1.disabled
	fi
	uci commit wireless
	wifi
}


wifi_fix() {
	[ ! -f /etc/config/wireless ] && return
	sed -i 's/platform\/18000000/platform\/soc\/18000000/' /etc/config/wireless
	for section in $(uci show wireless | grep OpenWrt | awk -F '[.=]' '{print $2}'); do
		uci -q delete wireless.$section
		radio=$(echo "$section" | sed 's/default_//')
		uci -q delete wireless.$radio
	done
	uci commit wireless
	wifi
}


set_dnsmasq() {
	is_rr_inited && return
	uci -q del dhcp.@dnsmasq[0].filterwin2k
	uci -q del dhcp.@dnsmasq[0].filter_a
	uci -q del dhcp.@dnsmasq[0].filter_aaaa
	uci -q set dhcp.@dnsmasq[0].cachesize='0' 2>/dev/null
	uci -q set dhcp.@dnsmasq[0].nonegcache='1' 2>/dev/null
	uci -q set dhcp.@dnsmasq[0].confdir='/tmp/dnsmasq.d' 2>/dev/null
	uci commit dhcp
}


set_ipv6_disable() {
	is_rr_inited && return
	/etc/init.d/disable_ipv6 enable
	/etc/init.d/disable_ipv6 start
	uci -q set dhcp.@dnsmasq[0].filter_aaaa='1'
	uci -q del dhcp.lan.dhcpv6
	uci -q del dhcp.lan.ra_flags
	uci -q del dhcp.lan.ra
	uci -q del network.wan6
	uci -q del network.lan.ip6assign
	uci commit dhcp
	uci	commit network
}


set_ttyd () {
	uci -q set ttyd.@ttyd[-1].debug='0'
	uci commit ttyd
	cat <<'EOF' >/etc/hotplug.d/iface/99-ttyd
[ "$ACTION" = "ifup" ] || exit 0
[ "$INTERFACE" = "lan" ] || exit 0

/etc/init.d/ttyd restart 2>/dev/null
EOF
}


set_ksmbd() {
	is_rr_inited && return
	uci -q set ksmbd.@globals[0].description='RouteRich Share'
	uci commit ksmbd
	cat <<EOF >/etc/ksmbd/ksmbd.conf.template
[global]
	netbios name = |NAME|
	server string = |DESCRIPTION|
	workgroup = |WORKGROUP|
	interfaces = |INTERFACES|
	bind interfaces only = yes
	ipc timeout = 20
	deadtime = 15
	map to guest = Bad User
	guest ok = yes
EOF
	sed -i 's/^\s*enable-reflector\s*=\s*no/enable-reflector=yes/' /etc/avahi/avahi-daemon.conf
}


set_pptp() {
	is_rr_inited && return
	sed -i 's/^mppe/#mppe/' /etc/ppp/options.pptp
	echo nomppe >> /etc/ppp/options.pptp
}


set_doh() {
	is_rr_inited && return
	if pkg_installed doh-proxy; then
		uci -q del doh-proxy.config.canary_domains_mozilla
		uci -q del doh-proxy.config.canary_domains_icloud
		uci -q set doh-proxy.config.force_dns='0'
		while uci -q delete doh-proxy.@doh-proxy[0]; do :; done
		id="$(uci add doh-proxy doh-proxy)"
		uci -q set doh-proxy.$id.bootstrap_dns="8.8.8.8,8.8.4.4"
		uci -q set doh-proxy.$id.resolver_url="https://dns.google/dns-query"
		uci -q set doh-proxy.$id.listen_addr="127.0.0.1"
		uci -q set doh-proxy.$id.listen_port="5053"
		uci -q set doh-proxy.$id.user="nobody"
		uci -q set doh-proxy.$id.group="nogroup"
		uci commit doh-proxy
	fi
}


set_dot() {
	is_rr_inited && return
	if pkg_installed stubby; then
		uci -q del stubby.global.trigger
		uci add_list stubby.global.trigger='wan'
		uci add_list stubby.global.trigger='wan6'
		uci add_list stubby.global.trigger='pppoe'
		uci add_list stubby.global.trigger='l2tp'
		uci add_list stubby.global.trigger='pptp'
		uci add_list stubby.global.trigger='modem'
		uci add_list stubby.global.trigger='wwan'
		uci add_list stubby.global.trigger='wwan0'
		uci -q set stubby.global.log_level='1'
		uci -q set stubby.global.round_robin_upstreams='1'
		while uci show stubby | grep -q 'stubby.@resolver'; do
			uci -q del stubby.@resolver[0]
		done
		uci add stubby resolver >/dev/null 2>&1
		uci -q set stubby.@resolver[-1].address='8.8.8.8'
		uci -q set stubby.@resolver[-1].tls_auth_name='dns.google'
		uci add stubby resolver >/dev/null 2>&1
		uci -q set stubby.@resolver[-1].address='1.1.1.1'
		uci -q set stubby.@resolver[-1].tls_auth_name='cloudflare-dns.com'
		uci add stubby resolver >/dev/null 2>&1
		uci -q set stubby.@resolver[-1].address='2001:4860:4860::8888'
		uci -q set stubby.@resolver[-1].tls_auth_name='dns.google'
		uci add stubby resolver >/dev/null 2>&1
		uci -q set stubby.@resolver[-1].address='2606:4700:4700::1111'
		uci -q set stubby.@resolver[-1].tls_auth_name='cloudflare-dns.com'
		uci add stubby resolver >/dev/null 2>&1
		uci -q set stubby.@resolver[-1].address='8.8.4.4'
		uci -q set stubby.@resolver[-1].tls_auth_name='dns.google'
		uci add stubby resolver >/dev/null 2>&1
		uci -q set stubby.@resolver[-1].address='1.0.0.1'
		uci -q set stubby.@resolver[-1].tls_auth_name='cloudflare-dns.com'
		uci add stubby resolver >/dev/null 2>&1
		uci -q set stubby.@resolver[-1].address='2001:4860:4860::8844'
		uci -q set stubby.@resolver[-1].tls_auth_name='dns.google'
		uci add stubby resolver >/dev/null 2>&1
		uci -q set stubby.@resolver[-1].address='2606:4700:4700::1001'
		uci -q set stubby.@resolver[-1].tls_auth_name='cloudflare-dns.com'
		uci add stubby resolver >/dev/null 2>&1
		uci -q set stubby.@resolver[-1].address='9.9.9.9'
		uci -q set stubby.@resolver[-1].tls_auth_name='dns.quad9.net'
		uci add stubby resolver >/dev/null 2>&1
		uci -q set stubby.@resolver[-1].address='149.112.112.112'
		uci -q set stubby.@resolver[-1].tls_auth_name='dns.quad9.net'
		uci add stubby resolver >/dev/null 2>&1
		uci -q set stubby.@resolver[-1].address='2620:fe::fe'
		uci -q set stubby.@resolver[-1].tls_auth_name='dns.quad9.net'
		uci add stubby resolver >/dev/null 2>&1
		uci -q set stubby.@resolver[-1].address='2620:fe::9'
		uci -q set stubby.@resolver[-1].tls_auth_name='dns.quad9.net'
		uci commit stubby
	fi
}

set_dfp() {
	is_rr_inited && return
	if pkg_installed luci-app-dns-failsafe-proxy; then
		SERVER='127.0.0.1#5359'
	else
		SERVER='127.0.0.1#5453'
	fi
	if ! uci get dhcp.@dnsmasq[0].server 2>/dev/null | grep -qw "$SERVER"; then
		uci add_list dhcp.@dnsmasq[0].server="$SERVER"
		uci commit dhcp
	fi
	uci -q set dhcp.@dnsmasq[0].noresolv='1'
	uci commit dhcp
}


set_led() {
	is_rr_inited && return
	BOARD_NAME=$(ubus call system board | jsonfilter -e '@.board_name')
	case "$BOARD_NAME" in
		routerich,ax3000)
			PHY="phy"
			if [ -d "/sys/class/leds/blue:wlan-24" ]; then
				WIFI_IF="blue:wlan-24"
				WIFI_IF5="red:wlan-50"
			else
				WIFI_IF="blue:wlan-2ghz"
				WIFI_IF5="red:wlan-5ghz"
			fi
			;;
		routerich,ax3000-v1)
			WIFI_IF="blue:wlan-2ghz"
			PHY="phy"
			;;
		routerich,be7200)
			WAN_IF="wan"
			WIFI_IF="blue:wlan-5ghz"
			PHY="phy0."
			;;
		routerich,be3600)
			# Индикаторов Wi-Fi на плате нет: DW1 и DW2 сидят на
			# выводах самого радиомодуля MT7990AN, а не на GPIO
			# процессора, и mt76 до них не дотягивается. Светодиоды
			# LAN висят на GPIO коммутатора AN8855, поддержки
			# которых в драйвере DSA нет. Процессору доступен
			# единственный индикатор, и он отдан под состояние
			# системы через led-boot и led-running в device tree.
			return 0
			;;
	esac
	uci -q set system.led_wifi2g=led
	uci -q set system.led_wifi2g.name='wifi2g'
	uci -q set system.led_wifi2g.sysfs="$WIFI_IF"
	uci -q set system.led_wifi2g.trigger='netdev'
	uci -q set system.led_wifi2g.mode='link tx rx'
	uci -q set system.led_wifi2g.dev="${PHY}0-ap0"
	uci -q set system.led_wifi5g=led
	uci -q set system.led_wifi5g.name='wifi5g'
	if [ -n "$WIFI_IF5" ]; then
		uci -q set system.led_wifi5g.sysfs="$WIFI_IF5"
	else
		uci -q set system.led_wifi5g.sysfs="$WIFI_IF"
	fi
	uci -q set system.led_wifi5g.trigger='netdev'
	uci -q set system.led_wifi5g.mode='link tx rx'
	uci -q set system.led_wifi5g.dev="${PHY}1-ap0"
	uci -q set system.led_mesh2=led
	uci -q set system.led_mesh2.name='mesh2g'
	uci -q set system.led_mesh2.sysfs='blue:mesh'
	uci -q set system.led_mesh2.trigger='netdev'
	uci -q set system.led_mesh2.mode='link tx rx'
	uci -q set system.led_mesh2.dev="${PHY}0-mesh0"
	uci -q set system.led_mesh5=led
	uci -q set system.led_mesh5.name='mesh5g'
	uci -q set system.led_mesh5.sysfs='blue:mesh'
	uci -q set system.led_mesh5.trigger='netdev'
	uci -q set system.led_mesh5.mode='link tx rx'
	uci -q set system.led_mesh5.dev="${PHY}1-mesh0"
	uci commit system
}


set_internet_detector() {
	is_rr_inited && return
	# uci -q set internet-detector.internet.mod_led_control_enabled='1'
	uci -q set internet-detector.internet.mod_led_control_led1_name='blue:wan'
	uci -q set internet-detector.internet.mod_led_control_led1_action_1='2'
	uci -q set internet-detector.internet.mod_led_control_led1_action_2='1'
	uci -q set internet-detector.internet.mod_led_control_led2_name='red:wan'
	uci -q set internet-detector.internet.mod_led_control_led2_action_1='2'
	uci -q set internet-detector.internet.mod_led_control_led2_action_2='1'
	uci commit internet-detector
	# uci -q del system.led_wan
	# uci -q del system.led_wan_off.mode
	# uci -q del system.led_wan_off.dev
	# uci -q set system.led_wan_off.trigger='none'
	# uci -q set system.led_wan_off.default='1'
	# uci -q del system.led_wan_off.mode='link'
	# uci -q del system.led_wan_off.dev='wan'
	# uci commit system
	# service internet-detector restart


	# # internet-detector settings
	# uci -q set internet-detector.internet.mod_reboot_enabled='1'
	# uci -q set internet-detector.internet.mod_user_scripts_dead_period='900'
	# echo usb-restart > /etc/internet-detector/down-script.internet
	# uci commit internet-detector
}


set_postupg() {
	cat <<'EOF' >/etc/init.d/postupgfix 2>/dev/null
#!/bin/sh /etc/rc.common

start() {
	# sort menu
	sed -i 's|"admin/status/amneziawg"|"admin/vpn/amneziawg"|' /usr/share/luci/menu.d/luci-proto-amneziawg.json 2>/dev/null
	sed -i 's|"admin/status/wireguard"|"admin/vpn/wireguard"|' /usr/share/luci/menu.d/luci-proto-wireguard.json 2>/dev/null
	sed -i 's|"admin/services/ksmbd"|"admin/nas/ksmbd"|' /usr/share/luci/menu.d/luci-app-ksmbd.json 2>/dev/null
	sed -i 's|"admin/system/filemanager"|"admin/nas/filemanager"|' /usr/share/luci/menu.d/luci-app-filemanager.json 2>/dev/null
	sed -i 's|"admin/services/transmission"|"admin/nas/transmission"|' /usr/share/luci/menu.d/luci-app-transmission.json 2>/dev/null
	sed -i 's|"admin/services/qbittorrent"|"admin/nas/qbittorrent"|' /usr/share/luci/menu.d/luci-app-qbittorrent.json 2>/dev/null

	# add zram lzo-rle 
	grep -q "o.value('lzo-rle','lzo-rle');" /www/luci-static/resources/view/system/system.js || sed -i "s|o.value('zstd','zstd');|o.value('zstd','zstd');o.value('lzo-rle','lzo-rle');|" /www/luci-static/resources/view/system/system.js

	# remove mm page
	[ -f /usr/share/luci/menu.d/luci-proto-modemmanager.json ] && rm /usr/share/luci/menu.d/luci-proto-modemmanager.json

	# replace ugly names
	sed -i 's/"title": "UPnP IGD & PCP"/"title": "UPnP"/' /usr/share/luci/menu.d/luci-app-upnp.json
	
	# replace led settings menu
	jq -e 'has("admin/system/leds")' /usr/share/luci/menu.d/luci-mod-system.json >/dev/null && \
		jq 'del(."admin/system/leds")' /usr/share/luci/menu.d/luci-mod-system.json > /tmp/menu.json && \
		mv /tmp/menu.json /usr/share/luci/menu.d/luci-mod-system.json

	# Set rr-sign for upnp
	if [ -f "/etc/init.d/miniupnpd" ] && ! grep -q "friendly_name" "/etc/init.d/miniupnpd" 2>/dev/null; then
		VERSION_RAW=$(miniupnpd --version 2>/dev/null | awk '{print $2}')

		version_ge() {
			[ "$(printf '%s\n' "$2" "$1" | sort -V | head -n1)" = "$2" ]
		}

		if version_ge "$VERSION_RAW" "2.3.9"; then
			MODEL_RAW=$(cat /tmp/sysinfo/model 2>/dev/null || echo "Unknown")

			case "$MODEL_RAW" in
				*"v1"*) USB_VER="USB 3.0" ;;
				*)      USB_VER="USB 2.0" ;;
			esac

			MODEL_SLUG=$(echo "$MODEL_RAW" | awk '{print tolower($2)}')
			SERIAL=$(uci -q get wizard.default.hw_mac | tr -d ':' | cut -c4-)

			TAB="\t\t"
			PATCH_BLOCK="${TAB}echo \"friendly_name=Routerich\"\n\
${TAB}echo \"manufacturer_name=Routerich\"\n\
${TAB}echo \"manufacturer_url=https://routerich.ru\"\n\
${TAB}echo \"model_name=$MODEL_RAW $USB_VER\"\n\
${TAB}echo \"model_description=$MODEL_RAW $USB_VER\"\n\
${TAB}echo \"model_url=https://routerich.ru/products/$MODEL_SLUG\"\n\
${TAB}echo \"model_number=$USB_VER\"\n\
${TAB}echo \"serial=$SERIAL\""

			sed -i "s|model_number=\$model_number\"\$|&\n$PATCH_BLOCK|" "/etc/init.d/miniupnpd"
		fi
	fi

	# automodem
	[ -f /etc/hotplug.d/tty/25-modemmanager-tty ] && rm /etc/hotplug.d/tty/25-modemmanager-tty
	[ -f /etc/usb-mode.json ] && sed -i '/413c:81d7_disable/! s/413c:81d7/413c:81d7_disable/' /etc/usb-mode.json
	[ -f /etc/usb-mode.json ] && sed -i '/413c:81e0_disable/! s/413c:81e0/413c:81e0_disable/' /etc/usb-mode.json
	[ -f /etc/usb-mode.json ] && sed -i '/03f0:0857_disable/! s/03f0:0857/03f0:0857_disable/' /etc/usb-mode.json

	# remove custom rr repo
	sed -i '/^src\/gz routerich http/d' /etc/opkg/customfeeds.conf

	# save spi-nand information
	dmesg | sed 's/^\[[^]]*\] //' | grep -E 'spi-(nand|nor)' > /tmp/sysinfo/spi

	# allow manual installation of unsigned packages for apk
	if command -v apk >/dev/null 2>&1 && ! grep -q "allow-untrusted" "/usr/libexec/package-manager-call"; then
		sed -i 's/--force-overwrite)/--force-overwrite|--allow-untrusted)/g' "/usr/libexec/package-manager-call"
		awk '/if flock -x 200; then/ {
		print "\t\t\t# Automatically add --allow-untrusted for local file installations"
		print "\t\t\tfor pkg in \"$@\"; do"
		print "\t\t\t\tcase \"$pkg\" in"
		print "\t\t\t\t\t*.apk|/tmp/upload.apk)"
		print "\t\t\t\t\t\taction=\"$action --allow-untrusted\""
		print "\t\t\t\t\t\tbreak"
		print "\t\t\t\t\t;;"
		print "\t\t\t\tesac"
		print "\t\t\tdone\n"
		}
		{print}' "/usr/libexec/package-manager-call" > /tmp/pmc.tmp
		mv /tmp/pmc.tmp "/usr/libexec/package-manager-call"
		chmod +x "/usr/libexec/package-manager-call"
	fi
}
EOF

	chmod +x /etc/init.d/postupgfix
	rm -f /etc/rc.d/S99postupgfix
	ln -s ../init.d/postupgfix /etc/rc.d/S99postupgfix
	/etc/init.d/postupgfix restart
}


set_rr_tailscale() {
	if pkg_installed luci-app-tailscale; then
		current_server=$(uci -q get tailscale.settings.login_server 2>/dev/null)
		if [ -z "$current_server" ]; then
			uci -q set tailscale.settings.login_server="https://rc.routerich.ru/"
			uci commit tailscale
		fi
	fi
}


set_igmp() {
	is_rr_inited && return
	pkg_installed igmpproxy || return
	local TARGET="br-lan"
	local FOUND=""
	local s name
	for s in $(uci show network | grep "=device" | sed -E 's/([^=]+)=device.*/\1/'); do
		name=$(uci -q get "$s.name")
		[ "$name" = "$TARGET" ] && FOUND="$s" && break
	done
	[ -n "$FOUND" ] || return
	uci -q set "$FOUND.igmp_snooping"='1'
	uci commit network
	uci -q set igmpproxy.@igmpproxy[0].verbose="0"
	uci -q set igmpproxy.@phyint[0].altnet="0.0.0.0/0"
	uci commit igmpproxy
}


mark_rr_init() {
	touch /etc/config/.rr-init
}

asu_defaults_settings() {
	is_rr_inited && return
	uci -q set attendedsysupgrade.client.login_check_for_upgrades="0"
	uci -q set attendedsysupgrade.server.url="https://sysupgrade.routerich.ru/"
	uci commit attendedsysupgrade 2>/dev/null
}


copy_routerich_firmware
add_repository
add_rr_version
set_wan
set_lan
set_init_wizard
set_packet_steering
set_hw_offloading
set_offload_delay
set_firewall
set_upnp
set_luci_nas
set_ntp
set_system
set_uhttpd
set_zram
set_dnsmasq
set_ipv6_disable
set_ttyd
set_ksmbd
set_pptp
set_doh
set_dot
set_dfp
set_led
set_internet_detector
set_postupg
set_rr_tailscale
set_igmp
asu_defaults_settings
set_wifi
wifi_fix
mark_rr_init

exit 0
