#!/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/usr/platform/sun4u/sbin:/usr/ccs/bin:/usr/xpg4/bin:/usr/xpg4/sbin

export PATH

HOSTNAME="`hostname`"
HOSTID="`hostid`"
BASE=`pwd`
BOLD="\033[1m"
NORMAL="\033[m"

unalias ls 2>/dev/null

echo "${BOLD}Analyzing $HOSTNAME server configuration...${NORMAL}"

rm -rf /tmp/gaga
rm -rf /tmp/${HOSTNAME}*

mkdir /tmp/gaga
mkdir -p /tmp/gaga/etc
mkdir -p /tmp/gaga/var/spool/cron/crontabs

for i in mail init.d rcS.d rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d ; do mkdir -p /tmp/gaga/etc/$i ; done

touch /tmp/gaga/netconf.csv

touch /tmp/gaga/complete.csv

#---------------------------------------------------------------#
# Festplatten erfassen
# Syntax:
# hostname;hostid;hd;groesse;partition;groesse;mountpoint
#---------------------------------------------------------------#

echo "${BOLD}Step 1:${NORMAL} Scanning harddisk configuration."
echo "hostname;hostid;hd;groesse;partition;groesse;mountpoint" >> /tmp/gaga/disks.csv
echo "hostname;hostid;hd;groesse;partition;groesse;mountpoint" >> /tmp/gaga/complete.csv

# Abbild der vom System erkannten Platten kreiern
disks -r /tmp/gaga

# Platten erfassen

DISKS="`ls /tmp/gaga/dev/rdsk/ | grep s0 | sed -e 's/s0//'`"

# Swapdev rausfinden
SWAPSLIC="`swap -l | awk '{if ( $1 ~ /^\/dev/ ) print $1}' | cut -d'/' -f4`"

for HD in $DISKS
do 
	HDNR="`echo $HD | sed -e 's/.*t\(.*\)d.*/\1/`"
	# old HDNR="`echo $HD | sed -e 's/c[0-9]*t//' -e 's/d[0-9].*//'`"
	SIZE="`dd if=/dev/dsk/${HD}s0 ibs=16 count=1 2>/dev/null | cut -d \" \" -f1`"
	SLICS="`ls /tmp/gaga/dev/rdsk/${HD}* | sed -e 's-/tmp/gaga/dev/rdsk/--'`"
	for SLIC in $SLICS
	do
		if [ "`devinfo -p /dev/rdsk/$SLIC 2>/dev/null`" != "" ]
		then
		SLICSIZE="`devinfo -p /dev/rdsk/$SLIC | awk '{print $5"/2048"}' | bc`"
		else
			SLICSIZE=0
		fi

		if [ "$SLIC" = "$SWAPSLIC" ]
		then
			MOUNT="SWAP"
		else
			MOUNT=`grep "^/dev/dsk/${SLIC}" /etc/vfstab | awk '{print $3}'`
		fi

		echo "$HOSTNAME;$HOSTID;Disk $HD;$SIZE;$SLIC;Size ${SLICSIZE}MB;$MOUNT" | grep -v "Size 0MB" >> /tmp/gaga/disks.csv
		echo "$HOSTNAME;$HOSTID;Disk $HD;$SIZE;$SLIC;Size ${SLICSIZE}MB;$MOUNT" | grep -v "Size 0MB" >> /tmp/gaga/complete.csv
	done
done
cp /etc/vfstab /tmp/gaga/etc

#---------------------------------------------------------------#
# System erfassen
# Syntax:
# hostname;hostid;boardserial;bootdev;local-mac-address;OBPVersion;Modell;RAM;prozessoren mit MHz;uptime;patchlevel;pkgliste
#---------------------------------------------------------------#

echo "${BOLD}Step 2:${NORMAL} Scanning system configuration."
echo "hostname;hostid;boardserial;bootdev;local-mac-address;OBPVersion;Modell;RAM;prozessoren mit MHz;uptime;patchlevel;pkgliste" > /tmp/gaga/system.csv
echo "hostname;hostid;boardserial;bootdev;local-mac-address;OBPVersion;Modell;RAM;prozessoren mit MHz;uptime;patchlevel;pkgliste" >> /tmp/gaga/complete.csv

BSERIAL="`eeprom system-board-serial# | awk -F= '{print $2}'`"
BOOTDEV="`eeprom boot-device | awk -F= '{print $2}'`"
LOCALMAC="`eeprom local-mac-address? | awk -F= '{print $2}'`"
OBPV="`prtconf -V`"
MODEL="`uname -i | awk -F',' '{print $2}'`"
RAM="`prtconf | grep Memory`"
CPU="`psrinfo | wc -l` x `psrinfo -v | grep MHz | uniq | awk '{print $6}'` MHz"
UPTIME="`uptime | awk -F' ,' '{print $3}'` days"
PATCHLVL="`uname -v | awk -F'_' '{print $2}'`"
PKGLIST="`pkginfo -i | awk '{print $2}'`"

for PKG in $PKGLIST
do
	PKGDESC=`pkginfo -i $PKG | awk '{for (i=3;i<=NF;i++) printf $i" " ; printf "\n"}'`
	echo "$HOSTNAME;$HOSTID;$BSERIAL;$BOOTDEV;$LOCALMAC;$OBPV;$MODEL;$RAM;$CPU;$UPTIME;$PATCHLVL;$PKG $PKGDESC" >> /tmp/gaga/system.csv
	echo "$HOSTNAME;$HOSTID;$BSERIAL;$BOOTDEV;$LOCALMAC;$OBPV;$MODEL;$RAM;$CPU;$UPTIME;$PATCHLVL;$PKG $PKGDESC" >> /tmp/gaga/complete.csv
done

# Check whether we have samba installed...
SMBROOT=`find /opt/samba* -type d -name "samba*" 2>/dev/null| uniq`
if [ "$SMBROOT" != "" ]
then
	for SMB in $SMBROOT
	do
		SMBCONFD=`find $SMB -name "smb.conf" -type f | grep -v man | grep -v html | sed -e 's-smb.conf.*$--' | uniq`
		SMBCONF=`find $SMB -name "smb.conf" -type f | grep -v man | grep -v html`
		SMBSID=`find $SMB -name "MACHINE.SID" -type f`
		SMBSIDDIR=`find $SMB -name "MACHINE.SID" -type f | sed -e 's-MACHINE.SID--'`
		SMBPASSWD=`find $SMB -name "smbpasswd" -type f | grep -v bin`
		SMBPASSWDDIR=`find $SMB -name "smbpasswd" -type f | grep -v bin | sed -e 's-smbpasswd--'`
		mkdir -p /tmp/gaga/$SMBCONFD /tmp/gaga/$SMBSIDDIR /tmp/gaga/$SMBPASSWDDIR
		cp $SMBCONF /tmp/gaga/$SMBCONFD
		cp $SMBSID /tmp/gaga/$SMBSIDDIR
		cp $SMBPASSWD /tmp/gaga/$SMBPASSWDDIR
	done
fi

cp /etc/system /tmp/gaga/etc
cp /var/spool/cron/crontabs/* /tmp/gaga/var/spool/cron/crontabs
df -k > /tmp/gaga/df.txt
ps -eaf > /tmp/gaga/ps.txt
ls -l /opt > /tmp/gaga/opt.txt

#---------------------------------------------------------------#
# Netzconfig erfassen
# Syntax:
# hostname;hostid;hme/le/qfe;Name;IP;up/down;link speed;linkmode;virtual NIC;up/down;Name;IP;netmask;broadcast;defaultrouter
#---------------------------------------------------------------#

echo "${BOLD}Step 3:${NORMAL} Scanning network interface configuration."

echo "hostname;hostid;hme/le/qfe;Name;IP;up/down;link speed;linkmode;virtual NIC;up/down;Name;IP;netmask;broadcast;defaultrouter" >> /tmp/gaga/net.csv
echo "hostname;hostid;hme/le/qfe;Name;IP;up/down;link speed;linkmode;virtual NIC;up/down;Name;IP;netmask;broadcast;defaultrouter" >> /tmp/gaga/complete.csv

# Asking the kernel about our network interfaces (running and connected)

NICS=`echo '$<msgbuf' | adb -k /dev/ksyms /dev/mem | grep "SUNW.*duplex" | sed -e 's/.*SUNW,//' -e 's/://' -e 's/Mbps.*$//' | sort | awk '{print $1" "}' | uniq`

# Fallback to ifconfig if NICS is empty and/or we got old hardware crap with
# a lance ethernetcard (le0 or s.th. = 10Mbps half duplex)
if [ "$NICS" = "" ]
then
	NICS=`ifconfig -a | grep BROADCAST | sed -e 's/ flags.*$//' -e 's/:$//' | grep -v : | awk '{printf $1" "}'`
fi

# Identify default router
DROUTER="`awk '
/^#/	{next;}
	{print}' /etc/defaultrouter`"

for NIC in $NICS
do
	NICNAME="`cat /etc/hostname.$NIC`"
	NICIP=`awk '{printf ("%s %s\n",$1,$2)}' < /etc/hosts | grep $NICNAME | cut -d " " -f1`	
	NICSTAT=`ifconfig -a | grep $NIC | cut -d "<" -f2 | cut -d "," -f1 | uniq`
	NICNM=`ifconfig -a | grep $NICIP | awk '{print $3" "$4}'`
	NICBRD=`ifconfig -a | grep $NICIP | awk '{print $5" "$6}'`
	NWDEV="`echo $NIC | sed -e 's/[0-9]//'`"
	NWINST="`echo $NIC | sed -e 's/^[a-z]..//'`"

	if [ "$NWDEV" = "le" ]
	then
		NICSPEED="10 Mbps"
		NICMODE="half-duplex"
		NICLINK="Link `echo $NICSTAT | tr '[:upper:]' '[:lower:]'`"
	else
		NWDEV="`echo $NIC | sed -e 's/[0-9]//'`"
		NWINST="`echo $NIC | sed -e 's/^[a-z]..//'`"
		ndd -set /dev/$NWDEV instance $NWINST
		NWMODE="`ndd -get /dev/$NWDEV link_mode`"
		NWSPEED="`ndd -get /dev/$NWDEV link_speed`"
		NWLINK="`ndd -get /dev/$NWDEV link_status`"

		case "$NWMODE" in
        		'1')
                		NICMODE="full-duplex"
        		;;
        		'0')
                		NICMODE="half-duplex"
        		;;
		esac
		
		case "$NWSPEED" in
        		'1')
                		NICSPEED="100 Mbps"
        		;;
        		'0')
                		NICSPEED="10 Mbps"
        		;;
		esac
	
		case "$NWLINK" in
			'1')
				NICLINK="Link up"
			;;
			'0')
				NICLINK="Link down"
			;;
		esac
	fi
	
	VIRTINT=`ifconfig -a | grep BROADCAST | sed -e 's/: .*$//' | grep "${NIC}:"`
	if [ "$VIRTINT" = "" ]
	then
		if [ "`ls /etc/hostname.${NIC}*off* 2> /dev/null`" = "" ]
		then
			VIRTINT=$NIC
			VIRTNAME=$NICNAME
			VIRTIP=$NICIP
			VIRTSTAT=$NICSTAT
			VIRTNM=$NICNM
			VIRTBRD=$NICBRD
			echo "$HOSTNAME;$HOSTID;$NIC;$NICNAME;$NICIP;$NICLINK;$NICSPEED;$NICMODE;$NIC;$VIRTIP;$NICLINK;$VIRTNAME;$VIRTNM;$VIRTBRD;$DROUTER" >> /tmp/gaga/net.csv
			echo "$HOSTNAME;$HOSTID;$NIC;$NICNAME;$NICIP;$NICLINK;$NICSPEED;$NICMODE;$NIC;$VIRTIP;$NICLINK;$VIRTNAME;$VIRTNM;$VIRTBRD;$DROUTER" >> /tmp/gaga/complete.csv
		else

		VIRTINT=`ls /etc/hostname.${NIC}*off* | sed -e 's-/etc/hostname\.--' -e 's-\..*$--'`
		for VIRT in $VIRTINT
		do
			VIRTSTAT=down
			VIRTNAME="`cat /etc/hostname.${VIRT}.off*`"
			VIRTIP=`awk '{printf ("%s %s\n",$1,$2)}' < /etc/hosts | grep $VIRTNAME | cut -d " " -f1`
			VIRTNM=$NICNM
			VIRTBRD=$NICBRD
			echo "$HOSTNAME;$HOSTID;$NIC;$NICNAME;$NICIP;$NICLINK;$NICSPEED;$NICMODE;$VIRT;$VIRTIP;$VIRTSTAT;$VIRTNAME;$VIRTNM;$VIRTBRD;$DROUTER" >> /tmp/gaga/net.csv
			echo "$HOSTNAME;$HOSTID;$NIC;$NICNAME;$NICIP;$NICLINK;$NICSPEED;$NICMODE;$VIRT;$VIRTIP;$VIRTSTAT;$VIRTNAME;$VIRTNM;$VIRTBRD;$DROUTER" >> /tmp/gaga/complete.csv
		done
		fi
	else

	for VIRT in $VIRTINT
	do
        	VIRTSTAT=`ifconfig -a | grep $VIRT | cut -d "<" -f2 | cut -d "," -f1 | tr '[:upper:]' '[:lower:]' | uniq`
		if [ "$VIRTSTAT" != "up" ]
                then
                        VIRTSTAT="down"
        		VIRTNAME="`cat /etc/hostname.${VIRT}*`"
                else
        		VIRTNAME="`cat /etc/hostname.${VIRT}`"
		fi
        	VIRTIP=`awk '{printf ("%s %s\n",$1,$2)}' < /etc/hosts | grep $VIRTNAME | cut -d " " -f1`
		VIRTNM=`ifconfig -a | grep $VIRTIP | awk '{print $3" "$4}'`
		VIRTBRD=`ifconfig -a | grep $VIRTIP | awk '{print $5" "$6}'`
echo "$HOSTNAME;$HOSTID;$NIC;$NICNAME;$NICIP;$NICLINK;$NICSPEED;$NICMODE;$VIRT;$VIRTIP;$VIRTSTAT;$VIRTNAME;$VIRTNM;$VIRTBRD;$DROUTER" >> /tmp/gaga/net.csv
echo "$HOSTNAME;$HOSTID;$NIC;$NICNAME;$NICIP;$NICLINK;$NICSPEED;$NICMODE;$VIRT;$VIRTIP;$VIRTSTAT;$VIRTNAME;$VIRTNM;$VIRTBRD;$DROUTER" >> /tmp/gaga/complete.csv
	done
	
	fi

done

cp /etc/hostname.* /tmp/gaga/etc
cp /etc/netmasks /tmp/gaga/etc
cp /etc/defaultrouter /tmp/gaga/etc
cp /etc/nsswitch.conf /tmp/gaga/etc
cp /etc/hosts /tmp/gaga/etc
cp /etc/passwd /tmp/gaga/etc
cp /etc/group /tmp/gaga/etc
cp /etc/resolv.conf /tmp/gaga/etc
cp -pr /etc/ssh* /tmp/gaga/etc

cd /

tar cf /tmp/gaga/boot.tar etc/init.d etc/rc*.d
cd /tmp/gaga
tar xf boot.tar
rm boot.tar
cd $BASE

#---------------------------------------------------------------#
# Routing/DNS/Mailrelay erfassen
# Syntax:
# hostname;hostid;routing table;destination;gateway;Interface
# hostname;hostid;nameserverconfig;nameserver
# hostname;hostid;mailrelayconfig;mailrelay
#---------------------------------------------------------------#

echo "${BOLD}Step 4:${NORMAL} Scanning routing/dns/mailrelay config."

LCOUNT="`netstat -nr | wc -l`"
RTCOUNT="`echo $LCOUNT-4 | bc`"
netstat -nr | tail -$RTCOUNT | awk '{print name";"hostid";routing table;"$1";"$2";"$6}' name=$HOSTNAME hostid=$HOSTID >> /tmp/gaga/netconf.csv
netstat -nr | tail -$RTCOUNT | awk '{print name";"hostid";routing table;"$1";"$2";"$6}' name=$HOSTNAME hostid=$HOSTID >> /tmp/gaga/complete.csv
if [ -s "/etc/resolv.conf" ]
then
	grep nameserver /etc/resolv.conf | awk '{print name";"hostid";nameserverconfig;"$1";"$2}' name=$HOSTNAME hostid=$HOSTID >> /tmp/gaga/netconf.csv
	grep nameserver /etc/resolv.conf | awk '{print name";"hostid";nameserverconfig;"$1";"$2}' name=$HOSTNAME hostid=$HOSTID >> /tmp/gaga/complete.csv
	cp /etc/resolv.conf /tmp/gaga/etc
fi
if [ -s "/etc/mail/sendmail.cf" ]
then
	MAILRELAY=`grep "^DS" /etc/mail/sendmail.cf | sed -e 's/^DS//'`
	echo "$HOSTNAME;$HOSTID;mailrelayconfig;$MAILRELAY" >> /tmp/gaga/netconf.csv
	echo "$HOSTNAME;$HOSTID;mailrelayconfig;$MAILRELAY" >> /tmp/gaga/complete.csv
	cp /etc/mail/sendmail.cf /tmp/gaga/etc/mail
fi

#---------------------------------------------------------------#
# Serverconfig auseinanderklabuesern
# Syntax:
# hostname;hostid;netscape/apache;instanzname;ip;name;docroot;cgi-bin;logsdir;Keyfile;certfile
#---------------------------------------------------------------#

echo "${BOLD}Step 5:${NORMAL} Scanning webserver configuration."
echo "hostname;hostid;netscape/apache;instanzname;ip;name;docroot;cgi-bin;logsdir;keyfile;certfile" >> /tmp/gaga/server.csv
echo "hostname;hostid;netscape/apache;instanzname;ip;name;docroot;cgi-bin;logsdir;keyfile;certfile" >> /tmp/gaga/complete.csv

# check if netscape or apache

NSINST=`find /opt -name "ns-home*" -type d`
if [ "$NSINST" != "" ]
then 
	NETSCAPE=true
fi

APROOT=`find /opt -name "apache*" -type d`
if [ "$APROOT" != "" ]
then
	APACHE=true
	CONFD=`find $APROOT -name httpd.conf | sed -e 's-/httpd.conf--'`
	for AP in $CONFD
	do
		mkdir -p /tmp/gaga/$AP
		cp $AP/httpd.conf /tmp/gaga/$AP
	done
fi

case "$NETSCAPE" in
	'true')
	for NS in $NSINST
	do
		ADMIN="admin-serv"
		NSROOT=$NS
		mkdir -p /tmp/gaga/${NSROOT}/${ADMIN}/config
		WSINST=`ls -d ${NSROOT}/https-* 2> /dev/null | sed -e 's;${NSROOT}/;;'`
		PRINST=`ls -d ${NSROOT}/proxy-* 2> /dev/null | sed -e 's;${NSROOT}/;;'`

		ADMINCONF=${NSROOT}/admin-serv/config
		ADMINPORT=`grep Port $ADMINCONF/ns-admin.conf`
		ADMINUSER=`cut -d":" -f1 $ADMINCONF/admpw`
		ADMINRUNUSER=`grep "^User" $ADMINCONF/ns-admin.conf`
		ADMINLOGS=`grep ErrorLog $ADMINCONF/ns-admin.conf | cut -d " " -f2 | sed -e 's/errors//'`
		ADMINKEY=`grep Keyfile $ADMINCONF/ns-admin.conf | cut -d " " -f2`
		ADMINCERT=`grep Certfile $ADMINCONF/ns-admin.conf | cut -d " " -f2`
		echo "$HOSTNAME;$HOSTID;$HTTPD;$ADMIN;*;${NSROOT}/admin-serv;$ADMINPORT;$ADMINUSER;$ADMINRUNUSER;$ADMINLOGS;$ADMINKEY;$ADMINCERT" >> /tmp/gaga/server.csv
		echo "$HOSTNAME;$HOSTID;$HTTPD;$ADMIN;*;${NSROOT}/admin-serv;$ADMINPORT;$ADMINUSER;$ADMINRUNUSER;$ADMINLOGS;$ADMINKEY;$ADMINCERT" >> /tmp/gaga/complete.csv
		cp $ADMINCONF/ns-admin.conf /tmp/gaga/$ADMINCONF/
		cp $ADMINCONF/admpw /tmp/gaga/$ADMINCONF/
		if [ "$WSINST" != "" ]
		then
			for INST in $WSINST
			do
			INSTCONF=$INST/config
			INSTID=`grep ServerID $INSTCONF/magnus.conf`
			INSTNAME=`grep ServerName $INSTCONF/magnus.conf`
			INSTIP=`grep Address $INSTCONF/magnus.conf | cut -d " " -f2`
			INSTPORT=`grep Port $INSTCONF/magnus.conf | cut -d " " -f2`
			INSTUSER=`grep User $INSTCONF/magnus.conf | cut -d " " -f2`
			INSTLOGS=`grep ErrorLog $INSTCONF/magnus.conf | cut -d " " -f2 | sed -e 's/error.*$//'`
			INSTDOCS=`grep "^NameTrans.*document-root" $INSTCONF/obj.conf | awk -F"=" '{print $3}' | sed -e 's/"//g'`
			INSTCGI=`grep "^NameTrans.*cgi-bin" $INSTCONF/obj.conf | awk -F"=" '{print $4}' | cut -d " " -f1 | sed -e 's/"//g'`
			INSTKEY=`grep Keyfile $INSTCONF/magnus.conf | cut -d " " -f2`
			INSTCERT=`grep Certfile $INSTCONF/magnus.conf | cut -d " " -f2`
			
			echo "$HOSTNAME;$HOSTID;$HTTPD;$INSTID;$INSTNAME;$INSTIP;$INSTPORT;$INSTUSER;$INSTDOCS;$INSTCGI;$INSTLOGS;$INSTKEY;$INSTCERT" >> /tmp/gaga/server.csv
			echo "$HOSTNAME;$HOSTID;$HTTPD;$INSTID;$INSTNAME;$INSTIP;$INSTPORT;$INSTUSER;$INSTDOCS;$INSTCGI;$INSTLOGS;$INSTKEY;$INSTCERT" >> /tmp/gaga/complete.csv
			mkdir -p /tmp/gaga/${INSTCONF}
			cp $INSTCONF/magnus.conf /tmp/gaga/${INSTCONF}
			cp $INSTCONF/obj.conf /tmp/gaga/${INSTCONF}/

			done
		fi
		
		if [ "$PRINST" != "" ]
		then
			for INST in $PRINST
			do
			INSTCONF=$INST/config
			INSTID=`grep ServerID $INSTCONF/magnus.conf`
			INSTNAME=`grep ServerName $INSTCONF/magnus.conf`
			INSTIP=`grep Address $INSTCONF/magnus.conf | cut -d " " -f2`
			INSTPORT=`grep Port $INSTCONF/magnus.conf | cut -d " " -f2`
			INSTUSER=`grep User $INSTCONF/magnus.conf | cut -d " " -f2`
			INSTLOGS=`grep ErrorLog $INSTCONF/magnus.conf | cut -d " " -f2 | sed -e 's/error.*$//'`
			INSTKEY=`grep Keyfile $INSTCONF/magnus.conf | cut -d " " -f2`
			INSTCERT=`grep Certfile $INSTCONF/magnus.conf | cut -d " " -f2`
			
			echo "$HOSTNAME;$HOSTID;$HTTPD;$INSTID;$INSTNAME;$INSTIP;$INSTPORT;$INSTUSER;$INSTDOCS;$INSTCGI;$INSTLOGS;$INSTKEY;$INSTCERT" >> /tmp/gaga/server.csv
			echo "$HOSTNAME;$HOSTID;$HTTPD;$INSTID;$INSTNAME;$INSTIP;$INSTPORT;$INSTUSER;$INSTDOCS;$INSTCGI;$INSTLOGS;$INSTKEY;$INSTCERT" >> /tmp/gaga/complete.csv
			mkdir -p /tmp/gaga/${INSTCONF}
			cp $INSTCONF/magnus.conf /tmp/gaga/${INSTCONF}
			cp $INSTCONF/obj.conf /tmp/gaga/${INSTCONF}/

			done
		fi
		
	done	
		;;
esac	

#---------------------------------------------------------------#
# System und Serverconfig sichern
#---------------------------------------------------------------#

echo "${BOLD}Step 6:${NORMAL} Creating tarball with configs."

cd /tmp
mv gaga ${HOSTNAME}
tar cf ${HOSTNAME}.tar ${HOSTNAME}

echo "${BOLD}...done.${NORMAL}"

#---------------------------------------------------------------#
# Cleaning up...
#---------------------------------------------------------------#

cd $BASE
rm analyze.sh

