tosca daemon
diff --git a/xos/tosca/daemon.py b/xos/tosca/daemon.py
new file mode 100644
index 0000000..0fff6e2
--- /dev/null
+++ b/xos/tosca/daemon.py
@@ -0,0 +1,92 @@
+""" A very simple Tosca daemon. Every ten seconds it looks for new programs in
+    "run" or "destroy" status, and executes them.
+
+    TODO: Replace this with observer and/or model_policies ?
+"""
+
+import os
+import sys
+from threading import Thread
+import time
+
+# add the parent directory to sys.path
+import os,sys,inspect
+currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
+parentdir = os.path.dirname(currentdir)
+sys.path.append(parentdir)
+
+os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xos.settings")
+import django
+django.setup()
+
+from core.models import Program, User
+from nodeselect import XOSNodeSelector
+from imageselect import XOSImageSelector
+import traceback
+
+from engine import XOSTosca
+
+class ToscaDaemon(Thread):
+    def __init__(self):
+        Thread.__init__(self)
+        self.daemon = True
+
+    def run_program(self, model):
+        try:
+            print "*** Run Program %s ***" % model.name
+            model.status = "executing"
+            model.output = ""
+            model.save()
+            xt = XOSTosca(model.contents, parent_dir=currentdir, log_to_console=True)
+            xt.execute(model.owner)
+            model.output = "\n".join(xt.log_msgs)
+            model.status = "complete"
+        except:
+            model.output = traceback.format_exc()
+            model.status = "exception"
+            traceback.print_exc()
+        model.command = None
+        model.save()
+
+    def destroy_program(self, model):
+        try:
+            print "*** Destroy Program %s ***" % model.name
+            model.status = "executing"
+            model.output = ""
+            model.save()
+            xt = XOSTosca(model.contents, parent_dir=currentdir)
+            xt.destroy(model.owner)
+            model.output = "\n".join(xt.log_msgs)
+            model.status = "complete"
+        except:
+            model.output = traceback.format_exc()
+            model.status = "exception"
+            traceback.print_exc()
+        model.command = None
+        model.save()
+
+    def run_once(self):
+        models = Program.objects.filter(kind="tosca", command="run")
+        for model in models:
+            self.run_program(model)
+
+        models = Program.objects.filter(kind="tosca", command="destroy")
+        for model in models:
+            self.destroy_program(model)
+
+    def run(self):
+        while True:
+            self.run_once()
+            time.sleep(10)
+            django.db.reset_queries()
+
+if __name__ == "__main__":
+    if "--once" in sys.argv:
+        ToscaDaemon().execute_once()
+    else:
+        ToscaDaemon().start()
+
+        print "Running forever..."
+        while True:
+            time.sleep(60)
+