1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185
|
#!/bin/bash
# Copyright (C) 2000-2006 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="/etc/vz/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} link list | egrep -v -E "LOOPBACK|NOARP|SLAVE" | \
awk "/^[0-9].*:/&&/UP/ {print \\$2}" | sed -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
if [ $(cat /proc/sys/net/ipv4/conf/$DEV/proxy_arp) == 0 ] ; then
vzwarning "Function proxy_arp for $DEV is set to 0. Enable with 'sysctl -w net.ipv4.conf.$DEV.proxy_arp=1'. See /usr/share/doc/vzctl/README.Debian."
fi
${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
}
# Sets VE0 source routing for given IP
# Parameters:
# $1 - IP address
function vzaddrouting()
{
local src_addr
local device=
if ! ${IP_CMD} route list $1 | grep "$1 dev venet0" > /dev/null 2>&1;
then
if [ -n "${VE_ROUTE_SRC_DEV}" ]; then
device="dev ${VE_ROUTE_SRC_DEV}"
fi
src_addr=`ip route list table local ${device} | grep '^local'|\
cut -d' ' -f2 | grep -v '^127\.' | head -n 1`
if [ -z "${src_addr}" ]; then
vzerror "Unable to get source ip [${device}]" $VZ_CANT_ADDIP
fi
${IP_CMD} route add $1 dev venet0 src ${src_addr} || \
vzerror "Unable to add route ${IP_CMD} route add $1 dev venet0 src ${src_addr}" $VZ_CANT_ADDIP
fi
}
# Deletes VE0 source routing for given IP
# Parameters:
# $1 - IP address
function vzdelrouting()
{
if ${IP_CMD} route list $1 | grep "$1 dev venet0" >/dev/null 2>&1; then
${IP_CMD} route del $1 dev venet0 || \
vzwarning "Unable to del route ${IP_CMD} route del $1 dev venet0"
fi
}
|