blob: 5cedbed286d70b16630a37e84917a323eaffd858 [file] [log] [blame]
#!/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 subprocess
import dbus
import dbus.mainloop.glib
import dbus.service
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