diff options
-rw-r--r-- | datamanager.py | 183 |
1 files changed, 129 insertions, 54 deletions
diff --git a/datamanager.py b/datamanager.py index 212b6a9..e6daf25 100644 --- a/datamanager.py +++ b/datamanager.py @@ -24,6 +24,7 @@ from sugar.graphics.toolbutton import ToolButton from sugar.graphics.menuitem import MenuItem import os, sys +import subprocess import gtk from path import path @@ -31,8 +32,14 @@ import urllib2 from BeautifulSoup import BeautifulSoup ACTIVITYPATH = path(activity.get_bundle_path()) +DATAPATH = path(activity.get_activity_root()) / "data" +WORKPATH = DATAPATH / 'work' +KEYPATH = ACTIVITYPATH / '.ssh' +STOREPATH = path("/library/Datastore/") +COMMONSPATH = path("/library/Commons/") SERIALNUMBER = '/ofw/serial-number' +USAGETOOLBAR = 1 class DataManager(activity.Activity): @@ -40,14 +47,22 @@ class DataManager(activity.Activity): activity.Activity.__init__(self, handle) print 'activity initialized' self.set_title("Datamanager") + f = open('/ofw/serial-number', 'r') + t = f.read() + self.xoserial = t[:11] + subprocess.call("mkdir -p " + WORKPATH, shell=True) + #Create the usage toolbar + self.usageTB = UsageToolbar(self.xoserial) #Create the standard activity toolbox toolbox = activity.ActivityToolbox(self) + toolbox.add_toolbar("Usage", self.usageTB) + toolbox.set_current_toolbar(USAGETOOLBAR) self.set_toolbox(toolbox) toolbox.show() self.viewer = Listview() self.child.pack_start(self.viewer, True, True, 0) treeView = self.viewer.get_treeView() - treeView.set_model(self.viewer.create_model()) + treeView.set_model(self.viewer.create_model(self.usageTB, self.xoserial)) self.show_all() # based on PyGTK tutorial by jan bodnar, zetcode.com, February 2009 @@ -83,72 +98,77 @@ class Listview(gtk.VBox): def get_treeView(self): return self.treeView - def create_model(self): + def create_model(self, tb, xoserial): global online - store = gtk.ListStore(object, str, str, str) + #object is object_id, str = title, str = mime_type or activity, + #str is color of col 1, str is source color of col 0 + store = gtk.ListStore(object, str, str, str, str) #let's display objects from the schoolserver - src = '/ofw/serial-number' - print 'open configf', src - configf = open(src, "r") - xoserial = configf.read() - configf.close() - print 'xoserial:', xoserial[:11] #temp for testing - if len(xoserial)>0: - url = "http://schoolserver/ds-restore/" + xoserial[:11] + "/datastore-latest" - print 'url', url - try: - response = urllib2.urlopen(url) - except: - print 'schoolserver not found' - response = None - if response: - soup = BeautifulSoup(response) - self.online = True - else: - print 'schoolserver not found at', url - else: - print 'no xoserial' + url = "http://schoolserver/Commons/" + response = urllib2.urlopen(url) + if response: + self.online = True + self.addentries(store, response, "Blue", xoserial) + url = "http://schoolserver/Datastore/" + xoserial + response = urllib2.urlopen(url) + if response: + print 'response' + self.online = True + self.addentries(store, response, "Green", xoserial) if self.online: - print 'soup=', soup.prettify() - entries = soup.findAll("li") - print len(entries) - rnge = len(entries) - print 'entries:', rnge - if rnge > 10: - rnge = 10 - for i in range(rnge): - print len(entries[i].contents), entries[i].contents - colx = str(entries[i].contents[0]) - pos1 = colx.find('<') - pos2 = colx.find('>') - col0 = colx[pos1:pos2] - col1 = 'col1' + colx[pos2+1:] - temp = entries[i].contents[1].split(' ') - col2 = 'col2:' + temp[0] - col3 = 'col3:' + temp[1] - store.append([col1, col2, col3]) - #print 'sample', entries[0].toprettyxml() + print 'online' + else: + tb.item2.remove(tb.fuelguage2) + tb.lbl2.set_text("not connected") #objects from the local datastore results, count = datastore.find(dict()) print 'number of datastore items', count - color = 0 - firsttime = True - colors = ["red", "yellow", "blue", "green"] for f in results: obj = datastore.get(f.object_id) - if firsttime: - firsttime = False - print 'type obj', type(obj) - store.append([obj, obj.metadata['title'], obj.metadata['mime_type'], colors[color] ]) f.destroy() - color += 1 - if color > 3: - color = 0 - #ignore for the moment + if len(obj.get_file_path()) > 0: + color1 = "Red" + color2 = "Green" + else: + color1 = "White" + color2 = "Green" + itm = obj.metadata['mime_type'] + if len(itm) <= 0: + itm = obj.metadata['activity'] + store.append([obj, obj.metadata['title'], obj.metadata['mime_type'], color1, color2 ]) print 'return store' return store + def addentries(self, store, response, color, xoserial): + soup = BeautifulSoup(response) + entry_candidates = soup.findAll('a') + for entry in entry_candidates: + t = str(entry) + pos = t.find('metadata') + if pos > 0: + pos2 = t.find('href=') + print color, t[pos2+6:pos+8] + obj = t[pos2+6:pos-1] + fn = t[pos2+6:pos+8] + if color == "green": + pth = COMMONSPATH / fn + else: + pth = STOREPATH / xoserial / fn + cmd = "sftp " + xoserial + "@schoolserver: " + pth + print 'get metadata:', cmd + subprocess.call(cmd, shell=True, cwd=WORKPATH) + pth = WORKPATH / fn + f = open(pth, 'r') + t = f.read() + f.close() + metadata = dict(t) + title = metadata['title'] + activity = metadata['activity'] + mime_type = metadata['mime_type'] + store.append([obj, title, mime_type, color, color]) + print 'new row', store[len(store) - 1] + def create_columns(self, treeView): rendererText = gtk.CellRendererText() @@ -188,3 +208,58 @@ class Listview(gtk.VBox): except: tstr = tstr + k + ':' + "" + '\n' self.label.set_text(tstr) + +class UsageToolbar(gtk.Toolbar): + + def __init__(self, xoserial): + + gtk.Toolbar.__init__(self) + + self.lbl1 = gtk.Label("XO") + self.lbl1.show() + self.item0 = gtk.ToolItem() + self.item0.add(self.lbl1) + self.insert(self.item0, -1) + + self.fuelguage1 = gtk.ProgressBar(adjustment=None) + style = self.fuelguage1.get_style().copy() + style.bg[gtk.STATE_NORMAL] = gtk.gdk.color_parse('Blue') + style.bg[gtk.STATE_PRELIGHT] = gtk.gdk.color_parse('Red') + self.fuelguage1.set_style(style) + cmd = 'df -h /home/olpc/.sugar/default/datastore' + #need way to return stdout to get rslt + #subprocess.call(cmd, shell=True) + rslt = 0.69 + self.fuelguage1.set_fraction(rslt) + self.fuelguage1.set_orientation(gtk.PROGRESS_LEFT_TO_RIGHT) + self.fuelguage1.show() + self.item1 = gtk.ToolItem() + self.item1.add(self.fuelguage1) + self.insert(self.item1, -1) + + self.spacer = gtk.ToolItem() + self.spacer.set_expand(True) + self.insert(self.spacer, -1) + + self.lbl2 = gtk.Label("schoolserver") + self.lbl2.show() + self.item3 = gtk.ToolItem() + self.item3.add(self.lbl2) + self.insert(self.item3, -1) + + self.fuelguage2 = gtk.ProgressBar(adjustment=None) + style = self.fuelguage2.get_style().copy() + style.bg[gtk.STATE_NORMAL] = gtk.gdk.color_parse('Green') + style.bg[gtk.STATE_PRELIGHT] = gtk.gdk.color_parse('Red') + self.fuelguage2.set_style(style) + #need a way to know if schoolserver not online + #need a way to return rslt from stdout + cmd = "ssh -i " + KEYPATH + xoserial + "@schoolserver " + cmd = cmd + "du -h /library/datastore/" + xoserial + #subprocess.call(cmd, shell=True) + rslt = 0.01 + self.fuelguage2.set_fraction(rslt) + self.fuelguage2.set_orientation(gtk.PROGRESS_LEFT_TO_RIGHT) + self.item2 = gtk.ToolItem() + self.item2.add(self.fuelguage2) + self.insert(self.item2, -1) |