Hardwareerkennungsscript

Oft muss man von vielen Maschinen die wichtigsten Hardware-Daten über das Netz abfragen. Genau für soeinen Fall stelle ich hier zwei Scripte 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-Script

#!/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-Script 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.

 
Falls nicht anders bezeichnet, ist der Inhalt dieses Wikis unter der folgenden Lizenz veröffentlicht:GNU Free Documentation License 1.2
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki