~jderose/+junk/dc2

« back to all changes in this revision

Viewing changes to dc2-service

  • Committer: Jason Gerard DeRose
  • Date: 2011-08-28 10:29:35 UTC
  • Revision ID: jderose@novacut.com-20110828102935-vedj0ezo61lp8o9n
Added a GObject timout based monitor loop

Show diffs side-by-side

added added

removed removed

Lines of Context:
2
2
 
3
3
import json
4
4
import time
 
5
import logging
5
6
 
 
7
import dc2
6
8
from dc2 import random_port, prepare_session, Monitor
7
9
 
 
10
log = logging.getLogger()
 
11
BUS = 'org.desktopcouch.CouchDB2'
 
12
IFACE = BUS
 
13
 
 
14
from dbus.mainloop.glib import DBusGMainLoop
 
15
DBusGMainLoop(set_as_default=True)
 
16
 
 
17
from gi.repository import GObject
 
18
 
 
19
import dbus
 
20
import dbus.service
 
21
 
 
22
 
 
23
class CouchDB2(dbus.service.Object):
 
24
    def __init__(self, env, monitor, killfunc):
 
25
        self._bus = BUS
 
26
        self._env_ = json.dumps(env, sort_keys=True, indent=4)
 
27
        self._monitor = monitor
 
28
        self._killfunc = killfunc
 
29
        log.info('Starting DC2 service on %r', self._bus)
 
30
        self._conn = dbus.SessionBus()
 
31
        super(CouchDB2, self).__init__(self._conn, object_path='/')
 
32
        self._busname = dbus.service.BusName(self._bus, self._conn)
 
33
        self._timeout_id = GObject.timeout_add(60 * 1000, self._check)
 
34
 
 
35
    def _check(self):
 
36
        try:
 
37
            self._monitor.check()
 
38
        except Exception as e:
 
39
            log.exception(e)
 
40
            self.Kill()
 
41
        return True  # Repeat timeout call
 
42
        
 
43
    @dbus.service.method(IFACE, in_signature='', out_signature='s')
 
44
    def Version(self):
 
45
        """
 
46
        Return dc2 version.
 
47
        """
 
48
        return dc2.__version__
 
49
 
 
50
    @dbus.service.method(IFACE, in_signature='', out_signature='')
 
51
    def Kill(self):
 
52
        """
 
53
        Kill the `dc2-service` process.
 
54
        """
 
55
        log.info('Killing dc2-service on %r', self._bus)
 
56
        self._killfunc()
 
57
        
 
58
    @dbus.service.method(IFACE, in_signature='', out_signature='s')
 
59
    def GetEnv(self):
 
60
        """
 
61
        Return DC2 env as a JSON string.
 
62
        """
 
63
        self._check()
 
64
        return self._env_s
 
65
 
 
66
    @dbus.service.method(IFACE, in_signature='', out_signature='')
 
67
    def Crash(self):
 
68
        """
 
69
        Terminate the couchdb process to simulate a crash and test respawning.
 
70
        """
 
71
        self._monitor.crash()
 
72
 
 
73
 
8
74
(socket, port) = random_port()
9
75
(env, ini) = prepare_session(port)
10
76
 
11
 
m = Monitor(env, ini)
12
 
socket.close()
 
77
monitor = Monitor(env, ini)
 
78
socket.close()  # We hold the port till right before handing off to CouchDB
13
79
try:
14
 
    m.start()
15
 
    time.sleep(5)
16
 
    m._terminate()
17
 
    time.sleep(5)
18
 
    m.check()
19
 
    time.sleep(4)
 
80
    monitor.start()
 
81
    mainloop = GObject.MainLoop()
 
82
    service = CouchDB2(env, monitor, mainloop.quit)
 
83
    mainloop.run()
20
84
finally:
21
 
    m.kill()
 
85
    monitor.kill()