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