1#!/usr/bin/env python 2 3import os 4 5# TODO: openbmc/openbmc#2994 remove python 2 support 6try: # python 2 7 import gobject 8except ImportError: # python 3 9 from gi.repository import GObject as gobject 10 11import subprocess 12 13import dbus 14import dbus.mainloop.glib 15import dbus.service 16from obmc.dbuslib.bindings import get_dbus 17 18FLASH_DOWNLOAD_PATH = "/tmp" 19DBUS_NAME = "org.openbmc.managers.Download" 20OBJ_NAME = "/org/openbmc/managers/Download" 21TFTP_PORT = 69 22 23 24class DownloadManagerObject(dbus.service.Object): 25 def __init__(self, bus, name): 26 dbus.service.Object.__init__(self, bus, name) 27 bus.add_signal_receiver( 28 self.DownloadHandler, 29 dbus_interface="org.openbmc.Flash", 30 signal_name="Download", 31 path_keyword="path", 32 ) 33 bus.add_signal_receiver( 34 self.TftpDownloadHandler, 35 signal_name="TftpDownload", 36 path_keyword="path", 37 ) 38 39 @dbus.service.signal(DBUS_NAME, signature="ss") 40 def DownloadComplete(self, outfile, filename): 41 print("Download Complete: " + outfile) 42 return outfile 43 44 @dbus.service.signal(DBUS_NAME, signature="s") 45 def DownloadError(self, filename): 46 pass 47 48 def TftpDownloadHandler(self, ip, filename, path=None): 49 try: 50 filename = str(filename) 51 print("Downloading: " + filename + " from " + ip) 52 outfile = FLASH_DOWNLOAD_PATH + "/" + os.path.basename(filename) 53 rc = subprocess.call( 54 ["tftp", "-l", outfile, "-r", filename, "-g", ip] 55 ) 56 if rc == 0: 57 self.DownloadComplete(outfile, filename) 58 else: 59 self.DownloadError(filename) 60 61 except Exception as e: 62 print("ERROR DownloadManager: " + str(e)) 63 self.DownloadError(filename) 64 65 # TODO: this needs to be deprecated. 66 # Shouldn't call flash interface from here 67 def DownloadHandler(self, url, filename, path=None): 68 try: 69 filename = str(filename) 70 print("Downloading: " + filename + " from " + url) 71 outfile = FLASH_DOWNLOAD_PATH + "/" + os.path.basename(filename) 72 subprocess.call(["tftp", "-l", outfile, "-r", filename, "-g", url]) 73 obj = bus.get_object("org.openbmc.control.Flash", path) 74 intf = dbus.Interface(obj, "org.openbmc.Flash") 75 intf.update(outfile) 76 77 except Exception as e: 78 print("ERROR DownloadManager: " + str(e)) 79 obj = bus.get_object("org.openbmc.control.Flash", path) 80 intf = dbus.Interface(obj, "org.openbmc.Flash") 81 intf.error("Download Error: " + filename) 82 83 84if __name__ == "__main__": 85 dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) 86 bus = get_dbus() 87 obj = DownloadManagerObject(bus, OBJ_NAME) 88 mainloop = gobject.MainLoop() 89 name = dbus.service.BusName(DBUS_NAME, bus) 90 91 print("Running Download Manager") 92 mainloop.run() 93 94# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4 95