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