blob: 980341b38cb7b564a2feff9ac75f8e010e00f371 [file] [log] [blame]
Norman James372b9662015-10-06 07:47:55 -05001#!/usr/bin/env python
2
3import sys
4import gobject
5import dbus
6import dbus.service
7import dbus.mainloop.glib
8import tftpy
9
10
11
12DBUS_NAME = 'org.openbmc.managers.Flash'
Norman James068efb32015-10-06 16:52:28 -050013OBJ_NAME = '/org/openbmc/managers/Flash'
Norman James372b9662015-10-06 07:47:55 -050014TFTP_PORT = 69
15DOWNLOAD_DIR = '/tmp'
16
17class FlashManagerObject(dbus.service.Object):
18 def __init__(self,bus,name):
19 self.dbus_objects = { }
Norman James068efb32015-10-06 16:52:28 -050020 self.status = { 'bios' : 'OK', 'bmc' : 'OK' }
Norman James372b9662015-10-06 07:47:55 -050021 dbus.service.Object.__init__(self,bus,name)
22 ## load utilized objects
23 self.dbus_objects = {
24 'bios' : {
25 'bus_name' : 'org.openbmc.flash.Bios',
26 'object_name' : '/org/openbmc/flash/Bios_0',
27 'interface_name' : 'org.openbmc.Flash'
28 },
29 'bmc' : {
30 'bus_name' : 'org.openbmc.flash.Bmc',
31 'object_name' : '/org/openbmc/flash/Bmc_0',
32 'interface_name' : 'org.openbmc.Flash'
33 }
34 }
35 bus = dbus.SessionBus()
Norman James068efb32015-10-06 16:52:28 -050036 bus.add_signal_receiver(self.UpdatedHandler,
37 dbus_interface = "org.openbmc.Flash", signal_name = "Updated", path_keyword='path')
38
39
40 def UpdatedHandler(self,path = None):
41 print "Flash update finish: "+path
42 for flash in self.dbus_objects:
43 if (path == self.dbus_objects[flash]['object_name']):
44 self.status[flash] = 'OK'
Norman James372b9662015-10-06 07:47:55 -050045
46 def getInterface(self,name):
47 o = self.dbus_objects[name]
48 obj = bus.get_object(o['bus_name'],o['object_name'])
49 return dbus.Interface(obj,o['interface_name'])
50
51 @dbus.service.method(DBUS_NAME,
Norman James068efb32015-10-06 16:52:28 -050052 in_signature='', out_signature='a{ss}')
53 def getStatus(self):
54 return self.status
55
56 @dbus.service.method(DBUS_NAME,
Norman James372b9662015-10-06 07:47:55 -050057 in_signature='sss', out_signature='')
58 def updateFromTftp(self,flash,url,filename):
59 if (self.dbus_objects.has_key(flash) == False):
Norman James068efb32015-10-06 16:52:28 -050060 print "ERROR FlashManager: Not a valid flash device: "+flash
Norman James372b9662015-10-06 07:47:55 -050061 return
62 try:
Norman James068efb32015-10-06 16:52:28 -050063 ## need to make download async
64 self.status[flash]="DOWNLOADING"
65 filename = str(filename)
Norman James372b9662015-10-06 07:47:55 -050066 client = tftpy.TftpClient(url, TFTP_PORT)
Norman James068efb32015-10-06 16:52:28 -050067 print "Downloading: "+filename+" from "+url
Norman James372b9662015-10-06 07:47:55 -050068 outfile = DOWNLOAD_DIR+"/"+filename
Norman James068efb32015-10-06 16:52:28 -050069 client.download(filename,outfile)
Norman James372b9662015-10-06 07:47:55 -050070 intf = self.getInterface(flash)
Norman James068efb32015-10-06 16:52:28 -050071 self.status[flash]="FLASHING"
Norman James372b9662015-10-06 07:47:55 -050072 intf.update(outfile)
73
74 except Exception as e:
Norman James068efb32015-10-06 16:52:28 -050075 print "ERROR FlashManager: "+str(e)
76 self.status="ERROR"
Norman James372b9662015-10-06 07:47:55 -050077
78
79
80if __name__ == '__main__':
81 dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
82
83 bus = dbus.SessionBus()
84 name = dbus.service.BusName(DBUS_NAME, bus)
85 obj = FlashManagerObject(bus, OBJ_NAME)
86 mainloop = gobject.MainLoop()
87
88 print "Running Flash Manager"
89 mainloop.run()
90