#!/bin/ksh # # $Log: vnames,v $ # Revision 1.14 2009/11/04 17:19:11 mbaker # made oracle section to work more cleanly with global and local zones # # Revision 1.13 2009/11/04 17:01:56 mbaker # updated for zone oracle instances # # Revision 1.12 2009/06/24 02:29:12 mbaker # made change for oratab in zones # # Revision 1.11 2009/01/22 02:25:03 mbaker # change stderr redirection - had space between 2 and greaterthan # # Revision 1.10 2008/10/24 15:02:38 mbaker # test change # # Revision 1.9 2008/09/16 17:04:40 mbaker # added /dev/null to each nslookup command # # Revision 1.8 2008/09/04 19:20:53 mbaker # added test for /etc/hosts - get rid of commented line, and only look at first # line that matches pattern (assume that first found line is right - that is what # the OS will do anyhow) # # Revision 1.7 2008/08/20 15:40:04 mbaker # updated prints # # # Revision 1.1 2008/06/26 02:08:55 mbaker # Initial revision # # ################################################################################ #DOCBEGIN # # Program to add,delete,list service names on a host (virtual IPs/names) # # Runs on solaris and redhat # # Solaris has knowledge of global and local (non-global) zones # # Has ability to parse oracle instances based upon a predefined standard # # All oracle instances have an INSTANCE.env in /vendor/oracle. # then see if that VIP is plumbed up - if so, the instance could be active # # # zone (non-global/local) -> VIPS && -> oracle SIDs (possible) # /\ # | # global (base OS) -> VIPS (possible) -> NOSIDS # /\ # | # domain or physical host # # global: # hostname: # vips:... # zones:... # VCS:... # metasets:... # Vxdg:... # ZFS:... # oracle:... # SIDs via SID.env file, # then looks for processes that match SID # then looks for plumbed VIP that matches SID # and looks in [/var/opt,/etc]/oratab # # local (non-global): # hostname: # vips:... # oracle:... # in a zone, looks for: # SIDs via SID.env file, # then looks for processes that match SID # then looks for plumbed VIP that matches SID # and looks in [/var/opt,/etc]/oratab # zones:*(no zones possible) # # before-zones(pre solaris10): # vips:... # oracle:*(no oracle; this script only works w/ oracle in a zone) # zones:*(no zones; not available in this release) # # Runs on: # # Features: add/delete DGs : Solaris - Veritas diskgroups # Features: add/delete VIPs : Solaris, Linux # Features: list metasets : Solaris only # Features: list metastat : Solaris only # Features: list zones : Solaris only # Features: list VIPs : All (see list below) # Features: list ZFS : All (see list below) # Features: list VCS SGs : All (see list below) # Features: list vxdg : All (see list below) # Features: list oracle : All (see list below) # # AIX : >=4.3.3 # HP-UX : >=10 # LINUX : tested on RedHat & Suse. Others? - hard to tell, too many. # SOLARIS: tested on >2.6, and many varied Sun h/w types # # Matt Baker - mbaker@computeranddata.com # Latest copy available at www.computeranddata.com/scripts # #DOCEND ################################################################################ set -o allexport HOSTNAME=$(hostname) VERBOSE=0 #VERBOSE=1 ADD=0 ALL=0 APPDIR=/apps #BINDIR=/usr/local/bin DATE=$(date +%Y%m%d%H%M) DELETE=0 DEBUG=0 DISK=0 FORCE=0 INFC="" IPMP=0 #IPMP_PATTERN=".fo-[1,2]" IPMP_PATTERN='.f[o,0]-[1,2]' BACKUP_PATTERN='\-b' LOGDIR=/tmp/log/srvnames LOGFILE=$LOGDIR/service_name_log LIST=0 NOOPTIONS=1 ORACLE=0 OSTYPE=$(uname) SRVNAME="" VCS=0 VXDG=0 ZFS=0 ZONE=0 ZONEGLOBAL=0 set +o allexport OSTYPE=$(uname 2> /dev/null) if [[ $OSTYPE = SunOS ]] then PATH=/sbin:/usr/sbin:/opt/VRTS/bin:/opt/VRTSvcs/bin:$PATH if [[ -f /usr/ucb/echo ]] then ECHO="/usr/ucb/echo" else #use ksh print ECHO="print" #ECHO="/usr/bin/echo" fi elif [[ $OSTYPE = AIX ]] then PATH=/usr/sbin:/opt/VRTS/bin:/opt/VRTSvcs/bin:$PATH #use ksh print ECHO="print" #ECHO="/usr/bin/echo" elif [[ $OSTYPE = HP-UX ]] then PATH=/usr/sbin:/opt/VRTS/bin:/opt/VRTSvcs/bin:$PATH #use ksh print ECHO="print" #ECHO="/usr/bin/echo" elif [[ $OSTYPE = Linux ]] then PATH=.:/sbin:/usr/sbin:/usr/bin:/bin:/opt/VRTS/bin:/opt/VRTSvcs/bin:$PATH ECHO="/bin/echo" elif [[ -n $(echo $OSTYPE | grep ^CYGWIN) ]] then PATH=.:/sbin:/usr/sbin:/usr/bin:/bin:$PATH ECHO="/usr/bin/echo" fi export PATH # # make dir if not there # if [[ ! -d $LOGDIR/$SRVNAME ]] then mkdir -p $LOGDIR else #find $LOGDIR -mtime +90 -exec rm -rf '{}' \;& : fi if [[ $OSTYPE = SunOS ]] then PATH=/usr/sbin:/opt/VRTS/bin:/opt/VRTSvcs/bin:$PATH NSLOOKUP=nslookup MYIP="$($NSLOOKUP $HOSTNAME 2> /dev/null | grep -iw Address | sed -n 2p \ | awk -F: '{print $2}')" if [[ -z $MYIP ]] then MYIP=$(grep -v ^# /etc/hosts | grep -w $HOSTNAME | sed -n 1p | awk '{print $1}') if [[ -z $MYIP ]] then MYIP=$(ifconfig -a | grep -v ether \ | awk '$0 ~ /:/ {printf "%s ",$1} \ $0 ~ /inet/ {printf "%s \n",$2}' \ | grep -vw 127.0.0.1 \ | awk '{print $2}' \ | sed -n 1p) fi fi INFC_FILE="/etc/hostname." FSTAB=/etc/vfstab DOMAIN=$(domainname) elif [[ $OSTYPE = AIX ]] then PATH=/usr/sbin:/opt/VRTS/bin:/opt/VRTSvcs/bin:$PATH NSLOOKUP=nslookup MYIP="$($NSLOOKUP $HOSTNAME 2> /dev/null | grep -iw Address | sed -n 2p \ | awk -F: '{print $2}')" if [[ -z $MYIP ]] then MYIP=$(grep -v ^# /etc/hosts | grep -w $HOSTNAME | sed -n 1p | awk '{print $1}') fi INFC_FILE="na" FSTAB=/etc/filesystems DOMAIN=$(domainname) elif [[ $OSTYPE = HP-UX ]] then PATH=/usr/sbin:/opt/VRTS/bin:/opt/VRTSvcs/bin:$PATH NSLOOKUP=nslookup MYIP="$($NSLOOKUP $HOSTNAME 2> /dev/null | grep -iw Address | sed -n 2p \ | awk -F: '{print $2}')" if [[ -z $MYIP ]] then MYIP=$(grep -v ^# /etc/hosts | grep -w $HOSTNAME | sed -n 1p | awk '{print $1}') if [[ -z $MYIP ]] then NICS=$(lanscan -i | awk '{print $1}') NET=$(for NIC in $NICS do ifconfig $NIC | grep inet | grep -v 127.0.0.1 \ | grep -v inet6 | awk '{print $2}' | sort -n \ | tr "\n" "," | awk '{print substr($0,1,length($0)-1)}' done 2> /dev/null) # # !!!** ASSUME **!!! first IP is my IP # MYIP=$($ECHO $NET | tr ' ' '\012' | sed -n 1p) fi fi INFC_FILE="na" FSTAB=/etc/fstab DOMAIN=$(domainname) elif [[ $OSTYPE = Linux ]] then PATH=/sbin:/usr/sbin:/usr/bin:/bin:/opt/VRTS/bin:/opt/VRTSvcs/bin:$PATH NSLOOKUP="nslookup -sil" MYIP="$($NSLOOKUP $HOSTNAME 2> /dev/null | grep -iw Address | sed -n 2p \ | awk -F: '{print $2}')" if [[ -z $MYIP ]] then MYIP=$(grep -v ^# /etc/hosts | grep -w $HOSTNAME | sed -n 1p | awk '{print $1}') if [[ -z $MYIP ]] then MYIP=$(ifconfig -a | grep -v ether \ | awk '$0 ~ /:/ {printf "%s ",$1} \ $0 ~ /inet/ {printf "%s \n",$2}' \ | grep -vw 127.0.0.1 \ | awk '{print $2}' \ | sed -n 1p) fi fi INFC_FILE="/etc/sysconfig/network-scripts/ifcfg-" FSTAB=/etc/fstab DOMAIN=$(domainname) else $ECHO "ERROR:1: $OSTYPE is not a supported OS" \ | tee -a $LOGFILE exit 1 fi ########### # PARSING: read in options & arguments ########### while (( $# )) do case $1 in -a) ADD=1 NOOPTIONS=0 shift if (( $# )) then SRVNAME=$1 shift else $ECHO "ERROR:1: add (-a) needs an argument" \ | tee -a $LOGFILE exit 1 fi ;; -A) ALL=1 NOOPTIONS=0 shift ;; -C) VCS=1 NOOPTIONS=0 shift ;; -d) DELETE=1 NOOPTIONS=0 shift if (( $# )) then SRVNAME=$1 shift else $ECHO "ERROR:1: delete (-d) needs an argument" \ | tee -a $LOGFILE exit 1 fi ;; -D) VXDG=1 NOOPTIONS=0 shift ;; -debug) DEBUG=1 shift ;; -disk) DISK=1 NOOPTIONS=0 shift if [[ $OSTYPE != SunOS ]] then $ECHO "ERROR:1: -disk only available on SunOS/Solaris" \ | tee -a $LOGFILE exit 1 fi ;; -F) FORCE=1 shift ;; -l|-v) LIST=1 NOOPTIONS=0 shift if (( $# )) then SRVNAME=$1 shift fi ;; -i) shift NOOPTIONS=0 if (( $# )) then INFC=$1 shift else $ECHO "ERROR:1: interface (-i) needs an argument" \ | tee -a $LOGFILE exit 1 fi ;; -o) ORACLE=1 NOOPTIONS=0 shift ;; -Z) ZFS=1 NOOPTIONS=0 shift ;; -z) ZONE=1 NOOPTIONS=0 shift ;; -V) VERBOSE=1 shift ;; -version) print "$0 is at version $(grep "^#.*Revision" $0 | sed -n 1p \ | awk '{print $3 }' )" exit 0 ;; -info | -doc) awk '/DOCBEGIN/, /DOCEND/' $0 \ | sed -e 's/^#//' \ | sed -e '/DOCBEGIN/d' \ | sed -e '/DOCEND/d' \ | more exit 0 ;; -h|*) if [[ $1 != -h ]] then $ECHO "\n OPTION: $1 is invalid.\n" else $ECHO "" fi #======================================================================= cat << EOF Usage: $0: <> Usage: $0: [-debug] [-V] -l|-v [service_name (VIP) | pattern] Usage: $0: [-debug] [-v] -[o | z | A | C | D | Z] Usage: $0: [-debug] [-v] [-F] -[a|d] service_name -disk -i interface Usage: $0: -info | -doc Usage: $0: -version Usage: $0: -h no args: defaults to a listing of all service names (-v|-l) -debug: debug mode, does a 'set -x' -disk: there is a disk mount/umount to do (only on Solaris) -A: list VIPs, Oracle, and any zones in this global zone Mountpath for Oracle is: /vendor/oracle/VIP -a: add service name -c: lists VCS Cluster name and host systems -d: delete service name -D: lists VxVm diskgroups -F: a: Add - will force an IP to be configure that is not part of your default subnet. You need a static route for this to work, otherwise you will have routing problems. This script does not check to see if the route needed exists. d: Delete - will do a 'fuser -kcu' on the mountpoint. -i: interface: give a single: le#, qe#, hme# ,ge#, ce#, ... i.e. ce0 use type and instance, as in hme0, hme1, ge2, ... -l|-v: DEFAULT option. This option defaults to list all service names (VIP) on server; otherwise list a specific service name, or it will search for a text pattern that is given, or it will search for an IP address that is given. -o: lists running oracle instances/SIDs (based upon a unique standard) -V: verbose mode -Z: lists ZFS components -z: lists all local/non-global zones running in this global zone -info|doc: print out header of program (document) -h: help - command synopsis (this listing) EOF #======================================================================= exit 1 ;; esac done if (( DEBUG )) then ($ECHO "Command line option settings" $ECHO "...ADD: $ADD" $ECHO "...ALL: $ALL" $ECHO "...APPDIR: $APPDIR" # $ECHO "...BINDIR: $BINDIR" $ECHO "...DATE: $DATE" $ECHO "...DELETE: $DELETE" $ECHO "...DISK: $DISK" $ECHO "...FORCE: $FORCE" $ECHO "...HOSTNAME: $HOSTNAME" $ECHO "...INFC: $INFC" $ECHO "...IPMP: $IPMP" $ECHO "...IPMP_PATTERN: $IPMP_PATTERN" $ECHO "...BACKUP_PATTERN: $BACKUP_PATTERN" $ECHO "...LIST: $LIST" $ECHO "...LOGDIR: $LOGDIR" $ECHO "...LOGFILE: $LOGFILE" $ECHO "...NOOPTIONS: $NOOPTIONS" $ECHO "...ORACLE: $ORACLE" $ECHO "...OSTYPE: $OSTYPE" $ECHO "...SRVNAME: $SRVNAME" $ECHO "...VERBOSE: $VERBOSE" $ECHO "...VCS: $VCS" $ECHO "...VXDG: $VXDG" $ECHO "...ZFS: $ZFS" $ECHO "...ZONE: $ZONE" $ECHO "...ZONEGLOBAL: $ZONEGLOBAL") set -x fi checkIfRoot (){ if (( DEBUG )) then set -x fi if (( $(id | awk '{print $1}' | sed -e 's/(.*)//' | awk -F= '{print $2}') != 0 )) then $ECHO "${DATE}:${HOSTNAME}:ERROR:7: you must be root (UID of 0) to run this command option" \ | tee -a $LOGFILE exit 7 fi } checkIfVCS (){ if (( DEBUG )) then set -x fi if [[ -n $(ps -ef | grep had | grep VRTS) ]] then $ECHO "${DATE}:${HOSTNAME}:ERROR:9: VCS is running on node - cannot add or delete service names with this script - use VCS." \ | tee -a $LOGFILE exit 9 fi } checkIfIPMP (){ if (( DEBUG )) then set -x fi if [[ -n $(ifconfig -a | grep DEPRECATED) ]] then IPMP=1 else IPMP=0 fi } checkIfGlobalZone (){ if (( DEBUG )) then set -x fi if [[ $OSTYPE = SunOS ]] then if (( $(uname -r | awk -F. '{print $2}') >= 10 && $(uname -r | awk -F. '{print $1}') == 5 )) then if [[ $(zonename) = global ]] then ZONEGLOBAL=1 else ZONEGLOBAL=0 fi else ZONEGLOBAL=0 fi fi } inDNS () { NAME=$1 if (( DEBUG )) then set -x fi if [[ -z $($NSLOOKUP $NAME 2> /dev/null | grep -iw Name | grep $NAME) ]] then $ECHO "${DATE}:${HOSTNAME}:ERROR:2: cannot find $NAME in DNS" \ | tee -a $LOGFILE exit 2 fi } namePingable () { NAME=$1 if (( DEBUG )) then set -x fi ping -c 1 $NAME > /dev/null 2>&1 if (( $? )) then $ECHO "${DATE}:${HOSTNAME}:ERROR:3: cannot ping $NAME" \ | tee -a $LOGFILE exit 3 fi } findName () { if (( DEBUG )) then set -x fi # # look for text pattern first, else look for IP address # LIST="" # if only non-dotted address if [[ -n "$($ECHO $SRVNAME | grep -v \\.)" ]] then if [[ $OSTYPE = SunOS ]] then VIRTUALS=$(ifconfig -a \ | grep inet \ | awk '{print $2}' \ | grep -vw 127.0.0.1 \ | grep -vw $MYIP) elif [[ $OSTYPE = Linux ]] then VIRTUALS=$(ifconfig -a \ | grep inet \ | awk '{print $2}' \ | grep -vw 127.0.0.1 \ | grep -vw $MYIP \ | awk -F: '{print $2}') fi for VIRT in $VIRTUALS do if [[ $OSTYPE = SunOS ]] then TEMP=$($NSLOOKUP $VIRT 2> /dev/null \ | grep -iw Address \ | sed -n 2p \ | grep $SRVNAME \ | awk '{print $NF}' \ | awk -F. '{print $1}') if [[ -z $TEMP ]] then TEMP=$(grep -v ^# /etc/hosts \ | grep -w $VIRT | sed -n 1p | awk '{print $1}') fi elif [[ $OSTYPE = Linux ]] then TEMP=$($NSLOOKUP $VIRT 2> /dev/null \ | grep -iw Address \ | sed -n 2p \ | grep $SRVNAME \ | awk -F= '{print $NF}' \ | awk -F. '{print $1}') if [[ -z $TEMP ]] then TEMP=$(grep -v ^# /etc/hosts \ | grep -w $VIRT | sed -n 1p | awk '{print $1}') fi fi if [[ -n $TEMP ]] then LIST="$LIST $TEMP" fi done if [[ -z $LIST ]] then $ECHO "${DATE}:${HOSTNAME}:ERROR:6: $SRVNAME does not match any names on server" \ | tee -a $LOGFILE exit 6 else $ECHO "$LIST" \ | cut -c2- \ | tr ' ' '\012' \ | sort \ | sed -e /^$/d \ | tee -a $LOGFILE fi else THISIP=$($NSLOOKUP $SRVNAME 2> /dev/null \ | grep ^Address | sed -n 2p | awk '{print $2}') if [[ -z $THISIP ]] then THISIP=$(grep -v ^# /etc/hosts \ | grep -w $VIRT | sed -n 1p | awk '{print $1}') fi if [[ -n $(ifconfig -a | grep $THISIP) ]] then $ECHO "${DATE}:${HOSTNAME}:INFO $SRVNAME is here. IP is $THISIP" \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:ERROR:4: $SRVNAME is ** NOT ** here. IP is $THISIP" \ | tee -a $LOGFILE exit 4 fi fi } listAllNamesZone () { if (( DEBUG )) then set -x fi if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:INFO: list all local (non-global) zone names..." \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:INFO: list all local (non-global) zone names..." \ >> $LOGFILE fi if [[ $OSTYPE = SunOS ]] then # # only run from a global zone, only place it works # if (( ZONEGLOBAL )) then ZONES=$(zoneadm list -civ \ | grep -w running \ | grep -vw global \ | awk '{print $2}') if [[ -n $ZONES ]] then $ECHO -n "${HOSTNAME}:" $ECHO "$ZONES" \ | sed -e '/^$/d' \ | sort \ | tr '\012' ' ' \ | tee -a $LOGFILE $ECHO "" else $ECHO "none" if (( VERBOSE )) then $ECHO "${HOSTNAME}:INFO: No Zones found..." \ | tee -a $LOGFILE else $ECHO "${HOSTNAME}:INFO: No Zones found..." \ >> $LOGFILE fi fi else $ECHO "" fi else if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:ERROR:21: only handle zones in Solaris" \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:ERROR:21: only handle zones in Solaris" \ >> $LOGFILE fi exit 21 fi } listAllNamesMetaset () { if (( DEBUG )) then set -x fi if [[ -n $(svcs meta | grep meta | grep online) ]] then if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:INFO: list all metaset names..." \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:INFO: list all metaset names..." \ >> $LOGFILE fi METASETS=$(/usr/sbin/metaset 2> /dev/null \ | awk '/^Set name =/ {print $4" "$8}' \ | sed -e 's/ /_/g' \ | sed -e 's/,//g') if [[ -n $METASETS ]] then $ECHO -n "METASETs:" $ECHO -n "${HOSTNAME}:" $ECHO "$METASETS" \ | sort \ | sed -e /^$/d \ | tr '\012' ' ' \ | tee -a $LOGFILE $ECHO "" else if (( VERBOSE )) then $ECHO "${HOSTNAME}:INFO: No metasets found... " \ | tee -a $LOGFILE else $ECHO "${HOSTNAME}:INFO: No metasets found... " \ >> $LOGFILE fi fi else if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:INFO: metaset SMF disabled..." \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:INFO: metaset SMF disabled..." \ >> $LOGFILE fi fi } listAllNamesMetastat () { if (( DEBUG )) then set -x fi if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:INFO: list all metaset names..." \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:INFO: list all metaset names..." \ >> $LOGFILE fi METASTATS=$(/usr/sbin/metastat 2> /dev/null \ | awk -F: '/Concat\/Stripe/ {print $1}') if [[ -n $METASTATS ]] then $ECHO -n "Metadevice stripes:" $ECHO -n "${HOSTNAME}:" $ECHO "$METASTATS" \ | sort \ | sed -e /^$/d \ | tr '\012' ' ' \ | tee -a $LOGFILE $ECHO "" else if (( VERBOSE )) then $ECHO "${HOSTNAME}:INFO: No metstat stripes found... " \ | tee -a $LOGFILE else $ECHO "${HOSTNAME}:INFO: No metstat stripes found... " \ >> $LOGFILE fi fi } listAllNamesZFS () { if (( DEBUG )) then set -x fi zpool list > /dev/null 2>&1 STATUS=$? if (( ! $STATUS )) then ZPOOLS="$(zpool list | grep -v SIZE | awk '{print $1}')" if [[ -n $ZPOOLS ]] then $ECHO -n "ZPools:" | tee -a $LOGFILE $ECHO -n "${HOSTNAME}:" | tee -a $LOGFILE $ECHO "$ZPOOLS" \ | sort \ | sed -e /^$/d \ | tr '\012' ' ' \ | tee -a $LOGFILE $ECHO "" else if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:INFO: No Zpools found... " \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:INFO: No Zpools found... " \ >> $LOGFILE fi fi else if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:INFO: ZFS not on system." \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:INFO: ZFS not on system." \ >> $LOGFILE fi fi } listAllNamesVCS () { if (( DEBUG )) then set -x fi if [[ -f /opt/VRTSvcs/bin/haclus ]] then VCSCMD=/opt/VRTSvcs/bin/haclus elif [[ -f /opt/VRTS/bin/haclus ]] then VCSCMD=/opt/VRTS/bin/haclus else VCSCMD="" fi if [[ -n $VCSCMD ]] then VCSCLS="$(haclus -list | sed -n 1p)" # # Get the IP of the ClusterService and nslookup on it # VCSIP=$(hares -display \ $(hagrp -resources ClusterService | grep -i IP) \ | awk '$2 ~ "Address" {print $4}') if [[ $OSTYPE = HP-UX ]] then VCSNAME="$($NSLOOKUP $VCSIP 2> /dev/null \ | grep -iw Name \ | sed -n 2p \ | awk -F: '{print $2}' \ | sed -e 's/ //g')" else VCSNAME="$($NSLOOKUP $VCSIP 2> /dev/null \ | grep -iw Name \ | awk -F: '{print $2}'\ | sed -e 's/ //g')" fi if [[ -z $VCSNAME ]] then VCSNAME=$(grep -v ^# /etc/hosts \ | grep -w $VCSIP | sed -n 1p | awk '{print $1}') fi if [[ -n $VCSCLS ]] then $ECHO "VCS Clustername:${HOSTNAME}:$VCSCLS $VCSNAME" \ | tee -a $LOGFILE else if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:INFO: No VCS ClusterService group found... " \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:INFO: No VCS ClusterService group found... " \ >> $LOGFILE fi fi else if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:INFO: VCS not on system." \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:INFO: VCS not on system." \ >> $LOGFILE fi fi } listAllNamesVXDG () { if (( DEBUG )) then set -x fi if [[ -f /opt/VRTS/bin/vxdg ]] then VXDGCMD=/opt/VRTS/bin/vxdg elif [[ -f /usr/sbin/vxdg ]] then VXDGCMD=/usr/sbin/vxdg else VXDGCMD="" fi if [[ -n $VXDGCMD ]] then # #list diskgroups without header # VXDGS="$($VXDGCMD -q list 2> /dev/null \ | awk '{print $1}')" if [[ -n $VXDGS ]] then $ECHO -n "VxDGs:" | tee -a $LOGFILE $ECHO -n "${HOSTNAME}:" | tee -a $LOGFILE $ECHO "$VXDGS" \ | sort \ | sed -e /^$/d \ | tr '\012' ' ' \ | tee -a $LOGFILE $ECHO "" else if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:INFO: No VxDGs found... " \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:INFO: No VxDGs found... " \ >> $LOGFILE fi fi else if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:INFO: VxDG not on system." \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:INFO: VxDG not on system." \ >> $LOGFILE fi fi } listAllNamesOracle () { if (( DEBUG )) then set -x fi if [[ $OSTYPE = SunOS ]] then checkIfGlobalZone ##################### # GLOBAL ZONE ##################### if (( ZONEGLOBAL )) then for ZONE in $(listAllNamesZone | awk -F: '{print $2}' | sed -e 's/none//') do # # get zoneroot from /etc/zones/index as the zonename and the zonemount # do NOT have to be the same name/pattern # ZONEROOT="$(grep -w $ZONE /etc/zones/index | awk -F: '{print $3}')/root" # # if you don't use the oratab, but have a different technique, i.e. # unique mountpoint # TEMPOUT=$(df -kZ 2> /dev/null \ | grep -w $ZONE \ | grep -w vendor/oracle \ | grep oradata \ | grep -vw home \ | awk '{print $6}' \ | awk -F/ '{print $8}' \ | sort -u) if [[ -n $TEMPOUT ]] then ORACLE_INST=$($ECHO "$TEMPOUT" | tr '\012' ' ') $ECHO "SIDs per zone:$HOSTNAME:$ZONE:$ORACLE_INST" \ | tee -a $LOGFILE elif [[ -f $ZONEROOT/var/opt/oracle/oratab || -f $ZONEROOT/etc/oratab ]] then # # sample line: # SID: DIR: AUTO # myinstance:/u01/app/oracle/product/7.3.4:Y # # get oratab without blank lines and commented lines if [[ -f $ZONEROOT/var/opt/oracle/oratab ]] then ORATAB=$ZONEROOT/var/opt/oracle/oratab else ORATAB=$ZONEROOT/etc/oratab fi TEMPOUT="$(cat $ORATAB \ | grep -v ^# \ | grep -v ^* \ | grep -v ^$ \ | awk -F: '{print $1}')" ORACLE_INST=$($ECHO "$TEMPOUT" | tr '\012' ' ') $ECHO "SIDs per zone:$HOSTNAME:$ZONE:$ORACLE_INST" \ | tee -a $LOGFILE else if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:INFO: For zone ${ZONE}: No Oracle instances found... " \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:INFO: For zone ${ZONE}: No Oracle instances found... " \ >> $LOGFILE fi fi done fi ##################### # LOCAL (non-global) ZONE # you are running this within a zone ##################### TEMPOUT=$(df -k \ | grep "^/vendor/oracle" \ | grep oradata \ | awk -F/ '{print $4}' \ | grep -v home$ \ | sort -u) if [[ -n $TEMPOUT ]] then ORACLE_INST=$($ECHO "$TEMPOUT" | tr '\012' ' ') $ECHO -n "SIDs:" | tee -a $LOGFILE $ECHO -n "${HOSTNAME}:" | tee -a $LOGFILE $ECHO "$ORACLE_INST" \ | sort \ | sed -e /^$/d \ | tr '\012' ' ' \ | tee -a $LOGFILE $ECHO "" elif [[ -f /var/opt/oracle/oratab || -f /etc/oratab ]] then # # sample line: # SID: DIR: AUTO # myinstance:/u01/app/oracle/product/7.3.4:Y # # get oratab without blank lines and commented lines if [[ -f /var/opt/oracle/oratab ]] then ORATAB=/var/opt/oracle/oratab else ORATAB=/etc/oratab fi TEMPOUT="$(cat $ORATAB \ | grep -v ^# \ | grep -v ^* \ | grep -v ^$ \ | awk -F: '{print $1}')" ORACLE_INST=$($ECHO "$TEMPOUT" | tr '\012' ' ') $ECHO "SIDs:$HOSTNAME:$ORACLE_INST" \ | tee -a $LOGFILE else if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:INFO: No Oracle instances found... " \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:INFO: No Oracle instances found... " \ >> $LOGFILE fi fi #All other OS types (no zones) else if [[ -f /var/opt/oracle/oratab || -f /etc/oratab ]] then # # sample line: # SID: DIR: AUTO # myinstance:/u01/app/oracle/product/7.3.4:Y # # get oratab without blank lines and commented lines if [[ -f /var/opt/oracle/oratab ]] then ORATAB=/var/opt/oracle/oratab else ORATAB=/etc/oratab fi TEMPOUT="$(cat $ORATAB \ | grep -v ^# \ | grep -v ^* \ | grep -v ^$ \ | awk -F: '{print $1}')" ORACLE_INST=$($ECHO "$TEMPOUT" | tr '\012' ' ') $ECHO "SIDs:$HOSTNAME:$ORACLE_INST" \ | tee -a $LOGFILE else if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:INFO: No Oracle instances found... " \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:INFO: No Oracle instances found... " \ >> $LOGFILE fi fi fi } listAllNamesVIP () { if (( DEBUG )) then set -x fi if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:INFO: list all service names..." \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:INFO: list all service names..." \ >> $LOGFILE fi if [[ $OSTYPE = SunOS ]] then VIRTUALS=$(ifconfig -a \ | grep inet \ | awk '{print $2}' \ | grep -vw 127.0.0.1 \ | grep -vw $MYIP) elif [[ $OSTYPE = AIX ]] then VIRTUALS=$(ifconfig -a \ | grep inet \ | grep -v :: \ | awk '{print $2}' \ | grep -vw 127.0.0.1 \ | grep -vw $MYIP) elif [[ $OSTYPE = HP-UX ]] then netstat -w > /dev/null 2>&1 if (( ! $? )) then VIRTNICS=$(netstat -win \ | awk '/:/ {print $1}' \ | sed -e 's/*//') for VIRTNIC in $VIRTNICS do MYVIRTUAL=$(ifconfig $VIRTNIC \ | grep inet \ | awk '{print $2}') if [[ $MYVIRTUAL != 0.0.0.0 ]] then VIRTUALS="$VIRTUALS $MYVIRTUAL" fi done else VIRTUALS="unknown" fi elif [[ $OSTYPE = Linux ]] then VIRTUALS=$(ifconfig -a \ | grep inet \ | awk '{print $2}' \ | grep -vw 127.0.0.1 \ | grep -vw $MYIP \ | awk -F: '{print $2}') else if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:ERROR:23: Incorrect OS type for ifconfig" \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:ERROR:23: Incorrect OS type for ifconfig" \ >> $LOGFILE fi exit 23 fi for VIRT in $VIRTUALS do if [[ $OSTYPE = SunOS ]] then checkIfIPMP if (( IPMP )) then # # simple IPMP test (not real portable) # our virtuals are all $HOSTNAME-fo-[1,2] # TEMPNAME=$($NSLOOKUP $VIRT 2> /dev/null \ | grep -iw name \ | sed -n 2p \ | awk -F='{print $NF}' \ | awk -F. '{print $1}' \ | grep -v $BACKUP_PATTERN \ | grep -v $IPMP_PATTERN) if [[ -z $TEMPNAME ]] then TEMPNAME=$(grep -v ^# /etc/hosts \ | grep -w $VIRT \ | sed -n 1p \ | awk '{print $2}'\ | awk -F. '{print $1}') fi else TEMPNAME=$($NSLOOKUP $VIRT 2> /dev/null \ | grep -iw name \ | sed -n 2p \ | awk -F= '{print $NF}' \ | awk -F. '{print $1}'\ | grep -v $BACKUP_PATTERN) if [[ -z $TEMPNAME ]] then TEMPNAME=$(grep -v ^# /etc/hosts \ | grep -w $VIRT \ | sed -n 1p \ | awk '{print $2}'\ | awk -F. '{print $1}') fi fi elif [[ $OSTYPE = AIX ]] then TEMPNAME=$($NSLOOKUP $VIRT 2> /dev/null \ | grep -iw name \ | awk '{print $NF}' \ | awk -F. '{print $1}'\ | sed 's/ //') if [[ -z $TEMPNAME ]] then TEMPNAME=$(grep -v ^# /etc/hosts \ | grep -w $VIRT \ | sed -n 1p \ | awk '{print $2}'\ | awk -F. '{print $1}') fi elif [[ $OSTYPE = HP-UX ]] then if [[ $VIRT != "unknown" ]] then TEMPNAME=$($NSLOOKUP $VIRT 2> /dev/null \ | grep -iw name \ | sed -n 2p \ | awk '{print $NF}' \ | awk -F. '{print $1}'\ | sed 's/ //') if [[ -z $TEMPNAME ]] then TEMPNAME=$(grep -v ^# /etc/hosts \ | grep -w $VIRT \ | sed -n 1p \ | awk '{print $2}'\ | awk -F. '{print $1}') fi fi elif [[ $OSTYPE = Linux ]] then TEMPNAME=$($NSLOOKUP $VIRT 2> /dev/null \ | grep -iw name \ | sed -n 2p \ | awk -F= '{print $NF}' \ | awk -F. '{print $1}'\ | sed 's/ //') if [[ -z $TEMPNAME ]] then TEMPNAME=$(grep -v ^# /etc/hosts \ | grep -w $VIRT \ | sed -n 1p \ | awk '{print $2}'\ | awk -F. '{print $1}') fi fi if [[ -n $TEMPNAME ]] then if [[ -n $VIRTLIST ]] then VIRTLIST="$VIRTLIST $TEMPNAME" else VIRTLIST="$TEMPNAME" fi fi done $ECHO -n "${HOSTNAME}:" if [[ -n $VIRTLIST ]] then $ECHO "$VIRTLIST" \ | tr ' ' '\012' \ | sort \ | sed -e '/^$/d' \ | tr '\012' ' ' $ECHO "" else $ECHO "" if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:INFO: No VIPs found... " \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:INFO: No VIPS found... " \ >> $LOGFILE fi fi if [[ $OSTYPE = SunOS ]] then checkIfGlobalZone if (( ZONEGLOBAL )) then listAllNamesVIPzone fi fi } listAllNamesVIPzone () { if (( DEBUG )) then set -x fi ##################### # GLOBAL ZONE # get VIPs per non-global zones # we don't worry about IPMP at the non-globals - it # doesn't show up there ##################### #need to be root to do a zlogin checkIfRoot # # keep VERBOSE messages from messing up the zone loop from # listAllNamesZone (verbose statements from that function) # VERBOSESTATE=$VERBOSE VERBOSE=0 for ZONE in $(listAllNamesZone | awk -F: '{print $2}' | sed -e 's/none//') do VERBOSE=$VERBOSESTATE MYIP="$($NSLOOKUP $ZONE 2> /dev/null | grep -iw Address | sed -n 2p \ | awk -F: '{print $2}')" if [[ -z $MYIP ]] then MYIP="$(grep -v ^# /etc/hosts \ | grep -w $ZONE | sed -n 1p | awk '{print $1}')" if [[ -z $MYIP ]] then MYIP="$(ifconfig -a | grep -v ether \ | awk '$0 ~ /:/ {printf "%s ",$1} \ $0 ~ /inet/ {printf "%s \n",$2}' \ | grep -vw 127.0.0.1 \ | awk '{print $2}' \ | sed -n 1p)" fi fi TEMPOUT=$(zlogin $ZONE ifconfig -a \ | grep inet \ | awk '{print $2}' \ | grep -vw 127.0.0.1 \ | grep -vw $MYIP ) if [[ -n $TEMPOUT ]] then ZONE_VIPS="" for VIRT in $TEMPOUT do TEMPNAME=$($NSLOOKUP $VIRT 2> /dev/null \ | grep -iw name \ | awk '{print $NF}' \ | awk -F. '{print $1}') if [[ -z $TEMPNAME ]] then TEMPNAME=$(grep -v ^# /etc/hosts \ | grep -w $VIRT \ | sed -n 1p \ | awk '{print $2}'\ | awk -F. '{print $1}') fi if [[ -z $ZONE_VIPS ]] then ZONE_VIPS="$TEMPNAME" else ZONE_VIPS="$ZONE_VIPS $TEMPNAME" fi done ZONE_VIPS=$($ECHO "$ZONE_VIPS" | tr '\012' ' ') $ECHO "VIPs per zone:$HOSTNAME:$ZONE:$ZONE_VIPS" \ | tee -a $LOGFILE else if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:INFO: For zone ${ZONE}: No VIPs found... " \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:INFO: For zone ${ZONE}: No VIPS found... " \ >> $LOGFILE fi fi done } areVirtuals () { if (( DEBUG )) then set -x fi if [[ $OSTYPE = SunOS ]] then if [[ -z $(ifconfig -a | grep :[0-9]*: | awk '{print $1}' \ | grep -vw ether ) ]] then if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:ERROR:5: No Virtual names on server" \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:ERROR:5: No Virtual names on server" \ >> $LOGFILE fi exit 5 fi elif [[ $OSTYPE = Linux ]] then if [[ -z $(ifconfig -a | grep :[0-9]*: | awk '{print $1}' \ | grep -vw "^eth0$") ]] then if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:ERROR:5: No Virtual names on server" \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:ERROR:5: No Virtual names on server" \ >> $LOGFILE fi exit 5 fi elif [[ $OSTYPE = AIX ]] then # # if numbe of interfaces is greater or equal to number of plumbed IPs # if (( $(ifconfig -a | grep -c en.:) >= \ $(ifconfig -a | grep -v 127.0.0.1 | grep -c netmask) )) then if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:ERROR:5: No Virtual names on server" \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:ERROR:5: No Virtual names on server" \ >> $LOGFILE fi exit 5 fi elif [[ $OSTYPE = HP-UX ]] then if [[ -z $(netstat -win | awk '/:/ {print $1}' | sed -e 's/*//') ]] then if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:ERROR:5: No Virtual names on server" \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:ERROR:5: No Virtual names on server" \ >> $LOGFILE fi exit 5 fi fi } addServiceName () { NAME=$1 if (( DEBUG )) then set -x fi if [[ $OSTYPE != SunOS && $OSTYPE = Linux ]] then $ECHO "ERROR:1: $OSTYPE is not a supported OS for this action" \ | tee -a $LOGFILE fi # # if no INFC given, take default (assume first interface listed) # if [[ -z $INFC ]] then if [[ $OSTYPE = SunOS ]] then INFC=$(ifconfig -a | sed -n 3p | awk -F: '{print $1}') elif [[ $OSTYPE = Linux ]] then INFC=$(ifconfig -a | sed -n 1p | awk '{print $1}') fi fi # # see if infc exists # if [[ -z $(ls ${INFC_FILE}${INFC}) ]] then $ECHO "${DATE}:${HOSTNAME}:ERROR:6: $INFC does not exist - please choose another" \ | tee -a $LOGFILE exit 6 else if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:INFO: $INFC exists - continuing..." \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:INFO: $INFC exists - continuing..." \ >> $LOGFILE fi fi # # make sure it is not already a configured virtual interface # FOUND=$(ifconfig -a | grep $($NSLOOKUP $SRVNAME 2> /dev/null \ | grep Address \ | sed -n 2p \ | awk '{print $2}') ) if [[ -z $FOUND ]] then FOUND=$(grep -v ^# /etc/hosts \ | grep -w $SRVNAME \ | sed -n 1p \ | awk '{print $2}'\ | awk -F. '{print $1}') fi if [[ -z $FOUND ]] then $ECHO "${DATE}:${HOSTNAME}:ERROR: $SRVNAME NOT added - exists already" \ | tee -a $LOGFILE else # # make sure host is on same subnet, unless force is issued # HOSTNET=$($NSLOOKUP $HOSTNAME 2> /dev/null \ | grep ^Address \ | sed -n 2p \ | awk '{print $2}' \ | awk -F. '{print $1":"$2":"$3}') if [[ -z $HOSTNET ]] then HOSTNET=$(grep -v ^# /etc/hosts \ | grep -w $HOSTNAME \ | sed -n 1p \ | awk '{print $1}'\ | awk -F. '{print $1":"$2":"$3}') fi SRVNET=$($NSLOOKUP $SRVNAME 2> /dev/null \ | grep ^Address \ | sed -n 2p \ | awk '{print $2}' \ | awk -F. '{print $1":"$2":"$3}') if [[ -z $SRVNET ]] then SRVNET=$(grep -v ^# /etc/hosts \ | grep -w $SRVNAME \ | sed -n 1p \ | awk '{print $1}'\ | awk -F. '{print $1":"$2":"$3}') fi # do a string compare because of octets - not true numeric if [[ $HOSTNET != $SRVNET ]] then if (( FORCE )) then $ECHO "${DATE}:${HOSTNAME}:INFO: $SRVNET is not on default network" \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:ERROR:8: $SRVNET is not on default network" \ | tee -a $LOGFILE exit 8 fi fi # not in /etc/hosts - add if [[ -z $(grep -v ^# /etc/hosts | grep $SRVNAME) ]] then IP=$($NSLOOKUP $SRVNAME 2> /dev/null \ | grep ^Address \ | sed -n 2p \ | awk '{print $2}') if [[ -n $IP ]] then $ECHO "${DATE}:${HOSTNAME}:ADDING: $SRVNAME to /etc/hosts" \ | tee -a $LOGFILE $ECHO "$IP\t$SRVNAME.$DOMAIN $SRVNAME" >> /etc/hosts else $ECHO "${DATE}:${HOSTNAME}:ERROR: $SRVNAME MISSING in /etc/hosts - you need to add this manually" \ | tee -a $LOGFILE fi # in /etc/hosts - see if IP is correct else THISIP=$($NSLOOKUP $SRVNAME 2> /dev/null \ | grep ^Address \ | sed -n 2p \ | awk '{print $2}') if [[ -n $THISIP ]] then if [[ -n $(grep -v ^# /etc/hosts | grep $SRVNAME | grep $THISIP) ]] then $ECHO "${DATE}:${HOSTNAME}:INFO: $SRVNAME already in /etc/hosts" \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:ERROR: $SRVNAME has wrong IP in /etc/hosts -- FIXING" \ | tee -a $LOGFILE IP=$(grep -v ^# /etc/hosts \ | grep $SRVNAME | sed -n 1p | awk '{print $1}') sed /$IP/d /etc/hosts > /tmp/host.$$ cp /tmp/host.$$ /etc/hosts rm /tmp/host.$$ $ECHO "$THISIP\t$SRVNAME.$DOMAIN $SRVNAME" >> /etc/hosts fi else $ECHO "${DATE}:${HOSTNAME}:INFO: $SRVNAME already in /etc/hosts - assume correct, cannot verify accuracy via DNS" \ | tee -a $LOGFILE fi fi # # add startup config file # # get instance, increment, use new higher number if [[ -z $(grep $SRVNAME ${INFC_FILE}*) ]] then $ECHO "${DATE}:${HOSTNAME}:INFO: $INFC creating interface file and plumbing" \ | tee -a $LOGFILE ls ${INFC_FILE}* > /dev/null 2>&1 if (( $? )) then FILE_INSTANCE=1 else FILE_INSTANCE=$(ls ${INFC_FILE}* \ | awk -F: '/'$INFC'/ {print $2}' \ | sort -n \ | sed -n \$p) let FILE_INSTANCE=$FILE_INSTANCE+1 fi if [[ $OSTYPE = SunOS ]] then $ECHO "$SRVNAME" > ${INFC_FILE}${INFC}:${FILE_INSTANCE} elif [[ $OSTYPE = Linux ]] then BOOTPROTO=$(grep -v ^# ${INFC_FILE}${INFC} \ | awk -F= '/BOOTPROTO/ {print $2}') BROADCAST=$(grep -v ^# ${INFC_FILE}${INFC} \ | awk -F= '/BROADCAST/ {print $2}') NETMASK=$(grep -v ^# ${INFC_FILE}${INFC} \ | awk -F= '/NETMASK/ {print $2}') NETWORK=$(grep -v ^# ${INFC_FILE}${INFC} \ | awk -F= '/NETWORK/ {print $2}') ONBOOT=$(grep -v ^# ${INFC_FILE}${INFC} \ | awk -F= '/ONBOOT/ {print $2}') IP=$($NSLOOKUP $SRVNAME 2> /dev/null \ | grep ^Address \ | sed -n 2p \ | awk '{print $2}') if [[ -z $IP ]] then IP=$(grep -v ^# /etc/hosts \ | grep -w $SRVNAME \ | sed -n 1p \ | awk '{print $1}') fi cat <<- EOF > ${INFC_FILE}${INFC}:${FILE_INSTANCE} Device=${INFC}:${FILE_INSTANCE} BOOTPROTO=$BOOTPROTO BROADCAST=$BROADCAST IPADDR=$IP NETMASK=$NETMASK NETWORK=$NETWORK ONBOOT=$ONBOOT EOF fi else NUM_FILE=$(grep -l $SRVNAME ${INFC_FILE}*) $ECHO "${DATE}:${HOSTNAME}:INFO: $SRVNAME already in $NUM_FILE" \ | tee -a $LOGFILE fi # # get the correct configured interface # look to see if a virtual exists already # if (( $(ifconfig -a | grep $INFC | wc -l) = 1 )) then INFC_INSTANCE=1 else # join lines, look for IP, strip off last colon INFC_INSTANCE=$(ifconfig -a \ | grep $INFC \ | awk -F: '{print $2}' \ | sort -n \ | sed -n \$p) let INFC_INSTANCE=$INFC_INSTANCE+1 fi # # plumb hostname.SRVNAME:# # if [[ $OSTYPE = SunOS ]] then NETMASK=$(grep -v ^# /etc/netmasks | awk '{print $2}') ifconfig $INFC:$INFC_INSTANCE plumb up ifconfig $INFC:$INFC_INSTANCE $SRVNAME netmask $NETMASK # reset broadcast, easier than figuring out network class, # then getting invert of mask ifconfig $INFC:$INFC_INSTANCE broadcast + elif [[ $OSTYPE = Linux ]] then BROADCAST=$(grep -v ^# ${INFC_FILE}${INFC} \ | awk -F= '/BROADCAST/ {print $2}') NETMASK=$(grep -v ^# ${INFC_FILE}${INFC} \ | awk -F= '/NETMASK/ {print $2}') ifconfig $INFC:$INFC_INSTANCE $SRVNAME netmask $NETMASK \ broadcast $BROADCAST up fi if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:OK: $SRVNAME added to system " \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:OK: $SRVNAME added to system " \ >> $LOGFILE fi fi } delServiceName () { NAME=$1 if (( DEBUG )) then set -x fi if [[ $OSTYPE != SunOS && $OSTYPE = Linux ]] then $ECHO "ERROR:1: $OSTYPE is not a supported OS for this action" \ | tee -a $LOGFILE fi THISIP=$($NSLOOKUP $NAME 2> /dev/null | grep ^Address | sed -n 2p \ | awk '{print $2}') if [[ -z $THISIP ]] then THISIP=$(grep -v ^# /etc/hosts | grep -w $NAME | sed -n 1p | awk '{print $1}') fi # # make sure it is already a configured virtual interface # if [[ -z $(ifconfig -a | grep $THISIP) ]] then $ECHO "${DATE}:${HOSTNAME}:ERROR:11: $NAME is not on system - no need to delete." \ | tee -a $LOGFILE exit 11 else if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:INFO: $NAME exists - continuing delete..." \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:INFO: $NAME exists - continuing delete..." \ >> $LOGFILE fi fi # # make sure host is on same subnet # this could exist if it was configured manually w/o this program # HOSTNET=$($NSLOOKUP $HOSTNAME 2> /dev/null \ | grep ^Address \ | sed -n 2p \ | awk '{print $2}' \ | awk -F. '{print $1":"$2":"$3}') if [[ -z $HOSTNET ]] then HOSTNET=$(grep -v ^# /etc/hosts \ | grep -w $HOSTNAME \ | sed -n 1p \ | awk '{print $1}'\ | awk -F. '{print $1":"$2":"$3}') fi SRVNET=$($NSLOOKUP $NAME 2> /dev/null \ | grep ^Address \ | sed -n 2p \ | awk '{print $2}' \ | awk -F. '{print $1":"$2":"$3}') if [[ -z $SRVNET ]] then SRVNET=$(grep -v ^# /etc/hosts \ | grep -w $SRVNAME \ | sed -n 1p \ | awk '{print $1}'\ | awk -F. '{print $1":"$2":"$3}') fi # do a string compare of first 3 octets - not true numeric if [[ $HOSTNET != $SRVNET ]] then $ECHO "${DATE}:${HOSTNAME}:ERROR:8: $SRVNET is not on default network" \ | tee -a $LOGFILE exit 8 fi # # get the correct configured interface # Solaris: get rid of ether (MAC) line (get this when run ifconfig as root) # join lines, look for IP, strip off last colon # if [[ $OSTYPE = SunOS ]] then THIS_INSTANCE=$(ifconfig -a | grep -v ether \ | awk '$0 ~ /:/ {printf "%s ",$1} \ $0 ~ /inet/ {printf "%s \n",$2}' \ | grep -vw 127.0.0.1 \ | awk '/'$THISIP'/ {print $1}' \ | sed s/:$// ) elif [[ $OSTYPE = Linux ]] then THIS_INSTANCE=$(ifconfig -a \ | awk '$0 ~ /eth/ {printf "%s ",$1} \ $0 ~ /inet/ {printf "%s \n",$2}' \ | grep -vw 127.0.0.1 \ | awk '/'$THISIP'/ {print $1}' \ | sed s/:$// ) fi # # remove $INFC_FILE:instance # INFC_FILE=$(grep -l $NAME ${INFC_FILE}${THIS_INSTANCE}*:* 2> /dev/null) if [[ -n "$INFC_FILE" ]] then if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:INFO: removing ${INFC_FILE}.$THIS_INSTANCE" \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:INFO: removing ${INFC_FILE}.$THIS_INSTANCE" \ >> $LOGFILE fi rm $INFC_FILE 2> /dev/null fi # rerun to see if there are file that exist (you may have # only had a /etc/hostname.INFC:1) INFC_FILE_EXIST=$(ls /etc/hostname.*:* 2> /dev/null) if [[ -n "$INFC_FILE_EXIST" ]] then if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:INFO: renumbering /etc/hostname.INFC:# files" \ | tee -a $LOGFILE fi # regroup hostname:# numbers on delete on correct interface INFC=$($ECHO "$INFC_FILE" | awk -F: '{print $1}' \ | awk -F. '{print $2}') FILES=$(ls /etc/hostname.$INFC:* \ | awk -F: '/'$INFC'/ {print $2}' \ | sort -n) CNT=1 # # don't run this section if you just deleted the last virtual interface file # if [[ -n $FILES ]] then # # compare FILE count with CNT count # if differ, then FILE is greater and needs to move down in number # for FILE in $FILES do if (( $FILE != $CNT )) then if (( VERBOSE )) then $ECHO "Moving /etc/hostname.$INFC:$FILE to /etc/hostname.$INFC:$CNT" fi mv /etc/hostname.$INFC:$FILE /etc/hostname.$INFC:$CNT fi let CNT=$CNT+1 done fi fi # # unplumb hostname.NAME:# # if [[ $OSTYPE = SunOS ]] then ifconfig $THIS_INSTANCE unplumb elif [[ $OSTYPE = Linux ]] then ifconfig $THIS_INSTANCE down fi $ECHO "${DATE}:${HOSTNAME}:OK: $NAME removed from system " \ | tee -a $LOGFILE # # remove from /etc/hosts # if [[ -n $(grep -v ^# /etc/hosts | grep -w $NAME ) ]] then $ECHO "${DATE}:${HOSTNAME}:REMOVING: $NAME from /etc/hosts" \ | tee -a $LOGFILE #use IP to avoid word match (p-ent-matt & p-ent-matter - delete # p-ent-matt would delele both lines unless you do field/space # matching THISIP=$($NSLOOKUP $NAME 2> /dev/null | grep ^Address | sed -n 2p \ | awk '{print $2}') if [[ -z $THISIP ]] then THISIP=$(grep -v ^# /etc/hosts | grep -w $NAME | sed -n 1p | awk '{print $1}') fi sed /$THISIP/d /etc/hosts > /tmp/host.$$ cp /tmp/host.$$ /etc/hosts rm /tmp/host.$$ else $ECHO "${DATE}:${HOSTNAME}:INFO: $NAME not found in /etc/hosts" \ | tee -a $LOGFILE fi } addDisk () { if (( DEBUG )) then set -x fi if [[ $OSTYPE != SunOS && $OSTYPE = Linux ]] then $ECHO "ERROR:1: $OSTYPE is not a supported OS for this action" \ | tee -a $LOGFILE fi # # does this have a mountable disk? # # we expect the DG to exist, otherwise we will fail mounting (of course) # we will do NO force import as we don't want to steal from another node # # we expect Veritas for the disk mgt s/w # # see if DG exists, then if VOL exists, if so, then mount, else state that # it is not there (which is valide in some cases - not all services # will have local/SAN storage (could be filer/NFS)) # # if [[ -f /opt/VRTS/bin/vxdg ]] then VXDGCMD=/opt/VRTS/bin/vxdg elif [[ -f /usr/sbin/vxdg ]] then VXDGCMD=/usr/sbin/vxdg else VXDGCMD="" fi if (( $DISK )) then # # check that we can "see" disk group # could be other issues - but we are not going to figure that out # we assume if we can "see" it we are good, otherwise we fail # $VXDGCMD -g $SRVNAME-dg free > /dev/null 2>&1 if (( ! $? )) then $ECHO "${DATE}:${HOSTNAME}:INFO: dg $SRVNAME exists" \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:ERROR:10: dg $SRVNAME does not exist" \ | tee -a $LOGFILE exit 10 fi # # assume volume is there, # check for volume state, start if needed # if [[ -z $(vxprint -g $SRVNAME-dg | grep "^v $SRVNAME" | grep ACTIVE) ]] then $ECHO "${DATE}:${HOSTNAME}:INFO: starting $SRVNAME-vol" \ | tee -a $LOGFILE vxvol -g $SRVNAME-dg start $SRVNAME-vol else if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:INFO: $SRVNAME-vol is running" \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:INFO: $SRVNAME-vol is running" \ >> $LOGFILE fi fi # # add to /etc/vfstab if not there # if [[ -z $(grep $SRVNAME $FSTAB ) ]] then $ECHO "${DATE}:${HOSTNAME}:INFO: adding $SRVNAME to $FSTAB " \ | tee -a $LOGFILE $ECHO "/dev/vx/dsk/$SRVNAME-dg/$SRVNAME-vol /dev/vx/rdsk/$SRVNAME-dg/$SRVNAME-vol $APPDIR/$SRVNAME vxfs 2 yes largefiles" >> $FSTAB else if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:INFO: $SRVNAME already in $FSTAB " \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:INFO: $SRVNAME already in $FSTAB " \ >> $LOGFILE fi fi # # make dir if not there # if [[ ! -d $APPDIR/$SRVNAME ]] then $ECHO "${DATE}:${HOSTNAME}:INFO: mkdir $APPDIR/$SRVNAME" \ | tee -a $LOGFILE mkdir -p $APPDIR/$SRVNAME else if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:INFO: dir $APPDIR/$SRVNAME exists" \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:INFO: dir $APPDIR/$SRVNAME exists" \ >> $LOGFILE fi fi # # mount $APPDIR/$SRVNAME # if [[ -z $(mount | awk '{print $1}' | grep $APPDIR/$SRVNAME) ]] then $ECHO "${DATE}:${HOSTNAME}:INFO: fsck & mount $APPDIR/$SRVNAME" \ | tee -a $LOGFILE fsck -F vxfs -y /dev/vx/rdsk/$SRVNAME-dg/$SRVNAME-vol > /dev/null mount -F vxfs $APPDIR/$SRVNAME else if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:INFO: $APPDIR/$SRVNAME already mounted" \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:INFO: $APPDIR/$SRVNAME already mounted" \ >> $LOGFILE fi fi if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:OK: disk action for $SRVNAME done" \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:OK: disk action for $SRVNAME done" \ >> $LOGFILE fi fi } delDisk () { if (( DEBUG )) then set -x fi if [[ $OSTYPE != SunOS && $OSTYPE = Linux ]] then $ECHO "ERROR:1: $OSTYPE is not a supported OS for this action" \ | tee -a $LOGFILE fi # # does this have a mountable disk? # # we expect the DG to exist, otherwise we will fail mounting (of course) # we will do NO force import as we don't want to steal from another node # # we expect Veritas for the disk mgt s/w # # see if DG exists, then if VOL exists, if so, then mount, else state that # it is not there (which is valide in some cases - not all services # will have local/SAN storage (could be filer/NFS)) # # if (( $DISK )) then # # check for existence of disk group # vxprint -g $SRVNAME-dg > /dev/null 2>&1 if (( ! $? )) then $ECHO "${DATE}:${HOSTNAME}:INFO: dg $SRVNAME exists" \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:ERROR:10: dg $SRVNAME does not exist" \ | tee -a $LOGFILE exit 10 fi # # umount $APPDIR/$SRVNAME # if [[ -n $(mount | awk '{print $1}' | grep $APPDIR/$SRVNAME) ]] then $ECHO "${DATE}:${HOSTNAME}:INFO: umounting $APPDIR/$SRVNAME" \ | tee -a $LOGFILE if (( FORCE )) then fuser -kcu $APPDIR/$SRVNAME umount $APPDIR/$SRVNAME else umount $APPDIR/$SRVNAME fi if (( $? )) then $ECHO "${DATE}:${HOSTNAME}:ERROR:12: failed to unmount $APPDIR/$SRVNAME" \ | tee -a $LOGFILE exit 12 fi else if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:INFO: $APPDIR/$SRVNAME already unmounted" \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:INFO: $APPDIR/$SRVNAME already unmounted" \ >> $LOGFILE fi fi # # remove dir # if [[ -d $APPDIR/$SRVNAME ]] then $ECHO "${DATE}:${HOSTNAME}:INFO: rmdir $APPDIR/$SRVNAME" \ | tee -a $LOGFILE rmdir $APPDIR/$SRVNAME else if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:INFO: dir $APPDIR/$SRVNAME doesn't exist" \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:INFO: dir $APPDIR/$SRVNAME doesn't exist" \ >> $LOGFILE fi fi # # assume volume is there # stop volume if active # if [[ -n $(vxprint -g $SRVNAME-dg | grep "^v $SRVNAME" | grep ACTIVE) ]] then $ECHO "${DATE}:${HOSTNAME}:INFO: stopping $SRVNAME-vol" \ | tee -a $LOGFILE vxvol -g $SRVNAME-dg stop $SRVNAME-vol else if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:INFO: $SRVNAME-vol is already stopped" \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:INFO: $SRVNAME-vol is already stopped" \ >> $LOGFILE fi fi # # remove from $FSTAB if not there # if [[ -n $(grep $SRVNAME $FSTAB ) ]] then $ECHO "${DATE}:${HOSTNAME}:REMOVING: $SRVNAME from $FSTAB " \ | tee -a $LOGFILE sed /$SRVNAME/d $FSTAB > /tmp/tempfstab.$$ cp /tmp/tempfstab.$$ $FSTAB rm /tmp/tempfstab.$$ else if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:INFO: $SRVNAME not in $FSTAB" \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:INFO: $SRVNAME not in $FSTAB" \ >> $LOGFILE fi fi if (( VERBOSE )) then $ECHO "${DATE}:${HOSTNAME}:OK: disk action for $SRVNAME done" \ | tee -a $LOGFILE else $ECHO "${DATE}:${HOSTNAME}:OK: disk action for $SRVNAME done" \ >> $LOGFILE fi fi } ############################################################################# # main function: run other functions ############################################################################# if (( DEBUG )) then set -x fi # #options: EITHER list OR nooptions # if (( LIST || NOOPTIONS )) then if (( VERBOSE )) then $ECHO "INFO: Listing out service names" fi # #see if there are VIPS, if so continue, else exit in function # areVirtuals # # if no SRVNAME given, list them all, else list that one IF found # if [[ -z $SRVNAME ]] then listAllNamesVIP else findName fi #options: all, oracle, or zone elif (( ALL || ORACLE || ZONE || VCS || VXDG || ZFS )) then if (( ALL )) then if (( VERBOSE )) then $ECHO "INFO: Listing out VIPs, zones, and oracle SIDs" fi $ECHO -n "VIPs:" listAllNamesVIP listAllNamesVXDG listAllNamesVCS listAllNamesZFS listAllNamesOracle if [[ $OSTYPE = SunOS ]] then checkIfGlobalZone ############################## # if not global, then no zones ############################## if (( ZONEGLOBAL )) then $ECHO -n "Zones:" listAllNamesZone # #Make the call to get metasets from here. #Could have made it a CLI option, but decided not to. # listAllNamesMetaset # #Make the call to get metastat from here. #Could have made it a CLI option, but decided not to. # listAllNamesMetastat else if (( VERBOSE )) then $ECHO "INFO: Not a global zone, other zones not possible" \ | tee -a $LOGFILE fi fi fi elif (( VCS )) then if (( VERBOSE )) then $ECHO "INFO: Listing out VCS cluster info" fi listAllNamesVCS elif (( VXDG )) then if (( VERBOSE )) then $ECHO "INFO: Listing out VxDG names" fi listAllNamesVXDG elif (( ZFS )) then if (( VERBOSE )) then $ECHO "INFO: Listing out ZFS info" fi listAllNamesZFS elif (( ORACLE )) then if (( VERBOSE )) then $ECHO "INFO: Listing out oracle SIDs" fi listAllNamesOracle elif (( ZONE )) then if (( VERBOSE )) then $ECHO "INFO: Listing out zones" fi ############################## # if not global, then no zones ############################## if (( ZONEGLOBAL )) then $ECHO -n "Zones:" listAllNamesZone else if (( VERBOSE )) then $ECHO "$HOSTNAME:INFO: Not a global zone, other zones not possible" \ | tee -a $LOGFILE fi fi fi elif (( ADD )) then if (( VERBOSE )) then $ECHO "INFO: Starting the adding of the service names" fi checkIfRoot checkIfVCS $ECHO "${DATE}:${HOSTNAME}:INFO: Adding service name: $SRVNAME" \ | tee -a $LOGFILE inDNS $SRVNAME addServiceName $SRVNAME if [[ $OSTYPE = SunOS ]] then addDisk fi elif (( DELETE )) then if (( VERBOSE )) then $ECHO "INFO: Starting the deleting of the service names" fi checkIfRoot checkIfVCS $ECHO "${DATE}:${HOSTNAME}:INFO: Deleting service name: $SRVNAME" \ | tee -a $LOGFILE inDNS $SRVNAME namePingable $SRVNAME delServiceName $SRVNAME if [[ $OSTYPE = SunOS ]] then delDisk fi fi