#!/bin/sh /etc/rc.common
# Copyright (C) 2006 OpenWrt.org
START=99

CONF_FILE_PATH=/etc/avahi/avahi-daemon.conf
VAR_CONF_FILE_PATH=/var/avahi-daemon.conf
BIN=avahi-daemon
OPTIONS="-D -f ${VAR_CONF_FILE_PATH}"

local vlanids=""
local cids=""

echo_forward_rules() {
  [ ! $1 == $2 ] && return
  local server_network
  local client_network
  local service_type
  local domains=""
  local domain

  config_get server_network $1 server_network_vlanid
  config_get client_network $1 client_network_vlanid
  config_get service_type $1 service_type
  for name in $service_type 
  do
    config_get domain $name domain
    domains="$domains $domain"
  done
  domains=${domains#* }

  echo "forward-rule=\
$(echo "$server_network"|sed 's/ /,/g');\
$(echo "$client_network"|sed 's/ /,/g');\
$(echo "$domains"|sed 's/ /,/g')">>${VAR_CONF_FILE_PATH}
}

stop() {
  pid=`pgrep -o avahi`
  if [ -n "$pid" ];then
		kill -9 $pid
	fi

}

start() {
	num=$(iptables -w -t mangle -nvL PREROUTING --line-numbers | grep "IPTABLES_MDNS" | cut -d ' ' -f 1)
	if [ -z "$num" ]; then
		# 添加mdns相关的iptables规则
    	iptables -w -t mangle -I PREROUTING -p udp -s 0.0.0.0/0 -d 224.0.0.251 --sport 5353 --dport 5353 -m comment --comment "IPTABLES_MDNS" -j ACCEPT 
	fi

    local switch
    local lan_list
    local vlanid_list
	local forward_rule_list

    config_load avahi-daemon
    config_get switch avahi switch
    config_get lan_list avahi interfaces
    config_get vlanid_list avahi vlanid
	config_get forward_rule_list avahi rule


    [ ! -e ${CONF_FILE_PATH} ] && return

	[ -e ${VAR_CONF_FILE_PATH} ] && rm ${VAR_CONF_FILE_PATH}
	
	if [ ${switch} = "0" ]
    then
		stop
		return
    fi

	if [ -n "${lan_list}" -a -n "${vlanid_list}" ]
    then
        sed "s/allow-interfaces=eth1.1/allow-interfaces=${lan_list}\nallow-interfaces-vlanid=${vlanid_list}/" ${CONF_FILE_PATH} > ${VAR_CONF_FILE_PATH}

        echo >> ${VAR_CONF_FILE_PATH}

        for rule in $forward_rule_list
		do
			config_foreach echo_forward_rules forward_rule $rule
		done
        vnete $BIN $OPTIONS
    fi

}

restart() {
  stop
  start
}

get_id_by_ifname() {
	local network="$1"
	local ifname="$2"

	local tmp=`uci get vnetwork.$1.ifname`
	[ ! "$tmp" = "$ifname" ] && return

	local cid=`uci get vnetwork.$1.cid`
	local vlanid=`uci get vnetwork.$1.vlanid`
	cids="$cids,$cid"
	vlanids="$vlanids,$vlanid"
}

update_uci_config() {
	local switch
    local lan_list

	switch=`uci get avahi-daemon.avahi.switch`
	lan_list=`uci get avahi-daemon.avahi.interfaces`

	rm /etc/config/avahi-daemon
	cp /etc/avahi/avahi-daemon.uci.conf /etc/config/avahi-daemon

	config_load vnetwork
	vlanids=""
	cids=""
	for lan in ${lan_list//,/ }
	do
		local cid
		local vlanid	
		config_foreach get_id_by_ifname vinterface $lan
	done
	vlanids=${vlanids#*,}
	cids=${cids#*,}

	uci set avahi-daemon.avahi.interfaces=${lan_list}
	uci set avahi-daemon.avahi.vlanid=${vlanids}
	uci set avahi-daemon.avahi.cid=${cids}
	uci set avahi-daemon.avahi.switch=${switch}
	uci commit
	/lib/cfg_save/config.sh modify
}

boot() {
	num=$(iptables -w -t mangle -nvL PREROUTING --line-numbers | grep "IPTABLES_MDNS" | cut -d ' ' -f 1)
  	if [ -z "$num" ]; then
		# 添加mdns相关的iptables规则
    	iptables -w -t mangle -I PREROUTING -p udp -s 0.0.0.0/0 -d 224.0.0.251 --sport 5353 --dport 5353 -m comment --comment "IPTABLES_MDNS" -j ACCEPT 
	fi

  	local switch
    local lan_list
    local vlanid_list
	local forward_rule_list
	local version

    version=`uci get avahi-daemon.avahi.version`
	#兼容旧版本 uci config 文件
	if [ ! -n "${version}" ]
	then
		update_uci_config
	fi

	config_load avahi-daemon
    config_get switch avahi switch
    config_get lan_list avahi interfaces
    config_get vlanid_list avahi vlanid
	config_get forward_rule_list avahi rule

    [ ! -e ${CONF_FILE_PATH} ] && return

	[ -e ${VAR_CONF_FILE_PATH} ] && rm ${VAR_CONF_FILE_PATH}
	
	if [ "${switch}" = "0" ]
    then
		stop
		return
    fi

	if [ -n "${lan_list}" -a -n "${vlanid_list}" ]
    then
        sed "s/allow-interfaces=eth1.1/allow-interfaces=${lan_list}\nallow-interfaces-vlanid=${vlanid_list}/" ${CONF_FILE_PATH} > ${VAR_CONF_FILE_PATH}

        echo >> ${VAR_CONF_FILE_PATH}

        for rule in $forward_rule_list
		do
			config_foreach echo_forward_rules forward_rule $rule
		done
        vnete $BIN $OPTIONS
    fi
}
