[Extras-cauldron-commits] r126 - in branches/qserver_branch: . qserver

danielwilms at garage.maemo.org danielwilms at garage.maemo.org
Wed Apr 1 18:47:02 EEST 2009


Author: danielwilms
Date: 2009-04-01 18:47:01 +0300 (Wed, 01 Apr 2009)
New Revision: 126

Added:
   branches/qserver_branch/qserver/
   branches/qserver_branch/qserver/README
   branches/qserver_branch/qserver/TODO
   branches/qserver_branch/qserver/org.maemo.qserver.conf
   branches/qserver_branch/qserver/org.maemo.qserver.service
   branches/qserver_branch/qserver/qserver
   branches/qserver_branch/qserver/qserver.py
   branches/qserver_branch/qserver/qserver_settings.py
   branches/qserver_branch/qserver/setup.py
   branches/qserver_branch/qserver/test_queue_client.py
Log:
qserver added to branch

Added: branches/qserver_branch/qserver/README
===================================================================
--- branches/qserver_branch/qserver/README	                        (rev 0)
+++ branches/qserver_branch/qserver/README	2009-04-01 15:47:01 UTC (rev 126)
@@ -0,0 +1,4 @@
+This scripts contain a dbus service, which should handle the file-copies 
+of the extras repository on maemo.org. At the moment the process 
+contains three different components: the buildme, develmover and the 
+qserver.

Added: branches/qserver_branch/qserver/TODO
===================================================================
--- branches/qserver_branch/qserver/TODO	                        (rev 0)
+++ branches/qserver_branch/qserver/TODO	2009-04-01 15:47:01 UTC (rev 126)
@@ -0,0 +1 @@
+placeholder

Added: branches/qserver_branch/qserver/org.maemo.qserver.conf
===================================================================
--- branches/qserver_branch/qserver/org.maemo.qserver.conf	                        (rev 0)
+++ branches/qserver_branch/qserver/org.maemo.qserver.conf	2009-04-01 15:47:01 UTC (rev 126)
@@ -0,0 +1,15 @@
+<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
+ "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
+<busconfig>
+
+  <policy context="default">
+    <allow own="org.maemo.qserver"/>
+
+    <allow send_destination="org.maemo.qserver"/>
+    <allow receive_sender="org.maemo.qserver"/>
+
+    <allow send_path="/"/>
+  </policy>
+
+</busconfig>
+

Added: branches/qserver_branch/qserver/org.maemo.qserver.service
===================================================================
--- branches/qserver_branch/qserver/org.maemo.qserver.service	                        (rev 0)
+++ branches/qserver_branch/qserver/org.maemo.qserver.service	2009-04-01 15:47:01 UTC (rev 126)
@@ -0,0 +1,5 @@
+[D-BUS Service]
+Name=org.maemo.qserver
+Exec=/usr/bin/qserver.py
+
+

Added: branches/qserver_branch/qserver/qserver
===================================================================
--- branches/qserver_branch/qserver/qserver	                        (rev 0)
+++ branches/qserver_branch/qserver/qserver	2009-04-01 15:47:01 UTC (rev 126)
@@ -0,0 +1,47 @@
+#!/bin/bash
+
+SCRIPT="/home/dwilms/maemo/promoter/trunk/qserver/qserver.py"
+SERVICENAME="qserver.py"
+
+start () {
+	PID=$(ps -eo pid,args | grep $SERVICENAME | grep -v grep | awk '{print $1;}')
+	echo $PID
+	if [ $PID ]; then
+		echo "service already running"
+	else
+		echo "start service"
+		$SCRIPT &
+		echo "done."
+	fi
+}
+
+
+stop () {
+	PID=$(ps -eo pid,args | grep $SERVICENAME | grep -v grep | awk '{print $1;}')
+	if [ $PID ]; then
+		kill -9 $PID
+	else
+		echo "service is not running - nothing to stop"
+	fi
+}	
+
+
+
+case "$1" in
+	start)
+		start
+		;;
+	stop)
+		stop
+		;;
+	restart)
+		stop
+		start
+		;;
+	*)
+		echo "use start|stop|restart"
+		exit 1
+		;;
+esac
+
+exit 0


Property changes on: branches/qserver_branch/qserver/qserver
___________________________________________________________________
Name: svn:executable
   + *

Added: branches/qserver_branch/qserver/qserver.py
===================================================================
--- branches/qserver_branch/qserver/qserver.py	                        (rev 0)
+++ branches/qserver_branch/qserver/qserver.py	2009-04-01 15:47:01 UTC (rev 126)
@@ -0,0 +1,131 @@
+#!/usr/bin/python
+#===============================================================================
+# this class should handle requests and copy files from
+# one repository into another. first the copy method will be implemented
+# to test the system. can be easyly extended afterwards
+#===============================================================================
+
+import dbus, dbus.glib, dbus.service
+import gobject
+import Queue
+import logging
+import time, datetime
+import qserver_settings
+from threading import Thread
+from uuid import uuid4
+import shutil
+
+
+
+class QueueThread (Thread):
+    ''' Thread, which is used by the queue'''
+    
+    def __init__ (self,q):
+        ''' initializes Thread 
+            @param queue: Queue object
+        '''
+        self.queue = q
+        self.thread_control = True
+        self.log = logging.getLogger('QueueThread')
+        Thread.__init__(self)
+        
+    def run (self):
+        ''' Main function of the Thread -> runs as long as thread_control == True
+        '''
+        while self.thread_control:
+            next = self.queue.get()
+            if next:
+                if next['id']==0:
+                    # cleanup the dictionary
+                    cleanup=True
+                else:
+                    self.log.debug('proceeding job %s' %next['id'])
+                    status_object [next['id']] = {'status':qserver_settings.COPYSTATUS ['proceeding'],'timestamp':datetime.datetime.now(),'message':''}
+                    try:
+                        shutil.copyfile (next['source'],next['destination'])
+                        status_object [next['id']] = {'status':qserver_settings.COPYSTATUS ['done'],'timestamp':datetime.datetime.now(),'message':''}                        
+                        self.log.debug( 'task no. %s done. status %s / message: %s' %( str(next['id']), str(status_object[next['id']]['status']), str(status_object[next['id']]['message'])) )
+                    except shutil.Error:
+                        status_object [next['id']] = {'status':qserver_settings.COPYSTATUS ['error'],'timestamp':datetime.datetime.now(),'message':'Source and destination are the same'}
+                        self.log.error( 'task no. %s done. status %s / message: %s' %( str(next['id']), str(status_object[next['id']]['status']), str(status_object[next['id']]['message'])) )
+                    except IOError:
+                        status_object [next['id']] = {'status':qserver_settings.COPYSTATUS ['error'],'timestamp':datetime.datetime.now(),'message':'IOError'}
+                        self.log.error( 'task no. %s done. status %s / message: %s' %( str(next['id']), str(status_object[next['id']]['status']), str(status_object[next['id']]['message'])) )
+                    self.queue.task_done()
+                    
+
+    def stop (self):
+        ''' stops the thread
+        '''
+        self.thread_control = False
+        
+        
+class FileCopyHandler (dbus.service.Object):
+    
+    def __init__ (self, conn=None, object_path=None, bus_name=None):
+        self.log = logging.getLogger ('FileCopyHandler')
+        self.length = 0
+        self.queue = Queue.Queue(qserver_settings.QUEUE_LENGTH)
+        for i in range (0,qserver_settings.NUMBER_OF_PROCESSES):
+            QueueThread(q=self.queue).start()
+        dbus.service.Object.__init__(self, conn, object_path, bus_name)
+        
+    @dbus.service.method ( dbus_interface = 'org.maemo.filecopy_interface')
+    def filecopy (self,source,dest):
+        ''' puts a filecopy request into a queue
+            @param source: source-path
+            @param dest: destination-path
+            
+            @return: uid of the process-job        
+        '''
+        self.log.debug('file copy request received: copy file %s to %s' %(source,dest))
+        id = str(uuid4())
+        self.queue.put ({'source':source,'destination':dest,'id':id})
+        self.log.info ('job %s queued' % str(id))
+        status_object [id] = {'status':qserver_settings.COPYSTATUS ['queued'],'timestamp':datetime.datetime.now(),'message':''}
+        # cleanup#===============================================================================
+        #        if len (status_object)>50:
+        #             self.queue ({'source':'cleanup',dest:'cleanup','id':0})
+        return id
+    
+    @dbus.service.method (dbus_interface = 'org.maemo.filecopy_interface')
+    def get_status_information (self,id):
+        ''' returns the information of a job, which was put into the queue
+            @param id: id of the job
+            @return (status,message)
+        '''
+        if id and status_object.has_key(id):
+            self.log.debug ('status request for %s -> status_object = %s' %(id,str(status_object[id])))
+            if status_object[id]['status'] == qserver_settings.COPYSTATUS['done']:
+                del status_object [id]
+                return qserver_settings.COPYSTATUS['done'],''
+            elif status_object[id]['status'] == qserver_settings.COPYSTATUS['error']:
+                error = status_object [id]['message']
+                del status_object [id]
+                return qserver_settings.COPYSTATUS['error'],error
+            else:
+                status = status_object [id]['status']
+                msg = status_object [id] ['message']
+                return status,msg
+        else:
+            return None
+        
+
+if __name__ == '__main__':
+    # settings
+    FORMAT = "%(asctime)s %(levelname)s: %(message)s"
+    logging.basicConfig(filename=qserver_settings.LOGFILENAME,level=logging.DEBUG,format=FORMAT)
+    log = logging.getLogger ('Service')
+    #session_bus    = dbus.SessionBus ()
+    session_bus    = dbus.SystemBus ()
+    bus_name      = dbus.service.BusName ('org.maemo.qserver',session_bus)
+    server_object = FileCopyHandler (bus_name,'/')
+    status_object = {}
+       
+    #start
+    loop = gobject.MainLoop ()
+    gobject.threads_init()
+    context = loop.get_context()
+    while 1:
+        context.iteration(True)
+    


Property changes on: branches/qserver_branch/qserver/qserver.py
___________________________________________________________________
Name: svn:executable
   + *

Added: branches/qserver_branch/qserver/qserver_settings.py
===================================================================
--- branches/qserver_branch/qserver/qserver_settings.py	                        (rev 0)
+++ branches/qserver_branch/qserver/qserver_settings.py	2009-04-01 15:47:01 UTC (rev 126)
@@ -0,0 +1,9 @@
+# specifies the max size of the queue
+QUEUE_LENGTH = 3
+# number of threads which are created to work on the queue
+NUMBER_OF_PROCESSES = 1
+# location of the logfile
+LOGFILENAME = '/var/log/qserver.log'
+COPYSTATUS = {'queued':0,'error':1,'proceeding':2,'done':3}
+
+

Added: branches/qserver_branch/qserver/setup.py
===================================================================
--- branches/qserver_branch/qserver/setup.py	                        (rev 0)
+++ branches/qserver_branch/qserver/setup.py	2009-04-01 15:47:01 UTC (rev 126)
@@ -0,0 +1,16 @@
+#!/usr/bin/env python
+
+from distutils.core import setup
+
+
+setup ( name        = 'qserver',
+        version     = '0.1',
+        description = 'DBUS queue service for devel-mover',
+        author      = 'Daniel Wilms',
+        author_email= 'daniel.wilms at nokia.com',
+        py_modules  = ['qserver_settings'],
+        scripts     = ['qserver.py','test_queue_client.py'],
+        data_files  = [ ('/etc/init.d',['qserver']),
+                        ('/etc/dbus-1/system.d',['org.maemo.qserver.conf']),
+                        ('/usr/share/dbus-1/system-services',['org.maemo.qserver.service'])],
+      )
\ No newline at end of file

Added: branches/qserver_branch/qserver/test_queue_client.py
===================================================================
--- branches/qserver_branch/qserver/test_queue_client.py	                        (rev 0)
+++ branches/qserver_branch/qserver/test_queue_client.py	2009-04-01 15:47:01 UTC (rev 126)
@@ -0,0 +1,39 @@
+#!/usr/bin/env python
+#===============================================================================
+# test client application - later integrated in promoter
+#===============================================================================
+
+import dbus
+import dbus.glib
+import time
+
+bus = dbus.SystemBus ()
+server_available = True
+
+path_src = '/home/dwilms/maemo/promoter/files_a'
+path_dest = '/home/dwilms/maemo/promoter/files_b'
+
+FileCopyHandler = None
+try: 
+    FileCopyHandler = dbus.Interface ( bus.get_object ('org.maemo.qserver','/'),
+                                          'org.maemo.filecopy_interface')
+except dbus.DBusException:
+    server_available = False
+
+if server_available:
+    files = ['a','b','c','d','e']
+    ids = []
+    for f in files:
+        id = FileCopyHandler.filecopy ('%s/%s.txt'%(path_src,f),'%s/%s.txt'%(path_dest,f))
+        ids.append (id)
+        status,msg = FileCopyHandler.get_status_information(id)
+        print str(status) + '.' + msg
+    time.sleep (3)
+    for id in ids:
+        try:
+            status,msg = FileCopyHandler.get_status_information(id) 
+            print str(status) + '.' + msg
+        except:
+            pass
+else:
+    print 'sorry, but the service is not reachable'


Property changes on: branches/qserver_branch/qserver/test_queue_client.py
___________________________________________________________________
Name: svn:executable
   + *



More information about the Extras-cauldron-commits mailing list