Salome HOME
PR: merge from tag mergeto_trunk_16Jan05
[modules/kernel.git] / bin / launchConfigureParser.py
1 import os, glob, string, sys
2 import xml.sax
3
4 # -----------------------------------------------------------------------------
5
6 ### xml reader for launch configuration file usage
7
8 class xml_parser:
9     def __init__(self, fileName):
10         self.space = []
11         self.opts = {}
12         parser = xml.sax.make_parser()
13         parser.setContentHandler(self)
14         parser.parse(fileName)
15         pass
16
17     def CorrectBoolean(self, str):
18         if str in ("yes", "y", "1"):
19             return 1
20         elif str in ("no", "n", "0"):
21             return 0
22         else:
23             return str
24         pass
25
26     def startElement(self, name, attrs):
27         #print "startElement name=",name
28         #print "startElement attrs=",attrs.getNames()
29         self.space.append(name)
30         self.current = None
31
32         if self.space[:2] == ["Configuration-list","launchoptions"] and len(self.space) == 3:
33             self.current = name
34         elif self.space == ["Configuration-list","modules-list"]:
35             self.opts["modules"] = []
36         elif self.space == ["Configuration-list","modules-list","module"] and "name" in attrs.getNames():
37             for field in attrs.getNames():
38                 if field == "name":
39                     self.currentModuleName = str(attrs.getValue("name"))
40                     self.opts["modules"].append(self.currentModuleName)
41                 else:
42                     self.opts[str(attrs.getValue("name"))+"_"+str(field)] = self.CorrectBoolean(attrs.getValue(field))
43                     pass
44                 pass
45         elif self.space == ["Configuration-list","modules-list","module","plugin"] and "name" in attrs.getNames():
46             key = str(self.currentModuleName)+"_plugins"
47             if not self.opts.has_key(key):
48                 self.opts[key]=[]
49                 pass
50             self.opts[key].append(attrs.getValue("name"))
51         elif self.space == ["Configuration-list","embedded-list"]:
52             self.opts["embedded"] = []
53             pass
54         elif self.space == ["Configuration-list","standalone-list"]:
55             self.opts["standalone"] = []
56             pass
57         elif self.space == ["Configuration-list","containers-list"]:
58             self.opts["containers"] = []
59             pass
60         pass
61
62     def endElement(self, name):
63         p = self.space.pop()
64         self.current = None
65         pass
66
67     def characters(self, content):
68         #print "Characters content:",content
69         if self.current:
70             self.opts[self.current] = self.CorrectBoolean(content)
71         elif self.space == ["Configuration-list","embedded-list", "embeddedserver"]:
72             self.opts["embedded"].append(content)
73         elif self.space == ["Configuration-list","standalone-list", "standaloneserver"]:
74             self.opts["standalone"].append(content)
75         elif self.space == ["Configuration-list","containers-list", "containertype"]:
76             self.opts["containers"].append(content)
77         pass
78
79     def processingInstruction(self, target, data):
80         pass
81
82     def setDocumentLocator(self, locator):
83         pass
84
85     def startDocument(self):
86         self.read = None
87         pass
88
89     def endDocument(self):
90         self.read = None
91         pass
92
93 # -----------------------------------------------------------------------------
94
95 ### searching for launch configuration file : $HOME/.$(application_name)/$(application_name).launch
96
97 appname = None
98 dirname = None
99 filename = None
100 for bindir in glob.glob(os.environ["KERNEL_ROOT_DIR"]+"/bin/*"):
101     appname = string.split(bindir, "/").pop()
102     print 'Application name: "'+appname+'"'
103     # find version number
104     versnb = ""
105     try:
106       file = open(os.environ["KERNEL_ROOT_DIR"]+"/bin/"+appname+"/VERSION", "r")
107       s = file.read()
108       l = string.split(s, ":")
109       vl = string.split(l[1], " ")
110       i = 0
111       while len(versnb) == 0:
112         versnb = vl[i]
113         i += 1
114         pass
115       versnb = string.split(versnb, "\n")[0]
116       print "Version ",versnb
117     except:
118       pass
119     # end find version number
120     dirname = os.environ["HOME"]+"/."+appname+"_"+versnb
121     filename = dirname+"/"+appname+".launch"
122     if not os.path.exists(filename) and \
123        not os.path.exists(os.environ["KERNEL_ROOT_DIR"]+"/bin/"+appname+"/"+appname+".launch"):
124         filename = None
125     else:
126         break
127     pass
128 if not appname:
129     print "Can not find application name"
130     if not os.have_key("KERNEL_ROOT_DIR"):
131         print "KERNEL_ROOT_DIR environment variable must be set"
132         pass
133     sys.exit(1);
134 elif not filename or not os.path.exists(filename):
135     filename = dirname+"/"+appname+".launch"
136     #filename = os.environ["HOME"]+"/."+appname+"/"+appname+".launch"
137     print "Launch configuration file does not exist. Create default:",filename
138     os.system("mkdir -p "+dirname)
139     #os.system("mkdir -p "+os.environ["HOME"]+"/."+appname)
140     os.system("cp -f "+os.environ["KERNEL_ROOT_DIR"]+"/bin/"+appname+"/"+appname+".launch "+filename)
141     pass
142
143 ### get options from launch configuration file
144
145 try:
146     p = xml_parser(filename)
147 except:
148     print 'Can not read launch configuration file ', filename
149     filename = None
150     pass
151
152 if filename:
153     args = p.opts
154 else:
155     args = {}
156     pass
157
158 # --- args completion
159 for aKey in ("containers","embedded","key","modules","standalone"):
160     if not args.has_key(aKey):
161         args[aKey]=[]
162 for aKey in ("gui","logger","file","xterm","portkill","killall"):
163     if not args.has_key(aKey):
164         args[aKey]=0
165 if args["file"]:
166     afile=args["file"]
167     args["file"]=[afile]
168 args["appname"] = appname
169
170 ### searching for my port
171
172 my_port = 2809
173 try:
174   file = open(os.environ["OMNIORB_CONFIG"], "r")
175   s = file.read()
176   while len(s):
177     l = string.split(s, ":")
178     if string.split(l[0], " ")[0] == "ORBInitRef":
179       my_port = int(l[len(l)-1])
180       pass
181     s = file.read()
182     pass
183 except:
184   pass
185
186 args["port"] = my_port
187
188 # -----------------------------------------------------------------------------
189
190 ### command line options reader
191
192 def options_parser(line):
193   source = line
194   list = []
195   for delimiter in [" ", ",", "="]:
196     for o in source:
197       list += string.split(o, delimiter)
198       pass
199     source = list
200     list = []
201     pass
202
203   print "source=",source
204   
205   result = {}
206   i = 0
207   while i < len(source):
208     if source[i][0] != '-':
209       key = None
210     elif source[i][1] == '-':
211       key = source[i][2]
212     else:
213       key = source[i][1]
214       pass
215     
216     result[key] = []
217     if key:
218       i += 1
219       pass
220     while i < len(source) and source[i][0] != '-':
221       result[key].append(source[i])
222       i += 1
223       pass
224     pass
225   return result
226
227 # -----------------------------------------------------------------------------
228
229 ### read command-line options : each arg given in command line supersedes arg from xml config file
230
231 try:
232     opts = options_parser(sys.argv[1:])
233     print "opts=",opts
234     kernel_root_dir=os.environ["KERNEL_ROOT_DIR"]
235 except:
236     opts["h"] = 1
237     pass
238
239 ### check all options are right
240
241 opterror=0
242 for opt in opts:
243     if not opt in ("h","g","l","f","x","m","e","s","c","p","k","t"):
244         print "command line error: -", opt
245         opterror=1
246
247 if opterror == 1:
248     opts["h"] = 1
249
250 if opts.has_key("h"):
251     print """USAGE: runSalome.py [options]
252     [command line options] :
253     --help or -h                  : print this help
254     --gui or -g                   : lancement du GUI
255     --terminal -t                 : launching without gui (to deny --gui)
256     --logger or -l                : redirection des messages via CORBA
257     --file=filename or -l=filename: redirection des messages dans un fichier
258     --xterm or -x                 : les serveurs ouvrent une fenêtre xterm et les messages sont affichés dans cette fenêtre
259     --modules=module1,module2,... : où modulen est le nom d'un module Salome à charger dans le catalogue
260     or -m=module1,module2,...
261     --embedded=registry,study,moduleCatalog,cppContainer
262     or -e=registry,study,moduleCatalog,cppContainer
263                                   : serveurs CORBA embarqués (par defaut: registry,study,moduleCatalog,cppContainer)
264                                   : (logger,pyContainer,supervContainer ne peuvent pas être embarqués
265     --standalone=registry,study,moduleCatalog,cppContainer,pyContainer,supervContainer
266     or -s=registry,study,moduleCatalog,cppContainer,pyContainer,supervContainer
267                                   : executables serveurs CORBA indépendants (par défaut: pyContainer,supervContainer)
268     --containers=cpp,python,superv: (obsolete) lancement des containers cpp, python et de supervision
269     or -c=cpp,python,superv       : = on prend les defauts de -e et -s
270     --portkill or -p              : kill the salome with current port
271     --killall or -k               : kill salome
272     
273     La variable d'environnement <modulen>_ROOT_DIR doit etre préalablement
274     positionnée (modulen doit etre en majuscule).
275     KERNEL_ROOT_DIR est obligatoire.
276     """
277     sys.exit(1)
278     pass
279
280 ### apply command-line options to the arguments
281 for opt in opts:
282     if opt == 'g':
283         args['gui'] = 1
284     elif opt == 'l':
285         args['logger'] = 1
286     elif opt == 'f':
287         args['file'] = opts['f']
288     elif opt == 'x':
289         args['xterm'] = 1
290     elif opt == 'm':
291         args['modules'] = opts['m']
292     elif opt == 'e':
293         args['embedded'] = opts['e']
294     elif opt == 's':
295         args['standalone'] = opts['s']
296     elif opt == 'c':
297         args['containers'] = opts['c']
298     elif opt == 'p':
299         args['portkill'] = 1
300     elif opt == 'k':
301         args['killall'] = 1
302         pass
303     pass
304
305 # 'terminal' must be processed in the end: to deny any 'gui' options
306 if 't' in opts:
307     args['gui'] = 0
308     pass
309
310 print "args=",args