#!/usr/bin/env python import gobject import dbus import dbus.service import dbus.mainloop.glib import subprocess from obmc.dbuslib.bindings import get_dbus FLASH_DOWNLOAD_PATH = '/tmp' 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 = 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 = 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() obj = DownloadManagerObject(bus, OBJ_NAME) mainloop = gobject.MainLoop() name = dbus.service.BusName(DBUS_NAME, bus) print "Running Download Manager" mainloop.run() # vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4