Inhaltsverzeichnis

Hardwareerkennungsskript

Oft muss man von vielen Maschinen die wichtigsten Hardware-Daten über das Netz abfragen. Genau für soeinen Fall stelle ich hier zwei Skripte vor.

  1. Gibt von der aktuellen Maschine die wichtigsten Hardware-Daten in Form von [Variable]=[Wert] aus.
  2. Wird mit dem Hostnamen bzw. der IP als Parameter aufgerufen und legt auf der aktuellen Maschine eine Datenbank mit zugehöriger Tabelle an und schreibt gleich die Hardware-Daten, die zu dem übergebenen Hostnamen gehören, in die Datenbanktabelle. MySQL sollte natürlich auf der aktuellen Maschine installiert sein!

einfaches HW-Skript

#!/bin/sh

(

# Hostname
echo "hostname=$(hostname -f)"

# IP-Adressen
ifconfig -a | awk '!/127.0.0.1/ && /inet / {sub(":", " ") ; print "IP4="$3}'

# MAC-Adressen
find /sys/ -type f | fgrep 'address' | fgrep -i 'eth' | xargs cat ${1} | awk '{print "mac="$1}'

# BIOS-Datum
dmidecode -t 0 | fgrep -i 'Release Date:' | sed -e 's/^\t/BIOS /' -e 's/: /=/'

# System-Infos
dmidecode -t 1 | egrep -i 'Manufacturer:|Product Name:|Serial Number:' | sed -e 's/^\t/BIOS /' -e 's/: /=/'

# Anzahl der CPUs
dmidecode -t processor | egrep -i 'Socket Designation:' | wc -l | awk '{print "CPU Anzahl="$1}'

# 64Bit oder nicht
egrep ^flags /proc/cpuinfo | tr -s ' ' '\n' | egrep ^lm | uniq | awk '{print "bus="$1}'

# Hardwarevirtualisierung
egrep ^flags /proc/cpuinfo | tr -s ' ' '\n' | egrep 'vmx|svm' | uniq | awk '{print "vm="$1}'

# Hyper-Threading oder nicht
awk -v alt='^$' -v neu='#' '{sub(alt, neu)} /physical id|core id|#/ && /0$|#/ {print $NF}' /proc/cpuinfo | uniq -c | awk '!/#|1 0/' | wc -l | awk '{$1 > 1 ; print "htt="$1}'

# CPU-Infos
dmidecode -t processor | sed -e '1,/^$/ d' -e '/^$/ q' -e 's/^\t/CPU /' -e 's/: /=/' | egrep -i 'Family=|Manufacturer=|ID=|Signature=|Core Count=|Core Enabled='

# Hauptspeichergröße
egrep ^MemTotal /proc/meminfo | sed 's/:[ ]*/=/'

# Festplatten
fgrep -H 0 /sys/class/block/*/removable | egrep -v 'loop|ram|dm-' | awk -F'/' '{print $5}' | while read DEV;do echo "HDD=${DEV} $(cat /sys/class/block/${DEV}/size | awk -F'/' '{print $1/2048}') MB";done

) | awk -F'=' '{wert=$2 ; gsub(" ", "_") ; variable=tolower($1) ; print variable"="wert}'

Die Angabe "BIOS Serial Number" entspricht der "Service Tag".

remote abfragendes HW-Skript mit Datenbankanbindung

#!/bin/sh

#------------------------------------------------------------------------------#
# User-Check

if [ "$(id -u)" != "0" -o -z "${1}" ] ; then
      echo "Sie muessen 'root' sein"
      echo "und"
      echo "die IP des Zielrechners als Parameter mit übergeben!"
      exit 1
else
      rm -fr HWINFOS SPALTEN WERTE
fi

#------------------------------------------------------------------------------#
# VARIABLEN werden gesammelt bzw. gesetzt

. /usr/share/openqrm/etc/openqrm-server.conf

#OPENQRM_DATABASE_SERVER=localhost
#OPENQRM_DATABASE_NAME=openqrm
#OPENQRM_DATABASE_USER=root
#OPENQRM_DATABASE_PASSWORD=geheim
#
HWINFOTAB="hardware"

#------------------------------------------------------------------------------#
# DB + Tabelle anlegen

################################################################################
# echo "DROP TABLE hardware" | mysql -h localhost -u root -p openqrm
# ./hardwareinfodb_bauen.sh 
# ./hardwareinfos2db.sh 192.168.3.70
# echo "SELECT * FROM hardware;" | mysql -h localhost -u root -p openqrm
# echo "SELECT hostname,bios_release_date,bios_product_name,mac,cpu_anzahl,bus,htt,cpu_family,cpu_manufacturer,cpu_signature FROM hardware;" | mysql -t -h localhost -u root -pblack60x openqrm
################################################################################

echo "
CREATE DATABASE IF NOT EXISTS ${OPENQRM_DATABASE_NAME};
USE ${OPENQRM_DATABASE_NAME};

CREATE TABLE IF NOT EXISTS ${HWINFOTAB} (
timestamp DATETIME,
hostname VARCHAR(254) default NULL,
ip4 VARCHAR(4096) default NULL,
mac VARCHAR(2048) default NULL,
bios_release_date VARCHAR(256) default NULL,
bios_manufacturer VARCHAR(256) default NULL,
bios_product_name VARCHAR(256) default NULL,
bios_serial_number VARCHAR(256) default NULL,
cpu_anzahl SMALLINT,
bus VARCHAR(8) default NULL,
vm VARCHAR(8) default NULL,
htt SMALLINT,
cpu_family VARCHAR(256) default NULL,
cpu_manufacturer VARCHAR(256) default NULL,
cpu_id VARCHAR(256) default NULL,
cpu_signature VARCHAR(256) default NULL,
cpu_core_count SMALLINT,
cpu_core_enabled SMALLINT,
memtotal VARCHAR(256) default NULL,
hdd VARCHAR(256) default NULL,
PRIMARY KEY (bios_serial_number),
KEY mac (mac)
) TYPE=MyISAM;
" | mysql -h ${OPENQRM_DATABASE_SERVER} -u${OPENQRM_DATABASE_USER} -p${OPENQRM_DATABASE_PASSWORD}

#------------------------------------------------------------------------------#
# Hardwareinfos werden gesammelt

#
# cat hardwareinfos_holen.sh | ssh root@192.168.3.70 'cat > hwi.sh;chmod 0700 hwi.sh;./hwi.sh'
#

echo "(
# TIMESTAMP
echo \"timestamp=\$(date +'%Y-%m-%d %H:%M:%S')\"

# Hostname
echo \"hostname=\$(hostname -f)\"

# IP-Adressen
ifconfig -a | awk '!/127.0.0.1/ && /inet / {sub(\":\", \" \") ; print \"IP4=\"\$3}'

# MAC-Adressen
find /sys/ -type f | fgrep 'address' | fgrep -i 'eth' | xargs cat \${1} | awk '{print \"mac=\"\$1}'

# BIOS-Datum
dmidecode -t 0 | fgrep -i 'Release Date:' | sed -e 's/^\t/BIOS /' -e 's/: /=/'

# System-Infos
dmidecode -t 1 | egrep -i 'Manufacturer:|Product Name:|Serial Number:' | sed -e 's/^\t/BIOS /' -e 's/: /=/'

# Anzahl der CPUs
dmidecode -t processor | egrep -i 'Socket Designation:' | wc -l | awk '{print \"CPU Anzahl=\"\$1}'

# 64Bit oder nicht
egrep ^flags /proc/cpuinfo | tr -s ' ' '\n' | egrep ^lm | uniq | awk '{print \"bus=\"\$1}'

# Hardwarevirtualisierung
egrep ^flags /proc/cpuinfo | tr -s ' ' '\n' | egrep 'vmx|svm' | uniq | awk '{print \"vm=\"\$1}'

# Hyper-Threading oder nicht
awk -v alt='^\$' -v neu='#' '{sub(alt, neu)} /physical id|core id|#/ && /0\$|#/ {print \$NF}' /proc/cpuinfo | uniq -c | awk '!/#|1 0/' | wc -l | awk '{\$1 > 1 ; print \"htt=\"\$1}'

# CPU-Infos
dmidecode -t processor | sed -e '1,/^\$/ d' -e '/^\$/ q' -e 's/^\t/CPU /' -e 's/: /=/' | egrep -i 'Family=|Manufacturer=|ID=|Signature=|Core Count=|Core Enabled='

# Hauptspeichergröße
egrep ^MemTotal /proc/meminfo | sed 's/:[ ]*/=/'

# Festplatten
fgrep -H 0 /sys/class/block/*/removable | egrep -v 'loop|ram|dm-' | awk -F'/' '{print \$5}' | while read DEV;do echo \"HDD=\${DEV} \$(cat /sys/class/block/\${DEV}/size | awk -F'/' '{print \$1/2048}') MB\";done

) | awk -F'=' '{wert=\$2 ; gsub(\" \", \"_\") ; variable=tolower(\$1) ; print variable\"=\"wert}'" | ssh root@${1} 'cat > hwi.sh;chmod 0700 hwi.sh;./hwi.sh' > HWINFOS || exit 1

#------------------------------------------------------------------------------#
# Hardwareinfos werden aufbereitet

HARDWAREINDEX="$(cat HWINFOS | sed 's/ *$//g')"

echo "${HARDWAREINDEX}" | awk -F'=' '{print $1}' | sort | uniq | while read SPALTE
do
      WERTE="$(echo "${HARDWAREINDEX}" | fgrep "${SPALTE}" | awk -F'=' '{print $2}' | tr -s '\n' '; ')"
      echo "${SPALTE}" >> SPALTEN
      echo "'${WERTE}'" >> WERTE
done

#------------------------------------------------------------------------------#
# Hardwareinfos werden in die DB geschrieben

echo "INSERT INTO ${HWINFOTAB} ($(cat SPALTEN|tr -s '\n' ','|sed 's/,$//')) VALUES ($(cat WERTE|tr -s '\n' ','|sed 's/,$//'))
" | mysql -h ${OPENQRM_DATABASE_SERVER} -u${OPENQRM_DATABASE_USER} -p${OPENQRM_DATABASE_PASSWORD} ${OPENQRM_DATABASE_NAME}

In diesem Fall ist es so ausgelegt, das es in die selbe Datenbank schreibt, in der auch openQRM seine Daten ablegt. Das kann man natürlich den eigenen Vorlieben anpassen.