6 proba de collision en fonction de la taille du hash
7 http://en.wikipedia.org/wiki/Birthday_attack
10 - Pouvoir configurer les algos de cryptage
11 - Pouvoir choisir de crypter dans le fileset
12 - Pouvoir choisir de forcer le cryptage dans la definition
15 Lister les fichiers sur le client :
16 - Avoir un mode comme restore
17 - Avoir une api list files client=xxx where=yyy
18 Dans la filed/job.c:handle_client_request, ajouter une commande
19 dans struct s_cmds cmds; et si possible utiliser le code de finlib
20 - A voir, pourquoi ne pas utiliser mark/unmark comme dans une resto
21 pour construire un fileset ?
23 Sauvegarde des postes nomades :
24 - Le client doit pouvoir initier les sauvegardes
25 - Au niveau firewall, il ne doit y avoir que 1 connexion (1)
29 | +-------+ (4) +---------------+
31 +--------+ (5) +-------+ | | | | DIRECTOR |
32 | |<------+ | | | |---->| |
33 | FD | | PROXY | | | PROXY | (3) +-------+-------+
34 | +-------> <-+---> | |
35 +--------+ (6) +-^-----+ (2) | | +-------v-------+
37 | | | +-----> STORAGE |
39 Initiate backup | | +-------+ +---------------+
44 (1) & (2) BEGIN Backup
45 (3) Bconsole like - Run command
46 (4) & (5) DIR -> (PROX <-> PROX) -> FD connection (fileset, storage..)
47 (6) & (7) FD -> (PROX <-> PROX) -> SD
49 - Utilisation d'une sorte proxy https
53 p Ajouter l'historique dans la bconsole
54 - Ajouter une commande pour bloquer un drive
55 - Ajouter de la completion automatique sur les commandes
58 - Avoir un SD sur chaque FD
59 - Avoir une serie de script qui :
60 * bascule le lecteur en local
62 * le script de mtx doit faire ses demandes au director sur
65 - Tout le monde voit le lecteur, et le client doit demander la permission
66 pour despooler son bloc de XG au director.
68 - On fait du round robbin avec tout le monde, et on utilise un disque
71 - 50 clients qui spoolent en local, c'est plus rapide que vers 1 point
76 - Ajouter la gestion des stats dans le client et le sd
77 - Ajouter un M_STATS dans la gestion des messages
78 - générer un format simple UNIXSTAMP|label|unit|value
79 - possibilité d'ajouter ça dans la base de donnée ou dans rrd
82 http://www.petri.co.il/brick_level_backup_of_mailboxes_by_using_exmerge.htm
86 - apr (apache portable runtime) pour les exemples de chargement
87 de module dynamique (win32, linux, etc...)
88 http://svn.apache.org/viewvc/apr/apr/trunk/dso/
91 http://modules.apache.org/doc/API.html
93 - comment charger les librairies dependantes d'un hook
97 - nommer les hook (a la place d'une structure de pointeur)
99 "action", mod_action_handler
114 - configuration... (ajout automatique avant de charger le fichier de conf)
121 - exemple de hook/module
123 - checksum (MD5/SHA1)
125 - compression (LZO, GZIP, BZIP)
127 - initialiser le jcr avec seulement les hooks utiles
130 - declarer les modules utiles
131 - les options doivent utiliser le nom du module
142 SELECT strftime('%Y-%m-%d', Job.StartTime) FROM Job LIMIT 1;
143 x Voir les groupes d'un client
144 - Overview, pouvoir choisir entre la job_old et l'autre
145 - utiliser des noms de table plus proche (brestore -> bweb ?)
147 Btw., the vertical axis was the number of files
148 while the size of the ballon is the volume (in MB
149 or GB). Those could be switched, though, depending on what looks better.
151 What are you using for color-coding the ballons?
152 That could be a variety of different things like
153 client, client group, backup level (full,
154 incremental, etc.,) that adds context to the size
155 and position that is already present in the chart.
157 x Ajouter mount,umount,release,status pour chaque device
158 - Ajouter le viewfileset dans l'interface de resto
159 x Ajouter la labelisation de bande et l'ajout de media (add et label)
160 - Ajouter la possibilité de lancer des migrations et des
162 - Quand on deplace un media, il faut prendre le enabled depuis
163 la nouvelle localisation (en javascript)
164 o On ajoute une combo (Backup/Migration/Verify)
165 o On peut regarder dans l'historique des job quel est le bon type
166 o Quand on relance, on spécifie le type directement
167 o Il faut adapter le status client pour traiter les autres type
168 de job (par exemple, si c'est pas un backup/restore, pas de status dir)
171 x Ajouter une vue par groupe et par date (sur 7, 15 ou 30 jours)
174 groupe1 v v x w v v v q1
175 |-- s1 v v v v v v v q2
179 ---8<-------8<--------8<--------8<----------8<------------------
181 ALTER TABLE Status ADD COLUMN severity int;
182 UPDATE status SET severity = 15;
183 UPDATE status SET severity = 100 where jobstatus = 'f';
184 UPDATE status SET severity = 90 where jobstatus = 'A';
185 UPDATE status SET severity = 10 where jobstatus = 'T';
187 -- Affiche par groupe et date le statut des jobs (q1)
188 SELECT date_part('day', date) AS day, date, client_group_name, JobStatusLong,
189 JobStatus, nb_job, joberrors
191 SELECT date_trunc('day', job_old.StartTime) AS date,
192 MAX(severity) AS severity,
194 SUM(JobErrors) AS joberrors,
197 JOIN client_group_member USING (ClientId)
198 JOIN client_group USING (client_group_id)
199 JOIN Status USING (JobStatus)
200 WHERE StartTime > '2007-10-01' AND StartTime < '2007-11-19'
202 GROUP BY client_group_name, date
203 ) AS sub JOIN Status USING (severity)
204 ORDER BY client_group_name, date
206 -- Affiche un client_group en detail (q2)
207 SELECT date, client, JobStatusLong, JobStatus, nb_job, joberrors
209 SELECT date_trunc('day', job_old.StartTime) AS date,
210 Client.Name AS client,
211 MAX(severity) AS severity,
213 SUM(JobErrors) AS joberrors
215 JOIN client_group_member USING (ClientId)
216 JOIN client_group USING (client_group_id)
217 JOIN Client USING (ClientId)
218 JOIN Status USING (JobStatus)
219 WHERE StartTime > '2007-10-01'
220 AND client_group_name = '0-SAVES_SIGMA1'
222 GROUP BY client, date
223 ) AS sub JOIN Status USING (severity)
224 ORDER BY client, date
226 ---8<-------8<--------8<--------8<----------8<------------------
228 - Quand on clique dessus on arrive sur la liste des jobs en question
232 x Ajouter une variable pour remplacer NOW() dans les queries
233 origin = arg->{origin} || NOW();
234 - Ajouter des stats en %
236 ---8<-------8<--------8<--------8<----------8<------------------
238 SELECT client_group_name, (nb_ok::float/(nb_ok+nb_other)*100)::numeric(6,3) AS percent_ok
242 SUM(CASE WHEN JobStatus='T' THEN 1
243 ELSE 0 END) AS nb_ok,
244 SUM(CASE WHEN JobStatus='A' THEN 1
245 WHEN JobStatus='f' THEN 1
246 WHEN JobStatus='E' THEN 1
247 WHEN JobStatus='e' THEN 1
248 ELSE 0 END) AS nb_other,
251 JOIN client_group_member USING (ClientId)
252 JOIN client_group USING (client_group_id)
254 WHERE StartTime > '2007-10-01'
255 GROUP BY client_group_name
258 SELECT Name, (nb_ok::float/(nb_ok+nb_other)*100)::numeric(6,3) AS percent_ok
262 SUM(CASE WHEN JobStatus='T' THEN 1
263 ELSE 0 END) AS nb_ok,
264 SUM(CASE WHEN JobStatus='A' THEN 1
265 WHEN JobStatus='f' THEN 1
266 WHEN JobStatus='E' THEN 1
267 WHEN JobStatus='e' THEN 1
268 ELSE 0 END) AS nb_other,
271 JOIN Client USING (ClientId)
273 WHERE StartTime > '2007-10-01'
274 AND JobStatus IN ('T', 'A', 'f', 'E', 'e')
280 ---8<-------8<--------8<--------8<----------8<------------------
283 ------------- x 100 => par groupe de client
286 - Il faut ajouter une estimation des jobs qui auraient
287 du se lancer (a voir avec les schedules)
289 - Affichage en html/csv pour des stats
290 grp, nb client, nb backup, nb ok, nb err, nb cancel,
291 %ok, nb files, nb gig, time
293 - Ajouter la liste des fichiers (quand il n'y en a pas trop)
294 - Ajouter un mode qui compte le nombre de fichier sous bfileview
295 x Ajouter une estimation de progression du backup basé sur le nombre
296 de fichier et le nombre de Mo
297 x Ajouter un bouton suivant/precedant dans la vue des logs
298 x Ajouter la liste des medias qui vont/ont expirer et les pruner
299 x Fixer les purge/prune de multiple volumes
300 x Ajouter une gestion des utilisateurs avec des roles
301 o Liste des roles possibles
315 o Avoir des profiles ayant certains roles
317 * customer (view_stats, view_history, view_log)
318 * production (all - configure)
321 o Pour faire la difference entre les groupes de la vue et
322 les groupes d'acl, il faut ajouter un champs dans la table
323 client_group (visible bool).
325 o Ajout de 4 tables dans le catalogue
326 - bweb_user (userid, username, passwd, comment) passwd with apache ?
327 - bweb_role (roleid, rolename)
328 - bweb_role_member (roleid, userid)
330 - bweb_client_group_acl (client_group_id, userid)
331 - bweb_pool_acl (poolid, userid)
333 o Il faudrait aussi pouvoir choisir le login admin...
335 x On specifie par user si on veut filter par les groupes (gestion un peu
336 chiante, il faut ajouter les hosts dans les groupes, sinon, ils sont
339 x On recupere ce champs quand on check les can_do(); et apres, on le regarde
340 avant d'envoyer le JOIN de filtre. (Attention, admin n'est pas soumis a ca)
342 x On peut ajouter une option dans la Config pour activer ce mode ou pas.
344 x Regarder la possibilite de recuperer toutes les roles au debut pour
345 adapter les pages web... Il n'y a que les menus/actions autorises qui
346 seraient affiches. (bp cancel => role cancel_job, configuration => role configure)
348 * on utilise le commentaire depuis une page web, comme ca
349 on gere la traduction sans toucher a la base
351 CREATE TABLE bweb_user
353 userid serial not null,
354 username text not null,
355 use_acl boolean default false,
356 comment text default '',
357 passwd text default '',
360 CREATE UNIQUE INDEX bweb_user_idx on bweb_user (username);
362 CREATE TABLE bweb_role
364 roleid serial not null,
365 rolename text not null,
366 -- comment text default '',
369 CREATE UNIQUE INDEX bweb_role_idx on bweb_role (rolename);
371 INSERT INTO bweb_role (rolename) VALUES ('r_user_mgnt');
372 INSERT INTO bweb_role (rolename) VALUES ('r_delete_job');
373 INSERT INTO bweb_role (rolename) VALUES ('r_prune');
374 INSERT INTO bweb_role (rolename) VALUES ('r_purge');
375 INSERT INTO bweb_role (rolename) VALUES ('r_group_mgnt');
376 INSERT INTO bweb_role (rolename) VALUES ('r_location_mgnt');
377 INSERT INTO bweb_role (rolename) VALUES ('r_cancel_job');
378 INSERT INTO bweb_role (rolename) VALUES ('r_run_job');
379 INSERT INTO bweb_role (rolename) VALUES ('r_configure');
380 INSERT INTO bweb_role (rolename) VALUES ('r_client_status');
381 INSERT INTO bweb_role (rolename) VALUES ('r_view_job');
383 CREATE TABLE bweb_role_member
385 roleid integer not null,
386 userid integer not null,
387 primary key (roleid, userid)
390 CREATE TABLE bweb_client_group_acl
392 client_group_id integer not null,
393 userid integer not null,
394 primary key (client_group_id, userid)
397 - Integrer brestore en mode javascript
399 .ls_dir(jobid,pathid)
400 .ls_file(jobid,pathid)
401 .get_pathid(jobid,"/")
402 .genbsr (fileid, fileid, fileid, fileid, fileid...)
403 -> on peut utiliser une table dans la base pour faire ca
406 > 1. Unloading tapes assistent.
408 > I'm using a script which selects tapes to unload. The idea is to
409 > remove all volumes from the library that contain a current set of
410 > backups. Basically, find the volumes from the most recent full backups
411 > and all volumes that depend on these. Ignore older fulls and their
412 > differentials and incrementals.
414 > This is to ensure that, at the time volumes are unloaded, a complete
415 > set of backups can be stored safely.
418 Jobs -> Job Zoom -> View Media -> Select them -> Eject
420 Yes, it's a very good idea, i see no difficulty to implement this kind of
424 Media -> Made a Safe backup set
425 -> Select Client(s) -> Select Job(s) -> Backup set
427 I think that i can do some sort of assistant to that.
428 (with next, next next)
431 > While volumes are prepared for unloading, I disable them, so Bacula
432 > will not try to use them. Later, they are automatically re-enabled.
434 x Do you use the Enabled flag for that ? It's a good idea.
436 > Move these volumes (if possible) to the export slots.
438 I have already some code for that, but at this time it doesn't use
439 the mtx-script from bacula. (or bacula-sd commands)
441 I have to change this, so user have a working mtx-scripts, and we use
442 it everywhere. (The best solution is to send command to bacula-dir)
444 > Later, request volumes to fill up the pools so there are usable
445 > volumes for later backups around. Load these volumes from the import
446 > slots to the regular working slots, and do an 'update slots'.
448 I use the Scratch pool for this sort of things, but we could use an other
451 Media -> I/O -> Fill pools -> Select pool(s) -> import selections
454 x Bug dans la determination des jours de la semaine (exemple de la full
455 le premier dimanche du mois)
458 - Avoir la version 2.0 et la version 2.2 en ligne (pour que les utilisateurs
459 ne se trompent pas dans les versions)
460 - Supprimer les (need bacula >= 1.xx) (dans la derniere version)
463 - Faire un test de non regression avec pleins d'erreur
464 o pb inclusion (distante, locale)
465 o pb exclusion (distante, locale)
466 o pb execution de commande
467 o pb de config avec test du -t des differents daemon
468 x Utiliser PQescapeStringConn a la place de PQescapeString
469 - Utiliser la lib pcre
470 - Rendre les scripts bacula-ctl-xxx LSB
471 x Pouvoir utiliser les uid numeriques dans le backup des acl
472 - Avoir un script qui dump la configuration pour faire
474 p modifier l'organisation de la table version (pour pouvoir ajouter
475 les versions de bweb par exemple)
476 - utiliser la meme fonction pour read_close_session et append_close_session
477 x pb dans le message de chargement d'une bande pendant une resto
479 Please mount Volume "R40175" or label a new one for
480 Pas le bon message pour une resto (label a new one)
481 - Impossible de lancer une restauration en meme temps qu'un backup sur
482 un autochanger. Le code dans jobq.c qui controle les MaxConcurrentJobs
483 ne prend pas en compte les autochanger avec plusieurs drives. Ce code
484 fait surement doublon avec le nouveau code de reservation.
485 Il faudrait le simplifier, et compter les jobs de restauration comme les
486 jobs normaux. Le patch précédent ne changeait pas le MaxConcurrentJobs
487 comme il faut à la fin du backup.
490 o Envoyer la liste de tous les fichiers au client dans un format simple
491 /path/ LSTAT # un / a la fin pour un repertoire
494 o Le client construit un hash disque (ou en memoire ou les deux)
495 o A chaque repertoire/fichier on verifie la presence du fichier dans le hash
496 et on peut aussi comparer date/taille/bloc
497 - Si le fichier n'est pas dedans, on le backup
498 - Si le fichier est present on verifie les attributs et on mark le fichier comme vu
499 o A la fin, on parcours tous le hash pour trouver les fichiers qui ne sont pas vu et
500 on envoie la liste des fichiers supprimes avec le fileindex=0 et pourquoi pas la date
501 du jour dans le champ mtime
502 o Utiliser systematiquement l'option ignorecase sous windows
503 p Ajouter une option pour avoir la table de stat
504 Enable Statistic = yes/no
505 Statistic retention = 4 years
506 o use mmap to map hash ? (on 32b, we are limited to 1 or 2GB)
509 ef->data = mmap(NULL, ef->data_size, PROT_READ,
510 MAP_SHARED, fileno(ef->fp), 0);
512 fm = CreateFileMapping((HANDLE) _get_osfhandle (fileno(ef->fp)),
518 ef->data = MapViewOfFile(fm,
526 ef = eet_internal_read(ef);
533 if (ef->data) munmap((void*)ef->data, ef->data_size);
535 if (ef->data) UnmapViewOfFile (ef->data);
538 if (ef->fp) fclose(ef->fp);
540 - Accurate backup (kern)
543 *3. FD does a normal backup and at the same time makes a list of all files on
544 the system (in the FileSet), marking which ones were just now backed up.
545 4. For each file backed up send attributes/data to SD. Note, this is done
546 during step 3 above. Minor difference, the connection with the SD is not
547 dropped at the end of the backup -- see later.
548 *5. Send the list of all files including those backed up to the Dir
549 --> Send to SD and DIR at the same time ?
550 filed/backup.c/encode_and_send_attributes
552 6. Dir computes files and deleted files.
553 7. Dir sends list of additional files (new files) to backup, and list of files
555 8. FD does backup of files Dir says to save.
556 9. FD sends SD attrs of backed up files
557 10. FD sends SD delete records for files Dir wants deleted.
558 *11. FD connection to SD can be closed, this part of the backup is done.
559 *12. FD sends new list of files just backed up to Dir
560 *13. Dir adds newly backed up files to previous list sent by FD
561 *14. Dir "batch" inserts complete new list in the catalog (I forgot the name
562 of the new table). Note this table has nothing to do with the File table.
563 *15. Dir deletes previous list in catalog.
564 *16. Dir does normal batch insert of attributes from SD, but must handle
565 deleted records. Note, this will probably happen at the same time as the
571 x Backup a file that is not in accurate list (change NOCHG to LINK, FILE, etc..)
572 * Manage JobFiles (Deleted compte pour 1 ?)
574 x Utiliser le check_accurate dans find_one et declencher le save_file
575 si besoin en desactivant le incremental.
576 x ne va pas marcher avec le strip path (la recherche est faite avant le strip path)
577 * on peut utiliser le champs LStat de la base pour noter que le fichier est supprimé...
579 CREATE TEMPORARY TABLE btemp2 AS (
580 SELECT max(FileId) as FileId, PathId, FilenameId
581 FROM (SELECT FileId, PathId, FilenameId FROM File WHERE JobId IN (39867,40341)) AS F
582 GROUP BY PathId, FilenameId )
584 SELECT Path.Path, Filename.Name, File.FileIndex, File.JobId, File.LStat
586 SELECT max(FileId) as FileId, PathId, FilenameId
587 FROM (SELECT FileId, PathId, FilenameId FROM File WHERE JobId IN (11,13)) AS F
588 GROUP BY PathId, FilenameId
590 JOIN Filename ON (Filename.FilenameId = Temp.FilenameId)
591 JOIN Path ON (Path.PathId = Temp.PathId)
592 JOIN File ON (File.FileId = Temp.FileId)
596 SELECT File.FileIndex, Path.Path, Filename.Name, File.LStat
597 FROM btemp2 JOIN Path USING (PathId) JOIN Filename USING (FilenameId)
598 JOIN File USING (FileId)
599 WHERE File.FileIndex > 0
604 SELECT DISTINCT ON (PathId, FilenameId) FileIndex, Path, Name, LStat
605 FROM File JOIN Filename USING (FilenameId) JOIN Path USING (PathId) WHERE JobId IN (40341)
606 ORDER BY PathId, FilenameId, JobId DESC
611 - Every dates have to be in ISO format
613 - JobLevel, JobStatus, etc.. have to use C constant T,R,a,A,f...
614 - Sizes are always in bytes (no suffix)
615 - Numbers have to be used without commas
616 - If we change (add) something, we must always add new elements
619 For director status on running jobs, it will be great to display :
620 JobId, Client name, Job Name, Level, Start Time and Status
623 x Utiliser une alist dans les runscripts
634 console = "xxxx", "yyyy", "zzzz"
638 o cleanup bextract to use filed code