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