Add hardware-to-mkd script
This commit is contained in:
parent
a73d8b0918
commit
681cbaf16b
1 changed files with 149 additions and 0 deletions
149
hardware-to-mkd
Executable file
149
hardware-to-mkd
Executable file
|
@ -0,0 +1,149 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
if [ "$(whoami)" != "root" ]; then
|
||||||
|
echo "This script is intended to run as root. Exiting" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
for cmd in lshw jq; do
|
||||||
|
if ! command -v $cmd > /dev/null; then
|
||||||
|
echo "Please install $cmd. Exiting." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "$1" = "" ]; then
|
||||||
|
echo "Usage: export-hardware.sh PATH_TO_OUTPUT" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
output=$1
|
||||||
|
if [ -d "$1" ]; then
|
||||||
|
echo "$1 is a directory and cannot be used as output. Exiting." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# We extract hardware details only once, as it can be somewhat expensive/slow.
|
||||||
|
echo "Extracting hardware informations.... "
|
||||||
|
hardware=$(lshw -json)
|
||||||
|
hostname=$(hostname --short)
|
||||||
|
components=$(echo "$hardware" | jq -r -c '..|.children?|select(.!=null)|.[]')
|
||||||
|
echo "--- OK"
|
||||||
|
|
||||||
|
print_server_component () {
|
||||||
|
class=$(echo "$@"| jq -j -c .class)
|
||||||
|
if echo "system processor memory power bus" | grep -w -q "$class"; then
|
||||||
|
# Motherboards are 'bus' class and what **seem** to be consistent (from a
|
||||||
|
# server + my laptop) 'Motherboard' description.
|
||||||
|
if [ "$class" = "bus" ] && [ "$(echo "$@"| jq -j -c .description)" != "Motherboard" ]; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
serial=$(echo "$@"| jq -j -c '.serial // "-"')
|
||||||
|
name='\(.description // .product)'
|
||||||
|
manufacturer='\(.vendor // "-")'
|
||||||
|
model='\(.product // "-")'
|
||||||
|
|
||||||
|
case "$class" in
|
||||||
|
"power")
|
||||||
|
name="$name (slot: \\(.slot // \"-\"))"
|
||||||
|
;;
|
||||||
|
"system")
|
||||||
|
# Ignore irrelevant PnP (and probably others) devices.
|
||||||
|
if [ "$serial" = "-" ]; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
"memory")
|
||||||
|
# Ignore CPU cache (= memory entries without serial number).
|
||||||
|
if [ "$serial" = "-" ]; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Extract size of RAM sticks.
|
||||||
|
units=$(echo "$@"| jq -j -c .units)
|
||||||
|
size=$(echo "$@"| jq -j -c .size)
|
||||||
|
if [ "$units" = "bytes" ]; then
|
||||||
|
model="\(.product) ($(((size / 1024 / 1024 / 1024 ))) GB)"
|
||||||
|
else
|
||||||
|
model='\(.product) (\(.size) \(.units),)'
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
echo "$@" | jq -j -c ".|\"| $class | $name | $manufacturer | $model | $serial | \n\""
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
get_disk_details () {
|
||||||
|
product=$(echo "$@" | jq -j -c .product)
|
||||||
|
size=$(echo "$@" | jq -j -c .size)
|
||||||
|
units=$(echo "$@" | jq -j -c .units)
|
||||||
|
serial=$(echo "$@" | jq -j -c .serial)
|
||||||
|
|
||||||
|
if [ "$units" = "bytes" ]; then
|
||||||
|
size=$(((size / 1024 / 1024 / 1024)))
|
||||||
|
units='GB'
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat <<- EOF
|
||||||
|
$product ($serial, $size $units)
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
### Output ###
|
||||||
|
|
||||||
|
touch "$output"
|
||||||
|
|
||||||
|
echo "Generating system section... "
|
||||||
|
cat <<- EOF > "$output"
|
||||||
|
# Host: $hostname
|
||||||
|
|
||||||
|
Extracted on $(date -I) by the [hardware-to-mkd script](https://code.recycled.cloud/RecycledCloud/tools/src/branch/master/hardware-to-mkd).
|
||||||
|
|
||||||
|
## System
|
||||||
|
|
||||||
|
| Class | Name | Manufacturer | Model | Serial |
|
||||||
|
|-------|------|--------------|-------|--------|
|
||||||
|
$(print_server_component "$hardware")
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo "$components" | while read -r component; do
|
||||||
|
print_server_component "$component" >> "$output"
|
||||||
|
done
|
||||||
|
echo "--- OK"
|
||||||
|
|
||||||
|
echo "Generating disks section... "
|
||||||
|
cat <<- EOF >> "$output"
|
||||||
|
|
||||||
|
## Disks
|
||||||
|
|
||||||
|
| Disk |
|
||||||
|
|------|
|
||||||
|
EOF
|
||||||
|
echo "$components" | while read -r component; do
|
||||||
|
class=$(echo "$component"| jq -j -c .class)
|
||||||
|
if [ "$class" = "disk" ]; then
|
||||||
|
echo "| $(get_disk_details "$component") |" >> "$output"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo "--- OK"
|
||||||
|
|
||||||
|
echo "Generating NICs section... "
|
||||||
|
cat <<- EOF >> "$output"
|
||||||
|
## NICs
|
||||||
|
|
||||||
|
| Interface | MAC |
|
||||||
|
|-----------|-----|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo "$components" | while read -r component; do
|
||||||
|
class=$(echo "$component"| jq -j -c .class)
|
||||||
|
if [ "$class" = "network" ]; then
|
||||||
|
serial=$(echo "$component"| jq -j -c '.serial // "-"')
|
||||||
|
iface=$(ip -j l | jq -r -c ".[] | select(.address == \"$serial\") | .ifname")
|
||||||
|
echo "| $iface | $serial |" >> "$output"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "--- OK"
|
Loading…
Reference in a new issue