| #!/usr/bin/env python |
| |
| import os |
| |
| # TODO: openbmc/openbmc#2994 remove python 2 support |
| try: # python 2 |
| import gobject |
| except ImportError: # python 3 |
| from gi.repository import GObject as 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 + "/" + os.path.basename(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 + "/" + os.path.basename(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 |