DataManager version 1

Wade Brainerd wadetb at
Tue Sep 22 10:19:55 EDT 2009

Hi Tony,

This sounds like a great approach to managing backup.  I particularly like
the color coding scheme and the way the user gets control over the process.

I wonder if this feature should be integrated into the Journal itself
somehow, or pehaps made into a  control panel applet?  It seems like doing
the work when you hit 'Stop' is inconsistent with the way other activities
function.  A control panel applet would also get better privileges by

I tried to launch DataManager as downloaded from ASLO but it hit an
exception.  Attached is a patch which lets it get further through startup,
but it still fails looking for ~/.sugar/default/datastore/store.  I'm not
familiar with the format of the datastore, or how it has changed in recent
Sugar versions.

Looking forward to seeing how this progresses.  Let us know how it does in


On Fri, Aug 28, 2009 at 1:38 PM, Tony Anderson <tony at> wrote:

> Hi,
> I posted the DataManager activity to ASLO today. It matches the code
> currently on gitorious.
> The intent of the DataManager is to deal with a problem faced in Nepal
> which is the small size of the Nand. The current backup/restore feature
> does not provide a way for the user to remove entries from the local store.
> The activity works on 0.82 with the Nepal version of the schoolserver,
> although I don't see why it wouldn't work with any version.
> It works in three phases. At launch it builds a list from the schoolserver
> (when connected) of all the entries. It provides a color code:
> light green - entry not stored locally
> green - entry stored locally (as well as on the schoolserver)
> cyan - entry on the schoolserver in Commons
> blue - entry from Commons stored locally
> red - new entry not yet uploaded to the schoolserver
> white - entry without an associated document
> The status bar reports the number of entries in the datastore and the
> percentage of the Nand in use.
> In phase 2 the user can double-click on an entry. If it is on the local XO
> (green or blue), it will be removed (but will still be on the schoolserver).
> If it is not on the XO (light green or cyan), it will be downloaded to the
> XO.
> When the user clicks on the Stop button on the activity toolbar, the
> activity performs the file operations: upload, download, and delete based on
> the user's requests. Entries in red are automatically saved to the
> schoolserver. Entries in white are deleted (to the best of may
> understanding, resuming these entries is the same as launching from the home
> view so they essentially only clutter the journal).
> This mechanism gives a simple way for the user to control what is available
> when the XO is not connected to the schoolserver (after school, for
> example). It also protects the datastore in case the XO must be reflashed.
> Implementation requires that the DataManager activity runs as olpc (added
> to the activityfactory list) and that public keys and permissions be
> implemented on the schoolserver (something that a deployment should do when
> the XO registers with the schoolserver)
> I hope to see this activity get a live workout when I return to Nepal at
> the end of September. In the meantime, it is available for test and comment.
> Yours,
> Tony
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>
-------------- next part --------------
From 5d52b0f699cb1c18bbeed3b363a014d73299d55d Mon Sep 17 00:00:00 2001
From: Wade Brainerd <wadetb at>
Date: Tue, 22 Sep 2009 14:10:39 +0000
Subject: [PATCH] Fixes for SoaS
 Do not hard code the home directory.
 Use the Sugar owner's public key as a serial number when the OLPC hardware serial number is not available.

--- |   40 ++++++++++++++++++++++++++++++++++------
 1 files changed, 34 insertions(+), 6 deletions(-)

diff --git a/ b/
index 95fc039..612ed63 100644
--- a/
+++ b/
@@ -37,13 +37,14 @@ from time import strftime
 import urllib2
 from BeautifulSoup import BeautifulSoup
+HOMEPATH = path(os.environ['HOME'])
 ACTIVITYPATH = path(activity.get_bundle_path())
 DATAPATH = path(activity.get_activity_root()) / "data"
 STOREPATH = path("/library/Datastore")
 COMMONSPATH = path("/library/Commons")
-LOCALPATH = path("/home/olpc/.sugar/default/datastore/store")
+LOCALPATH = HOMEPATH / ".sugar/default/datastore/store"
 DATEFORMAT = "%Y-%m-%d %H:%M:%S"
@@ -60,11 +61,16 @@ class DataManager(activity.Activity):
         activity.Activity.__init__(self, handle)
-        f = open('/ofw/serial-number', 'r')
-        t =
-        f.close()
-        SERIALNUMBER = t[:11]
+        # Determine a unique serial number for this computer.
+        SERIALNUMBER = self._get_serial_number() 
+        if not SERIALNUMBER:
+            print "Unable to determine a serial number."
+            sys.exit(1)
         print 'serial-number', SERIALNUMBER
         quitflag = False"mkdir -p " + WORKPATH, shell=True)
         #Create the usage toolbar
@@ -89,6 +95,28 @@ class DataManager(activity.Activity):
         txt = txt + str(MB) + '/1000 ' + str(PCT) + '%'
+    def _get_serial_number(self):
+        serial = None
+        # On OLPC XO laptops, read the hardware serial number from Open Firmware.
+        try:
+            f = open('/ofw/serial-number', 'r')
+            serial =[:11]
+            f.close()
+        except IOError:
+            # On SoaS and other distributions, use the public key.
+            try:
+                f = open(HOMEPATH + '/.sugar/default/', 'r')
+                serial =[8:19]
+                f.close()
+            except IOError:
+                pass
+        return serial
     def write_file(self, file_path):
         global SERIALNUMBER
         global store
@@ -522,7 +550,7 @@ class UsageToolbar(gtk.Toolbar):[gtk.STATE_NORMAL] = gtk.gdk.color_parse('White')[gtk.STATE_PRELIGHT] = gtk.gdk.color_parse('Red')
-        cmd = 'du -h /home/olpc/.sugar/default/datastore > /tmp/rslt'
+        cmd = 'du -h ' + HOMEPATH + '/.sugar/default/datastore > /tmp/rslt'
         #need way to return stdout to get rslt, shell=True)
         f = open('/tmp/rslt','r')

More information about the Devel mailing list