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