add support for persistent storage flashing scheme
diff --git a/bin/Barreleye.py b/bin/Barreleye.py
index bc05722..15d387c 100755
--- a/bin/Barreleye.py
+++ b/bin/Barreleye.py
@@ -141,15 +141,12 @@
 		'monitor_process' : True,
 		'process_name'    : 'button_power.exe',
 	},
-
         'reset_button' : {
                 'system_state'    : 'BMC_STARTING',
                 'start_process'   : True,
                 'monitor_process' : True,
                 'process_name'    : 'button_reset.exe',
         },
-
-
 	'led_control' : {
 		'system_state'    : 'BMC_STARTING',
 		'start_process'   : True,
@@ -162,6 +159,12 @@
 		'monitor_process' : True,
 		'process_name'    : 'flash_bios.exe',
 	},
+	'bmc_flash_control' : {
+		'system_state'    : 'BMC_STARTING',
+		'start_process'   : True,
+		'monitor_process' : True,
+		'process_name'    : 'bmc_update.py',
+	},
 	'download_manager' : {
 		'system_state'    : 'BMC_STARTING',
 		'start_process'   : True,
diff --git a/bin/bmc_update.py b/bin/bmc_update.py
new file mode 100755
index 0000000..e68dcf7
--- /dev/null
+++ b/bin/bmc_update.py
@@ -0,0 +1,126 @@
+#!/usr/bin/python -u
+
+import gobject
+import dbus
+import dbus.service
+import dbus.mainloop.glib
+import Openbmc
+import shutil
+import tarfile
+
+DBUS_NAME = 'org.openbmc.control.BmcFlash'
+OBJ_NAME = '/org/openbmc/control/flash/bmc'
+FLASH_INTF = 'org.openbmc.Flash'
+DOWNLOAD_INTF = 'org.openbmc.managers.Download'
+
+UPDATE_PATH = '/run/initramfs'
+
+
+def doExtract(members,files):
+    for tarinfo in members:
+        if files.has_key(tarinfo.name) == True:
+            yield tarinfo
+
+
+class BmcFlashControl(Openbmc.DbusProperties,Openbmc.DbusObjectManager):
+	def __init__(self,bus,name):
+		self.dbus_objects = { }
+		Openbmc.DbusProperties.__init__(self)
+		Openbmc.DbusObjectManager.__init__(self)
+		dbus.service.Object.__init__(self,bus,name)
+		
+		self.Set(DBUS_NAME,"status","Idle")
+		self.Set(DBUS_NAME,"filename","")
+		self.Set(DBUS_NAME,"preserve_network_settings",False)
+		self.Set(DBUS_NAME,"restore_application_defaults",False)
+		self.Set(DBUS_NAME,"update_kernel_and_apps_only",False)
+	
+		bus.add_signal_receiver(self.download_error_handler,signal_name = "DownloadError")
+		bus.add_signal_receiver(self.download_complete_handler,signal_name = "DownloadComplete")
+
+		self.InterfacesAdded(name,self.properties)
+
+
+	@dbus.service.method(DBUS_NAME,
+		in_signature='ss', out_signature='')
+	def updateViaTftp(self,ip,filename):
+		self.TftpDownload(ip,filename)
+		self.Set(DBUS_NAME,"status","Downloading")
+		
+	@dbus.service.signal(DOWNLOAD_INTF,signature='ss')
+	def TftpDownload(self,ip,filename):
+		self.Set(DBUS_NAME,"filename",filename)
+		pass		
+
+
+	## Signal handler
+	def download_error_handler(self,filename):
+		if (filename == self.Get(DBUS_NAME,"filename")):
+			self.Set(DBUS_NAME,"status","Download Error")
+
+	def download_complete_handler(self,outfile,filename):
+		## do update
+		if (filename != self.Get(DBUS_NAME,"filename")):
+			return
+	
+		print "Download complete. Updating..."
+	
+		self.Set(DBUS_NAME,"status","Download Complete")
+		copy_files = {}
+		
+		## determine needed files
+		if (self.Get(DBUS_NAME,"update_kernel_and_apps_only") == False):
+			copy_files["image-bmc"] = True
+		else:
+			copy_files["image-kernel"] = True
+			copy_files["image-initramfs"] = True
+			copy_files["image-rofs"] = True
+
+		if (self.Get(DBUS_NAME,"restore_application_defaults") == True):
+			copy_files["image-rofs"] = True
+			
+		
+		## make sure files exist in archive
+		try:
+			tar = tarfile.open(outfile,"r")
+			files = {}
+			for f in tar.getnames():
+				files[f] = True
+			tar.close()
+			for f in copy_files.keys():
+				if (files.has_key(f) == False):
+					raise Exception("ERROR: File not found in update archive: "+f)							
+
+		except Exception as e:
+			print e
+			self.Set(DBUS_NAME,"status","Update Error")
+			return
+
+		try:
+			tar = tarfile.open(outfile,"r")
+			tar.extractall(UPDATE_PATH,members=doExtract(tar,copy_files))
+			tar.close()
+	
+			if (self.Get(DBUS_NAME,"preserve_network_settings") == True):
+				shutil.copy2("/dev/mtd2",UPDATE_PATH+"image-u-boot-env")
+				
+		except Exception as e:
+			print e
+			self.Set(DBUS_NAME,"status","Update Error")
+				
+		
+
+		self.Set(DBUS_NAME,"status","Update Success.  Please reboot.")
+		
+
+if __name__ == '__main__':
+    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
+
+    bus = Openbmc.getDBus()
+    name = dbus.service.BusName(DBUS_NAME, bus)
+    obj = BmcFlashControl(bus, OBJ_NAME)
+    mainloop = gobject.MainLoop()
+    
+    print "Running Bmc Flash Control"
+    mainloop.run()
+
diff --git a/objects/flash_bios_obj.c b/objects/flash_bios_obj.c
index bbd1c55..89ddc4e 100644
--- a/objects/flash_bios_obj.c
+++ b/objects/flash_bios_obj.c
@@ -308,8 +308,8 @@
 		c--;

 	}

 

-	const char* inst[] = {"bios","bmc","bmc_ramdisk","bmc_kernel"};

-  	for (i=0;i<4;i++)

+	const char* inst[] = {"bios"};

+  	for (i=0;i<1;i++)

   	{

 		gchar* s;

 		s = g_strdup_printf ("%s/%s",dbus_object_path,inst[i]);