1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 """boostrapping functions for flumotion"""
19
20 import os
21 import sys
22
23 from flumotion.common.log import safeprintf
24
25 __version__ = "$Rev$"
26
27 PYGTK_REQ = (2, 10, 0)
28 KIWI_REQ = (1, 9, 13)
29 GST_REQ = {'0.10': {'gstreamer': (0, 10, 10),
30 'gst-python': (0, 10, 4)}}
31 USE_GOPTION_PARSER = False
32 USE_GTK = False
33 USE_GST = True
34
35
37 """
38 Initialize pygobject. A missing or too-old pygobject will cause a
39 SystemExit exception to be raised.
40 """
41 try:
42 import pygtk
43 pygtk.require('2.0')
44
45 import gobject
46 except ImportError:
47 raise SystemExit('ERROR: PyGTK could not be found')
48
49 if gobject.pygtk_version < PYGTK_REQ:
50 raise SystemExit('ERROR: PyGTK %s or higher is required'
51 % '.'.join(map(str, PYGTK_REQ)))
52
53 gobject.threads_init()
54
55
57
58 def tup2version(tup):
59 return '.'.join(map(str, tup))
60
61 if gst_majorminor not in GST_REQ:
62 raise SystemExit('ERROR: Invalid FLU_GST_VERSION: %r (expected '
63 'one of %r)' % (gst_majorminor, GST_REQ.keys()))
64
65 pygst_req = GST_REQ[gst_majorminor]['gst-python']
66 gst_req = GST_REQ[gst_majorminor]['gstreamer']
67
68 try:
69 import pygst
70 pygst.require(gst_majorminor)
71 import gst
72 except ImportError:
73 return False
74 except AssertionError:
75 return False
76
77 try:
78 gst_version = gst.get_gst_version()
79 pygst_version = gst.get_pygst_version()
80 except AttributeError:
81
82 gst_version = gst.gst_version
83 pygst_version = gst.pygst_version
84
85 if gst_req[:2] != gst_version[:2]:
86 raise SystemExit(
87 'ERROR: Expected GStreamer %s, but got incompatible %s'
88 % (gst_majorminor, tup2version(gst_version[:2])))
89
90 if gst_version < gst_req:
91 raise SystemExit(
92 'ERROR: GStreamer %s too old; install %s or newer'
93 % (tup2version(gst_version), tup2version(gst_req)))
94
95 if pygst_version < pygst_req:
96 raise SystemExit(
97 'ERROR: gst-python %s too old; install %s or newer'
98 % (tup2version(pygst_version), tup2version(pygst_req)))
99
100 return True
101
102
104 """
105 Initialize pygst. A missing or too-old pygst will cause a
106 SystemExit exception to be raised.
107 """
108 assert 'gobject' in sys.modules, "Run init_gobject() first"
109
110 gst_majorminor = os.getenv('FLU_GST_VERSION')
111
112 if gst_majorminor:
113 if not _init_gst_version(gst_majorminor):
114 raise SystemExit('ERROR: requested GStreamer version %s '
115 'not available' % gst_majorminor)
116 else:
117 majorminors = GST_REQ.keys()
118 majorminors.sort()
119 while majorminors:
120 majorminor = majorminors.pop()
121 if _init_gst_version(majorminor):
122 gst_majorminor = majorminor
123 break
124 if not gst_majorminor:
125 raise SystemExit('ERROR: no GStreamer available '
126 '(looking for versions %r)' % (GST_REQ.keys(), ))
127
128 return gst_majorminor
129
130
132 import gobject
133
134 try:
135 from kiwi.__version__ import version as kiwi_version
136 except ImportError:
137 return False
138
139 if kiwi_version < KIWI_REQ:
140 raise SystemExit('ERROR: Kiwi %s or higher is required'
141 % '.'.join(map(str, KIWI_REQ)))
142 elif gobject.pygobject_version > (2, 26, 0):
143
144
145
146
147 from gobject._gobject import type_register
148
149 def _type_register(cls, namespace):
150
151 if '__gtype__' in namespace:
152 return
153
154 if not ('__gproperties__' in namespace or
155 '__gsignals__' in namespace or
156 '__gtype_name__' in namespace):
157 return
158
159
160
161 if cls.__module__.startswith('gi.overrides.'):
162 return
163
164 type_register(cls, namespace.get('__gtype_name__'))
165
166 gobject.GObjectMeta._type_register = _type_register
167
168 return True
169
170
186
187
189 try:
190 import statprof
191 except ImportError, e:
192 print "Profiling requested, but statprof not available (%s)" % e
193 return main
194
195 def wrapped(*args, **kwargs):
196 statprof.start()
197 try:
198 return main(*args, **kwargs)
199 finally:
200 statprof.stop()
201 statprof.display(OUT=file(output_file, 'wb'))
202 return wrapped
203
204
206 try:
207 import cProfile as profile
208 except ImportError:
209 import profile
210
211 def wrapped(*args, **kwargs):
212 prof = profile.Profile()
213 try:
214 return prof.runcall(main, *args, **kwargs)
215 finally:
216 prof.dump_stats(output_file)
217 return wrapped
218
219
221
222 def generate_output_file():
223 import tempfile
224 return os.path.join(tempfile.gettempdir(),
225 'flustat.%s.%s.%d' %
226 (main.__module__, main.__name__, os.getpid()))
227
228 if os.getenv('FLU_PROFILE'):
229 return wrap_for_statprof(main, generate_output_file())
230 elif os.getenv('FLU_BUILTIN_PROFILE'):
231 return wrap_for_builtin_profiler(main, generate_output_file())
232 else:
233 return main
234
235
236 -def boot(path, gtk=False, gst=True, installReactor=True):
286
287 reactor.addSystemEventTrigger('before', 'startup', setkilled, False)
288 reactor.addSystemEventTrigger('before', 'shutdown', setkilled, True)
289
290 from flumotion.twisted import reflect
291 from flumotion.common import errors
292 from flumotion.common import setup
293
294 setup.setup()
295
296 from flumotion.common import log
297 log.logTwisted()
298
299 main = reflect.namedAny(path)
300
301 wrapped = wrap_for_profiling(main)
302 wrapped.__name__ = main.__name__
303
304 try:
305 sys.exit(wrapped(sys.argv))
306 except (errors.FatalError, SystemError), e:
307 safeprintf(sys.stderr, 'ERROR: %s\n', e)
308 sys.exit(1)
309