]> git.sur5r.net Git - bacula/bacula/blob - bacula/patches/testing/eblstodo
Commit NULL vol name patch
[bacula/bacula] / bacula / patches / testing / eblstodo
1 Idees
2 ------
3
4
5 Deduplication:
6  proba de collision en fonction de la taille du hash
7   http://en.wikipedia.org/wiki/Birthday_attack
8
9 Cryptage :
10  - Pouvoir configurer les algos de cryptage
11  - Pouvoir choisir de crypter dans le fileset
12  - Pouvoir choisir de forcer le cryptage dans la definition
13    du client.
14
15 Lister les fichiers sur le client :
16  - Avoir un mode comme restore
17  - Avoir une api list files client=xxx where=yyy
18   Dans la filed/job.c:handle_client_request, ajouter une commande
19   dans struct s_cmds cmds; et si possible utiliser le code de finlib
20  - A voir, pourquoi ne pas utiliser mark/unmark comme dans une resto
21    pour construire un fileset ?
22
23 Sauvegarde des postes nomades :
24  - Le client doit pouvoir initier les sauvegardes
25  - Au niveau firewall, il ne doit y avoir que 1 connexion (1)
26                     
27                                               
28              Localhost     |                  
29                            |   +-------+ (4) +---------------+
30                            |   |       |<----|               |
31 +--------+  (5)  +-------+ |   |       |     |   DIRECTOR    |
32 |        |<------+       | |   |       |---->|               |
33 |   FD   |       | PROXY | |   | PROXY | (3) +-------+-------+
34 |        +------->       <-+--->       |             |
35 +--------+  (6)  +-^-----+ (2) |       |     +-------v-------+
36                   /-\      |   |       | (7) |               |
37                    |       |   |       +----->   STORAGE     |
38                    |       |   |       |     |               |
39   Initiate backup  |       |   +-------+     +---------------+
40      --------------+       |                          
41            (1)          Network                               
42                                                       
43                                               
44 (1) & (2) BEGIN Backup         
45 (3) Bconsole like - Run command
46 (4) & (5) DIR -> (PROX <-> PROX) -> FD connection (fileset, storage..)
47 (6) & (7) FD -> (PROX <-> PROX) -> SD
48
49  - Utilisation d'une sorte proxy https
50
51
52 Bconsole :
53  p Ajouter l'historique dans la bconsole
54  - Ajouter une commande pour bloquer un drive
55  - Ajouter de la completion automatique sur les commandes
56
57 Sauvegarde SAN :
58  - Avoir un SD sur chaque FD
59  - Avoir une serie de script qui :
60    * bascule le lecteur en local
61    * lance le SD
62    * le script de mtx doit faire ses demandes au director sur
63      un autochanger commun
64
65  - Tout le monde voit le lecteur, et le client doit demander la permission
66  pour despooler son bloc de XG au director.
67
68  - On fait du round robbin avec tout le monde, et on utilise un disque 
69  local pour  spooler.
70
71  - 50 clients qui spoolent en local, c'est plus rapide que vers 1 point 
72  central
73
74
75 Gestion des stats :
76  - Ajouter la gestion des stats dans le client et le sd
77    - Ajouter un M_STATS dans la gestion des messages
78    - générer un format simple UNIXSTAMP|label|unit|value
79    - possibilité d'ajouter ça dans la base de donnée ou dans rrd
80
81 Exchange backup:
82 http://www.petri.co.il/brick_level_backup_of_mailboxes_by_using_exmerge.htm
83
84 API :
85
86  - apr (apache portable runtime) pour les exemples de chargement
87    de module dynamique (win32, linux, etc...)
88    http://svn.apache.org/viewvc/apr/apr/trunk/dso/
89
90  - exemple apache
91    http://modules.apache.org/doc/API.html
92
93  - comment charger les librairies dependantes d'un hook
94  ex: ACL  -> -lacl
95      GZIP -> -lgz
96
97  - nommer les hook (a la place d'une structure de pointeur)
98  ex:
99         "action", mod_action_handler
100
101  - interface
102    - opendir
103    - readdir
104    - closedir
105    - mkdir
106    - stat
107    - open
108    - close
109    - read
110    - write
111    - seek
112    - get_perm
113    - set_perm
114    - configuration... (ajout automatique avant de charger le fichier de conf)
115    - init
116    - destroy
117
118    - version
119    - name
120
121  - exemple de hook/module
122    - cryptage ?
123    - checksum (MD5/SHA1)
124    - ACL/droits
125    - compression (LZO, GZIP, BZIP)
126
127  - initialiser le jcr avec seulement les hooks utiles
128
129  - configuration 
130    - declarer les modules utiles
131    - les options doivent utiliser le nom du module
132  ex:
133       GZIP level = 2
134       ACL use uid = yes
135       etc...
136
137 TODO
138 ----
139
140 bweb :
141   - Support sqlite
142     SELECT strftime('%Y-%m-%d', Job.StartTime) FROM Job LIMIT 1;
143   x Voir les groupes d'un client
144   - Overview, pouvoir choisir entre la job_old et l'autre
145   - utiliser des noms de table plus proche (brestore -> bweb ?)
146   - Balloon
147 Btw., the vertical axis was the number of files 
148 while the size of the ballon is the volume (in MB 
149 or GB).  Those could be switched, though, depending on what looks better.
150
151 What are you using for color-coding the ballons? 
152 That could be a variety of different things like 
153 client, client group, backup level (full, 
154 incremental, etc.,) that adds context to the size 
155 and position that is already present in the chart.
156
157  x Ajouter mount,umount,release,status pour chaque device
158  - Ajouter le viewfileset dans l'interface de resto
159  x Ajouter la labelisation de bande et l'ajout de media (add et label)
160  - Ajouter la possibilité de lancer des migrations et des
161  verification. 
162  - Quand on deplace un media, il faut prendre le enabled depuis
163    la nouvelle localisation (en javascript)
164   o On ajoute une combo (Backup/Migration/Verify)
165   o On peut regarder dans l'historique des job quel est le bon type
166   o Quand on relance, on spécifie le type directement
167   o Il faut adapter le status client pour traiter les autres type
168  de job (par exemple, si c'est pas un backup/restore, pas de status dir)
169
170
171  x Ajouter une vue par groupe et par date (sur 7, 15 ou 30 jours)
172
173               lu ma me je ve sa di
174   groupe1     v  v  x  w  v  v  v             q1
175    |-- s1     v  v  v  v  v  v  v             q2
176    |-- s2     v  v  x  v  v  v  v
177    `-- s3     v  v  v  w  v  v  v
178
179 ---8<-------8<--------8<--------8<----------8<------------------
180
181 ALTER TABLE Status ADD COLUMN severity int;
182 UPDATE status SET severity = 15;
183 UPDATE status SET severity = 100 where jobstatus = 'f';
184 UPDATE status SET severity = 90 where jobstatus = 'A';
185 UPDATE status SET severity = 10 where jobstatus = 'T';
186
187 -- Affiche par groupe et date le statut des jobs (q1)
188 SELECT date_part('day', date) AS day, date, client_group_name, JobStatusLong, 
189        JobStatus, nb_job, joberrors
190 FROM (
191   SELECT date_trunc('day', job_old.StartTime) AS date, 
192          MAX(severity)  AS severity,
193          COUNT(1)       AS nb_job,
194          SUM(JobErrors) AS joberrors,
195          client_group_name
196     FROM job_old
197     JOIN client_group_member USING (ClientId)
198     JOIN client_group        USING (client_group_id)
199     JOIN Status              USING (JobStatus)
200    WHERE StartTime > '2007-10-01' AND StartTime < '2007-11-19'
201   
202    GROUP BY client_group_name, date
203 ) AS sub JOIN Status USING (severity)
204  ORDER BY client_group_name, date
205
206 -- Affiche un client_group en detail (q2)
207 SELECT date, client, JobStatusLong, JobStatus, nb_job, joberrors
208 FROM (
209   SELECT date_trunc('day', job_old.StartTime) AS date,
210          Client.Name    AS client,
211          MAX(severity)  AS severity,
212          COUNT(1)       AS nb_job,
213          SUM(JobErrors) AS joberrors
214     FROM job_old
215     JOIN client_group_member USING (ClientId)
216     JOIN client_group        USING (client_group_id)
217     JOIN Client              USING (ClientId)
218     JOIN Status              USING (JobStatus)
219    WHERE StartTime > '2007-10-01'
220      AND client_group_name = '0-SAVES_SIGMA1'
221
222    GROUP BY client, date
223 ) AS sub JOIN Status USING (severity)
224  ORDER BY client, date
225
226 ---8<-------8<--------8<--------8<----------8<------------------
227
228  - Quand on clique dessus on arrive sur la liste des jobs en question
229    Groupe -> Jobs
230    Job    -> Log
231
232  x Ajouter une variable pour remplacer NOW() dans les queries
233    origin = arg->{origin} || NOW();
234  - Ajouter des stats en %
235
236 ---8<-------8<--------8<--------8<----------8<------------------
237
238 SELECT  client_group_name, (nb_ok::float/(nb_ok+nb_other)*100)::numeric(6,3) AS percent_ok
239 FROM (
240
241      SELECT 
242        SUM(CASE WHEN JobStatus='T' THEN 1 
243                 ELSE 0 END) AS nb_ok,
244        SUM(CASE WHEN JobStatus='A' THEN 1 
245                 WHEN JobStatus='f' THEN 1
246                 WHEN JobStatus='E' THEN 1 
247                 WHEN JobStatus='e' THEN 1 
248                 ELSE 0 END) AS nb_other,
249        client_group_name
250       FROM job_old 
251       JOIN client_group_member USING (ClientId)
252       JOIN client_group        USING (client_group_id)
253
254      WHERE StartTime > '2007-10-01'
255      GROUP BY client_group_name
256 ) AS subq
257
258 SELECT  Name, (nb_ok::float/(nb_ok+nb_other)*100)::numeric(6,3) AS percent_ok
259 FROM (
260
261      SELECT 
262        SUM(CASE WHEN JobStatus='T' THEN 1 
263                 ELSE 0 END) AS nb_ok,
264        SUM(CASE WHEN JobStatus='A' THEN 1 
265                 WHEN JobStatus='f' THEN 1
266                 WHEN JobStatus='E' THEN 1 
267                 WHEN JobStatus='e' THEN 1 
268                 ELSE 0 END) AS nb_other,
269        Client.Name AS name
270       FROM job_old 
271       JOIN Client       USING (ClientId)
272
273      WHERE StartTime > '2007-10-01'
274        AND JobStatus IN ('T', 'A', 'f', 'E', 'e')
275      GROUP BY Client.Name
276 ) AS subq
277
278
279
280 ---8<-------8<--------8<--------8<----------8<------------------
281
282    Nb backup OK
283   -------------  x 100 => par groupe de client
284    Nb backup
285
286  - Il faut ajouter une estimation des jobs qui auraient
287    du se lancer (a voir avec les schedules)
288
289  - Affichage en html/csv pour des stats 
290   grp, nb client, nb backup, nb ok, nb err, nb cancel, 
291   %ok, nb files, nb gig, time
292
293  - Ajouter la liste des fichiers (quand il n'y en a pas trop)
294  - Ajouter un mode qui compte le nombre de fichier sous bfileview
295  x Ajouter une estimation de progression du backup basé sur le nombre
296    de fichier et le nombre de Mo
297  x Ajouter un bouton suivant/precedant dans la vue des logs
298  x Ajouter la liste des medias qui vont/ont expirer et les pruner
299  x Fixer les purge/prune de multiple volumes
300  x Ajouter une gestion des utilisateurs avec des roles
301    o Liste des roles possibles
302      * view_stats
303      * configure
304      * run_job
305      * run_restore
306      * view_history
307      * view_log
308      * view_media
309      * view_pool
310      * update_media
311      * view_autochanger
312      * update_autochanger
313      * cancel_job
314
315    o Avoir des profiles ayant certains roles
316      * admin (all)
317      * customer (view_stats, view_history, view_log)
318      * production (all - configure)
319      ...
320
321    o Pour faire la difference entre les groupes de la vue et
322      les groupes d'acl, il faut ajouter un champs dans la table
323      client_group (visible bool).
324
325    o Ajout de 4 tables dans le catalogue
326        - bweb_user (userid, username, passwd, comment) passwd with apache ?
327        - bweb_role (roleid, rolename)
328        - bweb_role_member (roleid, userid)
329
330        - bweb_client_group_acl (client_group_id, userid)
331        - bweb_pool_acl (poolid, userid)
332
333  o Il faudrait aussi pouvoir choisir le login admin...
334
335  x On specifie par user si on veut filter par les groupes (gestion un peu
336    chiante, il faut ajouter les hosts dans les groupes, sinon, ils sont
337    invisibles)
338
339  x On recupere ce champs quand on check les can_do(); et apres, on le regarde
340    avant d'envoyer le JOIN de filtre. (Attention, admin n'est pas soumis a ca)
341    
342  x On peut ajouter une option dans la Config pour activer ce mode ou pas. 
343
344  x Regarder la possibilite de recuperer toutes les roles au debut pour
345    adapter les pages web... Il n'y a que les menus/actions autorises qui
346    seraient affiches. (bp cancel => role cancel_job, configuration => role configure)
347
348  * on utilise le commentaire depuis une page web, comme ca
349    on gere la traduction sans toucher a la base
350
351 CREATE TABLE bweb_user
352 (
353         userid       serial not null,
354         username     text not null,
355         use_acl      boolean default false,
356         comment      text default '',
357         passwd       text default '',
358         primary key (userid)
359 );
360 CREATE UNIQUE INDEX bweb_user_idx on bweb_user (username);
361
362 CREATE TABLE bweb_role
363 (
364         roleid       serial not null,
365         rolename     text not null,
366 --      comment      text default '',
367         primary key (roleid)
368 );
369 CREATE UNIQUE INDEX bweb_role_idx on bweb_role (rolename);
370
371 INSERT INTO bweb_role (rolename) VALUES ('r_user_mgnt');
372 INSERT INTO bweb_role (rolename) VALUES ('r_delete_job');
373 INSERT INTO bweb_role (rolename) VALUES ('r_prune');
374 INSERT INTO bweb_role (rolename) VALUES ('r_purge');
375 INSERT INTO bweb_role (rolename) VALUES ('r_group_mgnt');
376 INSERT INTO bweb_role (rolename) VALUES ('r_location_mgnt');
377 INSERT INTO bweb_role (rolename) VALUES ('r_cancel_job');
378 INSERT INTO bweb_role (rolename) VALUES ('r_run_job');
379 INSERT INTO bweb_role (rolename) VALUES ('r_configure');
380 INSERT INTO bweb_role (rolename) VALUES ('r_client_status');
381 INSERT INTO bweb_role (rolename) VALUES ('r_view_job');
382
383 CREATE TABLE  bweb_role_member
384 (
385         roleid       integer not null,
386         userid       integer not null,
387         primary key (roleid, userid)
388 );
389
390 CREATE TABLE  bweb_client_group_acl
391 (
392         client_group_id       integer not null,
393         userid                integer not null,
394         primary key (client_group_id, userid)
395 );
396
397  - Integrer brestore en mode javascript
398    o ajouter une api 
399        .ls_dir(jobid,pathid)
400        .ls_file(jobid,pathid)
401        .get_pathid(jobid,"/")
402        .genbsr (fileid, fileid, fileid, fileid, fileid...)
403            -> on peut utiliser une table dans la base pour faire ca
404               cf bat
405
406 > 1. Unloading tapes assistent.
407 >
408 > I'm using a script which selects tapes to unload. The idea is to
409 > remove all volumes from the library that contain a current set of
410 > backups. Basically, find the volumes from the most recent full backups
411 > and all volumes that depend on these. Ignore older fulls and their
412 > differentials and incrementals.
413 >
414 > This is to ensure that, at the time volumes are unloaded, a complete
415 > set of backups can be stored safely.
416
417 Already ok
418  Jobs -> Job Zoom -> View Media -> Select them -> Eject
419
420 Yes, it's a very good idea, i see no difficulty to implement this kind of
421 tool.
422
423 Users go to 
424   Media -> Made a Safe backup set 
425         -> Select Client(s) -> Select Job(s) -> Backup set
426
427 I think that i can do some sort of assistant to that.
428 (with next, next next)
429
430
431 > While volumes are prepared for unloading, I disable them, so Bacula
432 > will not try to use them. Later, they are automatically re-enabled.
433
434 x Do you use the Enabled flag for that ? It's a good idea.
435
436 > Move these volumes (if possible) to the export slots.
437
438 I have already some code for that, but at this time it doesn't use
439 the mtx-script from bacula. (or bacula-sd commands)
440
441 I have to change this, so user have a working mtx-scripts, and we use
442 it everywhere. (The best solution is to send command to bacula-dir)
443
444 > Later, request volumes to fill up the pools so there are usable
445 > volumes for later backups around. Load these volumes from the import
446 > slots to the regular working slots, and do an 'update slots'.
447
448 I use the Scratch pool for this sort of things, but we could use an other 
449 assistant for that.
450
451 Media -> I/O -> Fill pools -> Select pool(s) -> import selections
452
453 bschedule:
454  x Bug dans la determination des jours de la semaine (exemple de la full
455   le premier dimanche du mois)
456
457 manuel :
458  - Avoir la version 2.0 et la version 2.2 en ligne (pour que les utilisateurs
459    ne se trompent pas dans les versions)
460  - Supprimer les (need bacula >= 1.xx) (dans la derniere version)
461
462 bacula :
463  - Faire un test de non regression avec pleins d'erreur
464    o pb inclusion (distante, locale)
465    o pb exclusion (distante, locale)
466    o pb execution de commande
467    o pb de config avec test du -t des differents daemon
468  x Utiliser PQescapeStringConn a la place de PQescapeString
469  - Utiliser la lib pcre
470  - Rendre les scripts bacula-ctl-xxx LSB
471  x Pouvoir utiliser les uid numeriques dans le backup des acl
472  - Avoir un script qui dump la configuration pour faire
473    des bug reports
474  p modifier l'organisation de la table version (pour pouvoir ajouter
475    les versions de bweb par exemple)
476  - utiliser la meme fonction pour read_close_session et append_close_session
477  x pb dans le message de chargement d'une bande pendant une resto
478
479         Please mount Volume "R40175" or label a new one for
480         Pas le bon message pour une resto (label a new one)
481  - Impossible de lancer une restauration en meme temps qu'un backup sur
482    un autochanger. Le code dans jobq.c qui controle les MaxConcurrentJobs
483    ne prend pas en compte les autochanger avec plusieurs drives. Ce code
484    fait surement doublon avec le nouveau code de reservation.
485    Il faudrait le simplifier, et compter les jobs de restauration comme les
486    jobs normaux. Le patch précédent ne changeait pas le MaxConcurrentJobs
487    comme il faut à la fin du backup.
488
489  x Accurate backup
490    o Envoyer la liste de tous les fichiers au client dans un format simple
491     /path/      LSTAT                   # un / a la fin pour un repertoire
492     /path/file  LSTAT
493
494    o Le client construit un hash disque (ou en memoire ou les deux)
495    o A chaque repertoire/fichier on verifie la presence du fichier dans le hash
496      et on peut aussi comparer date/taille/bloc
497       - Si le fichier n'est pas dedans, on le backup
498       - Si le fichier est present on verifie les attributs et on mark le fichier comme vu
499    o A la fin, on parcours tous le hash pour trouver les fichiers qui ne sont pas vu et 
500      on envoie la liste des fichiers supprimes avec le fileindex=0 et pourquoi pas la date
501      du jour dans le champ mtime
502    o Utiliser systematiquement l'option ignorecase sous windows
503    p Ajouter une option pour avoir la table de stat
504       Enable Statistic = yes/no
505       Statistic retention = 4 years
506    o use mmap to map hash ? (on 32b, we are limited to 1 or 2GB)
507
508 #ifndef _WIN32
509        ef->data = mmap(NULL, ef->data_size, PROT_READ,
510                        MAP_SHARED, fileno(ef->fp), 0);
511 #else
512        fm = CreateFileMapping((HANDLE) _get_osfhandle (fileno(ef->fp)),
513                               NULL,
514                               PAGE_READONLY,
515                               0,
516                               0,
517                               NULL);
518        ef->data = MapViewOfFile(fm,
519                                 FILE_MAP_READ,
520                                 0,
521                                 0,
522                                 ef->data_size);
523        CloseHandle(fm);
524 #endif
525  
526         ef = eet_internal_read(ef);
527         if (!ef)
528 @@ -892,11 +862,7 @@
529         free(ef->header);
530       }
531  
532 #ifndef _WIN32
533    if (ef->data) munmap((void*)ef->data, ef->data_size);
534 #else
535    if (ef->data) UnmapViewOfFile (ef->data);
536 #endif
537
538 if (ef->fp) fclose(ef->fp);
539
540   - Accurate backup (kern)
541 1. Run bconsole
542 2. Dir -> FD run job
543 *3. FD does a normal backup and at the same time makes a list of all files on 
544 the system (in the FileSet), marking which ones were just now backed up.
545 4. For each file backed up send attributes/data to SD.  Note, this is done 
546 during step 3 above. Minor difference, the connection with the SD is not 
547 dropped at the end of the backup -- see later.
548 *5. Send the list of all files including those backed up to the Dir
549   --> Send to SD and DIR at the same time ? 
550         filed/backup.c/encode_and_send_attributes
551
552 6. Dir computes files and deleted files.
553 7. Dir sends list of additional files (new files) to backup, and list of files
554 deleted.
555 8. FD does backup of files Dir says to save.
556 9. FD sends SD attrs of backed up files
557 10. FD sends SD delete records for files Dir wants deleted.
558 *11. FD connection to SD can be closed, this part of the backup is done.
559 *12. FD sends new list of files just backed up to Dir
560 *13. Dir adds newly backed up files to previous list sent by FD
561 *14. Dir "batch" inserts complete new list in the catalog (I forgot the name 
562 of the new table). Note this table has nothing to do with the File table.
563 *15. Dir deletes previous list in catalog.
564 *16. Dir does normal batch insert of attributes from SD, but must handle 
565 deleted records. Note, this will probably happen at the same time as the 
566 items 13-15.
567
568
569
570   - TODO:
571   0001088: volume FirstWritten attribute is set to time of mount request, not time of first write
572   Description   When a Bacula job requests mounting a tape volume that is not present in the drive,
573   once the tape is mounted, its FirstWritten attribute is set to the time when the volume was requested.
574   Consequently, if the job has been waiting longer than the maximum use duration of the volume,
575   the volume is promoted to Used immediately because the maximum use duration has apparently expired before
576   the use has even started.
577
578 To avoid that, the FirstWritten attribute should be set to the time the volume was mounted (= the current time when the setting takes place).
579
580  x Backup a file that is not in accurate list (change NOCHG to LINK, FILE, etc..)
581  * Manage JobFiles (Deleted compte pour 1 ?)
582
583  x Utiliser le check_accurate dans find_one et declencher le save_file
584  si besoin en desactivant le incremental.
585  x ne va pas marcher avec le strip path (la recherche est faite avant le strip path)
586  * on peut utiliser le champs LStat de la base pour noter que le fichier est supprimé...
587   
588  CREATE TEMPORARY TABLE btemp2 AS (
589   SELECT max(FileId) as FileId, PathId, FilenameId 
590     FROM (SELECT FileId, PathId, FilenameId FROM File WHERE JobId IN (39867,40341)) AS F
591    GROUP BY PathId, FilenameId )
592
593  SELECT Path.Path, Filename.Name, File.FileIndex, File.JobId, File.LStat 
594  FROM (
595   SELECT max(FileId) as FileId, PathId, FilenameId 
596     FROM (SELECT FileId, PathId, FilenameId FROM File WHERE JobId IN (11,13)) AS F
597    GROUP BY PathId, FilenameId
598   ) AS Temp 
599  JOIN Filename ON (Filename.FilenameId = Temp.FilenameId) 
600  JOIN Path ON (Path.PathId = Temp.PathId) 
601  JOIN File ON (File.FileId = Temp.FileId)
602  WHERE FileIndex > 0
603
604
605   SELECT File.FileIndex, Path.Path, Filename.Name, File.LStat
606     FROM btemp2 JOIN Path USING (PathId) JOIN Filename USING (FilenameId)
607                 JOIN File USING (FileId)
608    WHERE File.FileIndex > 0
609
610  DROP TABLE btemp2
611 */
612 /*
613 SELECT DISTINCT ON (PathId, FilenameId) FileIndex, Path, Name, LStat
614   FROM File JOIN Filename USING (FilenameId) JOIN Path USING (PathId) WHERE JobId IN (40341)
615  ORDER BY PathId, FilenameId, JobId DESC
616 */
617
618  - .api mode:
619 Some ideas :
620 - Every dates have to be in ISO format
621 YYYY-MM-DD HH:MM:SS
622 - JobLevel, JobStatus, etc.. have to use C constant T,R,a,A,f...
623 - Sizes are always in bytes (no suffix)
624 - Numbers have to be used without commas
625 - If we change (add) something,  we must always add new elements
626 at the end.
627
628 For director status on running jobs, it will be great to display :
629 JobId, Client name, Job Name, Level, Start Time and Status
630
631
632  x Utiliser une alist dans les runscripts
633
634 RunScript {
635    console = "xxxx"
636    console = "yyy"
637    console = "zzzz"
638 }
639
640 or possibly
641
642 RunScript {
643    console = "xxxx", "yyyy", "zzzz" 
644    console = "aaaa"
645 }
646
647  o cleanup bextract to use filed code
648