This file is indexed.

/usr/share/pyshared/Editeur/session.py is in eficas 6.4.0-1-2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
# -*- coding: iso-8859-15 -*-
"""
Ce module centralise les informations issues de la ligne de commande.

La ligne de commande est parsee avec l'aide du module python optparse.
Les options possibles sont : -c, -j, -p, -d, -i, -f comme definies ci-dessous.

Un exemple typique d'utilisation est :
>>> ./appli.py -c V7.3 -d 1 -j aa -i 11 iii -p ppp -i 22 ii -j bb -f ff

qui demande a l'application d'ouvrir trois jeux de commandes.

Le premier (aa) a un include (11,iii) et est la suite du fichier poursuite ppp 
qui a lui meme un include (22,ii).

Le deuxieme bb est un jeu de commandes simple.

Le troisieme est decrit dans le fichier ff de type .ini
qui est parse par le module ConfigParser.
Chaque section du fichier decrit un jeu de commandes.
Un include est specifie par: numero logique=nom du fichier
Une poursuite est specifiee par: poursuite=reference a un jeu de commande 
Cette reference correspond a un nom de section decrivant le jeu de commandes.
Le jeu de commandes maitre est donne par l'entree globale jdc dans la section jdc.

Exemple:
[jdc]
jdc=a
[a]
comm=aa
poursuite=pours
11=iii
[pours]
comm=ppp
22=ii

La session utilisera le catalogue V7.3 en mode debug.
"""

try:
   import optparse
   from optparse import OptionValueError
except:
   from Tools import optparse
   from Tools.optparse import OptionValueError

import os,traceback
import ConfigParser
import re

# Les valeurs decodees par optparse sont mises dans un objet dictionnaire-like.
# On l'utilise comme environnement de session.
d_env={}
#
# L'attribut "studies" de d_env est une liste dans laquelle on range les etudes de niveau global.
# Une étude est stockée dans un dictionnaire.
# La clé "comm" du dictionnaire donne le nom du fichier de commandes principal
# La clé (optionnelle) "pours" du dictionnaire donne les informations pour une poursuite
# La valeur associée à la clé est un dictionnaire qui contient les informations sur
# le nom du fichier de commandes de la poursuite (clé "comm"), une éventuelle poursuite
# (clé "pours") et les includes (clés entières associées à des noms de fichier).
#
#
#
# Les informations (dictionnaire) associées au fichier de commandes en cours de traitement 
# sont stockées dans parser.values.current
# En general, il faut utiliser current et pas parser.values.studies car les informations
# sont stockées hiérarchiquement
#

def check_comm(option, opt_str, value, parser):
    if not hasattr(parser.values,"studies"):
       parser.values.studies=[]
       parser.values.comm=[]
    if not os.path.isfile(value):
       raise OptionValueError("le fichier de commandes %s n'existe pas" % value)
    parser.values.comm.append(value)
    d_study={"comm":value}
    parser.values.current=d_study
    parser.values.studies.append(d_study)

def check_poursuite(option, opt_str, value, parser):
    if parser.values.comm is None:
       raise OptionValueError("un fichier de commandes doit etre defini avant une poursuite %s" % value)
    if not os.path.isfile(value):
       raise OptionValueError("le fichier poursuite %s n'existe pas" % value)
    #current : fichier de commandes en cours de traitement (dictionnaire des infos)
    comm=parser.values.current
    d_study={"comm":value}
    comm["pours"]=d_study
    parser.values.current=d_study

def check_include(option, opt_str, value, parser):
    try:
       args=[int(parser.rargs[0]),parser.rargs[1]]
    except:
       raise OptionValueError("include mal defini %s" % parser.rargs[0:2])

    del parser.rargs[0]
    del parser.rargs[0]

    if parser.values.comm is None:
       raise OptionValueError("un fichier de commandes doit etre defini avant un include %s" % args)
    if not os.path.isfile(args[1]):
       raise OptionValueError("le fichier include %s n'existe pas" % args[1])

    comm=parser.values.current
    comm[args[0]]=args[1]


def check_jdc(config,jdc,parser,fich):
    """
        Fonction : analyse une section de fichier .ini pour en extraire
        les informations sur les fichiers poursuite et includes
        définis dans cette section

        parser : objet analyseur de la ligne de commande
        fich : nom du fichier .ini en cours d'analyse
        config : objet de la classe ConfigParser permettant de parser le fichier fich
        jdc : nom de la section du fichier fich à analyser
    """
    d_study={}

    for o in config.options(jdc):
       if o == "poursuite":
          p=config.get(jdc,"poursuite")

          if not config.has_option(p,"comm"):
             raise OptionValueError("jdc %s manque fichier comm dans section %s" % (fich,p))
          comm=config.get(p,"comm")
          if not os.path.isfile(comm):
             raise OptionValueError("jdc %s, le fichier de commandes %s n'existe pas" % (fich,comm))

          pours=check_jdc(config,p,parser,fich)
          pours["comm"]=comm
          d_study["pours"]=pours
          continue

       try:
          unit=int(o)
          # si le parametre est un entier, il s'agit d'un include
          inc=config.get(jdc,o)
       except:
          continue
       if not os.path.isfile(inc):
          raise OptionValueError("jdc %s fichier include %s, %s n'existe pas" % (fich,unit,inc))
       d_study[unit]=inc

    return d_study

def check_fich(option, opt_str, fich, parser):
    """
        Fonction : parse le fichier fich (format .ini)
        
        option : option en cours de traitement
        opt_str : chaine de caracteres utilisee par l'utilisateur
        fich : nom du fichier .ini donné par l'utilisateur
        parser : objet parseur des options de la ligne de commande
    """
    if not os.path.isfile(fich):
       raise OptionValueError("le fichier jdc %s n'existe pas" % fich)
    if parser.values.fich is None:
       parser.values.fich=[]
    parser.values.fich.append(fich)
    if not hasattr(parser.values,"studies"):
       parser.values.studies=[]
       parser.values.comm=[]
    config = ConfigParser.ConfigParser()
    config.read([fich])
    if not config.has_option("jdc","jdc"):
       raise OptionValueError("jdc %s manque option jdc dans section jdc")
    jdc=config.get("jdc","jdc")

    if not config.has_option(jdc,"comm"):
       raise OptionValueError("jdc %s manque fichier comm dans section %s" % (fich,jdc))
    comm=config.get(jdc,"comm")
    if not os.path.isfile(comm):
       raise OptionValueError("jdc %s, le fichier de commandes %s n'existe pas" % (fich,comm))
    parser.values.comm.append(comm)

    d_study=check_jdc(config,jdc,parser,fich)
    d_study["comm"]=comm
    parser.values.studies.append(d_study)

def print_pours(d_pours,dec=''):
    # Les fichiers includes d'abord
    for k,v in d_pours.items():
       if k in ("pours","comm"):continue
       print dec+" include",k," :",v

    if d_pours.has_key("pours"):
       # Description de la poursuite
       print dec+" fichier poursuite:",d_pours["pours"]["comm"]
       print_pours(d_pours["pours"],dec=dec+"++")

def print_d_env():
    #print d_env
    if d_env.studies is None:return
    for study in d_env.studies:
       print "nom etude:",study["comm"]
       print_pours(study,dec="++")
       print

def create_parser():
    # creation du parser des options de la ligne de commande
    #import prefs
    parser=optparse.OptionParser(usage="usage: %prog [options]",version="%prog 1.13")

    parser.add_option("-j","--jdc",dest="comm",type='string',
                    action="callback",callback=check_comm,
                    help="nom du fichier de commandes")

    parser.add_option("-p","--poursuite", type="string",dest="pours",
                  action="callback", callback=check_poursuite,
                  help="nom du fichier poursuite")

    parser.add_option("-i","--include", 
                  action="callback", callback=check_include,
                  nargs=2, help="numero d'unite suivi du nom du fichier include")

    parser.add_option("-f","--fich", type="string",dest="fich",
                  action="callback", callback=check_fich,
                  help="fichier decrivant une etude")

    parser.add_option("-c","--cata", action="store", type="string",dest="cata",
                  help="version de catalogue a utiliser")

    parser.add_option("-k","--kode", action="store", type="string",dest="code",
                  help="nom du code a utiliser")

    parser.add_option("-d","--debug", action="store", type="int",dest="debug",
                  help="niveau de debug")

    return parser

def parse(args):
    parser=create_parser()
    (options,args)=parser.parse_args(args[1:])
    if not hasattr(options,"studies"):
       options.studies=[]
       options.comm=[]
    try:
       del parser.values.current
    except:
       pass

    for file in args:
         if os.path.isfile(file):
            options.comm.append(file)
            options.studies.append({"comm":file})
         elif len(args)==1 and re.search('.comm',file):
            try :
                f=open(file,'w')
                f.close()
            except :
                parser.error("incorrect number of arguments")
            options.comm.append(file)
            options.studies.append({"comm":file})
         else:
            parser.error("incorrect number of arguments")

    global d_env
    d_env=options
    #print_d_env()
    return options

def get_unit(d_study,appli):
    """
       Fonction : construit et retourne un dictionnaire contenant les informations
       sur les fichiers poursuite et includes sous la forme adaptée
       pour EFICAS ::

                  [None : nom_fichier, texte_source, unites_associees,           # poursuite
                   numero_include : nom_fichier, texte_source, unites_associees, # include
                    ...] 

       d_study : dictionnaire de l'etude
       appli : objet application EFICAS (permet d'acceder aux services comme get_source)
    """
    return get_dunit(d_study,appli)

def get_dunit(d_unit,appli):
    d={}
    if d_unit.has_key("pours"):
       # on a une poursuite
       comm=d_unit["pours"]["comm"]
       g=get_dunit(d_unit["pours"],appli)
       text=appli.get_source(comm)
       d[None]=comm,text,g

    for k,v in d_unit.items():
       if k in ("pours","comm"): continue
       text=appli.get_source(v)
       d[k]=v,text,d

    return d