patrick_fisc...@dell.com wrote, On 02/26/2010 03:28 AM:
> We provide 2 Tools.
...
> Old: IT Assistant (requires a Windows 32 Bit OS)
> New: DMC (requires a w23 Host or VM)
> 
> Both tools are able to compare server revisions with the actual Updates.
> So you can run the comparison report to see which machines need to be
> updated. A snmp configuration on each machine is a must have.
...
> Maybe some of the Linux guys are able to run such reports with Nagios or
> anything else, maybe with reading out the FW and driver strings
> (omreport) and compare it with the latest versions from the Update DVD
> dell provide ca. 1 time per quarter.

I manage 100s of Debian, RHEL, and SLES boxes here.

I enclose a script that's hit/miss to do *some* inventory.
Here's sample output:

[r...@server1 MegaRAID]# /opt/sbin/ral-superinv
Hostname:        [server1]
Manufacturer:    [Dell Inc.]
Model:           [PowerEdge 2950]
Serial Number:   [XXXXXXX]
BIOS Version:    [2.4.3] *(!=2.6.1)
BMC Version:     [2.28] *(!=2.37)
PERC5i Version:  [1.03, 1.03]
PERC5E Version:  [1.03, 1.03, 1.03, 1.03, 1.03, 1.03, 1.03]
SASBP Version:   [1.05]
MD1000 Version:  [A.04, A.04, A.04, A.04, A.04]

It's seriously flawed, predominantly because it requires constant
manual updating to report out-of-rev BIOS, etc.  Why do i do this
and not run OMSA?

Because OMSA doesn't run on Debian, grrr.
It might provide you with some strategies to do inventory gathering
on your own.

Now, please note at the bottom of the script, there's a URL at Dell
that's titled "Enterprise BIOS and Firmware Matrix".  Wow, that's
awesome, something that would really help endusers, EXCEPT, it hasn't
been updated in years!! (more grrr).

So, it would be super-mega-awesome if Dell provided said Matrix
in a queryable format.  I.e. i'd like to be able to probe, say:

http://awesome.dell.com/pe2950/bios?fmt=csv&info=history

to get a history listing of all pe2950 BIOS updates including their
criticality status.  yeah, i'll keep dreaming...
But even a static (but maintained) table like the one proposed
at the "Enterprise BIOS and Firmware Matrix" page would be really
awesome (if i could easily programmatically parse it and rely
on its data being accurate and timely)

So, it looks like DMC might do this, but again, it locks me into
a *Windows* solution.  sigh.  SUU uses Java to do the Catalog
processing/inventory, why can't we have a platform-agnostic
tool that'll manage this (at least the inventory part).

Now, as far as updates go...

I've had limited success on Debian doing updates with various
DUP components.

BIOS: I've posted a thread in the past here on using libsmbios
on payloads extracted from DUP kits, and the '-writehdrfile'
option for Windows-only BIOS payloads (mostly for laptops, and
desktops not supported via DUP updates) with the dell_rbu
(Remote BIOS Update) kernel module & libsmbios.  That's all
pretty solid.

BMC: can't do that in Debian.  there's a "bmcflash" kit on
the linux.dell.com site, but it doesn't seem to work, and is
unmaintained.  Also the old list threads seem to discuss a
history of "bricking" servers and i think the connection with
that project getting scrapped.

SASDUPIE:  This kit can update SAS disks on Debian, but it
has a bug.  I wanted to dump all the payload images into the
payload directory, and running it in DEBUG mode shows it doing
"addfile" on each payload image, but when it comes to flashing
the disks, it ONLY attempts the first payload image in the
list.  So, with this version of 'sadupie', i'd have to modify
the caller script to scan "N" payload subdirectories, or build
my own catalog and specify the payload directory for the disk image
after doing all my own up-front processing.
(note that LD_LIBRARY_PATH has to be setup to point to all the
required "Lib" bits that are provided with the DUP kits)

The SUU doesn't even always work right.  And the diagnostics are
very poor.  Yes, i've learned:

iconv -f utf16 -t ascii /var/log/dell/suu/invcolError.log
less /var/log/dell/suu/{update,support}.log*

and having to 'FOO.BIN --extract' to find the PIEConfig
inventory execution bits and run them with '-debug' to
hopefully figure out what's going wrong.

AND having to always do:

rpm -e $(rpm -qa | egrep '(srvadmin|instsvc)') || rpm -e --noscripts $(rpm -qa 
| egrep '(srvadmin|instsvc)')

because leaving old instsvc or srvadmin kits on the system often
silently breaks suu.  Even to the point of it saying "Update Successful"
anyway, and me scratching my head why the BIOS is still out of date
on a server when i thought i'd updated it.  (this is on RHEL, since
SUU doesn't support Debian)

So, my first desire is to get a SIMPLE maintained, supported interface that
is platform agnostic for VALIDATING my server's status.  That one seems
like it should be pretty simple.  (the current SUU is not that answer.  It is
monolithic (huge) and not incrementally-updatable

My second is for an maintenance update system that is platform agnostic.

Perhaps these things exist, but it's also difficult trying to figure
out which system is the one to use (note the ITA vs DMC, SBUU vs SUU vs ..)
Even things like the Dell Capacity Planner/Calculator hav gone from
a Windows only executable to a Java app to a flash app to ???  and often
the new servers aren't included.   And, STILL:
www.dell.com/calc points to "ESSA" for the Blades, and you click that
link and get "can't find the server at solutions.dell.com."  (it's been
that way for MONTHS)

Thanks,
--stephen "Cranky Old Man Ramblin'" dowdy
#!/bin/sh
# Title:    ral-superinv
# Purpose:  obtain System Inventory info (firmware, etc)
# Author:   Stephen Dowdy (sdo...@ucar.edu)
# RCS:      $Header$
# Note:     See RCS/CVS Log info at End of File
# Requirements:  dmidecode, ipmitool, ddcprobe, xresprobe
# Caveats:
# Todo:
#
# Copyright UCAR (c) 2006-2009.
# University Corporation for Atmospheric Research (UCAR),
# National Center for Atmospheric Research (NCAR),
# Research Applications Laboratory (RAL),
# P.O. Box 3000, Boulder, Colorado, 80307-3000, USA.

is_debug() { [ ${DEBUG:-0} -ge 1 ] ;}
debug() { is_debug && echo "DEBUG: " "$@" 1>&2 ;}

preload() {

if [ -f /etc/debian_version ]; then
    #if ! type dmidecode >& /dev/null; then echo "Missing dmidecode";  exit 1; 
fi
    if ! dpkg-query -W --showformat='${Status}\n' dmidecode | grep -q 
'^install'; then
      echo "Installing 'dmidecode'..."
      apt-get install dmidecode >& /dev/null
    fi

    #if ! type ddcprobe >& /dev/null; then echo "Missing ddcprobe";  exit 1; fi
    if ! dpkg-query -W --showformat='${Status}\n' xresprobe | grep -q 
'^install'; then
      echo "Installing 'xresprobe'..."
      apt-get install xresprobe >& /dev/null
    fi
fi

# lame attempt to get IPMI functional
if type -p ipmitool >& /dev/null; then
    if [ $(lsmod | grep ipmi | wc -l) != 3 ]; then
        modprobe ipmi_si
        modprobe ipmi_devintf
        modprobe ipmi_msghandler
    fi
fi
}

inv_sys_hostname="$(hostname -s)"

# The dmidecode statements here are from earlier dmidecode releases
# that didn't support such niceties as "dmidecode -t bios"
get_sys_manufacturer() {
  dmidecode | egrep -A8 '^Handle (0x0100|0x0001|0x0005)' | grep 'Manufacturer:' 
\
    | sed -e 's/^[^:]*:[[:space:]]*\(.*[^ ]\)\([[:space:]]*$\)/\1/'
}

get_sys_model() {
  dmidecode | egrep -A8 '^Handle (0x0100|0x0001|0x0005)' | grep 'Product Name:' 
\
    | sed -e 's/^[^:]*:[[:space:]]*\(.*[^ ]\)\([[:space:]]*$\)/\1/'
}

get_sys_serialnumber() {
dmidecode | egrep -A8 '^Handle (0x0100|0x0001|0x0005)' \
    | sed -ne '/Serial Number:/s/^[^:]*:[[:space:]]*\(.*[^ 
]\)\([[:space:]]*$\)/\1/p'
}

get_sys_bios() {
  dmidecode | egrep -A8 '^Handle (0x0000)' | grep 'Version:' \
    | sed -e 's/^[^:]*:[[:space:]]*\(.*[^ ]\)\([[:space:]]*$\)/\1/'
}

get_sys_bmc() {
  if type -p ipmitool >/dev/null 2>&1; then
    tmp="$(ipmitool mc info 2>/dev/null | grep 'Firmware Revision' \
      | sed -e 's/^[^:]*:[[:space:]]*\(.*[^ ]\)\([[:space:]]*$\)/\1/')"
#    echo "${tmp:-N/A}"
    echo "${tmp}"
  else
#    echo "N/A"
    echo ""
  fi
}

# XXX this doesn't work reliably much, but Xorg.0.log
# XXX often has the monitor model correctly probed?
# XXX - nvidia proprietary drivers tend to disable this capability :-(
get_monitor_model() {
  tmp="$(ddcprobe | grep monitorname: | cut -d: -f2 \
  | sed -e 's/^[[:space:]]*\(.*[^ ]\)\([[:space:]]*$\)/\1/')"
  debug "monitor_model tmp=[${tmp}]"
  #echo "${tmp:-UNKNOWN}"
  echo "${tmp}"
}

get_monitor_serialnumber() {
  tmp="$(ddcprobe | grep monitorserial: \
  | sed -e 's/^[^:]*:[[:space:]]*\(.*[^ ]\)\([[:space:]]*$\)/\1/')"
  debug "monitor_serialnumber tmp=[${tmp}]"
  #echo "${tmp:-UNKNOWN}"
  echo "${tmp}"
}

# XXX - We don't rely on external LSI tools at this point
# XXX - we're trying to be lean, rely on well-established utilities
get_perc4() {
## Host: scsi0 Channel: 01 Id: 00 Lun: 00
##   Vendor: MegaRAID Model: LD 0 RAID1   69G Rev: 522D
##   Type:   Direct-Access                    ANSI SCSI revision: 02
awk -F: '
$1 ~ /Vendor/ && $2 ~ /MegaRAID/ && $3 ~ /LD [0-9] RAID/ {print $4; }
' /proc/scsi/scsi | tr -d ' ' | fmt -128 | sed -e 's/ /, /g'
}

get_perc5i() {
## Host: scsi0 Channel: 02 Id: 00 Lun: 00
##   Vendor: DELL     Model: PERC 5/i         Rev: 1.03
##   Type:   Direct-Access                    ANSI SCSI revision: 05
awk -F: '
$1 ~ /Vendor/ && $2 ~ /DELL/ && $3 ~ /PERC 5\/i/ {print $4; }
' /proc/scsi/scsi | tr -d ' ' | fmt -128 | sed -e 's/ /, /g'
}

get_perc5E() {
## Host: scsi2 Channel: 02 Id: 00 Lun: 00
##   Vendor: DELL     Model: PERC 5/E Adapter Rev: 1.03
##   Type:   Direct-Access                    ANSI SCSI revision: 05
awk -F: '
$1 ~ /Vendor/ && $2 ~ /DELL/ && $3 ~ /PERC 5\/E/ {print $4; }
' /proc/scsi/scsi | tr -d ' ' | fmt -128 | sed -e 's/ /, /g'
}

get_perc6i() {
## Host: scsi0 Channel: 02 Id: 00 Lun: 00
##   Vendor: DELL     Model: PERC 6/i         Rev: 1.11
##   Type:   Direct-Access                    ANSI SCSI revision: 05
awk -F: '
$1 ~ /Vendor/ && $2 ~ /DELL/ && $3 ~ /PERC 6\/i/ {print $4; }
' /proc/scsi/scsi | tr -d ' ' | fmt -128 | sed -e 's/ /, /g'
}

get_perc6E() {
## Host: scsi0 Channel: 02 Id: 00 Lun: 00
##   Vendor: DELL     Model: PERC 6/i         Rev: 1.11
##   Type:   Direct-Access                    ANSI SCSI revision: 05
awk -F: '
$1 ~ /Vendor/ && $2 ~ /DELL/ && $3 ~ /PERC 6\/E/ {print $4; }
' /proc/scsi/scsi | tr -d ' ' | fmt -128 | sed -e 's/ /, /g'
}

get_sasbp() {
## *** SAS Backplane example
## Host: scsi0 Channel: 00 Id: 32 Lun: 00
##   Vendor: DP       Model: BACKPLANE        Rev: 1.05
##   Type:   Enclosure                        ANSI SCSI revision: 05
awk -F: '
$1 ~ /Vendor/ && $2 ~ /DP/ && $3 ~ /BACKPLANE/  {print $4; }
' /proc/scsi/scsi | tr -d ' '
}

get_scabp() {
## *** SCSI/SCA Backplane example
## Host: scsi0 Channel: 00 Id: 06 Lun: 00
##   Vendor: PE/PV    Model: 1x2 SCSI BP      Rev: 1.0
##   Type:   Processor                        ANSI SCSI revision: 02
awk -F: '
$1 ~ /Vendor/ && $2 ~ /PE\/PV/ && $3 ~ /SCSI BP/  {print $4; }
' /proc/scsi/scsi | tr -d ' '
}

get_md1000() {
## Host: scsi2 Channel: 00 Id: 18 Lun: 00
##   Vendor: DELL     Model: MD1000           Rev: A.04
##   Type:   Enclosure                        ANSI SCSI revision: 05
awk -F: '
$1 ~ /Vendor/ && $2 ~ /DELL/ && $3 ~ /MD1000/ {print $4; }
' /proc/scsi/scsi | tr -d ' ' | fmt -128 | sed -e 's/ /, /g'
}

# XXX use sg3utils as documented in END_NOTES to obtain Serial Number

get_pv220() {
:
}
# XXX use sg3utils as documented in END_NOTES to obtain Serial Number

check_bios_bmc_bp() {
model=$1
type=$2
value=$3
    case $type in
        bios)   field=2;;
        bmc)    field=3;;
        bp)     field=4;;
    esac
    val_expected=$(awk -F, "{ if ( \$1 == \"${model}\" ) { print \$${field} } 
}" <<EOF
#Model,BIOS,BMC,BackPlane
Latitude E4300,A14
Latitude E6500,A19
Precision WorkStation T3500,A04
Precision WorkStation T5400,A05
Precision WorkStation T5500,A03
Precision WorkStation 490,A08
Precision WorkStation 530MT,A11
Precision WorkStation 650,A05
Precision WorkStation 670,A07
Precision WorkStation 690,A08
PowerEdge 1750,A12,1.84,1.1?
PowerEdge 1800,A07,1.83,A04
PowerEdge 1850,A07,1.83,1.00
PowerEdge 1950,2.6.1,2.37,1.05
PowerEdge 2800,A07,1.83,A04
PowerEdge 2850,A07,1.83,1.00
PowerEdge 2900,2.4.3,2.28,
PowerEdge 2950,2.6.1,2.37,
PowerEdge R610,1.3.6,1.30,1.07
PowerEdge R710,1.3.6,1.30,1.07
EOF)
    debug "model=[${model}],type=[${type}],value=[${value}], 
val_expected=[${val_expected}]"
    if [ -z "${val_expected}" ]; then
        echo "(?)"
    elif [ "${value}" != "${val_expected}" ]; then
        echo "*(!=${val_expected})"
    fi
}


# XXX Gotta keep this correct and maintained
check_perc4() {
rev=$(echo "$1" | cut -f1 -d,)
rev_expected="5B2D"
    [ "${rev}" != "${rev_expected}" ] && echo "*(!=${rev_expected})"
}
check_perc5i() {
rev=$(echo "$1" | cut -f1 -d,)
rev_expected="5B2D"
    [ "${rev}" != "${rev_expected}" ] && echo "*(!=${rev_expected})"
}
check_perc5e() {
rev=$(echo "$1" | cut -f1 -d,)
rev_expected="5B2D"
    [ "${rev}" != "${rev_expected}" ] && echo "*(!=${rev_expected})"
}
check_perc6i() {
rev=$(echo "$1" | cut -f1 -d,)
rev_expected="5B2D"
    [ "${rev}" != "${rev_expected}" ] && echo "*(!=${rev_expected})"
}
check_perc6e() {
rev=$(echo "$1" | cut -f1 -d,)
rev_expected="5B2D"
    [ "${rev}" != "${rev_expected}" ] && echo "*(!=${rev_expected})"
}
check_md1000() {
rev=$(echo "$1" | cut -f1 -d,)
rev_expected="A04"
    [ "${rev}" != "${rev_expected}" ] && echo "*(!=${rev_expected})"
}

# ========================================================================
# MAIN
# ========================================================================

preload

inv_sys_manufacturer="$(get_sys_manufacturer)"
inv_sys_model="$(get_sys_model)"
inv_sys_serialnumber="$(get_sys_serialnumber)"
inv_sys_bios="$(get_sys_bios)"
inv_sys_bmc="$(get_sys_bmc)"
inv_sys_perc4="$(get_perc4)"
inv_sys_perc5i="$(get_perc5i)"
inv_sys_perc5e="$(get_perc5E)"
inv_sys_perc6i="$(get_perc6i)"
inv_sys_perc6E="$(get_perc6E)"
inv_sys_sasbp="$(get_sasbp)"
inv_sys_scabp="$(get_scabp)"
inv_sys_md1000="$(get_md1000)"
inv_sys_pv220="$(get_pv220)"

inv_monitor_model="$(get_monitor_model)"
inv_monitor_serialnumber="$(get_monitor_serialnumber)"

echo "Hostname:        [${inv_sys_hostname}]"
echo "Manufacturer:    [${inv_sys_manufacturer}]"
echo "Model:           [${inv_sys_model}]"
echo "Serial Number:   [${inv_sys_serialnumber}]"
echo "BIOS Version:    [${inv_sys_bios}] $(check_bios_bmc_bp "${inv_sys_model}" 
bios ${inv_sys_bios})"
[ -n "${inv_sys_bmc}" ] && \
echo "BMC Version:     [${inv_sys_bmc}] $(check_bios_bmc_bp "${inv_sys_model}" 
bmc ${inv_sys_bmc})"
[ -n "${inv_sys_perc4}" ] && \
echo "PERC4 Version:   [${inv_sys_perc4}] $(check_perc4 "${inv_sys_perc4}")"
[ -n "${inv_sys_perc5i}" ] && \
echo "PERC5i Version:  [${inv_sys_perc5i}]"
[ -n "${inv_sys_perc5e}" ] && \
echo "PERC5E Version:  [${inv_sys_perc5e}]"
[ -n "${inv_sys_perc6i}" ] && \
echo "PERC6i Version:  [${inv_sys_perc6i}]"
[ -n "${inv_sys_perc6e}" ] && \
echo "PERC6E Version:  [${inv_sys_perc6E}]"
[ -n "${inv_sys_sasbp}" ] && \
echo "SASBP Version:   [${inv_sys_sasbp}]"
[ -n "${inv_sys_scabp}" ] && \
echo "SCABP Version:   [${inv_sys_scabp}]"
[ -n "${inv_sys_md1000}" ] && \
echo "MD1000 Version:  [${inv_sys_md1000}]"

[ -n "${inv_monitor_model}" ] && \
echo "Monitor Model:   [${inv_monitor_model}]"
[ -n "${inv_monitor_serialnumber}" ] && \
echo "Monitor SerNum:  [${inv_monitor_serialnumber}]"

#echo "Hostname, System Manufacturer, System Model, System Serial Number, 
System BIOS, BMC version, Monitor Model, Monitor SerialNumber"
#echo "${inv_sys_hostname}, ${inv_sys_manufacturer}, ${inv_sys_model}" \
#     ", ${inv_sys_serialnumber}, ${inv_sys_bios}, ${inv_sys_bmc}" \
#     ", ${inv_monitor_model}, ${inv_monitor_serialnumber}"


### --- Appendix ------------------------------------------------------------
exit 0

: <<"END_NOTES"
Handle 0x0100
        DMI type 1, 25 bytes.
        System Information
                Manufacturer: Dell Inc.                
                Product Name: Precision WorkStation 670    
                Version: Not Specified
                Serial Number: 2MX9Q81
                UUID: 44454C4C-4D00-1058-8039-B2C04F513831
                Wake-up Type: Power Switch



Handle 0x0000, DMI type 0, 20 bytes
BIOS Information
        Vendor: Dell Computer Corporation
        Version: A05


Handle 0x0000
        DMI type 0, 20 bytes.
        BIOS Information
                Vendor: Dell Computer Corporation
                Version: A11


----------------------------
[ /proc/scsi/scsi ]

*** SCSI/SCA Backplane example
Host: scsi0 Channel: 00 Id: 06 Lun: 00
  Vendor: PE/PV    Model: 1x2 SCSI BP      Rev: 1.0
  Type:   Processor                        ANSI SCSI revision: 02

*** SAS Backplane example
Host: scsi0 Channel: 00 Id: 32 Lun: 00
  Vendor: DP       Model: BACKPLANE        Rev: 1.05
  Type:   Enclosure                        ANSI SCSI revision: 05

*** PERC 6/i example
Host: scsi0 Channel: 02 Id: 00 Lun: 00
  Vendor: DELL     Model: PERC 6/i         Rev: 1.11
  Type:   Direct-Access                    ANSI SCSI revision: 05


Host: scsi0 Channel: 01 Id: 00 Lun: 00
  Vendor: MegaRAID Model: LD 0 RAID1   69G Rev: 522D
  Type:   Direct-Access                    ANSI SCSI revision: 02


sg_scan -ia

md1000_svctag=$(sg_ses -p 0x4  /dev/sg9 | grep '^ 20[[:space:]]\+' | cut 
-b68-74)

PowerEdge 1950
    2.6.1(rec)
    2.5.0(opt)
    2.4.3(urg)
    2.3.1(urg)
    2.2.6(rec)
    2.1.1(rec)
    2.0.1(rec)
    1.5.1(rec)
    1.3.7(urg)
    1.2.0(opt)
    1.1.0(urg)
    1.0.1(rec)


This link is TOTALLY unmaintained :-(
http://support.dell.com/support/topics/global.aspx/support/downloads/en/bios_and_firmware?~ck=ln&c=us&l=en&lnki=0&s=gen

END_NOTES

: <<"RCS_INFO"
$Header$
$Log$
RCS_INFO

# :set expandtab shiftwidth=4 tabstop=4 noai

_______________________________________________
Linux-PowerEdge mailing list
Linux-PowerEdge@dell.com
https://lists.us.dell.com/mailman/listinfo/linux-poweredge
Please read the FAQ at http://lists.us.dell.com/faq

Reply via email to