%PDF- %PDF-
Direktori : /usr/lib/parallels-tools/tools/scripts/ |
Current File : //usr/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