#!/bin/bash

#  chkcfg.sh version 0.5.6
#  released 4 Apr 2007
#
#  Copyright (C) 2002-2007  by Sapon Oleg
#  Copyright (C) 2006, 2007 by RusBusinessSecurity Co. Ltd.
#
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.

# Define chkcfg.sh report location
#PATHTODIR="./"		# We define it in /etc/sysconfig/sklad-chkcfg

. /etc/sysconfig/sklad-chkcfg

# Define dmidecode location
DMIDECODE="/usr/sbin/dmidecode"

VERSION="0.5.5"

AWK="/usr/bin/awk"
CAT="/usr/bin/cat"
CUT="/usr/bin/cut"
DATE="/bin/date"
DF="/bin/df"
ECHO="/bin/echo"
FIND="/usr/bin/find"
FREE="/usr/bin/free"
GREP="/bin/grep"
ID="/usr/bin/id"
IFCONFIG="/sbin/ifconfig"
LS="/bin/ls"
LSPCI="/usr/bin/lspci"
LSUSB="/usr/sbin/lsusb"
MOUNT="/bin/mount"
SED="/bin/sed"
SMARTCTL="/usr/sbin/smartctl"
SORT="/usr/bin/sort"
TODOS="/usr/bin/unix2dos"
TR="/usr/bin/tr"
UPTIME="/usr/bin/uptime"
WC="/usr/bin/wc"
RPM="/usr/bin/rpm"

MACADDR=`${IFCONFIG} -a|${GREP} "eth0 "|${AWK} '{print $5}'|${SED} 's/://g'`
LOGFILE=${PATHTODIR}/${MACADDR}

NL=$'\n'
OLDIFS=${IFS}

##################################################
# Reinit variables, process Software and Startup #
##################################################
SOFTNO=0
STUPNO=0

if [ -e /etc/slackware-version ]; then
    SYSTEM="`${CAT} /etc/slackware-version`"
    SOFTLIST="`${LS} /var/adm/packages`"
    STUPLIST="`${LS} -1 /etc/rc.d/rc.*|${CUT} -d '/' -f 4`"
elif [ -e /etc/gentoo-release ]; then
    LSPCI="/usr/sbin/lspci"
    LSPCI="/usr/sbin/lsusb"
    TODOS="/usr/bin/unix2dos"

    SYSTEM="`${CAT} /etc/gentoo-release`"
    SOFTLIST="`${LS} /var/db/pkg/* |${CUT} -d '/' -f 5-6`"
    STUPLIST="`${LS} -1 /etc/runlevels/*|${CUT} -d '/' -f 3-4`"
elif [ -e /etc/redhat-version ]; then
    SYSTEM="`${CAT} /etc/redhat-version`"
elif [ -e /etc/debian-version ]; then
    SYSTEM="`${CAT} /etc/debian-version`"
elif [ -e /etc/suse-version ]; then
    SYSTEM="`${CAT} /etc/suse-version`"
elif [ -e /etc/altlinux-release ]; then
    SYSTEM="`${CAT} /etc/altlinux-release`"
    SOFTLIST="`${RPM} -qa`"
fi

# Software list
for SOFT in ${SOFTLIST}; do
    SOFTINFO="\
${SOFTINFO}Win_Soft_${SOFTNO}=${SOFT}
"
    let SOFTNO++
done

# Startup list
for STUP in ${STUPLIST}; do
    STUPINFO="\
${STUPINFO}Win_Start_${STUPNO}=Common Startup ${STUP}
"
    let STUPNO++
done

############################
### Begin processing ... ###
############################

NCPU=`${CAT} /proc/cpuinfo|${GREP} processor|${WC} -l`
if [ ${NCPU} -eq 1 ]; then
    NCPU=""
else
    NCPU="${NCPU}x "
fi

##################
# Process drives #
##################
DISKNO=0
HDDSIZE=0

# Floppy drives (BUG: We don't know exactly how much floppies, and their names, i.e. fd0 or fd1)
if [ ! "`cat /proc/devices|grep fd`" = "" ]; then
    DISKINFO="\
Drive_${DISKNO}=fd REMOVABLE
"
    let DISKNO++
fi

# IDE and SCSI disks (BUG: Mounted Flash drives will appear too!)
DISKSMOUNT="`${MOUNT} -l|${GREP} \"/dev/[hs]d[a-z][0-9]\"|${CUT} -d ' ' -f 1,5,7|${SED} -e 's/\[/\(/' -e 's/\]/\)/' -e 's/\/dev\///'`"
for DISK in `${ECHO} "${DISKSMOUNT}"|${CUT} -d ' ' -f 1`; do
    DISKLABEL=`${ECHO} "${DISKSMOUNT}"|${GREP} ${DISK}|${CUT} -d ' ' -f 3`
    DISKDF="`${DF} -m /dev/${DISK}|${GREP} ${DISK}`"
    DISKSIZE=`${ECHO} ${DISKDF}|${AWK} '{ print $2 }'`
    DISKFREE=`${ECHO} ${DISKDF}|${AWK} '{ print $4 }'`
    DISKFSYS=`${ECHO} "${DISKSMOUNT}"|${GREP} ${DISK}|${CUT} -d ' ' -f 2|${TR} [:lower:] [:upper:]`
    DISKINFO="\
${DISKINFO}Drive_${DISKNO}=${DISK} Hard Disk${DISKLABEL}, ${DISKSIZE} Mb ${DISKFSYS} (free ${DISKFREE} Mb)
"
    let DISKNO++
    let HDDSIZE=HDDSIZE+DISKSIZE
done

#############################
# Process devices and SMART #
#############################
DEVNO=0
SMANO=0

# IDE + SMART
for HDISK in `${LS} -1d /proc/ide/hd* 2>/dev/null|${CUT} -d '@' -f 1`; do
    MEDIA=`${CAT} ${HDISK}/media`
    if [ ${MEDIA} == "disk" ]; then
	DEVICEINFO="\
${DEVICEINFO}Device_${DEVNO}=HDD `${CAT} ${HDISK}/model` `${CAT} ${HDISK}/capacity|${AWK} '{printf \"%.2f\", $1/1000000/2}'`Gb Drive `${ECHO} \"${DISKSMOUNT}\"|${GREP} \`${ECHO} ${HDISK}|${CUT} -d '/' -f 4\`|${CUT} -d ' ' -f 1|${SORT} -k 1,1|${TR} $'\n' ' '`
"

	SMART1INFO="\
${SMART1INFO}HDD${SMANO}_Info=`${CAT} ${HDISK}/model`
"

	export SMANO
	SMART2INFO="\
${SMART2INFO}`${SMARTCTL} -A /dev/hda|${GREP} 0x0|${AWK} '{ print \"HDD\" ENVIRON[\"SMANO\"] \"_\" $1 \"=<V>\" $4 \" <W>\" $5 \" <T>\" $6 \" <R>\" $10 }'`
"
	let SMANO++
    
    elif [ ${MEDIA} == "cdrom" ]; then
	DEVICEINFO="\
${DEVICEINFO}Device_${DEVNO}=CDROM `${CAT} ${HDISK}/model`
"
    else
	${ECHO} "Unknown device type: ${MEDIA} for ${HDISK}, report to developer"
	let DEVNO--
    fi
    
    let DEVNO++
done

# 1 for grep, 2 class
ProcessDevice()
{
    IFS=${NL}
    
    for DEVICE in "`${LSPCI}|${GREP} \"${1}\"|${CUT} -d ':' -f 3|${CUT} -d ' ' -f 2-`"; do
	if [ ! ${DEVICE} == "" ]; then
	    DEVICEINFO="\
${DEVICEINFO}Device_${DEVNO}=${2} ${DEVICE}
"
	    let DEVNO++
	fi
    done
    
    IFS=${OLDIFS}
}

ProcessDevice "VGA compatible controller" "Display"
ProcessDevice "Ethernet controller" "Net"
ProcessDevice "Network controller" "Net"

#########################
# Process Linux Devices #
#########################

# 1 description
ProcessLinuxDevice()
{
    LINDEVINFO="\
${LINDEVINFO}Win_Device_${LINNO}=${1}
"
    let LINNO++
}

LINNO=0
IFS=${NL}
for PCIDEVICE in `${LSPCI}|${SORT} -k 2,2|${CUT} -d ' ' -f 2-`; do
    ProcessLinuxDevice "${PCIDEVICE}"
done
for USBDEVICE in `${LSUSB}|${GREP} -v "0000:0000"|${CUT} -d ' ' -f 6|${AWK} -F ':' '{print "0x" $1 ":0x" $2}'`; do
    USBDEVVERBOSE="`${LSUSB} -vd ${USBDEVICE}`"
    ProcessLinuxDevice "USB `${ECHO} \"${USBDEVVERBOSE}\"|${GREP} idVendor|${CUT} -d 'x' -f 2-|${CUT} -d ' ' -f 2-` `${ECHO} \"${USBDEVVERBOSE}\"|${GREP} iProduct|${TR} -s ' '|${CUT} -d ' ' -f 4-`"
done
IFS=${OLDIFS}

${ECHO} "\
[Info]
MAC_Addr=${MACADDR}
System=`${CAT} /proc/version` (${SYSTEM})
Current_User_Name=`${ID} -nu`
Computer_Name=${HOSTNAME}
Param_0=${0} ${VERSION}
Param_1=`${UPTIME}|${TR} -s '  '|${CUT} -d ' ' -f 2-`
Record_Date=`${DATE} +%x`
IP_Addr=`${IFCONFIG} eth0|${GREP} \"inet addr\"|${CUT} -d ':' -f 2|${CUT} -d ' ' -f 1`

[Computer]
BIOS=`${DMIDECODE}|${GREP} -A3 \"BIOS Information\"|${CUT} -d ':' -f 2|${SED} 's/ //'|${GREP} -v BIOSInformation|${TR} $'\n' ' '`
CPU_Freq_in_MHz=`${CAT} /proc/cpuinfo|${GREP} -m 1 \"cpu MHz\"|${CUT} -d ':' -f 2|${CUT} -d '.' -f 1|${CUT} -d ' ' -f 2`
CPU=${NCPU}`${CAT} /proc/cpuinfo|${GREP} \"model name\"|${CUT} -d ':' -f 2|${CUT} -d ' ' -f 2-|${TR} -s '  '`
Memory_in_Mb=`${FREE}|${GREP} \"Mem:\"|${AWK} '{print $2/1000}'|${CUT} -d ',' -f 1`
${DISKINFO}Total_HDD_in_Mb=${HDDSIZE}

[Windows_Devices]
${LINDEVINFO}
[Current_Config]
${DEVICEINFO}
[Windows_StartUp]
${STUPINFO}
[Windows_Soft]
${SOFTINFO}
[S.M.A.R.T.]
${SMART1INFO}${SMART2INFO}
"|${TODOS}>${LOGFILE}

exit 0
