#!/usr/bin/python -u import sys import gobject import dbus import dbus.service import dbus.mainloop.glib import subprocess from obmc.dbuslib.bindings import get_dbus if (len(sys.argv) < 2): print "Usage: download_manager.py [system name]" exit(1) System = __import__(sys.argv[1]) DBUS_NAME = 'org.openbmc.managers.Download' OBJ_NAME = '/org/openbmc/managers/Download' TFTP_PORT = 69 class DownloadManagerObject(dbus.service.Object): def __init__(self,bus,name): dbus.service.Object.__init__(self,bus,name) bus.add_signal_receiver(self.DownloadHandler, dbus_interface = "org.openbmc.Flash", signal_name = "Download", path_keyword = "path") bus.add_signal_receiver(self.TftpDownloadHandler, signal_name = "TftpDownload", path_keyword = "path") @dbus.service.signal(DBUS_NAME,signature='ss') def DownloadComplete(self,outfile,filename): print "Download Complete: "+outfile return outfile @dbus.service.signal(DBUS_NAME,signature='s') def DownloadError(self,filename): pass def TftpDownloadHandler(self,ip,filename,path = None): try: filename = str(filename) print "Downloading: "+filename+" from "+ip outfile = System.FLASH_DOWNLOAD_PATH+"/"+filename rc = subprocess.call(["tftp", "-l",outfile,"-r",filename,"-g",ip]) if (rc == 0): self.DownloadComplete(outfile,filename) else: self.DownloadError(filename) except Exception as e: print "ERROR DownloadManager: "+str(e) self.DownloadError(filename) ## TODO: this needs to be deprecated. Shouldn't call flash interface from here def DownloadHandler(self,url,filename,path = None): try: filename = str(filename) print "Downloading: "+filename+" from "+url outfile = System.FLASH_DOWNLOAD_PATH+"/"+filename subprocess.call(["tftp", "-l",outfile,"-r",filename,"-g",url]) obj = bus.get_object("org.openbmc.control.Flash",path) intf = dbus.Interface(obj,"org.openbmc.Flash") intf.update(outfile) except Exception as e: print "ERROR DownloadManager: "+str(e) obj = bus.get_object("org.openbmc.control.Flash",path) intf = dbus.Interface(obj,"org.openbmc.Flash") intf.error("Download Error: "+filename) if __name__ == '__main__': dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) bus = get_dbus() name = dbus.service.BusName(DBUS_NAME, bus) obj = DownloadManagerObject(bus, OBJ_NAME) mainloop = gobject.MainLoop() print "Running Download Manager" mainloop.run()