hpサーバをリモートから制御するために使用するiLO。
稼働させたあとにIPアドレスを確認するのがめんどくさい。
そういう場合に、総当たりでiLOのIPアドレスを確認するスクリプトがあった。
NachoTech Blogの「How to find all the iLO’s on your network」にあるfindilosである。
早速ダウンロードして実行してみる。
[root@adserver ~]# ./findilos 172.17.17.0/24 Scanning... --------------- ------ -------- ------------ ------------------------- iLO IP Address iLO HW iLO FW Server S/N Server Model --------------- ------ -------- ------------ ------------------------- 172.17.17.xxx N/A 1.26 CN71xxxMxx ProLiant DL360 G7 1 iLOs found on network target 172.17.17.0/24 [root@adserver ~]#
iLO HWのモデル名は拾ってくれない。
blogのコメントを確認していくと、元のスクリプトはiLO-2までしか対応しておらず、その後のバージョンについてはコメント欄にある修正を実施すれば良いようだ。
また、iLO Advanceを買っている場合に、そのライセンスコードを表示するための案も提示されていた。
ただ、スクリプト例は汚い実装となっていて、せっかくの元スクリプトを活かしていない形だったので、元スクリプトの実装に従ってライセンスを表示するバージョンを作成した。
その実行例がこちら
[root@adserver ~]# ./findilos 172.17.17.0/24 Scanning... --------------- ------ -------- ------------ ------------------------- -------------------- ----------------------------- iLO IP Address iLO HW iLO FW Server S/N Server Model iLO Edition iLO Licence Key --------------- ------ -------- ------------ ------------------------- -------------------- ----------------------------- 172.17.17.xxx iLO-3 1.26 CN71xxxMxx ProLiant DL360 G7 iLO 3 Advanced xxxxx-xxxxx-xxxxx-xxxxxx-xxxxx 1 iLOs found on network target 172.17.17.0/24 [root@adserver ~]#
スクリプトの修正例は以下
#!/bin/bash # # findilos - Search a local network segment for iLOs # The iLO is the Integrated Lights-Out management processor # used on HP ProLiant and BladeSystem servers # scriptversion="1.0" # # Author: iggy@nachotech.com # # Website: http://blog.nachotech.com # # Requires: tr sed expr curl nmap # # Tested with: Nmap 4.20, curl 7.17.1, RHEL4 # # Note: Discovery of an iLO is dependent upon the Virtual Media port # being set to the default of 17988. If this has been changed # by the iLO administrator, then this script will NOT find it. # # Also, if the iLO XML Reply Data Return has been Disabled by # the iLO administrator, this script will not be able to # gather any information about the server. It will still be # discovered, but all you will see is its IP address. # # GLOBAL VARIABLES scriptname="findilos" iloips="/tmp/tmpilos.$$" iloxml="/tmp/tmpiloxml.$$" ilohwvers="/tmp/tmpilohwvers.$$" declare -i ilosfound=0 # FUNCTIONS function parseiloxml { fgrep "$1" $iloxml > /dev/null 2>&1 if [ $? -ne 0 ] then # tag not found in xml output, return empty string parsedstring="N/A" else # tag was found - now we parse it from the output tempstring=$( cat $iloxml | tr -d -c [:print:] | sed "s/^.*<$1>//" | sed "s/<.$1.*//") # trim off leading and trailing whitespace parsedstring=`expr match "$tempstring" '[ \t]*\(.*[^ \t]\)[ \t]*$'` fi } function is_installed { which $1 > /dev/null 2>&1 if [ $? -ne 0 ] then printf "\nERROR: %s not installed.\n\n" $1 exit 255 fi } # MAIN # check for tools that we depend upon is_installed tr is_installed sed is_installed expr is_installed curl is_installed nmap # check syntax - should have 1 and only 1 parameter on cmdline if [ $# -ne 1 ]; then printf "%s %s ( http://blog.nachotech.com/ )\n" $scriptname $scriptversion printf "Usage: %s {target network specification}\n" $scriptname printf "TARGET NETWORK SPECIFICATION:\n" printf " Can pass hostnames, IP addresses, networks, etc.\n" printf " Ex: server1.company.com, company.com/24, 192.168.0.1/16, 10.0.0-255.1-254\n" printf "EXAMPLE:\n" printf " %s 16.32.64.0/22\n" $scriptname exit 255 fi iprange=$1 # prepare lookup file for iLO hardware versions cat > $ilohwvers << EOF iLO-1 shows hw version ASIC: 2 iLO-2 shows hw version ASIC: 7 iLO-3 shows hw version ASIC: 8 iLO-3 shows hw version ASIC: 9 iLO-4 shows hw version ASIC: 12 iLO-4 shows hw version ASIC: 16 i-iLO shows hw version T0 EOF # # scan a range of IP addresses looking for an # open tcp port 17988 (the iLO virtual media port) # printf "Scanning..." nmap -n -P0 -sS -p 17988 -oG - $iprange | fgrep /open/ | awk '{print $2}' > $iloips printf "\n\n" # # open and read the list of IP addresses one at a time # exec 3< $iloips echo "--------------- ------ -------- ------------ ------------------------- -------------------- -----------------------------" echo "iLO IP Address iLO HW iLO FW Server S/N Server Model iLO Edition iLO Licence Key" echo "--------------- ------ -------- ------------ ------------------------- -------------------- -----------------------------" while read iloip <&3 ; do ilosfound=$ilosfound+1 # # attempt to read the xmldata from iLO, no password required # curl --proxy "" --fail --silent --max-time 3 http://$iloip/xmldata?item=All > $iloxml # # parse out the Server model (server product name) # from the XML output # parseiloxml SPN; servermodel=$parsedstring parseiloxml SBSN; sernum=$parsedstring parseiloxml PN; ilotype=$parsedstring parseiloxml FWRI; ilofirmware=$parsedstring parseiloxml HWRI; ilohardware=$parsedstring ilohwver=$(grep "$ilohardware" $ilohwvers|awk '{print $1}') if [ "$ilohwver" == "" ]; then ilohwver="N/A" fi if [ "$sernum" == "" ]; then sernum="N/A" fi # add start curl --proxy "" --fail --silent --max-time 3 http://$iloip/xmldata?item=CpqKey > $iloxml parseiloxml LNAME; ilomodel=$parsedstring parseiloxml KEY; ilokey=$parsedstring # add end printf "%-15s %-6s %-8s %-12s %-25s %-20s %-30s\n" $iloip "$ilohwver" "$ilofirmware" "$sernum" "$servermodel" "$ilomodel" "$ilokey" done printf "\n%d iLOs found on network target %s.\n\n" $ilosfound $iprange rm -f $iloips $iloxml $ilohwvers exit 0