dhcpconfig、dhtadm、pntadm コマンドは、スクリプト中での使用に適しています。 特に、pntadm コマンドは大量の IP アドレスエントリを DHCP ネットワークテーブルに作成するときに便利です。次のサンプルスクリプトでは、バッチモードで pntadm を使って、IP アドレスを作成しています。
#! /usr/bin/ksh
#
# This script utilizes the pntadm batch facility to add client entries
# to a DHCP network table. It assumes that the user has the rights to
# run pntadm to add entries to DHCP network tables.
#
# Based on the nsswitch setting, query the netmasks table for a netmask.
# Accepts one argument, a dotted IP address.
#
get_netmask()
{
MTMP=`getent netmasks ${1} | awk '{ print $2 }'`
if [ ! -z "${MTMP}" ]
then
print - ${MTMP}
fi
}
#
# Based on the network specification, determine whether or not network is
# subnetted or supernetted.
# Given a dotted IP network number, convert it to the default class
# network.(used to detect subnetting). Requires one argument, the
# network number. (e.g. 10.0.0.0) Echos the default network and default
# mask for success, null if error.
#
get_default_class()
{
NN01=${1%%.*}
tmp=${1#*.}
NN02=${tmp%%.*}
tmp=${tmp#*.}
NN03=${tmp%%.*}
tmp=${tmp#*.}
NN04=${tmp%%.*}
RETNET=""
RETMASK=""
typeset -i16 ONE=10#${1%%.*}
typeset -i10 X=$((${ONE}&16#f0))
if [ ${X} -eq 224 ]
then
# Multicast
typeset -i10 TMP=$((${ONE}&16#f0))
RETNET="${TMP}.0.0.0"
RETMASK="240.0.0.0"
fi
typeset -i10 X=$((${ONE}&16#80))
if [ -z "${RETNET}" -a ${X} -eq 0 ]
then
# Class A
RETNET="${NN01}.0.0.0"
RETMASK="255.0.0.0"
fi
typeset -i10 X=$((${ONE}&16#c0))
if [ -z "${RETNET}" -a ${X} -eq 128 ]
then
# Class B
RETNET="${NN01}.${NN02}.0.0"
RETMASK="255.255.0.0"
fi
typeset -i10 X=$((${ONE}&16#e0))
if [ -z "${RETNET}" -a ${X} -eq 192 ]
then
# Class C
RETNET="${NN01}.${NN02}.${NN03}.0"
RETMASK="255.255.255.0"
fi
print - ${RETNET} ${RETMASK}
unset NNO1 NNO2 NNO3 NNO4 RETNET RETMASK X ONE
}
#
# Given a dotted form of an IP address, convert it to its hex equivalent.
#
convert_dotted_to_hex()
{
typeset -i10 one=${1%%.*}
typeset -i16 one=${one}
typeset -Z2 one=${one}
tmp=${1#*.}
typeset -i10 two=${tmp%%.*}
typeset -i16 two=${two}
typeset -Z2 two=${two}
tmp=${tmp#*.}
typeset -i10 three=${tmp%%.*}
typeset -i16 three=${three}
typeset -Z2 three=${three}
tmp=${tmp#*.}
typeset -i10 four=${tmp%%.*}
typeset -i16 four=${four}
typeset -Z2 four=${four}
hex=`print - ${one}${two}${three}${four} | sed -e 's/#/0/g'`
print - 16#${hex}
unset one two three four tmp
}
#
# Generate an IP address given the network address, mask, increment.
#
get_addr()
{
typeset -i16 net=`convert_dotted_to_hex ${1}`
typeset -i16 mask=`convert_dotted_to_hex ${2}`
typeset -i16 incr=10#${3}
# Maximum legal value - invert the mask, add to net.
typeset -i16 mhosts=~${mask}
typeset -i16 maxnet=${net}+${mhosts}
# Add the incr value.
let net=${net}+${incr}
if [ $((${net} < ${maxnet})) -eq 1 ]
then
typeset -i16 a=${net}\&16#ff000000
typeset -i10 a="${a}>>24"
typeset -i16 b=${net}\&16#ff0000
typeset -i10 b="${b}>>16"
typeset -i16 c=${net}\&16#ff00
typeset -i10 c="${c}>>8"
typeset -i10 d=${net}\&16#ff
print - "${a}.${b}.${c}.${d}"
fi
unset net mask incr mhosts maxnet a b c d
}
# Given a network address and client address, return the index.
client_index()
{
typeset -i NNO1=${1%%.*}
tmp=${1#*.}
typeset -i NNO2=${tmp%%.*}
tmp=${tmp#*.}
typeset -i NNO3=${tmp%%.*}
tmp=${tmp#*.}
typeset -i NNO4=${tmp%%.*}
typeset -i16 NNF1
let NNF1=${NNO1}
typeset -i16 NNF2
let NNF2=${NNO2}
typeset -i16 NNF3
let NNF3=${NNO3}
typeset -i16 NNF4
let NNF4=${NNO4}
typeset +i16 NNF1
typeset +i16 NNF2
typeset +i16 NNF3
typeset +i16 NNF4
NNF1=${NNF1#16\#}
NNF2=${NNF2#16\#}
NNF3=${NNF3#16\#}
NNF4=${NNF4#16\#}
if [ ${#NNF1} -eq 1 ]
then
NNF1="0${NNF1}"
fi
if [ ${#NNF2} -eq 1 ]
then
NNF2="0${NNF2}"
fi
if [ ${#NNF3} -eq 1 ]
then
NNF3="0${NNF3}"
fi
if [ ${#NNF4} -eq 1 ]
then
NNF4="0${NNF4}"
fi
typeset -i16 NN
let NN=16#${NNF1}${NNF2}${NNF3}${NNF4}
unset NNF1 NNF2 NNF3 NNF4
typeset -i NNO1=${2%%.*}
tmp=${2#*.}
typeset -i NNO2=${tmp%%.*}
tmp=${tmp#*.}
typeset -i NNO3=${tmp%%.*}
tmp=${tmp#*.}
typeset -i NNO4=${tmp%%.*}
typeset -i16 NNF1
let NNF1=${NNO1}
typeset -i16 NNF2
let NNF2=${NNO2}
typeset -i16 NNF3
let NNF3=${NNO3}
typeset -i16 NNF4
let NNF4=${NNO4}
typeset +i16 NNF1
typeset +i16 NNF2
typeset +i16 NNF3
typeset +i16 NNF4
NNF1=${NNF1#16\#}
NNF2=${NNF2#16\#}
NNF3=${NNF3#16\#}
NNF4=${NNF4#16\#}
if [ ${#NNF1} -eq 1 ]
then
NNF1="0${NNF1}"
fi
if [ ${#NNF2} -eq 1 ]
then
NNF2="0${NNF2}"
fi
if [ ${#NNF3} -eq 1 ]
then
NNF3="0${NNF3}"
fi
if [ ${#NNF4} -eq 1 ]
then
NNF4="0${NNF4}"
fi
typeset -i16 NC
let NC=16#${NNF1}${NNF2}${NNF3}${NNF4}
typeset -i10 ANS
let ANS=${NC}-${NN}
print - $ANS
}
#
# Check usage.
#
if [ "$#" != 3 ]
then
print "This script is used to add client entries to a DHCP network"
print "table by utilizing the pntadm batch facilty.\n"
print "usage: $0 network start_ip entries\n"
print "where: network is the IP address of the network"
print " start_ip is the starting IP address \n"
print " entries is the number of the entries to add\n"
print "example: $0 10.148.174.0 10.148.174.1 254\n"
return
fi
#
# Use input arguments to set script variables.
#
NETWORK=$1
START_IP=$2
typeset -i STRTNUM=`client_index ${NETWORK} ${START_IP}`
let ENDNUM=${STRTNUM}+$3
let ENTRYNUM=${STRTNUM}
BATCHFILE=/tmp/batchfile.$$
MACRO=`uname -n`
#
# Check if mask in netmasks table. First try
# for network address as given, in case VLSM
# is in use.
#
NETMASK=`get_netmask ${NETWORK}`
if [ -z "${NETMASK}" ]
then
get_default_class ${NETWORK} | read DEFNET DEFMASK
# use the default.
if [ "${DEFNET}" != "${NETWORK}" ]
then
# likely subnetted/supernetted.
print - "\n\n###\tWarning\t###\n"
print - "Network ${NETWORK} is netmasked, but no entry was found \n
in the 'netmasks' table; please update the 'netmasks' \n
table in the appropriate nameservice before continuing. \n
(See /etc/nsswitch.conf.) \n">&2
return 1
else
# use the default.
NETMASK="${DEFMASK}"
fi
fi
#
# Create a batch file.
#
print -n "Creating batch file "
while [ ${ENTRYNUM} -lt ${ENDNUM} ]
do
if [ $((${ENTRYNUM}-${STRTNUM}))%50 -eq 0 ]
then
print -n "."
fi
CLIENTIP=`get_addr ${NETWORK} ${NETMASK} ${ENTRYNUM}`
print "pntadm -A ${CLIENTIP} -m ${MACRO} ${NETWORK}">> ${BATCHFILE}
let ENTRYNUM=${ENTRYNUM}+1
done
print " done.\n"
#
# Run pntadm in batch mode and redirect output to a temporary file.
# Progress can be monitored by using the output file.
#
print "Batch processing output redirected to ${BATCHFILE}"
print "Batch processing started."
pntadm -B ${BATCHFILE} -v> /tmp/batch.out 2>&1
print "Batch processing completed."
|