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 x Ajouter un bouton suivant/precedant dans la vue des logs
285 x Ajouter la liste des medias qui vont/ont expirer et les pruner
286 x Fixer les purge/prune de multiple volumes
287 x Ajouter une gestion des utilisateurs avec des roles
288 o Liste des roles possibles
302 o Avoir des profiles ayant certains roles
304 * customer (view_stats, view_history, view_log)
305 * production (all - configure)
308 o Pour faire la difference entre les groupes de la vue et
309 les groupes d'acl, il faut ajouter un champs dans la table
310 client_group (visible bool).
312 o Ajout de 4 tables dans le catalogue
313 - bweb_user (userid, username, passwd, comment) passwd with apache ?
314 - bweb_role (roleid, rolename)
315 - bweb_role_member (roleid, userid)
317 - bweb_client_group_acl (client_group_id, userid)
318 - bweb_pool_acl (poolid, userid)
320 o Il faudrait aussi pouvoir choisir le login admin...
322 x On specifie par user si on veut filter par les groupes (gestion un peu
323 chiante, il faut ajouter les hosts dans les groupes, sinon, ils sont
326 x On recupere ce champs quand on check les can_do(); et apres, on le regarde
327 avant d'envoyer le JOIN de filtre. (Attention, admin n'est pas soumis a ca)
329 x On peut ajouter une option dans la Config pour activer ce mode ou pas.
331 x Regarder la possibilite de recuperer toutes les roles au debut pour
332 adapter les pages web... Il n'y a que les menus/actions autorises qui
333 seraient affiches. (bp cancel => role cancel_job, configuration => role configure)
335 * on utilise le commentaire depuis une page web, comme ca
336 on gere la traduction sans toucher a la base
338 CREATE TABLE bweb_user
340 userid serial not null,
341 username text not null,
342 use_acl boolean default false,
343 comment text default '',
344 passwd text default '',
347 CREATE UNIQUE INDEX bweb_user_idx on bweb_user (username);
349 CREATE TABLE bweb_role
351 roleid serial not null,
352 rolename text not null,
353 -- comment text default '',
356 CREATE UNIQUE INDEX bweb_role_idx on bweb_role (rolename);
358 INSERT INTO bweb_role (rolename) VALUES ('r_user_mgnt');
359 INSERT INTO bweb_role (rolename) VALUES ('r_delete_job');
360 INSERT INTO bweb_role (rolename) VALUES ('r_prune');
361 INSERT INTO bweb_role (rolename) VALUES ('r_purge');
362 INSERT INTO bweb_role (rolename) VALUES ('r_group_mgnt');
363 INSERT INTO bweb_role (rolename) VALUES ('r_location_mgnt');
364 INSERT INTO bweb_role (rolename) VALUES ('r_cancel_job');
365 INSERT INTO bweb_role (rolename) VALUES ('r_run_job');
366 INSERT INTO bweb_role (rolename) VALUES ('r_configure');
367 INSERT INTO bweb_role (rolename) VALUES ('r_client_status');
368 INSERT INTO bweb_role (rolename) VALUES ('r_view_job');
370 CREATE TABLE bweb_role_member
372 roleid integer not null,
373 userid integer not null,
374 primary key (roleid, userid)
377 CREATE TABLE bweb_client_group_acl
379 client_group_id integer not null,
380 userid integer not null,
381 primary key (client_group_id, userid)
384 - Integrer brestore en mode javascript
386 .ls_dir(jobid,pathid)
387 .ls_file(jobid,pathid)
388 .get_pathid(jobid,"/")
389 .genbsr (fileid, fileid, fileid, fileid, fileid...)
390 -> on peut utiliser une table dans la base pour faire ca
393 > 1. Unloading tapes assistent.
395 > I'm using a script which selects tapes to unload. The idea is to
396 > remove all volumes from the library that contain a current set of
397 > backups. Basically, find the volumes from the most recent full backups
398 > and all volumes that depend on these. Ignore older fulls and their
399 > differentials and incrementals.
401 > This is to ensure that, at the time volumes are unloaded, a complete
402 > set of backups can be stored safely.
405 Jobs -> Job Zoom -> View Media -> Select them -> Eject
407 Yes, it's a very good idea, i see no difficulty to implement this kind of
411 Media -> Made a Safe backup set
412 -> Select Client(s) -> Select Job(s) -> Backup set
414 I think that i can do some sort of assistant to that.
415 (with next, next next)
418 > While volumes are prepared for unloading, I disable them, so Bacula
419 > will not try to use them. Later, they are automatically re-enabled.
421 x Do you use the Enabled flag for that ? It's a good idea.
423 > Move these volumes (if possible) to the export slots.
425 I have already some code for that, but at this time it doesn't use
426 the mtx-script from bacula. (or bacula-sd commands)
428 I have to change this, so user have a working mtx-scripts, and we use
429 it everywhere. (The best solution is to send command to bacula-dir)
431 > Later, request volumes to fill up the pools so there are usable
432 > volumes for later backups around. Load these volumes from the import
433 > slots to the regular working slots, and do an 'update slots'.
435 I use the Scratch pool for this sort of things, but we could use an other
438 Media -> I/O -> Fill pools -> Select pool(s) -> import selections
441 x Bug dans la determination des jours de la semaine (exemple de la full
442 le premier dimanche du mois)
445 - Avoir la version 2.0 et la version 2.2 en ligne (pour que les utilisateurs
446 ne se trompent pas dans les versions)
447 - Supprimer les (need bacula >= 1.xx) (dans la derniere version)
450 - Faire un test de non regression avec pleins d'erreur
451 o pb inclusion (distante, locale)
452 o pb exclusion (distante, locale)
453 o pb execution de commande
454 o pb de config avec test du -t des differents daemon
455 x Utiliser PQescapeStringConn a la place de PQescapeString
456 - Utiliser la lib pcre
457 - Rendre les scripts bacula-ctl-xxx LSB
458 x Pouvoir utiliser les uid numeriques dans le backup des acl
459 - Avoir un script qui dump la configuration pour faire
461 p modifier l'organisation de la table version (pour pouvoir ajouter
462 les versions de bweb par exemple)
463 - utiliser la meme fonction pour read_close_session et append_close_session
464 - pb dans le message de chargement d'une bande pendant une resto
466 Please mount Volume "R40175" or label a new one for
467 Pas le bon message pour une resto (label a new one)
468 - Impossible de lancer une restauration en meme temps qu'un backup sur
469 un autochanger. Le code dans jobq.c qui controle les MaxConcurrentJobs
470 ne prend pas en compte les autochanger avec plusieurs drives. Ce code
471 fait surement doublon avec le nouveau code de reservation.
472 Il faudrait le simplifier, et compter les jobs de restauration comme les
473 jobs normaux. Le patch précédent ne changeait pas le MaxConcurrentJobs
474 comme il faut à la fin du backup.
477 o Envoyer la liste de tous les fichiers au client dans un format simple
478 /path/ LSTAT # un / a la fin pour un repertoire
481 o Le client construit un hash disque (ou en memoire ou les deux)
482 o A chaque repertoire/fichier on verifie la presence du fichier dans le hash
483 et on peut aussi comparer date/taille/bloc
484 - Si le fichier n'est pas dedans, on le backup
485 - Si le fichier est present on verifie les attributs et on mark le fichier comme vu
486 o A la fin, on parcours tous le hash pour trouver les fichiers qui ne sont pas vu et
487 on envoie la liste des fichiers supprimes avec le fileindex=0 et pourquoi pas la date
488 du jour dans le champ mtime
489 o Utiliser systematiquement l'option ignorecase sous windows
490 p Ajouter une option pour avoir la table de stat
491 Enable Statistic = yes/no
492 Statistic retention = 4 years
494 - Accurate backup (kern)
497 *3. FD does a normal backup and at the same time makes a list of all files on
498 the system (in the FileSet), marking which ones were just now backed up.
499 4. For each file backed up send attributes/data to SD. Note, this is done
500 during step 3 above. Minor difference, the connection with the SD is not
501 dropped at the end of the backup -- see later.
502 *5. Send the list of all files including those backed up to the Dir
503 --> Send to SD and DIR at the same time ?
504 filed/backup.c/encode_and_send_attributes
506 6. Dir computes files and deleted files.
507 7. Dir sends list of additional files (new files) to backup, and list of files
509 8. FD does backup of files Dir says to save.
510 9. FD sends SD attrs of backed up files
511 10. FD sends SD delete records for files Dir wants deleted.
512 *11. FD connection to SD can be closed, this part of the backup is done.
513 *12. FD sends new list of files just backed up to Dir
514 *13. Dir adds newly backed up files to previous list sent by FD
515 *14. Dir "batch" inserts complete new list in the catalog (I forgot the name
516 of the new table). Note this table has nothing to do with the File table.
517 *15. Dir deletes previous list in catalog.
518 *16. Dir does normal batch insert of attributes from SD, but must handle
519 deleted records. Note, this will probably happen at the same time as the
525 * Backup a file that is not in accurate list (change NOCHG to LINK, FILE, etc..)
526 * Manage JobFiles (Deleted compte pour 1 ?)
527 * Gerer la fuite memoire...
528 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
529 12521 eric 15 0 178m 132m 844 S 0.0 26.4 2:39.30 bacula-fd
532 CREATE TEMPORARY TABLE btemp2 AS (
533 SELECT max(FileId) as FileId, PathId, FilenameId
534 FROM (SELECT FileId, PathId, FilenameId FROM File WHERE JobId IN (39867,40341)) AS F
535 GROUP BY PathId, FilenameId )
537 SELECT Path.Path, Filename.Name, File.FileIndex, File.JobId, File.LStat
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 JOIN Filename ON (Filename.FilenameId = Temp.FilenameId)
544 JOIN Path ON (Path.PathId = Temp.PathId)
545 JOIN File ON (File.FileId = Temp.FileId)
549 SELECT File.FileIndex, Path.Path, Filename.Name, File.LStat
550 FROM btemp2 JOIN Path USING (PathId) JOIN Filename USING (FilenameId)
551 JOIN File USING (FileId)
552 WHERE File.FileIndex > 0
557 SELECT DISTINCT ON (PathId, FilenameId) FileIndex, Path, Name, LStat
558 FROM File JOIN Filename USING (FilenameId) JOIN Path USING (PathId) WHERE JobId IN (40341)
559 ORDER BY PathId, FilenameId, JobId DESC
565 p Utiliser une alist dans les runscripts
576 console = "xxxx", "yyyy", "zzzz"
580 x fix segfault when config files are empty
581 o cleanup bextract to use filed code