]> 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   - Balloon
133 Btw., the vertical axis was the number of files 
134 while the size of the ballon is the volume (in MB 
135 or GB).  Those could be switched, though, depending on what looks better.
136
137 What are you using for color-coding the ballons? 
138 That could be a variety of different things like 
139 client, client group, backup level (full, 
140 incremental, etc.,) that adds context to the size 
141 and position that is already present in the chart.
142
143  - Ajouter mount,umount,release,status pour chaque device
144  - Ajouter le viewfileset dans l'interface de resto
145  x Ajouter la labelisation de bande et l'ajout de media (add et label)
146  - Ajouter la possibilité de lancer des migrations et des
147  verification. 
148  - Quand on deplace un media, il faut prendre le enabled depuis
149    la nouvelle localisation (en javascript)
150   o On ajoute une combo (Backup/Migration/Verify)
151   o On peut regarder dans l'historique des job quel est le bon type
152   o Quand on relance, on spécifie le type directement
153   o Il faut adapter le status client pour traiter les autres type
154  de job (par exemple, si c'est pas un backup/restore, pas de status dir)
155
156
157  - Ajouter une vue par groupe et par date (sur 7, 15 ou 30 jours)
158
159               lu ma me je ve sa di
160   groupe1     v  v  x  w  v  v  v             q1
161    |-- s1     v  v  v  v  v  v  v             q2
162    |-- s2     v  v  x  v  v  v  v
163    `-- s3     v  v  v  w  v  v  v
164
165 ---8<-------8<--------8<--------8<----------8<------------------
166
167 ALTER TABLE Status ADD COLUMN severity int;
168 UPDATE status SET severity = 15;
169 UPDATE status SET severity = 100 where jobstatus = 'f';
170 UPDATE status SET severity = 90 where jobstatus = 'A';
171 UPDATE status SET severity = 10 where jobstatus = 'T';
172
173 -- Affiche par groupe et date le statut des jobs (q1)
174 SELECT date_part('day', date) AS day, date, client_group_name, JobStatusLong, 
175        JobStatus, nb_job, joberrors
176 FROM (
177   SELECT date_trunc('day', job_old.StartTime) AS date, 
178          MAX(severity)  AS severity,
179          COUNT(1)       AS nb_job,
180          SUM(JobErrors) AS joberrors,
181          client_group_name
182     FROM job_old
183     JOIN client_group_member USING (ClientId)
184     JOIN client_group        USING (client_group_id)
185     JOIN Status              USING (JobStatus)
186    WHERE StartTime > '2007-10-01' AND StartTime < '2007-11-19'
187   
188    GROUP BY client_group_name, date
189 ) AS sub JOIN Status USING (severity)
190  ORDER BY client_group_name, date
191
192 -- Affiche un client_group en detail (q2)
193 SELECT date, client, JobStatusLong, JobStatus, nb_job, joberrors
194 FROM (
195   SELECT date_trunc('day', job_old.StartTime) AS date,
196          Client.Name    AS client,
197          MAX(severity)  AS severity,
198          COUNT(1)       AS nb_job,
199          SUM(JobErrors) AS joberrors
200     FROM job_old
201     JOIN client_group_member USING (ClientId)
202     JOIN client_group        USING (client_group_id)
203     JOIN Client              USING (ClientId)
204     JOIN Status              USING (JobStatus)
205    WHERE StartTime > '2007-10-01'
206      AND client_group_name = '0-SAVES_SIGMA1'
207
208    GROUP BY client, date
209 ) AS sub JOIN Status USING (severity)
210  ORDER BY client, date
211
212 ---8<-------8<--------8<--------8<----------8<------------------
213
214  - Quand on clique dessus on arrive sur la liste des jobs en question
215    Groupe -> Jobs
216    Job    -> Log
217
218  - Ajouter une variable pour remplacer NOW() dans les queries
219    origin = arg->{origin} || NOW();
220  - Ajouter des stats en %
221
222 ---8<-------8<--------8<--------8<----------8<------------------
223
224 SELECT  client_group_name, (nb_ok::float/(nb_ok+nb_other)*100)::numeric(6,3) AS percent_ok
225 FROM (
226
227      SELECT 
228        SUM(CASE WHEN JobStatus='T' THEN 1 
229                 ELSE 0 END) AS nb_ok,
230        SUM(CASE WHEN JobStatus='A' THEN 1 
231                 WHEN JobStatus='f' THEN 1
232                 WHEN JobStatus='E' THEN 1 
233                 WHEN JobStatus='e' THEN 1 
234                 ELSE 0 END) AS nb_other,
235        client_group_name
236       FROM job_old 
237       JOIN client_group_member USING (ClientId)
238       JOIN client_group        USING (client_group_id)
239
240      WHERE StartTime > '2007-10-01'
241      GROUP BY client_group_name
242 ) AS subq
243
244 SELECT  Name, (nb_ok::float/(nb_ok+nb_other)*100)::numeric(6,3) AS percent_ok
245 FROM (
246
247      SELECT 
248        SUM(CASE WHEN JobStatus='T' THEN 1 
249                 ELSE 0 END) AS nb_ok,
250        SUM(CASE WHEN JobStatus='A' THEN 1 
251                 WHEN JobStatus='f' THEN 1
252                 WHEN JobStatus='E' THEN 1 
253                 WHEN JobStatus='e' THEN 1 
254                 ELSE 0 END) AS nb_other,
255        Client.Name AS name
256       FROM job_old 
257       JOIN Client       USING (ClientId)
258
259      WHERE StartTime > '2007-10-01'
260        AND JobStatus IN ('T', 'A', 'f', 'E', 'e')
261      GROUP BY Client.Name
262 ) AS subq
263
264
265
266 ---8<-------8<--------8<--------8<----------8<------------------
267
268    Nb backup OK
269   -------------  x 100 => par groupe de client
270    Nb backup
271
272  - Il faut ajouter une estimation des jobs qui auraient
273    du se lancer (a voir avec les schedules)
274
275  - Affichage en html/csv pour des stats 
276   grp, nb client, nb backup, nb ok, nb err, nb cancel, 
277   %ok, nb files, nb gig, time
278
279  - Ajouter la liste des fichiers (quand il n'y en a pas trop)
280  - Ajouter un mode qui compte le nombre de fichier sous bfileview
281  x Ajouter un bouton suivant/precedant dans la vue des logs
282  x Ajouter la liste des medias qui vont/ont expirer et les pruner
283  x Fixer les purge/prune de multiple volumes
284  x Ajouter une gestion des utilisateurs avec des roles
285    o Liste des roles possibles
286      * view_stats
287      * configure
288      * run_job
289      * run_restore
290      * view_history
291      * view_log
292      * view_media
293      * view_pool
294      * update_media
295      * view_autochanger
296      * update_autochanger
297      * cancel_job
298
299    o Avoir des profiles ayant certains roles
300      * admin (all)
301      * customer (view_stats, view_history, view_log)
302      * production (all - configure)
303      ...
304
305    o Pour faire la difference entre les groupes de la vue et
306      les groupes d'acl, il faut ajouter un champs dans la table
307      client_group (visible bool).
308
309    o Ajout de 4 tables dans le catalogue
310        - bweb_user (userid, username, passwd, comment) passwd with apache ?
311        - bweb_role (roleid, rolename)
312        - bweb_role_member (roleid, userid)
313
314        - bweb_client_group_acl (client_group_id, userid)
315        - bweb_pool_acl (poolid, userid)
316
317  o Il faudrait aussi pouvoir choisir le login admin...
318
319  x On specifie par user si on veut filter par les groupes (gestion un peu
320    chiante, il faut ajouter les hosts dans les groupes, sinon, ils sont
321    invisibles)
322
323  x On recupere ce champs quand on check les can_do(); et apres, on le regarde
324    avant d'envoyer le JOIN de filtre. (Attention, admin n'est pas soumis a ca)
325    
326  x On peut ajouter une option dans la Config pour activer ce mode ou pas. 
327
328  x Regarder la possibilite de recuperer toutes les roles au debut pour
329    adapter les pages web... Il n'y a que les menus/actions autorises qui
330    seraient affiches. (bp cancel => role cancel_job, configuration => role configure)
331
332  * on utilise le commentaire depuis une page web, comme ca
333    on gere la traduction sans toucher a la base
334
335 CREATE TABLE bweb_user
336 (
337         userid       serial not null,
338         username     text not null,
339         use_acl      boolean default false,
340         comment      text default '',
341         passwd       text default '',
342         primary key (userid)
343 );
344 CREATE UNIQUE INDEX bweb_user_idx on bweb_user (username);
345
346 CREATE TABLE bweb_role
347 (
348         roleid       serial not null,
349         rolename     text not null,
350 --      comment      text default '',
351         primary key (roleid)
352 );
353 CREATE UNIQUE INDEX bweb_role_idx on bweb_role (rolename);
354
355 INSERT INTO bweb_role (rolename) VALUES ('r_user_mgnt');
356 INSERT INTO bweb_role (rolename) VALUES ('r_delete_job');
357 INSERT INTO bweb_role (rolename) VALUES ('r_prune');
358 INSERT INTO bweb_role (rolename) VALUES ('r_purge');
359 INSERT INTO bweb_role (rolename) VALUES ('r_group_mgnt');
360 INSERT INTO bweb_role (rolename) VALUES ('r_location_mgnt');
361 INSERT INTO bweb_role (rolename) VALUES ('r_cancel_job');
362 INSERT INTO bweb_role (rolename) VALUES ('r_run_job');
363 INSERT INTO bweb_role (rolename) VALUES ('r_configure');
364 INSERT INTO bweb_role (rolename) VALUES ('r_client_status');
365 INSERT INTO bweb_role (rolename) VALUES ('r_view_job');
366
367 CREATE TABLE  bweb_role_member
368 (
369         roleid       integer not null,
370         userid       integer not null,
371         primary key (roleid, userid)
372 );
373
374 CREATE TABLE  bweb_client_group_acl
375 (
376         client_group_id       integer not null,
377         userid                integer not null,
378         primary key (client_group_id, userid)
379 );
380
381  - Integrer brestore en mode javascript
382    o ajouter une api 
383        .ls_dir(jobid,pathid)
384        .ls_file(jobid,pathid)
385        .get_pathid(jobid,"/")
386        .genbsr (fileid, fileid, fileid, fileid, fileid...)
387            -> on peut utiliser une table dans la base pour faire ca
388               cf bat
389
390 > 1. Unloading tapes assistent.
391 >
392 > I'm using a script which selects tapes to unload. The idea is to
393 > remove all volumes from the library that contain a current set of
394 > backups. Basically, find the volumes from the most recent full backups
395 > and all volumes that depend on these. Ignore older fulls and their
396 > differentials and incrementals.
397 >
398 > This is to ensure that, at the time volumes are unloaded, a complete
399 > set of backups can be stored safely.
400
401 Already ok
402  Jobs -> Job Zoom -> View Media -> Select them -> Eject
403
404 Yes, it's a very good idea, i see no difficulty to implement this kind of
405 tool.
406
407 Users go to 
408   Media -> Made a Safe backup set 
409         -> Select Client(s) -> Select Job(s) -> Backup set
410
411 I think that i can do some sort of assistant to that.
412 (with next, next next)
413
414
415 > While volumes are prepared for unloading, I disable them, so Bacula
416 > will not try to use them. Later, they are automatically re-enabled.
417
418 x Do you use the Enabled flag for that ? It's a good idea.
419
420 > Move these volumes (if possible) to the export slots.
421
422 I have already some code for that, but at this time it doesn't use
423 the mtx-script from bacula. (or bacula-sd commands)
424
425 I have to change this, so user have a working mtx-scripts, and we use
426 it everywhere. (The best solution is to send command to bacula-dir)
427
428 > Later, request volumes to fill up the pools so there are usable
429 > volumes for later backups around. Load these volumes from the import
430 > slots to the regular working slots, and do an 'update slots'.
431
432 I use the Scratch pool for this sort of things, but we could use an other 
433 assistant for that.
434
435 Media -> I/O -> Fill pools -> Select pool(s) -> import selections
436
437 bschedule:
438  - Bug dans la determination des jours de la semaine (exemple de la full
439   le premier dimanche du mois)
440
441 manuel :
442  - Avoir la version 2.0 et la version 2.2 en ligne (pour que les utilisateurs
443    ne se trompent pas dans les versions)
444  - Supprimer les (need bacula >= 1.xx) (dans la derniere version)
445
446 bacula :
447  - Faire un test de non regression avec pleins d'erreur
448    o pb inclusion (distante, locale)
449    o pb exclusion (distante, locale)
450    o pb execution de commande
451    o pb de config avec test du -t des differents daemon
452  x Utiliser PQescapeStringConn a la place de PQescapeString
453  - Utiliser la lib pcre
454  - Rendre les scripts bacula-ctl-xxx LSB
455  x Pouvoir utiliser les uid numeriques dans le backup des acl
456  - Avoir un script qui dump la configuration pour faire
457    des bug reports
458  p modifier l'organisation de la table version (pour pouvoir ajouter
459    les versions de bweb par exemple)
460  - utiliser la meme fonction pour read_close_session et append_close_session
461  - pb dans le message de chargement d'une bande pendant une resto
462
463         Please mount Volume "R40175" or label a new one for
464         Pas le bon message pour une resto (label a new one)
465  - Impossible de lancer une restauration en meme temps qu'un backup sur
466    un autochanger. Le code dans jobq.c qui controle les MaxConcurrentJobs
467    ne prend pas en compte les autochanger avec plusieurs drives. Ce code
468    fait surement doublon avec le nouveau code de reservation.
469    Il faudrait le simplifier, et compter les jobs de restauration comme les
470    jobs normaux. Le patch précédent ne changeait pas le MaxConcurrentJobs
471    comme il faut à la fin du backup.
472
473  - Accurate backup
474    o Envoyer la liste de tous les fichiers au client dans un format simple
475     /path/      LSTAT                   # un / a la fin pour un repertoire
476     /path/file  LSTAT
477
478    o Le client construit un hash disque (ou en memoire ou les deux)
479    o A chaque repertoire/fichier on verifie la presence du fichier dans le hash
480      et on peut aussi comparer date/taille/bloc
481       - Si le fichier n'est pas dedans, on le backup
482       - Si le fichier est present on verifie les attributs et on mark le fichier comme vu
483    o A la fin, on parcours tous le hash pour trouver les fichiers qui ne sont pas vu et 
484      on envoie la liste des fichiers supprimes avec le fileindex=0 et pourquoi pas la date
485      du jour dans le champ mtime
486    o Utiliser systematiquement l'option ignorecase sous windows
487    p Ajouter une option pour avoir la table de stat
488       Enable Statistic = yes/no
489       Statistic retention = 4 years
490
491
492  o Utiliser une alist dans les runscripts
493
494 RunScript {
495    console = "xxxx"
496    console = "yyy"
497    console = "zzzz"
498 }
499
500 or possibly
501
502 RunScript {
503    console = "xxxx", "yyyy", "zzzz" 
504    console = "aaaa"
505 }
506
507  o fix segfault when config files are empty