344 lines
7.2 KiB
Bash
Executable File
344 lines
7.2 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# DESCRIPTION: configure network services
|
|
#
|
|
# SCRIPT NAME: configure_network.sh
|
|
#
|
|
# Input: argument
|
|
# [--help] show usage
|
|
# <-t|--type> "static" or "dynamic"
|
|
# static argument:
|
|
# <-h|--hostname> hostname
|
|
# <-i|--ip> ip address
|
|
# <-n|--netmask> netmask
|
|
# <-g|--gateway> gateway
|
|
# <-d|--domainname> domainname
|
|
# [-p|--pdns] priamaryDNS
|
|
# [-s|--sdns] secondaryDNS
|
|
# [-e|--device] network device. if no configure, default is eth0.
|
|
# dynamic argument:
|
|
# <-h|--hostname> hostname
|
|
# [-e|--device] network device. if no configure, default is eth0.
|
|
#
|
|
# Output:
|
|
# NULL
|
|
# Return value:
|
|
# 1 argument error
|
|
# 2 ip/netmask/gateway address incorrect
|
|
# 3 hosts/resolv.conf/ifcfg.template/network doesn't exist
|
|
#
|
|
# AUTHOR: Qin Bo
|
|
#
|
|
# EMAIL: bqin@linx-info.com
|
|
#
|
|
# DATE: 2010-08-23
|
|
#
|
|
# HISTORY:
|
|
# REVISOR DATE MODIFICATION
|
|
# Qin Bo 2010-08-23 create
|
|
#
|
|
#
|
|
#
|
|
|
|
source ./functions
|
|
|
|
usage ()
|
|
{
|
|
if [ "$1" == "-n" ];then
|
|
cmd="info"
|
|
ret=0
|
|
else
|
|
cmd="err"
|
|
ret=1
|
|
fi
|
|
|
|
$cmd "
|
|
This script will configure your network
|
|
|
|
Usage: $0 options:
|
|
|
|
options:
|
|
[--help] show this message
|
|
<-t|--type> \"static\" or \"dynamic\"
|
|
static argument:
|
|
<-h|--hostname> hostname
|
|
<-i|--ip> ip address
|
|
<-n|--netmask> netmask
|
|
<-g|--gateway> gateway
|
|
[-d|--domainname] domainname
|
|
[-p|--pdns] priamaryDNS
|
|
[-s|--sdns] secondaryDNS
|
|
[-e|--device] network device. if no configure, default is eth0.
|
|
dynamic argument:
|
|
<-h|--hostname> hostname
|
|
[-e|--device] network device. if no configure, default is eth0.
|
|
"
|
|
return $ret
|
|
}
|
|
|
|
check_ip ()
|
|
{
|
|
|
|
if [ $# -ne 1 ];then
|
|
err "$FUNCNAME function argument error, it must 1 argument !"
|
|
return 1;
|
|
fi
|
|
|
|
local ip=$1
|
|
local ret=2
|
|
|
|
# "=~" use for match regular expression, only use in bash 3.0 or higher
|
|
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
|
|
|
|
# IFS is a separator for read builtin command, we save old IFS
|
|
OIFS=$IFS
|
|
IFS='.'
|
|
# set $ip to ip array
|
|
ip=($ip)
|
|
# restore IFS
|
|
IFS=$OIFS
|
|
[[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
|
|
&& ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
|
|
ret=$?
|
|
fi
|
|
|
|
return $ret
|
|
|
|
}
|
|
|
|
parse_arg ()
|
|
{
|
|
if [ $# -eq 0 ];then
|
|
usage
|
|
return 1
|
|
fi
|
|
|
|
tmp=$(getopt -o t:h:d:i:n:g:p:s:e:? --long type:,hostname:,domainname:,ip:,netmask:,gateway:,pdns:,sdns:,device:,help -- "$@" 2>>$DEV_LOG)
|
|
if [ $? -ne 0 ];then
|
|
usage
|
|
return 1
|
|
fi
|
|
|
|
# set all argument to arg variable
|
|
eval set -- "$tmp"
|
|
|
|
while true ; do
|
|
case $1 in
|
|
-t|--type) TYPE="$2" ;
|
|
info "network configure type: $TYPE" ;
|
|
shift 2;;
|
|
-h|--hostname) HOSTNAME="$2";
|
|
info "hostname: $HOSTNAME" ;
|
|
shift 2 ;;
|
|
-d|--domainname) DOMAINNAME="$2";
|
|
info "domainname: $DOMAINNAME" ;
|
|
shift 2 ;;
|
|
-i|--ip) IP="$2";
|
|
info "ip: $IP" ;
|
|
shift 2 ;;
|
|
-n|--netmask) NETMASK="$2";
|
|
info "netmask: $NETMASK" ;
|
|
shift 2 ;;
|
|
-g|--gateway) GATEWAY="$2";
|
|
info "gateway: $GATEWAY" ;
|
|
shift 2 ;;
|
|
-p|--pdns) primaryDNS="$2";
|
|
info "primaryDNS: $primaryDNS" ;
|
|
shift 2 ;;
|
|
-s|--sdns) secondaryDNS="$2";
|
|
info "secondaryDNS: $secondaryDNS" ;
|
|
shift 2 ;;
|
|
# may be have mulit-network devices
|
|
-e|--device) DEVICE="$2";
|
|
info "device: $DEVICE" ;
|
|
shift 2 ;;
|
|
# shift the last "--", this dash is define by getopt (more information see man getopt)
|
|
--) shift ;break;;
|
|
--help) usage -n ;return 0;;
|
|
*) usage ;return 1;;
|
|
esac
|
|
done
|
|
|
|
if [ "$TYPE" != "static" -a "$TYPE" != "dynamic" ];then
|
|
err "configure network must be static or dynamic"
|
|
return 1
|
|
fi
|
|
|
|
if [ -z "$HOSTNAME" ];then
|
|
err "HOSTNAME can't be empty"
|
|
return 1
|
|
fi
|
|
|
|
# default device is eth0
|
|
if [ -z "$DEVICE" ];then
|
|
DEVICE="eth0"
|
|
fi
|
|
|
|
if [ "$TYPE" == "static" ];then
|
|
if [ -z "$IP" ];then
|
|
err "static configure network, IP address can't be empty"
|
|
return 1
|
|
else
|
|
info "checking ip: $IP"
|
|
if ! check_ip "$IP"; then
|
|
err "ip: $IP incorrect"
|
|
return 2
|
|
fi
|
|
fi
|
|
if [ -z "$NETMASK" ];then
|
|
err "static configure network, netmask address can't be empty"
|
|
return 1
|
|
else
|
|
info "checking netmask: $NETMASK"
|
|
if ! check_ip "$NETMASK"; then
|
|
err "netmask: $NETMASK incorrect"
|
|
return 2
|
|
fi
|
|
fi
|
|
if [ -z "$GATEWAY" ];then
|
|
err "static configure network, gateway address can't be empty"
|
|
return 1
|
|
else
|
|
info "checking gateway: $GATEWAY"
|
|
if ! check_ip "$GATEWAY"; then
|
|
err "gateway: $GATEWAY incorrect"
|
|
return 2
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
}
|
|
|
|
# configure /etc/hosts
|
|
configure_hosts ()
|
|
{
|
|
if [ -e "$TARGET/etc/hosts" ];then
|
|
if [ "$TYPE" == "static" ];then
|
|
sed -i "s/^#<ip-address>/$IP/
|
|
s/<hostname\.domain\.org>/$HOSTNAME\.$DOMAINNAME/
|
|
s/<hostname>/$HOSTNAME/" "$TARGET/etc/hosts"
|
|
elif [ "$TYPE" == "dynamic" ];then
|
|
printf "%s\n" $HOSTNAME >> "$TARGET/etc/hosts"
|
|
fi
|
|
else
|
|
err "$TARGET/etc/hosts doesn't exist"
|
|
return 3
|
|
fi
|
|
}
|
|
|
|
# configure /etc/resolv.conf
|
|
configure_resolv_conf ()
|
|
{
|
|
if [ -e "$TARGET/etc/resolv.conf" ];then
|
|
if [ "$TYPE" == "static" ];then
|
|
sed -i "s/^#search <domain\.org>$/search $DOMAINNAME/
|
|
s/^#domain <domain\.org>$/domain $DOMAINNAME/" "$TARGET/etc/resolv.conf"
|
|
if [ -n "$primaryDNS" ];then
|
|
sed -i "s/^#nameserver <ip-address>$/nameserver $primaryDNS/" "$TARGET/etc/resolv.conf"
|
|
fi
|
|
if [ -n "$secondaryDNS" ];then
|
|
sed -i "/nameserver/a\nameserver $secondaryDNS" "$TARGET/etc/resolv.conf"
|
|
fi
|
|
fi
|
|
else
|
|
err "$TARGET/etc/resolv.conf doesn't exist"
|
|
return 3
|
|
fi
|
|
}
|
|
|
|
# configure /etc/sysconfig/network-devices/ifcfg.$DEVICE
|
|
configure_ifcfg ()
|
|
{
|
|
if [ -e "$IFCFG_TEMP" ];then
|
|
if [ "$TYPE" == "static" ];then
|
|
SERVICE="ipv4-static"
|
|
BOOTPROTO="none"
|
|
BROADCAST=$(./ipcalc.pl -n $IP/$NETMASK| grep Broadcast|awk '{ print $2 }')
|
|
NETWORK=$(./ipcalc.pl -n $IP/$NETMASK| grep Network|awk '{ print $2 }'|cut -d "/" -f 1)
|
|
elif [ "$TYPE" == "dynamic" ];then
|
|
SERVICE="dhcpcd"
|
|
BOOTPROTO="dhcp"
|
|
IP=""
|
|
NETMASK=""
|
|
GATEWAY=""
|
|
BROADCAST=""
|
|
NETWORK=""
|
|
fi
|
|
|
|
sed "/DEVICE/ c\DEVICE=$DEVICE
|
|
/BOOTPROTO/ c\BOOTPROTO=$BOOTPROTO
|
|
/SERVICE/ c\SERVICE=$SERVICE
|
|
/IPADDR/ c\IPADDR=$IP
|
|
/NETMASK/ c\NETMASK=$NETMASK
|
|
/GATEWAY/ c\GATEWAY=$GATEWAY
|
|
/BROADCAST/ c\BROADCAST=$BROADCAST
|
|
/NETWORK/ c\NETWORK=$NETWORK
|
|
" "$IFCFG_TEMP" >"$NETWORK_DEVICES_DIR/ifcfg-$DEVICE"
|
|
else
|
|
err "$IFCFG_TEMP doesn't exist"
|
|
return 3
|
|
fi
|
|
}
|
|
|
|
# configure /etc/sysconfig/network
|
|
configure_network_file ()
|
|
{
|
|
if [ -e "$SYSCONFIG_DIR/network" ];then
|
|
if [ "$TYPE" == "static" ];then
|
|
sed -i "/HOSTNAME/ c\HOSTNAME=$HOSTNAME" "$SYSCONFIG_DIR/network"
|
|
printf "DOMAIN=%s\n" "$DOMAINNAME" >>"$SYSCONFIG_DIR/network"
|
|
elif [ "$TYPE" == "dynamic" ];then
|
|
sed -i "/HOSTNAME/ c\HOSTNAME=$HOSTNAME" "$TARGET/etc/sysconfig/network"
|
|
fi
|
|
else
|
|
err "$SYSCONFIG_DIR/network doesn't exist"
|
|
return 3
|
|
fi
|
|
|
|
}
|
|
|
|
configure_network ()
|
|
{
|
|
configure_hosts
|
|
|
|
configure_resolv_conf
|
|
|
|
configure_ifcfg
|
|
|
|
configure_network_file
|
|
}
|
|
|
|
main ()
|
|
{
|
|
info "configure network"
|
|
parse_arg "$@"
|
|
erv
|
|
configure_network
|
|
erv
|
|
info "configure network success"
|
|
}
|
|
|
|
TYPE=""
|
|
HOSTNAME=""
|
|
DOMAINNAME=""
|
|
IP=""
|
|
NETMASK=""
|
|
GATEWAY=""
|
|
primaryDNS=""
|
|
secondaryDNS=""
|
|
DEVICE=""
|
|
SERVICE=""
|
|
BROADCAST=""
|
|
BOOTPROTO=""
|
|
NETWORK=""
|
|
|
|
SYSCONFIG_DIR="$TARGET/etc/sysconfig"
|
|
NETWORK_DEVICES_DIR="$SYSCONFIG_DIR/network-devices"
|
|
IFCFG_TEMP="$NETWORK_DEVICES_DIR/ifcfg.template"
|
|
|
|
# The quotes around '$@' are essential!
|
|
# in this way we can accept whitespace as parameter.
|
|
main "$@"
|
|
|
|
|