| #!/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 = -f 1` |
| |
| 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 -q "^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 -q "^${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 address=$1 |
| local netmask=$2 |
| local ifnum=$3 |
| # add venet0 alias to rc.conf |
| put_param "${OLDCFGFILE}.bak" "${VENET_DEV}_${ifnum}" \ |
| "${VENET_DEV}:${ifnum} ${address} 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 |
| IFNUM=$((IFNUM+1)) |
| echo "${IFNUMLIST}" | grep -q -E "^${IFNUM}\$" 2>/dev/null || |
| found=1 |
| done |
| } |
| |
| |
| function old_add_address() |
| { |
| 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 address=$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='${address}'" "${CFGPATH}/${VENET_DEV}_*" 2> /dev/null && return |
| |
| echo "CONNECTION='ethernet' |
| DESCRIPTION='${VENET_DEV}:${ifnum}' |
| INTERFACE='${VENET_DEV}:${ifnum}' |
| IP='static' |
| ADDR='${address}' |
| 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 ${address}/${netmask} broadcast 0.0.0.0 dev ${VENET_DEV}" |
| fi |
| else |
| # Don't do anything if address already exists |
| grep -q "ADDR6='${address}'" "${CFGPATH}/${VENET_DEV}_*" 2> /dev/null && return |
| |
| echo "CONNECTION='ethernet' |
| DESCRIPTION='${VENET_DEV}:${ifnum}' |
| INTERFACE='${VENET_DEV}:${ifnum}' |
| IP6='static' |
| POST_UP='ip route add ::/0 dev ${VENET_DEV}' |
| ADDR6='${address}/${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 ${address}/${netmask} dev ${VENET_DEV}" |
| if ! grep -q "['\\\"]-6 route add default" "${CFGPATH}/${VENET_DEV}" 2> /dev/null; 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 address=$1 |
| local netmask=$2 |
| local isinet6=$3 |
| |
| if [ -z "$isinet6" ]; then |
| # Don't do anything if address already exists |
| grep -q "Address.*${address}/${netmask}" "${CTLPATH}/${VENET_DEV}" 2> /dev/null && return |
| add_param3 "${CTLPATH}/${VENET_DEV}" "Address" "${address}/${netmask}" |
| |
| # Don't do anything if route already exists |
| grep -q "Routes=" "${CTLPATH}/${VENET_DEV}" 2> /dev/null && return |
| add_param3 "${CTLPATH}/${VENET_DEV}" "Routes" "default dev ${VENET_DEV}" |
| else |
| # Don't do anything if address already exists |
| grep -q "Address6.*${address}/${netmask}" "${CTLPATH}/${VENET_DEV}" 2> /dev/null && return |
| add_param3 "${CTLPATH}/${VENET_DEV}" "Address6" "${address}/${netmask}" |
| |
| # Don't do anything if route already exists |
| grep -q "Routes6=" "${CTLPATH}/${VENET_DEV}" 2> /dev/null && return |
| add_param3 "${CTLPATH}/${VENET_DEV}" "Routes6" "default dev ${VENET_DEV}" |
| fi |
| } |
| |
| function netctl_add_address() |
| { |
| 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_address |
| fi |
| if [ -z "$newcfg" ] ; then |
| old_add_address |
| fi |
| |
| exit 0 |