Sophie

Sophie

distrib > Fedora > 18 > i386 > by-pkgid > 556c72213b56d8f166bf2049a651d4e8 > files > 43

vzctl-core-4.4-2.fc18.i686.rpm

#!/bin/bash
#  Copyright (C) 2006-2007 SYSTS.ORG  All rights reserved.
#  Copyright (C) 2012 Brinstar Networks  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 as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#
#  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
#
#
# Adds IP address(es) in a container running Arch Linux.

VENET_DEV=venet0
OLDCFGFILE=/etc/rc.conf

CFGPATH=/etc/network.d
NETCFG=/etc/conf.d/netcfg

CTLPATH=/etc/netctl

function old_remove_all_ve_aliases()
{
	local ve_if_name
	local ve_if

	ve_if_name=`grep "^${VENET_DEV}_" ${OLDCFGFILE}.bak | cut -d'=' -f1`

	for ve_if in ${ve_if_name}; do
	    /etc/rc.d/network ifdown ${ve_if} 2>/dev/null
	    del_param "${OLDCFGFILE}.bak" "${ve_if}"
	    del_param3 "${OLDCFGFILE}.bak" "INTERFACES" "${ve_if}"
	done
}

function old_setup_network()
{
    # create lo
    if ! grep -qe "^lo=" ${OLDCFGFILE}.bak 2>/dev/null; then
	put_param "${OLDCFGFILE}.bak" "lo" "lo 127.0.0.1"
	add_param3 "${OLDCFGFILE}.bak" "INTERFACES" "lo"
    fi

    # create venet0 and routes
    if ! grep -qe "^${VENET_DEV}=" ${OLDCFGFILE}.bak 2>/dev/null; then
	put_param "${OLDCFGFILE}.bak" "${VENET_DEV}" "${VENET_DEV} 127.0.0.1 netmask 255.255.255.255 broadcast 0.0.0.0"
	add_param3 "${OLDCFGFILE}.bak" "INTERFACES" "${VENET_DEV}"
	put_param "${OLDCFGFILE}.bak" "rt_default" "default dev ${VENET_DEV}"
	add_param3 "${OLDCFGFILE}.bak" "ROUTES" "rt_default"
    fi
}

function old_create_config()
{
	local ip=$1
	local netmask=$2
	local ifnum=$3
	# add venet0 alias to rc.conf
	put_param "${OLDCFGFILE}.bak" "${VENET_DEV}_${ifnum}" \
		"${VENET_DEV}:${ifnum} ${ip} netmask ${netmask} broadcast 0.0.0.0"

	# add venet0 alias to INTERFACES array
	add_param3 "${OLDCFGFILE}.bak" "INTERFACES" "${VENET_DEV}_${ifnum}"
}

function old_get_all_aliasid()
{
	IFNUM=-1
	IFNUMLIST=`grep -e "^${VENET_DEV}_.*$" 2> /dev/null ${OLDCFGFILE}.bak |
		   sed "s/.*${VENET_DEV}_//" | cut -d '=' -f 1`
}

function old_get_free_aliasid()
{
	local found=

	[ -z "${IFNUMLIST}" ] && old_get_all_aliasid
	while test -z ${found}; do
		let IFNUM=IFNUM+1
		echo "${IFNUMLIST}" | grep -q -E "^${IFNUM}$" 2>/dev/null ||
			found=1
	done
}


function old_add_ip()
{
	local ipm
	local add
	local iface

	cp -f ${OLDCFGFILE} ${OLDCFGFILE}.bak

	if [ "${IPDELALL}" = "yes" ]; then
		old_remove_all_ve_aliases
	fi

	old_setup_network

	for ipm in ${IP_ADDR}; do
		ip_conv $ipm
		if grep -e "\\<${_IP}\\>" >/dev/null 2>&1  ${OLDCFGFILE}.bak; then
			continue
		fi
		old_get_free_aliasid
		old_create_config "${_IP}" "${_NETMASK}" "${IFNUM}"
	done

	mv -f ${OLDCFGFILE}.bak ${OLDCFGFILE}
	if [ "x${VE_STATE}" = "xrunning" ]; then
		if [ ! -z ${IFNUM} ]; then
		    /etc/rc.d/network ifup ${VENET_DEV}_${IFNUM} 2>/dev/null
		fi
	fi
}

function remove_all_ve_aliases()
{
	local ve_if
	for ve_if in $(ls -1 ${CFGPATH}/${VENET_DEV}_* 2> /dev/null | sed "s/.*${VENET_DEV}_//"); do
		ip link set "${VENET_DEV}:${ve_if}" down
		rm -f "${CFGPATH}/${VENET_DEV}_${ve_if}"
	done

	# Remove NETWORKS line in $NETCFG
	cp "$NETCFG" "${NETCFG}.bak"
	grep -v NETWORKS= "${NETCFG}.bak" > "$NETCFG"
	echo 'NETWORKS=()' >> "$NETCFG"
}

function setup_network()
{
	echo "CONNECTION='ethernet'
DESCRIPTION='${VENET_DEV}'
INTERFACE='${VENET_DEV}'
IP='static'" > "${CFGPATH}/${VENET_DEV}" || error "Could not write ${CFGPATH}/${VENET_DEV}" $VZ_FS_NO_DISK_SPACE
	if [ ! -d /etc/systemd ]; then
		echo "ADDR='127.0.0.2'
NETMASK='32'
GATEWAY='0.0.0.0'" >> "${CFGPATH}/${VENET_DEV}" || error "Could not write ${CFGPATH}/${VENET_DEV}" $VZ_FS_NO_DISK_SPACE
	else
		add_param3 "${CFGPATH}/${VENET_DEV}" "IPCFG" "addr add 127.0.0.2/32 broadcast 0.0.0.0 dev ${VENET_DEV}"
		add_param3 "${CFGPATH}/${VENET_DEV}" "IPCFG" "route add default dev ${VENET_DEV}"
	fi

	add_param3 "${NETCFG}" "NETWORKS" "${VENET_DEV}"

	if [ ! -f "/etc/hosts" ] ; then
		echo "127.0.0.1 localhost.localdomain localhost" > /etc/hosts || error "Could not write /etc/hosts" $VZ_FS_NO_DISK_SPACE
	fi
}

function create_config()
{
	local ip=$1
	local netmask=$2
	local ifnum=$3
	local isinet6=$4

	if [ -z "$isinet6" ] ; then
		# Don't do anything if address already exists
		grep -q "ADDR='${ip}'" "${CFGPATH}/${VENET_DEV}_*" 2> /dev/null
		if [ "$?" -eq "0" ] ; then
			return 0
		fi

		echo "CONNECTION='ethernet'
DESCRIPTION='${VENET_DEV}:${ifnum}'
INTERFACE='${VENET_DEV}:${ifnum}'
IP='static'
ADDR='${ip}'
NETMASK='${netmask}'" > "${CFGPATH}/${VENET_DEV}_${ifnum}" || error "Could not write ${CFGPATH}/${VENET_DEV}_${ifnum}" $VZ_FS_NO_DISK_SPACE
		if [ -d /etc/systemd ]; then
			add_param3 "${CFGPATH}/${VENET_DEV}" "IPCFG" "addr add ${ip}/${netmask} broadcast 0.0.0.0 dev ${VENET_DEV}"
		fi
	else
		# Don't do anything if address already exists
		grep -q "ADDR6='${ip}'" "${CFGPATH}/${VENET_DEV}_*" 2> /dev/null
		if [ "$?" -eq "0" ] ; then
			return 0
		fi

		echo "CONNECTION='ethernet'
DESCRIPTION='${VENET_DEV}:${ifnum}'
INTERFACE='${VENET_DEV}:${ifnum}'
IP6='static'
POST_UP='ip route add ::/0 dev ${VENET_DEV}'
ADDR6='${ip}/${netmask}'" > "${CFGPATH}/${VENET_DEV}_${ifnum}" || error "Could not write ${CFGPATH}/${VENET_DEV}_${ifnum}" $VZ_FS_NO_DISK_SPACE
		if [ -d /etc/systemd ]; then
			add_param3 "${CFGPATH}/${VENET_DEV}" "IPCFG" "addr add ${ip}/${netmask} dev ${VENET_DEV}"
			grep -q "['\\\"]-6 route add default" "${CFGPATH}/${VENET_DEV}" 2> /dev/null
			if [ "$?" -ne "0" ] ; then
				add_param3 "${CFGPATH}/${VENET_DEV}" "IPCFG" "-6 route add default dev ${VENET_DEV}"
			fi
		fi
	fi

	# add device entry to NETWORKS
	add_param3 "${NETCFG}" "NETWORKS" "${VENET_DEV}_${ifnum}"
}

function get_all_aliasid()
{
	IFNUM=-1
	IFNUMLIST=`ls -1 ${CFGPATH}/${VENET_DEV}_* 2> /dev/null | sed "s/.*${VENET_DEV}_//"`
}

function get_free_aliasid()
{
	local found=

	[ -z "${IFNUMLIST}" ] && get_all_aliasid
	while test -z ${found}; do
		let IFNUM=IFNUM+1
		echo "${IFNUMLIST}" | grep -q -E "^${IFNUM}$" 2>/dev/null ||
			found=1
	done
}


function add_ip()
{
	local ipm

	if [ "x${VE_STATE}" = "xstarting" ]; then
		remove_all_ve_aliases
	fi

	if [ "x${IPDELALL}" = "xyes" ]; then
		remove_all_ve_aliases
	fi

	if [ "${VE_STATE}" != "running" ]; then
		setup_network
	fi

	for ipm in ${IP_ADDR}; do
		ip_conv $ipm
		get_free_aliasid
		if [ -z "$_IPV6ADDR" ] ; then
			create_config "${_IP}" "${_MASK}" "${IFNUM}"
		else
			create_config "${_IP}" "${_MASK}" "${IFNUM}" 1
		fi
	done

	if [ "${VE_STATE}" = "running" ] ; then
		rc.d restart net-profiles
		netcfg "${VENET_DEV}"
	fi
}

function netctl_setup_network()
{
	echo "# This configuration file is auto-generated.
Description='VPS ethernet connection'
Interface=${VENET_DEV}
Connection=ethernet
IP=static
IP6=static
" > "${CTLPATH}/${VENET_DEV}" || error "Could not write ${CTLPATH}/${VENET_DEV}" $VZ_FS_NO_DISK_SPACE

	if [ ! -f "/etc/hosts" ]; then
		echo "127.0.0.1 localhost.localdomain localhost" > /etc/hosts || error "Could not write /etc/hosts" $VZ_FS_NO_DISK_SPACE
	fi

	netctl enable ${VENET_DEV}
}

function netctl_create_config()
{
	local ip=$1
	local netmask=$2
	local isinet6=$3

	if [ -z "$isinet6" ]; then
		# Don't do anything if address already exists
		grep -q "Address.*${ip}/${netmask}" "${CTLPATH}/${VENET_DEV}" 2> /dev/null
		if [ "$?" -eq "0" ]; then
			return 0
		fi
		add_param3 "${CTLPATH}/${VENET_DEV}" "Address" "${ip}/${netmask}"

		# Don't do anything if route already exists
		grep -q "Routes=" "${CTLPATH}/${VENET_DEV}" 2> /dev/null
		if [ "$?" -eq "0" ]; then
			return 0
		fi
		add_param3 "${CTLPATH}/${VENET_DEV}" "Routes" "default dev ${VENET_DEV}"
	else
		# Don't do anything if address already exists
		grep -q "Address6.*${ip}/${netmask}" "${CTLPATH}/${VENET_DEV}" 2> /dev/null
		if [ "$?" -eq "0" ]; then
			return 0
		fi
		add_param3 "${CTLPATH}/${VENET_DEV}" "Address6" "${ip}/${netmask}"

		# Don't do anything if route already exists
		grep -q "Routes6=" "${CTLPATH}/${VENET_DEV}" 2> /dev/null
		if [ "$?" -eq "0" ]; then
			return 0
		fi
		add_param3 "${CTLPATH}/${VENET_DEV}" "Routes6" "default dev ${VENET_DEV}"
	fi
}

function netctl_add_ip()
{
	local ipm

	if [ "x${VE_STATE}" = "xstarting" ]; then
		remove_all_ve_aliases
	fi
	if [ "x${IPDELALL}" = "xyes" ]; then
		remove_all_ve_aliases
	fi
	if [ "${VE_STATE}" != "running" ]; then
		netctl_setup_network
	fi

	for ipm in ${IP_ADDR}; do
		ip_conv $ipm
		if [ -z "$_IPV6ADDR" ]; then
			netctl_create_config "${_IP}" "${_MASK}"
		else
			netctl_create_config "${_IP}" "${_MASK}" 1
		fi
	done

	if [ "${VE_STATE}" = "running" ]; then
		netctl restart ${VENET_DEV}
	fi
}

newcfg=
if [ -d "${CFGPATH}" ] ; then
	newcfg=1
	add_ip
fi
if [ -d "${CTLPATH}" ] ; then
	newcfg=1
	netctl_add_ip
fi
if [ -z newcfg ] ; then
	old_add_ip
fi

exit 0