New firmware_utils.py with get_firmware_info function.

Change-Id: Ie4ab784eb4ab452abd18ee34e42a64cfec782626
Signed-off-by: Michael Walsh <micwalsh@us.ibm.com>
diff --git a/lib/firmware_utils.py b/lib/firmware_utils.py
new file mode 100755
index 0000000..2964814
--- /dev/null
+++ b/lib/firmware_utils.py
@@ -0,0 +1,75 @@
+#!/usr/bin/env python
+
+r"""
+This module contains functions which pertain to firmware.
+"""
+
+import bmc_ssh_utils as bsu
+import var_funcs as vf
+
+
+def get_hard_disk_info(device="/dev/sdb"):
+
+    r"""
+    Get firmware information for the given device on the OS and return it as a
+    dictionary.
+
+    Description of argument(s):
+    device  The device to be passed to the hdparm and lsblk commands (e.g.
+            "/dev/sdb").
+
+    Example result:
+
+    sda_info:
+      [model_number]:                        MTFDDAK1T9TCB 00LY461 00LY570IBM
+      [serial_number]:                       179C413F
+      [firmware_revision]:                   MJ06
+      [transport]:                           Serial, ATA8-AST, SATA 1.0a, SATA II Extensions, SATA Rev 2.5, SATA Rev 2.6, SATA Rev 3.0
+      [used]:                                unknown (minor revision code 0x006d)
+      [supported]:                           enhanced erase
+      [likely_used]:                         10
+      [lba_user_addressable_sectors]:        268435455
+      [lba48_user_addressable_sectors]:      3750748848
+      [logical_sector_size]:                 512 bytes
+      [physical_sector_size]:                4096 bytes
+      [logical_sector-0_offset]:             0 bytes
+      [device_size_with_m_=_1024*1024]:      1831420 MBytes
+      [device_size_with_m_=_1000*1000]:      1920383 MBytes (1920 GB)
+      [form_factor]:                         2.5 inch
+      [nominal_media_rotation_rate]:         Solid State Device
+      [queue_depth]:                         32
+      [standby_timer_values]:                spec'd by Standard, with device specific minimum
+      [r/w_multiple_sector_transfer]:        Max = 16 Current = 16
+      [advanced_power_management_level]:     254
+      [dma]:                                 mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 udma5 *udma6
+      [cycle_time]:                          no flow control=120ns IORDY flow control=120ns
+      [pio]:                                 pio0 pio1 pio2 pio3 pio4
+      [security]:
+      [not_expired]:                         security count
+      [logical_unit_wwn_device_identifier]:  500a0751179c413f
+      [naa]:                                 5
+      [ieee_oui]:                            00a075
+      [unique_id]:                           1179c413f
+      [checksum]:                            correct
+      [name]:                                sda1
+      [maj:min]:                             8:1
+      [rm]:                                  1
+      [size]:                                4M
+      [ro]:                                  0
+      [type]:                                part
+      [mountpoint]:
+
+    """
+
+    cmd_buf = "hdparm -I " + device + " | egrep \":.+\" | sed -re" +\
+        " \"s/[ \t]+/ /g\""
+    stdout, stderr, rc = bsu.os_execute_command(cmd_buf)
+
+    firmware_dict = vf.key_value_outbuf_to_dict(stdout)
+
+    cmd_buf = "lsblk -P " + device + " | sed -re 's/\" /\"\\n/g'"
+    stdout, stderr, rc = bsu.os_execute_command(cmd_buf)
+    firmware_dict.update(vf.key_value_outbuf_to_dict(stdout, delim='=',
+                                                     strip=" \""))
+
+    return firmware_dict