blob: dc0e8afc9fa99ab63b77bfb177008abb91de95ed [file] [log] [blame] [raw]
#!/bin/bash
# Copyright (C) 2000-2007 SWsoft. 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
#
#
# Common stuff for vzctl helper scripts
# get the name of the script
SELFNAME=`basename $0`
# Set the sane umask
umask 022
# Error codes
VZ_INVALID_PARAMETER_SYNTAX=20
VZ_FS_NO_DISK_SPACE=46
VZ_FS_BAD_TMPL=47
VZ_FS_NEW_VE_PRVT=48
VZ_CHANGEPASS=74
VZ_CANT_ADDIP=34
VZ_IP_INUSE=78
# iptables parameters
VE_STATE_DIR="/var/lib/vzctl/veip/"
CONF_DIR="@PKGCONFDIR@/conf/"
ARPSEND_CMD="arpsend -c 1 -w 1"
IP_CMD=/sbin/ip
# Prints error message and exits
# Parameters:
# $1 - error message
# $2 - exit code
# Example of usage:
# vzerror "Fatal error" 1
function vzerror()
{
# print errors to stdout too
ERR=$?
echo "$SELFNAME ERROR: $1"
exit $2
}
# Prints warning message
# Parameters:
# $* - error message
# Example of usage:
# vzwarning Invalid user
function vzwarning()
{
echo "$SELFNAME WARNING: $*"
}
# Prints debug message
# Parameters:
# $* - debug message
# Example of usage:
# vzdebug Trying to start ls
function vzdebug()
{
echo "$SELFNAME: $*"
}
# Checks if environment variable exists,
# and exits with exit code 1 if not
# Parameters:
# $* - option names
# Example:
# vzcheckvar VEID IP_ADDR
function vzcheckvar()
{
for VAR in $*; do
if eval test "\"x\$$VAR\"" = "x"; then
vzerror "Missing parameter: $VAR" $VZ_INVALID_PARAMETER_SYNTAX
fi
done
}
# This function fills $NETDEVICES with all network interfaces
# You should always call it before calling vzarp
function vzgetnetdev()
{
# Get a list of interfaces, excluding ones with LOOPBACK,
# NOARP, or SLAVE flags
NETDEVICES=`${IP_CMD} addr list | awk '
/^[0-9]+/ {
dev="";
}
/^[0-9]+/ && /UP/ && !/LOOPBACK/ && !/SLAVE/ && !/NOARP/ {
dev=$2;
}
/^[\ \t]+inet / {
if (dev != "") print (dev);
dev="";
}' | sed -e 's/:$//' -e 's/@.*$//'`
}
# Adds/deletes public ARP records for given IP for all interfaces
# Parameters:
# $1 - should be either "add" or "del"
# $2 - IP address
# $NETDEVICES - Network devices used to take MAC addresses from
function vzarp()
{
local DEV
[ -z "${NETDEVICES}" ] && vzwarning "Device list is empty"
for DEV in $NETDEVICES; do
${IP_CMD} neigh $1 proxy $2 dev $DEV > /dev/null 2>&1
done
}
# Send ARP request to detect that somebody already have this IP
function vzarpipdetect()
{
local DEV
local ip
local cmd
[ -z "${1}" ] && return
[ "${SKIP_ARPDETECT}" = "yes" ] && return
for ip in ${1}; do
cmd="$cmd -e $ip"
done
for DEV in $NETDEVICES; do
${ARPSEND_CMD} -D ${cmd} $DEV || vzwarning "${ARPSEND_CMD} -D ${cmd} $DEV FAILED"
done
}
# Send ARP request to update neighbour ARP caches
function vzarpipset()
{
local DEV
local ip
local dev
[ -z "${1}" ] && return
for dev in $NETDEVICES; do
for ip in ${1}; do
opt="-i ${ip} -e ${ip}"
${ARPSEND_CMD} -U ${opt} ${dev} || vzwarning "${ARPSEND_CMD} -U ${opt} ${dev} FAILED"
done
done
}
function vzaddrouting4()
{
local src_addr=
if [ -n "${VE_ROUTE_SRC_DEV}" ]; then
src_addr=`ip route list table local dev ${VE_ROUTE_SRC_DEV} | \
grep '^local'| \
cut -d' ' -f2 | grep -v '^127\.' | head -n 1`
if [ -z "${src_addr}" ]; then
vzerror "Unable to get source ip [${VE_ROUTE_SRC_DEV}]" $VZ_CANT_ADDIP
fi
src_addr="src ${src_addr}"
fi
${IP_CMD} route add $1 dev venet0 ${src_addr} || \
vzerror "Unable to add route ${IP_CMD} route add $1 dev venet0 ${src_addr}" $VZ_CANT_ADDIP
}
function vzaddrouting6()
{
${IP_CMD} route add $1 dev venet0 || \
vzerror "Unable to add route ${IP_CMD} route add $1 dev venet0" $VZ_CANT_ADDIP
}
# Sets VE0 source routing for given IP
# Parameters:
# $1 - IP address
function vzaddrouting()
{
if ! ${IP_CMD} route list table all $1 | grep "$1 dev venet0" > /dev/null 2>&1;
then
if [ "${1#*:}" = "${1}" ]; then
vzaddrouting4 $1
else
vzaddrouting6 $1
fi
fi
}
# Deletes VE0 source routing for given IP
# Parameters:
# $1 - IP address
function vzdelrouting()
{
local arg
if ${IP_CMD} route list table all $1 | grep "$1 dev venet0" >/dev/null 2>&1; then
if [ "${1%%:*}" != "${1}" ]; then
arg="-6 route flush $1 dev venet0"
else
arg="route del $1 dev venet0"
fi
${IP_CMD} ${arg} || \
vzwarning "vzdelrouting: ${IP_CMD} ${arg} failed"
fi
}