#!/bin/bash
# Network Interface Configuration System
# Copyright (c) 1996-2009 Red Hat, Inc. all rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License, version 2,
# as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA

PATH=/sbin:/usr/sbin:/bin:/usr/bin
TEXTDOMAIN=initscripts

unset WINDOW # defined by screen, conflicts with our usage

. /etc/init.d/functions

cd /etc/sysconfig/network-scripts
. ./network-functions

[ -f /etc/sysconfig/network ] && . /etc/sysconfig/network

CONFIG=${1}

[ -z "${CONFIG}" ] && {
    echo $"Usage: ifup <device name>" >&2
    exit 1
}

need_config "${CONFIG}"

[ -f "${CONFIG}" ] || {
    echo $"$0: configuration for ${1} not found." >&2
    echo $"Usage: ifup <device name>" >&2
    exit 1
}

source_config

if [ ${UID} != 0 ]; then
    if [ -x /usr/sbin/usernetctl ]; then
		if /usr/sbin/usernetctl ${CONFIG} report ; then
	    exec /usr/sbin/usernetctl ${CONFIG} up
		fi
    fi
    echo $"Users cannot control this device." >&2
    exit 1
fi

if [ "foo$2" = "fooboot" ] && [ "${ONBOOT}" = "no" -o "${ONBOOT}" = "NO" ]
then
    exit 0
fi
if [ -n "$IN_HOTPLUG" ] && [ "${HOTPLUG}" = "no" -o "${HOTPLUG}" = "NO" ]
then
    exit 0
fi
if [ -n "$IN_HOTPLUG" -a "${TYPE}" = "Bridge" ]; 
then
    exit 0
fi

# networkmanager stuff
# ---------------------------------------------------------------------------------------
if is_true "$_use_nm" && [ "$REALDEVICE" != "lo" ]; then
    [ -n "${DEVICE}" ] && is_nm_handling ${DEVICE} && exit 0
# is_nm_handling do not support nm wireless cards so
# do an extra check for that
carrier=$(cat /sys/class/net/$DEVICE/carrier)
operstate=$(cat /sys/class/net/$DEVICE/operstate)
NAME=$(nmcli -t --fields UUID,NAME con show | awk -F ':' "\$1 == \"$UUID\" { print \$2 }")
if ! LC_ALL=C nmcli -t --fields UUID,NAME con show --active | grep -Eq "^($UUID):$NAME$"; then
 sleep 1
	if ! is_wireless_device "$DEVICE"  && [ "$carrier" = "0" ] && [ "$operstate" = "down" ]; then
		exit 0
	fi
 nmcli con up "$NAME"
fi
ethtool_set
exit $?
fi
#just make sure we stop here
# for nm configured wireles cards  
if is_wireless_device "$DEVICE" && [ "$TYPE" = "Wireless" ]; then
exit 0
fi
# ---------------------------------------------------------------------------------------

# Ethernet 802.1Q VLAN support
if [ "${VLAN}" = "yes" ] && [ "$ISALIAS" = "no" ]; then
    VID=""
    MATCH='^(eth|hsi|bond)[0-9]+\.[0-9]{1,4}$'
    if [[ "${DEVICE}" =~ $MATCH ]]; then
	VID=$(echo "${DEVICE}" | LC_ALL=C sed 's/^[a-z0-9]*\.0*\([0-9]\+\)/\1/')
	PHYSDEV=${DEVICE%.*}
    fi
    MATCH='^vlan[0-9]{1,4}?'
    if [[ "${DEVICE}" =~ $MATCH ]]; then
	VID=$(echo "${DEVICE}" | LC_ALL=C sed 's/^vlan0*//')
	# PHYSDEV should be set in ifcfg-vlan* file
	if test -z "$PHYSDEV"; then
		echo $"PHYSDEV should be set for device ${DEVICE}"
		exit 1
	fi
    fi
    if [ -n "$VID" ]; then
	if [ ! -d /proc/net/vlan ]; then
            if ! modprobe 8021q >/dev/null 2>&1 ; then
		echo $"No 802.1Q VLAN support available in kernel for device ${DEVICE}"
		exit 1
	    fi
	fi

	is_available ${PHYSDEV} || {
	    if [ "$?" = "1" ] ; then
		echo $"$alias device ${DEVICE} does not seem to be present, delaying initialization."
		exit 1
	    else
		exit 0
	    fi
	}

	# Link on Physical device needs to be up but no ip required
	check_device_down ${PHYSDEV} && {
	    ip -o link set dev ${PHYSDEV} up
	}

	if [ ! -f /proc/net/vlan/${DEVICE} ]; then
	    if [ "${REORDER_HDR}" = "no" -o "${REORDER_HDR}" = "0" ]; then
		FLAG_REORDER_HDR="reorder_hdr off"
	    fi

	    ip link add dev ${DEVICE} link ${PHYSDEV} type vlan id ${VID} ${FLAG_REORDER_HDR} || {
		(/usr/bin/logger -p daemon.info -t ifup \
		    $"ERROR: could not add vlan ${VID} as ${DEVICE} on dev ${PHYSDEV}" &)&
		echo $"ERROR: could not add vlan ${VID} as ${DEVICE} on dev ${PHYSDEV}"
		exit 1
	    }
	fi
    fi
fi

# signalling the start of connection
mdv-network-event connection_start ${DEVICE}

if [ -x /sbin/ifup-pre-local ]; then
    /sbin/ifup-pre-local ${CONFIG} $2
fi

OTHERSCRIPT="/etc/sysconfig/network-scripts/ifup-${DEVICETYPE}"

if [ ! -x ${OTHERSCRIPT} ]; then
    OTHERSCRIPT="/etc/sysconfig/network-scripts/ifup-eth"
fi

if is_false "$_nm_enabled" || [ -z "$TYPE" ] || [ "${NM_CONTROLLED}" = "no" ]; then
exec ${OTHERSCRIPT} ${CONFIG} $2
fi
