summaryrefslogtreecommitdiffstats
path: root/pydownloadmgr/download_manager.py
blob: 7fb600fc3898f62b64e705ec9915f122b2d705c6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#!/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
OpenPOWER on IntegriCloud