1 #!/usr/bin/ksh 2 # 3 # CDDL HEADER START 4 # 5 # The contents of this file are subject to the terms of the 6 # Common Development and Distribution License, Version 1.0 only 7 # (the "License"). You may not use this file except in compliance 8 # with the License. 9 # 10 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 11 # or http://www.opensolaris.org/os/licensing. 12 # See the License for the specific language governing permissions 13 # and limitations under the License. 14 # 15 # When distributing Covered Code, include this CDDL HEADER in each 16 # file and include the License file at usr/src/OPENSOLARIS.LICENSE. 17 # If applicable, add the following below this CDDL HEADER, with the 18 # fields enclosed by brackets "[]" replaced with your own identifying 19 # information: Portions Copyright [yyyy] [name of copyright owner] 20 # 21 # CDDL HEADER END 22 # 23 # 24 #ident "%Z%%M% %I% %E% SMI" 25 # 26 # Copyright (c) 2001 by Sun Microsystems, Inc. 27 # All rights reserved. 28 # 29 30 # 31 # Process arguments. 32 # 33 process_args() 34 { 35 DEBUG= 36 DHCPRSRC= 37 DHCPPATH= 38 DHCPRSRC_NEW= 39 DHCPPATH_NEW= 40 ERR= 41 USAGE="Usage: %s: [-d]" 42 while getopts ${VALIDOPTS} name 43 do 44 case $name in 45 d) DEBUG="-d";; 46 r) DHCPRSRC="${OPTARG}";; 47 p) DHCPPATH="${OPTARG}";; 48 R) DHCPRSRC_NEW="${OPTARG}";; 49 P) DHCPPATH_NEW="${OPTARG}";; 50 ?) ERR=1;; 51 esac 52 done 53 54 # 55 # If the resource is a valid option, then it is a required one 56 # 57 echo ${VALIDOPTS} | grep r: >/dev/null 58 if [ $? == 0 ] 59 then 60 USAGE="${USAGE} -r resource" 61 if [ -z "${DHCPRSRC}" ] 62 then 63 ERR=1 64 fi 65 fi 66 67 # 68 # If the path is a valid option, then it is a required one 69 # 70 echo ${VALIDOPTS} | grep p: >/dev/null 71 if [ $? == 0 ] 72 then 73 USAGE="${USAGE} -p path" 74 if [ -z "${DHCPPATH}" ] 75 then 76 ERR=1 77 fi 78 fi 79 80 # 81 # If the conversion resource is a valid option, then it is a required one 82 # 83 echo ${VALIDOPTS} | grep R: >/dev/null 84 if [ $? == 0 ] 85 then 86 USAGE="${USAGE} -R resource" 87 if [ -z "${DHCPRSRC_NEW}" ] 88 then 89 ERR=1 90 fi 91 fi 92 93 # 94 # If the conversion path is a valid option, then it is a required one 95 # 96 echo ${VALIDOPTS} | grep P: >/dev/null 97 if [ $? == 0 ] 98 then 99 USAGE="${USAGE} -P path" 100 if [ -z "${DHCPPATH_NEW}" ] 101 then 102 ERR=1 103 fi 104 fi 105 106 if [ ! -z "${ERR}" ] 107 then 108 printf "$USAGE\n" $0 109 exit -1 110 fi 111 } 112 113 # 114 # Return the primary interface's IP address. 115 # 116 get_server_ip() 117 { 118 awk '$1 ~ /^[0-9]/ && $2 == "'${SRVNAME}'" { printf "%s", $1; exit }' /etc/inet/hosts 119 } 120 121 # 122 # Based on the network specification, determine whether or not network is 123 # subnetted or supernetted. 124 # Given a dotted IP network number, convert it to the default class 125 # network.(used to detect subnetting). Requires one argument, the 126 # network number. (e.g. 10.0.0.0) Echos the default network and default 127 # mask for success, null if error. 128 # 129 get_default_class() 130 { 131 NN01=${1%%.*} 132 tmp=${1#*.} 133 NN02=${tmp%%.*} 134 tmp=${tmp#*.} 135 NN03=${tmp%%.*} 136 tmp=${tmp#*.} 137 NN04=${tmp%%.*} 138 RETNET="" 139 RETMASK="" 140 141 typeset -i16 ONE=10#${1%%.*} 142 typeset -i10 X=$((${ONE}&16#f0)) 143 if [ ${X} -eq 224 ] 144 then 145 # Multicast 146 typeset -i10 TMP=$((${ONE}&16#f0)) 147 RETNET="${TMP}.0.0.0" 148 RETMASK="240.0.0.0" 149 fi 150 typeset -i10 X=$((${ONE}&16#80)) 151 if [ -z "${RETNET}" -a ${X} -eq 0 ] 152 then 153 # Class A 154 RETNET="${NN01}.0.0.0" 155 RETMASK="255.0.0.0" 156 fi 157 typeset -i10 X=$((${ONE}&16#c0)) 158 if [ -z "${RETNET}" -a ${X} -eq 128 ] 159 then 160 # Class B 161 RETNET="${NN01}.${NN02}.0.0" 162 RETMASK="255.255.0.0" 163 fi 164 typeset -i10 X=$((${ONE}&16#e0)) 165 if [ -z "${RETNET}" -a ${X} -eq 192 ] 166 then 167 # Class C 168 RETNET="${NN01}.${NN02}.${NN03}.0" 169 RETMASK="255.255.255.0" 170 fi 171 print - ${RETNET} ${RETMASK} 172 unset NNO1 NNO2 NNO3 NNO4 RETNET RETMASK X ONE 173 } 174 175 # 176 # Based on the nsswitch setting, query the netmasks table for a netmask. 177 # Accepts one argument, a dotted IP address. 178 # 179 get_netmask() 180 { 181 MTMP=`getent netmasks ${1} | awk '{ print $2 }'` 182 if [ ! -z "${MTMP}" ] 183 then 184 print - ${MTMP} 185 fi 186 } 187 188 # Given a network number and subnetmask, return the broadcast address. 189 get_bcast_addr() 190 { 191 typeset -i16 NNO1=10#${1%%.*} 192 tmp=${1#*.} 193 typeset -i16 NNO2=10#${tmp%%.*} 194 tmp=${tmp#*.} 195 typeset -i16 NNO3=10#${tmp%%.*} 196 tmp=${tmp#*.} 197 typeset -i16 NNO4=10#${tmp%%.*} 198 199 typeset -i16 NMO1=10#${2%%.*} 200 tmp=${2#*.} 201 typeset -i16 NMO2=10#${tmp%%.*} 202 tmp=${tmp#*.} 203 typeset -i16 NMO3=10#${tmp%%.*} 204 tmp=${tmp#*.} 205 typeset -i16 NMO4=10#${tmp%%.*} 206 207 typeset -i16 ONE 208 typeset -i16 TWO 209 typeset -i16 THREE 210 typeset -i16 FOUR 211 let ONE=\~${NMO1}\|${NNO1} 212 let ONE=${ONE}\&16#ff 213 let TWO=\~${NMO2}\|${NNO2} 214 let TWO=${TWO}\&16#ff 215 let THREE=\~${NMO3}\|${NNO3} 216 let THREE=${THREE}\&16#ff 217 let FOUR=\~${NMO4}\|${NNO4} 218 let FOUR=${FOUR}\&16#ff 219 typeset -i10 ONE 220 typeset -i10 TWO 221 typeset -i10 THREE 222 typeset -i10 FOUR 223 print - "${ONE}.${TWO}.${THREE}.${FOUR}" 224 } 225 226 # Given a network number and subnetmask, return the subnet address. 227 get_subnet_addr() 228 { 229 typeset -i16 NNO1=10#${1%%.*} 230 tmp=${1#*.} 231 typeset -i16 NNO2=10#${tmp%%.*} 232 tmp=${tmp#*.} 233 typeset -i16 NNO3=10#${tmp%%.*} 234 tmp=${tmp#*.} 235 typeset -i16 NNO4=10#${tmp%%.*} 236 237 typeset -i16 NMO1=10#${2%%.*} 238 tmp=${2#*.} 239 typeset -i16 NMO2=10#${tmp%%.*} 240 tmp=${tmp#*.} 241 typeset -i16 NMO3=10#${tmp%%.*} 242 tmp=${tmp#*.} 243 typeset -i16 NMO4=10#${tmp%%.*} 244 245 typeset -i16 ONE 246 typeset -i16 TWO 247 typeset -i16 THREE 248 typeset -i16 FOUR 249 let ONE=${NMO1}\&${NNO1} 250 let TWO=${NMO2}\&${NNO2} 251 let THREE=${NMO3}\&${NNO3} 252 let FOUR=${NMO4}\&${NNO4} 253 typeset -i10 ONE 254 typeset -i10 TWO 255 typeset -i10 THREE 256 typeset -i10 FOUR 257 print - "${ONE}.${TWO}.${THREE}.${FOUR}" 258 } 259 260 # 261 # Given a macro definition defined in MACRO_DEFINITION and a symbol/value string 262 # defined in SRCH, search the macro definition for the string. If not found, abort. 263 # If found, remove the string from the definition. 264 # 265 macro_find_and_replace() 266 { 267 VAL=`expr "${MACRO_DEFINITION}" : .*"${SRCH}".*` 268 if [ "${VAL}" = "0" ] 269 then 270 echo "${SRCH} not defined as part of the macro definition" 271 echo "${TESTNAME} - Test failed!" 272 exit 1 273 fi 274 275 SRCH=`echo "${SRCH}" | cut -c2-` 276 MACRO_DEFINITION=`echo "${MACRO_DEFINITION}" | sed s/"${SRCH}"//` 277 } 278 279 # 280 # Given a macro or option definition, returns its value. 281 # 282 function get_value 283 { 284 echo $* | cut -d ' ' -f 3- 285 }