#!/bin/bash . /lib/dracut-lib.sh # http://git.openslx.org/openslx-ng/mltk.git/tree/core/modules/hardware-stats/data/opt/openslx/scripts/systemd-hardware_stats # dmidecode | grep -i UUID TYPE="CLIENT" cpu() { cat << EOF { "model": "$1", "manufacturer": "$2", "type": "$3", "cores": "$4", "frequency": "$5", "unit": "$6" } EOF } getCpus() { readarray -t CPU_MODEL <<< "$(dmidecode -q -s processor-version)" readarray -t CPU_MANUFACTURER <<< "$(dmidecode -q -s processor-manufacturer)" readarray -t CPU_TYPE <<< "$(dmidecode -q -s processor-family)" readarray -t CPU_CORES <<< "$(dmidecode -t processor | grep -o 'Core Count:.*' | cut -f3- -d ' ')" readarray -t CPU_FREQUENCY <<< "$(dmidecode -q -s processor-frequency | cut -f1- -d ' ')" CPUS=() FIRST=true for i in ${!CPU_MODEL[@]}; do if [ "$FIRST" == "true" ]; then FIRST=false else CPUS+=", " fi frequency=$(echo ${CPU_FREQUENCY[i]} | awk '{print $1}') unit=$(echo ${CPU_FREQUENCY[i]} | awk '{print $2}') CPUS+=$(cpu "${CPU_MODEL[i]}" "${CPU_MANUFACTURER[i]}" "${CPU_TYPE[i]}" "${CPU_CORES[i]}" "$frequency" "$unit") done echo ${CPUS[*]} } # CPU CPU_MODEL=$(dmidecode -q -s processor-version) # CPUMODEL=$(grep -m1 '^model name\s*:' /proc/cpuinfo | sed 's/^model name\s*:\s*//;s/\s\s*/ /g;s/^ //;s/ $//') CPU_MANUFACTURER=$(dmidecode -q -s processor-manufacturer) CPU_TYPE=$(dmidecode -q -s processor-family) CPU_CORES=$(cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list | sort -u | wc -l) CPU_FREQUENCY=$(dmidecode -q -s processor-frequency) CPU_FREQUENCY=${CPU_FREQUENCY%" MHz"} ram() { cat << EOF { "capacity": "$1", "unit": "$2", "manufacturer": "$3", "type": "$4", "formfactor": "$5" } EOF } getRamModules() { readarray -t RAM_SIZE <<< "$(dmidecode -t 17 | grep -o 'Size:.*' | cut -f2- -d ' ')" readarray -t RAM_MANUFACTURER <<< "$(dmidecode -t 17 | grep -o 'Manufacturer:.*' | cut -f2- -d ' ')" readarray -t RAM_TYPE <<< "$(dmidecode -t 17 | grep -o 'Type:.*' | cut -f2- -d ' ')" readarray -t RAM_FORMFACTOR <<< "$(dmidecode -t 17 | grep -o 'Form Factor:.*' | cut -f3- -d ' ')" RAM_MODULES=() FIRST=true for i in ${!RAM_SIZE[@]}; do if [ "${RAM_SIZE[i]}" == 'No Module Installed' ] then continue fi if [ "$FIRST" == "true" ]; then FIRST=false else RAM_MODULES+=", " fi size=$(echo ${RAM_SIZE[i]} | awk '{print $1}') unit=$(echo ${RAM_SIZE[i]} | awk '{print $2}') RAM_MODULES+=$(ram "$size" "$unit" "${RAM_MANUFACTURER[i]}" "${RAM_TYPE[i]}" "${RAM_FORMFACTOR[i]}") done echo ${RAM_MODULES[*]} } drive() { cat << EOF { "model": "$1", "serial": "$2", "capacity": "$3", "unit": "$4", "type": "$5", "formfactor": "$6", "connection": "$7" } EOF } getDrives() { # HDD / SSD # hd parm or smartctl from smartmontools drives=$(ls /dev/sd* | grep -o '/dev/sd.$') DRIVES=() FIRST=true for drive in $drives; do if [ "$FIRST" == "true" ]; then FIRST=false else DRIVES+=", " fi drivedata=$(mktemp) smartctl -i $drive >> $drivedata DRIVE_MODEL=$(cat $drivedata | grep -o "Device Model: .*" | cut -f2- -d ":" | sed -e 's/^[[:space:]]*//') DRIVE_SERIAL=$(cat $drivedata | grep -o "Serial Number: .*" | cut -f2- -d ":" | sed -e 's/^[[:space:]]*//') DRIVE_CAPACITY=$(cat $drivedata | grep -o "User Capacity: .*" | grep -Pzo '(?<=\[)(.*?)(?=\])' | awk '{print $1}') DRIVE_UNIT=$(cat $drivedata | grep -o "User Capacity: .*" | grep -Pzo '(?<=\[)(.*?)(?=\])' | awk '{print $2}') DRIVE_TYPE=$(cat $drivedata | grep -o "Rotation Rate: .*" | cut -f2- -d ":" | sed -e 's/^[[:space:]]*//') DRIVE_FORMFACTOR=$(cat $drivedata | grep -o "Form Factor: .*" | cut -f2- -d ":" | sed -e 's/^[[:space:]]*//') DRIVE_CONNECTION=$(cat $drivedata | grep -o "SATA Version is: .*" | cut -f2- -d ":" | sed -e 's/^[[:space:]]*//') DRIVES+=$(drive "$DRIVE_MODEL" "$DRIVE_SERIAL" "$DRIVE_CAPACITY" "$DRIVE_UNIT" "$DRIVE_TYPE" "$DRIVE_FORMFACTOR" "$DRIVE_CONNECTION") done # NVME need extra stuff nvmes=$(ls /dev/nvme* | grep -o '/dev/nvme.$') for nvme in $nvmes; do if [ "$FIRST" == "true" ]; then FIRST=false else DRIVES+=", " fi drivedata=$(mktemp) smartctl -i $nvme >> $drivedata DRIVE_MODEL=$(cat $drivedata | grep -o "Model Number: .*" | cut -f2- -d ":" | sed -e 's/^[[:space:]]*//') DRIVE_SERIAL=$(cat $drivedata | grep -o "Serial Number: .*" | cut -f2- -d ":" | sed -e 's/^[[:space:]]*//') DRIVE_CAPACITY=$(cat $drivedata | grep -o "Total NVM Capacity: .*" | grep -Pzo '(?<=\[)(.*?)(?=\])' | awk '{print $1}') DRIVE_UNIT=$(cat $drivedata | grep -o "Total NVM Capacity: .*" | grep -Pzo '(?<=\[)(.*?)(?=\])' | awk '{print $2}') DRIVE_TYPE='Solid State Device' DRIVE_FORMFACTOR='NVMe' DRIVE_CONNECTION='Other' DRIVES+=$(drive "$DRIVE_MODEL" "$DRIVE_SERIAL" "$DRIVE_CAPACITY" "$DRIVE_UNIT" "$DRIVE_TYPE" "$DRIVE_FORMFACTOR" "$DRIVE_CONNECTION") done echo ${DRIVES[*]} } # System # VENDOR=$(dmidecode | grep -Eo '(Vendor).*' | cut -f 2 -d ":") # Mainboard # MAINBOARD_MANUFACTURER=$(dmidecode -q -s baseboard-manufacturer) # MAINBOARD_MODEL=$(dmidecode -q -s baseboard-product-name) # MAINBOARD_SERIAL_NUMBER=$(dmidecode -q -s baseboard-serial-number) UUID=$(dmidecode -q -s system-uuid | grep -v '^#' | head -n 1 | tr '[a-z]' '[A-Z]') json_data() { cat << EOF { "client": { "parents": [], "type": "$TYPE", "uuid": "$UUID", "network": { "mac": "$(ip addr show | grep -Eo -m 1 'ether\s.*\sbrd' | awk '{print $2}')", "ip": "$(hostname -I | awk '{print $1}')" }, "system": { "model": "$(dmidecode -q -s system-product-name)", "manufacturer": "$(dmidecode -q -s system-manufacturer)", "serialnumber": "$(dmidecode -q -s system-serial-number)" }, "cpus": [$(getCpus)], "ram": { "modules": [$(getRamModules)], "isEcc": "$(dmidecode -t 16 | grep -o 'Error Correction Type:.*' | cut -f4- -d ' ')" }, "drives": [$(getDrives)] } } EOF } # Curl # curl --data "state=6" --insecure https://bas.stfu-kthx.net:8888/api/registrations/$UUID/state # curl -d "name=Client_$UUID&sys_manufacturer=$MANUFACTURER&sys_model=$MODEL&sys_serial=$SERIAL&cpu_model=$CPU_MODEL&cpu_manufacturer=$CPU_MANUFACTURER&cpu_type=$CPU_TYPE&cpu_cores=$CPU_CORES&cpu_frequency=$CPU_FREQUENCY&ram_size=$RAM_SIZE&ram_manufacturer=$RAM_MANUFACTURER&ram_type=$RAM_TYPE&ram_isecc=$RAM_ISECC&ram_formfactor=$RAM_FORMFACTOR&drives=${DRIVES[*]}" -H "Content-Type: application/x-www-form-urlencoded" -X POST --insecure https://bas.intra.uni-freiburg.de/api/registration/$UUID/update #echo $(json_data) curl -d "$(json_data)" -H "Content-Type: application/json" -X POST --insecure https://bas.intra.uni-freiburg.de/api/registration/clients/$UUID