IFACES_FILE=/etc/network/interfaces

IFACE=$1
ADDR=$2
NETMASK=''
GATEWAY=''
BROADCAST=''
DNS=''
if [ "`cat $IFACES_FILE | grep $IFACE | grep static`" ]
then
	DHCP_MODE=0
else
	DHCP_MODE=1
fi

shift 2
if ! iwconfig $IFACE > /dev/null 2>&1
then
	IS_LAN=true;
fi

print_dns_list() {
	_OLD_IFS=$IFS
	IFS=$','
	_OUT=''
	for dns in $1
	do
		_OUT=$_OUT$dns' '
	done
	IFS=$_OLD_IFS
	echo $_OUT
}

del_iface_field() {
	res=''
	for line in `echo -e $1|grep -v "$2"`
	do
		res=$res$'\\n'"$line"
	done
	echo "$res"
}

print_iface_field() {
	if [ $2 ]
	then
		echo $'\\n\\t'"$1 $2"
	fi
}

strip_prop_name() {
	echo $1|cut -d'=' -f2
}

get_iface_block() {
	_OLD_BLOCK=$1
	_NEW_BLOCK=''
	_IP=$2
	_NETMASK=$3
	_GATEWAY=$4
	_BROADCAST=$5
	_DNS=$6
	
	if [ $_IP ]
	then
		_OLD_BLOCK=`del_iface_field "$_OLD_BLOCK" "^\saddress"`
		_NEW_BLOCK=$_NEW_BLOCK`print_iface_field address $(strip_prop_name $_IP)`
	fi
	if [ $_NETMASK ]
	then
		_OLD_BLOCK=`del_iface_field "$_OLD_BLOCK" "^\snetmask"`
		_NEW_BLOCK=$_NEW_BLOCK`print_iface_field netmask $(strip_prop_name $_NETMASK)`
	fi
	if [ $_GATEWAY ]
	then
		_OLD_BLOCK=`del_iface_field "$_OLD_BLOCK" "^\sgateway"`
		_NEW_BLOCK=$_NEW_BLOCK`print_iface_field gateway $(strip_prop_name $_GATEWAY)`
	fi
	if [ $_BROADCAST ]
	then
		_OLD_BLOCK=`del_iface_field "$_OLD_BLOCK" "^\sbroadcast"`
		_NEW_BLOCK=$_NEW_BLOCK`print_iface_field broadcast $(strip_prop_name $_BROADCAST)`
	fi
	if [ $_DNS ]
	then
		_OLD_BLOCK=`del_iface_field "$_OLD_BLOCK" "^\sdns-nameservers"`
		_NEW_BLOCK=$_NEW_BLOCK`print_iface_field dns-nameservers $(print_dns_list $(strip_prop_name $_DNS))`
	fi
	echo "$_OLD_BLOCK"$_NEW_BLOCK
}

# $1 ip
# $2 netmask
# $3 gateway
set_iface_static() {
	_OLD_IFS=$IFS
	IFS=$'\n'
	_INTERFACES=''
	_GEN_IFACE_BLOCK=true
	_IS_IFACE_BLOCK=''
	for line in $(cat $IFACES_FILE)
	do
		if [ `echo "$line" | grep "^iface $IFACE"` ]
		then
			_INTERFACES=$_INTERFACES$'\\n'"iface $IFACE inet static"
			_IS_IFACE_BLOCK=true
		elif [ $_IS_IFACE_BLOCK ] && ( [ `echo $line | grep ^iface` ] || [ `echo $line | grep ^auto` ] )
		then
			_INTERFACES=$_INTERFACES`get_iface_block "$_IFACE_BLOCK" "$1" "$2" "$3" "$4" "$5"`$'\\n'$line
			unset _IS_IFACE_BLOCK
			unset _GEN_IFACE_BLOCK
		elif [ $_IS_IFACE_BLOCK ]
		then
			_IFACE_BLOCK=$_IFACE_BLOCK$line$'\\n'
		else
			_INTERFACES=$_INTERFACES$'\\n'$line
		fi
	done
	if [ $_GEN_IFACE_BLOCK ]
	then
		_INTERFACES=$_INTERFACES`get_iface_block "$_IFACE_BLOCK" "$1" "$2" "$3" "$4" "$5"`
	fi
	IFS=$_OLD_IFS
	echo -e "$_INTERFACES" > $IFACES_FILE
}

set_iface_dynamic() {
	_OLD_IFS=$IFS
	IFS=$'\n'
	_INTERFACES=''
	_GEN_IFACE_BLOCK=true
	_IS_IFACE_BLOCK=''
	_DNS=$1
	for line in $(cat $IFACES_FILE)
	do
		if [ `echo $line | grep "iface $IFACE"` ]
		then
			_IS_IFACE_BLOCK=true
		elif [ $_IS_IFACE_BLOCK ] && ( [ `echo $line | grep ^iface` ] || [ `echo $line | grep ^auto` ] )
		then
			_INTERFACES=$_INTERFACES$'\\n'"iface $IFACE inet dhcp"
			_INTERFACES=$_INTERFACES$(del_iface_field $(del_iface_field $(del_iface_field $(del_iface_field $(del_iface_field "$_INTERFACE_BLOCK" gateway) netmask) address) dns-nameservers) broadcast)
			if [ "$_DNS" ]
			then
				_INTERFACES=$_INTERFACES$(print_iface_field dns-nameservers $(print_dns_list $(strip_prop_name $_DNS)))
			fi
			_INTERFACES=$_INTERFACES$'\\n'$line
			unset _IS_IFACE_BLOCK
			unset _GEN_IFACE_BLOCK
		elif [ $_IS_IFACE_BLOCK ]
		then
			_INTERFACE_BLOCK=$_INTERFACE_BLOCK$'\\n'$line
		else
			_INTERFACES=$_INTERFACES$'\\n'$line
		fi
	done
	if [ $_GEN_IFACE_BLOCK ]
	then
			_INTERFACES=$_INTERFACES$'\\n'"iface $IFACE inet dhcp"
			_INTERFACES=$_INTERFACES$(del_iface_field $(del_iface_field $(del_iface_field $(del_iface_field $(del_iface_field "$_INTERFACE_BLOCK" gateway) netmask) address) dns-nameservers) broadcast)
			if [ "$_DNS" ]
			then
				_INTERFACES=$_INTERFACES$(print_iface_field dns-nameservers $(print_dns_list $(strip_prop_name $_DNS)))
			fi
	fi
	IFS=$_OLD_IFS
	echo -e "$_INTERFACES" > $IFACES_FILE
}

for prop in "$@"
do
	PROP_NAME=`echo $prop|cut -d'=' -f1`
	if [ 'DNSServers' = $PROP_NAME ]
	then
		DNS=$prop
	elif [ 'Hostname' = $PROP_NAME ]
	then
		PROP_VALUE=`strip_prop_name $prop`
		/bin/hostname $PROP_VALUE
	elif [ 'IP' = $PROP_NAME ]
	then
		ADDR=$prop
	elif [ 'SubnetMask' = $PROP_NAME ]
	then
		NETMASK=$prop
	elif [ 'Gateway' = $PROP_NAME ]
	then
		GATEWAY=$prop
	elif [ 'Broadcast' = $PROP_NAME ]
	then
		BROADCAST=$prop
	elif [ 'MACaddress' = $PROP_NAME ]
	then
		PROP_VALUE=`strip_prop_name $prop`
		/sbin/ifconfig $IFACE down
		/sbin/ifconfig $IFACE hw ether $PROP_VALUE up
	elif [ 'DHCP_mode' = $PROP_NAME ]
	then
		PROP_VALUE=`strip_prop_name $prop`
		DHCP_MODE=$PROP_VALUE
	fi
done

if [ $DHCP_MODE != 0 ]
then
	set_iface_dynamic $DNS
elif [[ "$ADDR" || "$NETMASK" || "$GATEWAY" || "$BROADCAST" || "$DNS" ]]
then
	set_iface_static "$ADDR" "$NETMASK" "$GATEWAY" "$BROADCAST" "$DNS"
fi

ip addr flush dev $IFACE
ifdown -a
ifup -a