%PDF- %PDF-
| Direktori : /proc/self/root/lib/parallels-tools/tools/scripts/ |
| Current File : //proc/self/root/lib/parallels-tools/tools/scripts/debian-set_ip.sh |
#!/bin/bash
# Copyright (c) 2015 Parallels IP Holdings GmbH
#
# This script configure IP alias(es) inside Debian like VM.
#
# Parameters: <dev> <MAC_addr> <IPs>
# <dev> - name of device. (example: eth2)
# <MAC_addr> - MAC address of device
# <IP/MASKs> - IP address(es) with MASK
# (example: 192.169.1.30/255.255.255.0)
# (several addresses should be divided by space)
#
prog="$0"
path="${prog%/*}"
funcs="$path/functions"
if [ -f "$funcs" ] ; then
. $funcs
else
echo "Program $0"
echo "File ${func} not found"
exit 1
fi
ETH_DEV=$1
ETH_MAC=$2
IP_MASKS=$3
OPTIONS=$4
ETH_MAC_NW=`echo $ETH_MAC | sed "s,00,0,g"`
IFNUM=-1
IFNUM6=-1
IP4_MASKS=
IP6_MASK=
SET_AUTO[0]="no"
set_options "${OPTIONS}"
for ip_mask in ${IP_MASKS}; do
if [ "${ip_mask}" == "remove" ] ; then
continue
elif is_ipv6 ${ip_mask}; then
IP6_MASKS="${IP6_MASKS} ${ip_mask}"
else
IP4_MASKS="${IP4_MASKS} ${ip_mask}"
fi
done
function print_ipv6_header()
{
local device=$1
local method=$2
if [ "${SET_AUTO[0]}" != "yes" ] ; then
SET_AUTO[0]="yes"
echo "auto ${device}" >> $DEBIAN_CONFIGFILE
fi
echo "iface ${device} inet6 ${method}" >> $DEBIAN_CONFIGFILE
# 2.6.35 kernel doesn't flush IPv6 addresses
echo " pre-down ip -6 addr flush dev ${device} scope global || :" >> $DEBIAN_CONFIGFILE
}
function add_ip6()
{
local ip=$1
local mask=$2
local device=$3
local ifnum=${IFNUM6}
local ifnum_postfix=":${IFNUM6}"
local inet="inet6"
[ -z "${ip}" ] && \
error "Empty value of IP"
[ -z "${mask}" ] && \
error "Empty value of MASK"
if [ "x${IFNUM6}" == "x0" ] ; then
print_ipv6_header ${device} static
echo " address ${ip}" >> $DEBIAN_CONFIGFILE
echo " netmask ${mask}" >> $DEBIAN_CONFIGFILE
else
awk 'BEGIN {found = 0}
NF == 0 {next}
!found && $1 == "iface" && $2 ~/'${device}'$/ && $3 == "inet6" {
found = 1;
print;
next;
}
found == 1 && !/^\t/{
print "\tup ip addr add '${ip}'/'${mask}' dev '${device}'";
found++;
}
{print}
END {
if (found == 1) {
print "\tup ip addr add '${ip}'/'${mask}' dev '${device}'";
}
}
' < ${DEBIAN_CONFIGFILE} > ${DEBIAN_CONFIGFILE}.$$ && \
mv -f ${DEBIAN_CONFIGFILE}.$$ ${DEBIAN_CONFIGFILE}
fi
echo >> $DEBIAN_CONFIGFILE
echo >> $DEBIAN_CONFIGFILE
}
function create_config()
{
local ip=$1
local mask=$2
local device=$3
local ifnum=${IFNUM}
local ifnum_postfix=":${IFNUM}"
local inet="inet"
[ -z "${ip}" ] && \
error "Empty value of IP"
[ -z "${mask}" ] && \
error "Empty value of MASK"
[ "x${IFNUM}" == "x0" ] && ifnum_postfix=""
if [ "${SET_AUTO[${ifnum}]}" != "yes" ] ; then
SET_AUTO[${ifnum}]="yes"
echo "auto ${device}${ifnum_postfix}" >> $DEBIAN_CONFIGFILE
fi
if [ "${ip}" == "remove" ] ; then
echo "" >> $DEBIAN_CONFIGFILE
return
fi
echo "iface ${device}${ifnum_postfix} ${inet} static" >> $DEBIAN_CONFIGFILE
echo " address ${ip}
netmask ${mask}" >> $DEBIAN_CONFIGFILE
echo " broadcast +
" >> $DEBIAN_CONFIGFILE
}
function set_ip()
{
local ip_mask ip mask
local new_ips
remove_debian_interfaces ${ETH_DEV}
remove_debian_interfaces "${ETH_DEV}:[0-9]+"
new_ips="${IP_MASKS}"
for ip_mask in ${new_ips}; do
if is_ipv6 ${ip_mask} ; then
let IFNUM6=IFNUM6+1
if echo ${ip_mask} | grep -q '/' ; then
mask=${ip_mask##*/}
else
mask='64'
fi
ip=${ip_mask%%/*}
add_ip6 "${ip}" "${mask}" ${ETH_DEV}
else
let IFNUM=IFNUM+1
if echo ${ip_mask} | grep -q '/' ; then
mask=${ip_mask##*/}
else
mask='255.255.255.255'
fi
ip=${ip_mask%%/*}
create_config "${ip}" "${mask}" ${ETH_DEV}
fi
done
#clean IPv4
ip -4 addr flush dev ${ETH_DEV}
if [ "x$IP4_MASKS" == "x" ] ; then
if [ $USE_DHCPV4 -eq 1 ] ; then
echo "
iface ${ETH_DEV} inet dhcp
" >> $DEBIAN_CONFIGFILE
fi
fi
# unset IPv6 addresses on interface down
[ "x$IP6_MASKS" == "x" ] && print_ipv6_header ${ETH_DEV} manual
if [ "x$IP6_MASKS" == "x" -a $USE_DHCPV6 -eq 1 ] ; then
#don't support dhcpv6 by config
set_wide_dhcpv6 ${ETH_DEV}
else
unset_wide_dhcpv6 ${ETH_DEV}
fi
}
function add_ips_nm()
{
local ip_mask ip mask
local new_ips=$1
IFNUM=0
for ip_mask in ${new_ips}; do
let IFNUM=IFNUM+1
if ! is_ipv6 ${ip_mask} ; then
if echo ${ip_mask} | grep -q '/' ; then
mask=` echo ${ip_mask##*/} | \
awk -F '.' 'function calc_digit (n)
{
if (n ~ 255) return 8
if (n ~ 254) return 7
if (n ~ 252) return 6
if (n ~ 248) return 5
if (n ~ 240) return 4
if (n ~ 224) return 3
if (n ~ 192) return 2
if (n ~ 128) return 1
if (n ~ 0) return 0
return 127
}
function calc_mask (a, b, c, d, e, mymask)
{
e = calc_digit(a)
if (e !~ 127) mymask += e; else return 1
e = calc_digit(b)
if (e !~ 127) mymask += e; else return 1
e = calc_digit(c)
if (e !~ 127) mymask += e; else return 1
e = calc_digit(d)
if (e !~ 127) mymask += e; else return 1
print mymask
}
{ exit calc_mask($1, $2, $3, $4) }'`
[ "x$mask" = "x" ] && exit 1
else
mask='32'
fi
ip=${ip_mask%%/*}
echo "addresses${IFNUM}=${ip};${mask};0.0.0.0;" >> $NWSYSTEMCONNECTIONS/${ETH_DEV}
else
echo "addresses${IFNUM}=${ip_mask},::" >> $NWSYSTEMCONNECTIONS/${ETH_DEV}
fi
done
}
function set_ip_nm() {
local ip_mask ip mask
local new_ips
local ret=0
if [ ! -f "${NWMANAGER}" ] ; then
echo "Network manager ${NWMANAGER} not found"
exit 3
fi
for dev in ${ETH_DEV} "${ETH_DEV}:[0-9]+"; do
remove_debian_interfaces $dev
[ $ret -eq 0 ] && ret=$?
done
[ $ret -ne 0 ] && restart_nm_wait
clean_nm_connections $ETH_DEV $ETH_MAC $ETH_MAC_NW
echo "[connection]
id=${ETH_DEV}
uuid=`generate_uuid`
type=802-3-ethernet
autoconnect=true
timestamp=0" > $NWSYSTEMCONNECTIONS/${ETH_DEV}
if [ "x${IP4_MASKS}" != "x" ] ; then
echo "
[ipv4]
method=manual" >> $NWSYSTEMCONNECTIONS/${ETH_DEV}
ip -4 addr flush dev ${ETH_DEV}
add_ips_nm "${IP4_MASKS}"
echo "ignore-auto-routes=false
ignore-auto-dns=false
never-default=false
" >> $NWSYSTEMCONNECTIONS/${ETH_DEV}
else
echo "
[ipv4]
method=auto
ignore-auto-dns=false
never-default=false
" >> $NWSYSTEMCONNECTIONS/$ETH_DEV
fi
if [ "x${IP6_MASKS}" != "x" ] ; then
echo "
[ipv6]
method=manual" >> $NWSYSTEMCONNECTIONS/${ETH_DEV}
add_ips_nm "${IP6_MASKS}"
echo "ignore-auto-routes=false
ignore-auto-dns=false
never-default=false
" >> $NWSYSTEMCONNECTIONS/${ETH_DEV}
elif [ $USE_DHCPV6 -eq 1 ] ; then
echo "
[ipv6]
method=auto
ignore-auto-routes=false
ignore-auto-dns=false
never-default=false
" >> $NWSYSTEMCONNECTIONS/$ETH_DEV
fi
echo "
[802-3-ethernet]
speed=0
duplex=full
auto-negotiate=true
mac-address=$ETH_MAC_NW
mtu=0" >> $NWSYSTEMCONNECTIONS/${ETH_DEV}
chmod 0600 $NWSYSTEMCONNECTIONS/${ETH_DEV}
nm_connection_reload ${ETH_DEV}
}
if [ -f $NWSYSTEMCONF -o -f $NMCONFFILE ]; then
set_ip_nm
else
set_ip
fi
$path/debian-restart.sh ${ETH_DEV}
exit 0
# end of script