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