シェルでドライブのブランド、モデル、シリアルを取得するスクリプト

中国語セクションでTR-004のドライブのシリアル番号を取得したい方がいると質問がありましたが、こちらでも共有できると思います。

出力サンプル:

[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

他のエンクロージャは持っていませんが、おそらく動作するはずです。

#!/bin/sh
# 使用方法:
#   ./hdd_id.sh               # すべてのエンクロージャ、タブ区切り(標準出力)
#   ./hdd_id.sh --csv         # すべてのエンクロージャ、<HOST>-<YYYYMMDD>-DiskList.csv に書き出し
#   ./hdd_id.sh 1             # enc_id=1 のみ、タブ区切り
#   ./hdd_id.sh --csv 1       # enc_id=1 のみ、<HOST>-<YYYYMMDD>-DiskList.csv に書き出し

# オプション解析
CSV=0
if [ "$1" = "--csv" ]; then
  CSV=1
  shift
fi

# エンクロージャリスト作成
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 "No enclosure enc_id found."; exit 1; }

# CSVモード時の出力ファイル名をuname -nとdateで準備
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}"

  # このエンクロージャのディスクを列挙し、スロットごとにBrand, Model, Serialを出力
  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}
    # ヘッダーのインデックスを一度だけ取得
    !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   # Brand
        if($i=="model")      mid=i
        if($i=="serial_no")  sid=i
      }
      hdr=1; next
    }
    # データ行: 最初のフィールドが数値(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

「いいね!」 4

在庫管理のためにこの情報が必要なのは理解できますが、GUIで利用できないわけではありません。

ストレージとスナップショット > ディスク/VJBOD
を開くと、下部セクションにこのように表示されます…

「いいね!」 1

それは確かにそうですが、NAS情報を取得する内部スクリプトを知っておくと何かと便利ですよね。:nerd_face:

「いいね!」 2

それはGUIで利用できないわけではありません。

まさにその通りです。ただ、バッチ処理を求めていたのはその人だけです。
そもそも、どうやってインベントリをバッチ処理したいのか私にはよく分かりません。