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