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