[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