eeprom read CLI
diff --git a/readeeprom.C b/readeeprom.C
new file mode 100644
index 0000000..b9c6f69
--- /dev/null
+++ b/readeeprom.C
@@ -0,0 +1,71 @@
+#include <iostream>
+#include <memory>
+#include "argument.H"
+#include "writefrudata.H"
+
+static void exit_with_error(const char* err, char** argv)
+{
+    ArgumentParser::usage(argv);
+    std::cerr << std::endl;
+    std::cerr << "ERROR: " << err << std::endl;
+    exit(-1);
+}
+
+//--------------------------------------------------------------------------
+// This gets called by udev monitor soon after seeing hog plugs for EEPROMS. 
+//--------------------------------------------------------------------------
+int main(int argc, char **argv)
+{
+    int rc = 0;
+    uint8_t fruid = 0;
+
+    // Handle to per process system bus
+    sd_bus *bus_type = NULL;
+    
+    // Read the arguments.
+    auto cli_options = std::make_unique<ArgumentParser>(argc, argv);
+
+    // Parse out each argument.
+    auto eeprom_file = (*cli_options)["eeprom"];
+    if (eeprom_file == ArgumentParser::empty_string)
+    {
+        // User has not passed in the appropriate argument value
+        exit_with_error("eeprom data not found.", argv);
+    }
+
+    auto fruid_str = (*cli_options)["fruid"];
+    if (eeprom_file == ArgumentParser::empty_string)
+    {
+        // User has not passed in the appropriate argument value
+        exit_with_error("fruid data not found.", argv);
+    }
+
+    // Extract the fruid
+    fruid = strtol(fruid_str.c_str(), NULL, 16);
+    if(fruid == 0)
+    {
+        // User has not passed in the appropriate argument value
+        exit_with_error("Invalid fruid.", argv);
+    }
+
+    // Finished getting options out, so release the parser.
+    cli_options.release();
+
+    // Get a handle to System Bus
+    rc = sd_bus_open_system(&bus_type);
+    if (rc < 0) 
+    {
+        fprintf(stderr, "Failed to connect to system bus: %s\n",strerror(-rc));
+    }
+    else
+    {
+        // Now that we have the file that contains the eeprom data, go read it and
+        // update the Inventory DB.
+        rc = ipmi_validate_fru_area(fruid, eeprom_file.c_str(), bus_type);
+    }
+
+    // Cleanup
+    sd_bus_unref(bus_type);
+
+    return (rc < 0 ? EXIT_FAILURE : EXIT_SUCCESS);
+}