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
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 ?
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)
24 | +-------+ (4) +---------------+
26 +--------+ (5) +-------+ | | | | DIRECTOR |
27 | |<------+ | | | |---->| |
28 | FD | | PROXY | | | PROXY | (3) +-------+-------+
29 | +-------> <-+---> | |
30 +--------+ (6) +-^-----+ (2) | | +-------v-------+
32 | | | +-----> STORAGE |
34 Initiate backup | | +-------+ +---------------+
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
44 - Utilisation d'une sorte proxy https
48 p Ajouter l'historique dans la bconsole
49 - Ajouter une commande pour bloquer un drive
52 - Avoir un SD sur chaque FD
53 - Avoir une serie de script qui :
54 * bascule le lecteur en local
56 * le script de mtx doit faire ses demandes au director sur
59 - Tout le monde voit le lecteur, et le client doit demander la permission
60 pour despooler son bloc de XG au director.
62 - On fait du round robbin avec tout le monde, et on utilise un disque
65 - 50 clients qui spoolent en local, c'est plus rapide que vers 1 point
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
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/
82 http://modules.apache.org/doc/API.html
84 - comment charger les librairies dependantes d'un hook
88 - nommer les hook (a la place d'une structure de pointeur)
90 "action", mod_action_handler
105 - configuration... (ajout automatique avant de charger le fichier de conf)
112 - exemple de hook/module
114 - checksum (MD5/SHA1)
116 - compression (LZO, GZIP, BZIP)
118 - initialiser le jcr avec seulement les hooks utiles
121 - declarer les modules utiles
122 - les options doivent utiliser le nom du module
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 ?)
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.
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.
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
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)
160 x Ajouter une vue par groupe et par date (sur 7, 15 ou 30 jours)
163 groupe1 v v x w v v v q1
164 |-- s1 v v v v v v v q2
168 ---8<-------8<--------8<--------8<----------8<------------------
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';
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
180 SELECT date_trunc('day', job_old.StartTime) AS date,
181 MAX(severity) AS severity,
183 SUM(JobErrors) AS joberrors,
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'
191 GROUP BY client_group_name, date
192 ) AS sub JOIN Status USING (severity)
193 ORDER BY client_group_name, date
195 -- Affiche un client_group en detail (q2)
196 SELECT date, client, JobStatusLong, JobStatus, nb_job, joberrors
198 SELECT date_trunc('day', job_old.StartTime) AS date,
199 Client.Name AS client,
200 MAX(severity) AS severity,
202 SUM(JobErrors) AS joberrors
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'
211 GROUP BY client, date
212 ) AS sub JOIN Status USING (severity)
213 ORDER BY client, date
215 ---8<-------8<--------8<--------8<----------8<------------------
217 - Quand on clique dessus on arrive sur la liste des jobs en question
221 x Ajouter une variable pour remplacer NOW() dans les queries
222 origin = arg->{origin} || NOW();
223 - Ajouter des stats en %
225 ---8<-------8<--------8<--------8<----------8<------------------
227 SELECT client_group_name, (nb_ok::float/(nb_ok+nb_other)*100)::numeric(6,3) AS percent_ok
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,
240 JOIN client_group_member USING (ClientId)
241 JOIN client_group USING (client_group_id)
243 WHERE StartTime > '2007-10-01'
244 GROUP BY client_group_name
247 SELECT Name, (nb_ok::float/(nb_ok+nb_other)*100)::numeric(6,3) AS percent_ok
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,
260 JOIN Client USING (ClientId)
262 WHERE StartTime > '2007-10-01'
263 AND JobStatus IN ('T', 'A', 'f', 'E', 'e')
269 ---8<-------8<--------8<--------8<----------8<------------------
272 ------------- x 100 => par groupe de client
275 - Il faut ajouter une estimation des jobs qui auraient
276 du se lancer (a voir avec les schedules)
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
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
304 o Avoir des profiles ayant certains roles
306 * customer (view_stats, view_history, view_log)
307 * production (all - configure)
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).
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)
319 - bweb_client_group_acl (client_group_id, userid)
320 - bweb_pool_acl (poolid, userid)
322 o Il faudrait aussi pouvoir choisir le login admin...
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
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)
331 x On peut ajouter une option dans la Config pour activer ce mode ou pas.
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)
337 * on utilise le commentaire depuis une page web, comme ca
338 on gere la traduction sans toucher a la base
340 CREATE TABLE bweb_user
342 userid serial not null,
343 username text not null,
344 use_acl boolean default false,
345 comment text default '',
346 passwd text default '',
349 CREATE UNIQUE INDEX bweb_user_idx on bweb_user (username);
351 CREATE TABLE bweb_role
353 roleid serial not null,
354 rolename text not null,
355 -- comment text default '',
358 CREATE UNIQUE INDEX bweb_role_idx on bweb_role (rolename);
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');
372 CREATE TABLE bweb_role_member
374 roleid integer not null,
375 userid integer not null,
376 primary key (roleid, userid)
379 CREATE TABLE bweb_client_group_acl
381 client_group_id integer not null,
382 userid integer not null,
383 primary key (client_group_id, userid)
386 - Integrer brestore en mode javascript
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
395 > 1. Unloading tapes assistent.
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.
403 > This is to ensure that, at the time volumes are unloaded, a complete
404 > set of backups can be stored safely.
407 Jobs -> Job Zoom -> View Media -> Select them -> Eject
409 Yes, it's a very good idea, i see no difficulty to implement this kind of
413 Media -> Made a Safe backup set
414 -> Select Client(s) -> Select Job(s) -> Backup set
416 I think that i can do some sort of assistant to that.
417 (with next, next next)
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.
423 x Do you use the Enabled flag for that ? It's a good idea.
425 > Move these volumes (if possible) to the export slots.
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)
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)
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'.
437 I use the Scratch pool for this sort of things, but we could use an other
440 Media -> I/O -> Fill pools -> Select pool(s) -> import selections
443 x Bug dans la determination des jours de la semaine (exemple de la full
444 le premier dimanche du mois)
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)
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
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
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.
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
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
496 - Accurate backup (kern)
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
508 6. Dir computes files and deleted files.
509 7. Dir sends list of additional files (new files) to backup, and list of files
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
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
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é...
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 )
543 SELECT Path.Path, Filename.Name, File.FileIndex, File.JobId, File.LStat
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
549 JOIN Filename ON (Filename.FilenameId = Temp.FilenameId)
550 JOIN Path ON (Path.PathId = Temp.PathId)
551 JOIN File ON (File.FileId = Temp.FileId)
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
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
571 p Utiliser une alist dans les runscripts
582 console = "xxxx", "yyyy", "zzzz"
586 x fix segfault when config files are empty
587 o cleanup bextract to use filed code