#!/usr/bin/env python import sys, os, signal, logging import gobject import dbus.service import dbus.mainloop.glib import dbus.glib from olpc.datastore import DataStore, backingstore from sugar import logger gobject.threads_init() dbus.glib.threads_init() # Path handling profile = os.environ.get('SUGAR_PROFILE', 'default') base_dir = os.path.join(os.path.expanduser('~'), '.sugar', profile) repo_dir = os.path.join(base_dir, 'datastore') # operate from the repo directory if not os.path.exists(repo_dir): os.makedirs(repo_dir) log_dir = os.path.join(base_dir, "logs") if not os.path.exists(log_dir): os.makedirs(log_dir) #os.chdir(repo_dir) # setup logger logger.start('datastore') # check for old lockfiles, the rules here are that we can't be # connected to a tty. If we are not then in all likelyhood the process # was started automatically, which hopefully implies a single instance if not sys.stdin.isatty(): lf = os.path.join(repo_dir, 'fulltext', 'flintlock') if os.path.exists(lf): logging.warning("Old lock file found -- removing.") os.unlink(lf) # build the datastore dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) bus = dbus.SessionBus() connected = True ds = DataStore() ds.registerBackend(backingstore.FileBackingStore) ds.registerBackend(backingstore.InplaceFileBackingStore) # and run it logging.info("Starting Datastore %s" % (repo_dir)) mainloop = gobject.MainLoop() def handle_disconnect(): global mainloop mainloop.quit() logging.debug("Datastore disconnected from the bus.") def handle_shutdown(signum, frame): global mainloop mainloop.quit() raise SystemExit("Shutting down on signal %s" % signum) bus.set_exit_on_disconnect(False) bus.add_signal_receiver(handle_disconnect, signal_name='Disconnected', dbus_interface='org.freedesktop.DBus.Local') signal.signal(signal.SIGHUP, handle_shutdown) signal.signal(signal.SIGTERM, handle_shutdown) def main(): if '-m' in sys.argv: # mount automatically for local testing ds.mount(repo_dir) ds.complete_indexing() try: mainloop.run() except KeyboardInterrupt: logging.info("DataStore shutdown by user") except: logging.error("Datastore shutdown with error", exc_info=sys.exc_info()) main() ds.stop() #import hotshot #p = hotshot.Profile('hs.prof') #p.run('main()')