Skript zum Auslesen von Laufwerksmarke, Modell und Seriennummer aus der Shell

Im chinesischen Bereich wurde gefragt dass jemand die Seriennummern seiner Laufwerke auf dem TR-004 auslesen möchte, aber ich denke, das kann auch hier geteilt werden.

Beispielausgabe:

[qnap@NAS ~]$ ./hdd_id.sh                             
ENC_0	3	TOSHIBA	MC04ACA300E	85G9XXXXFLVA
ENC_0	6	Seagate	ST8000VX010-2ZR188	WPV0XYZZ
ENC_0	7	Seagate	ST8000VX010-2ZR188	WPV0ZZZZ
ENC_0	8	Seagate	ST8000VX010-2ZR188	WPVXXXR5
TR-004-N001	1	Seagate	ST4000NE001-2MA101	WS24ZZZB
TR-004-N001	2	Seagate	ST4000NE001-2MA101	WS24XXXY

Ich habe keine anderen Gehäuse, aber es sollte auch dort funktionieren

#!/bin/sh
# Verwendung:
#   ./hdd_id.sh               # alle Gehäuse, tab-getrennt (auf stdout)
#   ./hdd_id.sh --csv         # alle Gehäuse, schreibe nach <HOST>-<YYYYMMDD>-DiskList.csv
#   ./hdd_id.sh 1             # nur enc_id=1, tab-getrennt
#   ./hdd_id.sh --csv 1       # nur enc_id=1, schreibe nach <HOST>-<YYYYMMDD>-DiskList.csv

# Optionen parsen
CSV=0
if [ "$1" = "--csv" ]; then
  CSV=1
  shift
fi

# Gehäuseliste erstellen
if [ -n "$1" ]; then
  ENC_LIST="$1"
else
  ENC_LIST=$(hal_app --se_enum 2>/dev/null | awk '
    /^=/{next}
    NF==0{next}
    /(^|[[:space:]])enc_id($|[[:space:]])/ { hdr=1; next }
    hdr && $1 ~ /^[0-9]+$/ { print $1 }
  ' | sort -n | uniq)
fi

[ -z "$ENC_LIST" ] && { echo "Keine Gehäuse enc_id gefunden."; exit 1; }

# Dateiname für CSV-Ausgabe mit uname -n und date vorbereiten
OUTFILE=""
DELIM="\t"
if [ $CSV -eq 1 ]; then
  HOSTNAME=$(uname -n 2>/dev/null)
  [ -z "$HOSTNAME" ] && HOSTNAME="NAS"
  DATESTR=$(date +%Y%m%d)
  OUTFILE="${HOSTNAME}-${DATESTR}-DiskList.csv"
  DELIM="," 
  echo "Enclosure,Slot,Brand,Model,Serial" > "$OUTFILE"
fi

for ENC in $ENC_LIST; do
  NAME=$(hal_app --se_get_jbod_display_name enc_id=$ENC 2>/dev/null)
  [ -z "$NAME" ] && NAME="ENC_${ENC}"

  # Laufwerke für dieses Gehäuse auflisten und Marke, Modell, Seriennummer pro Slot ausgeben
  hal_app --pd_enum enc_id=$ENC 2>/dev/null | awk -v name="$NAME" -v D="$DELIM" -v csv="$CSV" -v out="$OUTFILE" '
    /^=/{next}
    NF==0{next}
    # Header-Indizes einmal erfassen
    !hdr && /(^|[[:space:]])port_id($|[[:space:]])/ && /vendor/ && /model/ && /serial_no/ {
      for(i=1;i<=NF;i++){
        if($i=="port_id")    pid=i
        if($i=="vendor")     bid=i   # Marke
        if($i=="model")      mid=i
        if($i=="serial_no")  sid=i
      }
      hdr=1; next
    }
    # Datenzeilen: Erstes Feld ist numerisch (port_id)
    hdr && $1 ~ /^[0-9]+$/ && pid>0 && bid>0 && mid>0 && sid>0 {
      line = name D $(pid) D $(bid) D $(mid) D $(sid)
      if (csv==1) {
        print line >> out
      } else {
        print line
      }
    }
  '
done

Auch wenn ich verstehe, dass Sie diese Informationen zur Bestandsverwaltung benötigen, sind sie doch in der GUI verfügbar.

Speicher und Snapshots > Festplatten/VJBOD
öffnet im unteren Bereich Folgendes…

Das stimmt, aber interne Skripte, um NAS-Informationen zu erhalten, sind immer nützlich zu kennen. :nerd_face:

Es ist ja nicht so, als wäre es in der GUI nicht verfügbar.

Genau. Nur die Person, die das für Massenaktionen gefragt hat.
Ich bin mir sowieso nicht wirklich sicher, wie sie das Inventar stapelweise bearbeiten wollen.