5 - Use VolAddr in jobmedia
7 Despool attributes later
8 - use spool_attribute parameter (0,1,2)
9 foreach spool_file (spool_files)
10 ask to director ok/discard
14 Continious Backup Linux
16 http://www.redhat.com/magazine/011sep05/features/systemtap/
17 http://sourceware.org/systemtap/
20 proba de collision en fonction de la taille du hash
21 http://en.wikipedia.org/wiki/Birthday_attack
24 - Pouvoir configurer les algos de cryptage
25 - Pouvoir choisir de crypter dans le fileset
26 - Pouvoir choisir de forcer le cryptage dans la definition
29 Lister les fichiers sur le client :
30 - Avoir un mode comme restore
31 - Avoir une api list files client=xxx where=yyy
32 Dans la filed/job.c:handle_client_request, ajouter une commande
33 dans struct s_cmds cmds; et si possible utiliser le code de finlib
34 - A voir, pourquoi ne pas utiliser mark/unmark comme dans une resto
35 pour construire un fileset ?
37 Sauvegarde des postes nomades :
38 - Le client doit pouvoir initier les sauvegardes
39 - Au niveau firewall, il ne doit y avoir que 1 connexion (1)
43 | +-------+ (4) +---------------+
45 +--------+ (5) +-------+ | | | | DIRECTOR |
46 | |<------+ | | | |---->| |
47 | FD | | PROXY | | | PROXY | (3) +-------+-------+
48 | +-------> <-+---> | |
49 +--------+ (6) +-^-----+ (2) | | +-------v-------+
51 | | | +-----> STORAGE |
53 Initiate backup | | +-------+ +---------------+
58 (1) & (2) BEGIN Backup
59 (3) Bconsole like - Run command
60 (4) & (5) DIR -> (PROX <-> PROX) -> FD connection (fileset, storage..)
61 (6) & (7) FD -> (PROX <-> PROX) -> SD
63 - Utilisation d'une sorte proxy https
67 p Ajouter l'historique dans la bconsole
68 - Ajouter une commande pour bloquer un drive
69 - Ajouter de la completion automatique sur les commandes
72 - Avoir un SD sur chaque FD
73 - Avoir une serie de script qui :
74 * bascule le lecteur en local
76 * le script de mtx doit faire ses demandes au director sur
79 - Tout le monde voit le lecteur, et le client doit demander la permission
80 pour despooler son bloc de XG au director.
82 - On fait du round robbin avec tout le monde, et on utilise un disque
85 - 50 clients qui spoolent en local, c'est plus rapide que vers 1 point
90 - Ajouter la gestion des stats dans le client et le sd
91 - Ajouter un M_STATS dans la gestion des messages
92 - générer un format simple UNIXSTAMP|label|unit|value
93 - possibilité d'ajouter ça dans la base de donnée ou dans rrd
96 http://www.petri.co.il/brick_level_backup_of_mailboxes_by_using_exmerge.htm
100 - apr (apache portable runtime) pour les exemples de chargement
101 de module dynamique (win32, linux, etc...)
102 http://svn.apache.org/viewvc/apr/apr/trunk/dso/
105 http://modules.apache.org/doc/API.html
107 - comment charger les librairies dependantes d'un hook
111 - nommer les hook (a la place d'une structure de pointeur)
113 "action", mod_action_handler
128 - configuration... (ajout automatique avant de charger le fichier de conf)
135 - exemple de hook/module
137 - checksum (MD5/SHA1)
139 - compression (LZO, GZIP, BZIP)
141 - initialiser le jcr avec seulement les hooks utiles
144 - declarer les modules utiles
145 - les options doivent utiliser le nom du module
156 SELECT strftime('%Y-%m-%d', Job.StartTime) FROM Job LIMIT 1;
157 x Voir les groupes d'un client
158 - Overview, pouvoir choisir entre la job_old et l'autre
159 - utiliser des noms de table plus proche (brestore -> bweb ?)
161 Btw., the vertical axis was the number of files
162 while the size of the ballon is the volume (in MB
163 or GB). Those could be switched, though, depending on what looks better.
165 What are you using for color-coding the ballons?
166 That could be a variety of different things like
167 client, client group, backup level (full,
168 incremental, etc.,) that adds context to the size
169 and position that is already present in the chart.
171 x Ajouter mount,umount,release,status pour chaque device
172 - Ajouter le viewfileset dans l'interface de resto
173 x Ajouter la labelisation de bande et l'ajout de media (add et label)
174 - Ajouter la possibilité de lancer des migrations et des
176 - Quand on deplace un media, il faut prendre le enabled depuis
177 la nouvelle localisation (en javascript)
178 o On ajoute une combo (Backup/Migration/Verify)
179 o On peut regarder dans l'historique des job quel est le bon type
180 o Quand on relance, on spécifie le type directement
181 o Il faut adapter le status client pour traiter les autres type
182 de job (par exemple, si c'est pas un backup/restore, pas de status dir)
185 x Ajouter une vue par groupe et par date (sur 7, 15 ou 30 jours)
188 groupe1 v v x w v v v q1
189 |-- s1 v v v v v v v q2
193 ---8<-------8<--------8<--------8<----------8<------------------
195 ALTER TABLE Status ADD COLUMN severity int;
196 UPDATE status SET severity = 15;
197 UPDATE status SET severity = 100 where jobstatus = 'f';
198 UPDATE status SET severity = 90 where jobstatus = 'A';
199 UPDATE status SET severity = 10 where jobstatus = 'T';
201 -- Affiche par groupe et date le statut des jobs (q1)
202 SELECT date_part('day', date) AS day, date, client_group_name, JobStatusLong,
203 JobStatus, nb_job, joberrors
205 SELECT date_trunc('day', job_old.StartTime) AS date,
206 MAX(severity) AS severity,
208 SUM(JobErrors) AS joberrors,
211 JOIN client_group_member USING (ClientId)
212 JOIN client_group USING (client_group_id)
213 JOIN Status USING (JobStatus)
214 WHERE StartTime > '2007-10-01' AND StartTime < '2007-11-19'
216 GROUP BY client_group_name, date
217 ) AS sub JOIN Status USING (severity)
218 ORDER BY client_group_name, date
220 -- Affiche un client_group en detail (q2)
221 SELECT date, client, JobStatusLong, JobStatus, nb_job, joberrors
223 SELECT date_trunc('day', job_old.StartTime) AS date,
224 Client.Name AS client,
225 MAX(severity) AS severity,
227 SUM(JobErrors) AS joberrors
229 JOIN client_group_member USING (ClientId)
230 JOIN client_group USING (client_group_id)
231 JOIN Client USING (ClientId)
232 JOIN Status USING (JobStatus)
233 WHERE StartTime > '2007-10-01'
234 AND client_group_name = '0-SAVES_SIGMA1'
236 GROUP BY client, date
237 ) AS sub JOIN Status USING (severity)
238 ORDER BY client, date
240 ---8<-------8<--------8<--------8<----------8<------------------
242 - Quand on clique dessus on arrive sur la liste des jobs en question
246 x Ajouter une variable pour remplacer NOW() dans les queries
247 origin = arg->{origin} || NOW();
248 - Ajouter des stats en %
250 ---8<-------8<--------8<--------8<----------8<------------------
252 SELECT client_group_name, (nb_ok::float/(nb_ok+nb_other)*100)::numeric(6,3) AS percent_ok
256 SUM(CASE WHEN JobStatus='T' THEN 1
257 ELSE 0 END) AS nb_ok,
258 SUM(CASE WHEN JobStatus='A' THEN 1
259 WHEN JobStatus='f' THEN 1
260 WHEN JobStatus='E' THEN 1
261 WHEN JobStatus='e' THEN 1
262 ELSE 0 END) AS nb_other,
265 JOIN client_group_member USING (ClientId)
266 JOIN client_group USING (client_group_id)
268 WHERE StartTime > '2007-10-01'
269 GROUP BY client_group_name
272 SELECT Name, (nb_ok::float/(nb_ok+nb_other)*100)::numeric(6,3) AS percent_ok
276 SUM(CASE WHEN JobStatus='T' THEN 1
277 ELSE 0 END) AS nb_ok,
278 SUM(CASE WHEN JobStatus='A' THEN 1
279 WHEN JobStatus='f' THEN 1
280 WHEN JobStatus='E' THEN 1
281 WHEN JobStatus='e' THEN 1
282 ELSE 0 END) AS nb_other,
285 JOIN Client USING (ClientId)
287 WHERE StartTime > '2007-10-01'
288 AND JobStatus IN ('T', 'A', 'f', 'E', 'e')
294 ---8<-------8<--------8<--------8<----------8<------------------
297 ------------- x 100 => par groupe de client
300 - Il faut ajouter une estimation des jobs qui auraient
301 du se lancer (a voir avec les schedules)
303 - Affichage en html/csv pour des stats
304 grp, nb client, nb backup, nb ok, nb err, nb cancel,
305 %ok, nb files, nb gig, time
307 - Ajouter la liste des fichiers (quand il n'y en a pas trop)
308 - Ajouter un mode qui compte le nombre de fichier sous bfileview
309 x Ajouter une estimation de progression du backup basé sur le nombre
310 de fichier et le nombre de Mo
311 x Ajouter un bouton suivant/precedant dans la vue des logs
312 x Ajouter la liste des medias qui vont/ont expirer et les pruner
313 x Fixer les purge/prune de multiple volumes
314 x Ajouter une gestion des utilisateurs avec des roles
315 o Liste des roles possibles
329 o Avoir des profiles ayant certains roles
331 * customer (view_stats, view_history, view_log)
332 * production (all - configure)
335 o Pour faire la difference entre les groupes de la vue et
336 les groupes d'acl, il faut ajouter un champs dans la table
337 client_group (visible bool).
339 o Ajout de 4 tables dans le catalogue
340 - bweb_user (userid, username, passwd, comment) passwd with apache ?
341 - bweb_role (roleid, rolename)
342 - bweb_role_member (roleid, userid)
344 - bweb_client_group_acl (client_group_id, userid)
345 - bweb_pool_acl (poolid, userid)
347 o Il faudrait aussi pouvoir choisir le login admin...
349 x On specifie par user si on veut filter par les groupes (gestion un peu
350 chiante, il faut ajouter les hosts dans les groupes, sinon, ils sont
353 x On recupere ce champs quand on check les can_do(); et apres, on le regarde
354 avant d'envoyer le JOIN de filtre. (Attention, admin n'est pas soumis a ca)
356 x On peut ajouter une option dans la Config pour activer ce mode ou pas.
358 x Regarder la possibilite de recuperer toutes les roles au debut pour
359 adapter les pages web... Il n'y a que les menus/actions autorises qui
360 seraient affiches. (bp cancel => role cancel_job, configuration => role configure)
362 * on utilise le commentaire depuis une page web, comme ca
363 on gere la traduction sans toucher a la base
365 CREATE TABLE bweb_user
367 userid serial not null,
368 username text not null,
369 use_acl boolean default false,
370 comment text default '',
371 passwd text default '',
374 CREATE UNIQUE INDEX bweb_user_idx on bweb_user (username);
376 CREATE TABLE bweb_role
378 roleid serial not null,
379 rolename text not null,
380 -- comment text default '',
383 CREATE UNIQUE INDEX bweb_role_idx on bweb_role (rolename);
385 INSERT INTO bweb_role (rolename) VALUES ('r_user_mgnt');
386 INSERT INTO bweb_role (rolename) VALUES ('r_delete_job');
387 INSERT INTO bweb_role (rolename) VALUES ('r_prune');
388 INSERT INTO bweb_role (rolename) VALUES ('r_purge');
389 INSERT INTO bweb_role (rolename) VALUES ('r_group_mgnt');
390 INSERT INTO bweb_role (rolename) VALUES ('r_location_mgnt');
391 INSERT INTO bweb_role (rolename) VALUES ('r_cancel_job');
392 INSERT INTO bweb_role (rolename) VALUES ('r_run_job');
393 INSERT INTO bweb_role (rolename) VALUES ('r_configure');
394 INSERT INTO bweb_role (rolename) VALUES ('r_client_status');
395 INSERT INTO bweb_role (rolename) VALUES ('r_view_job');
397 CREATE TABLE bweb_role_member
399 roleid integer not null,
400 userid integer not null,
401 primary key (roleid, userid)
404 CREATE TABLE bweb_client_group_acl
406 client_group_id integer not null,
407 userid integer not null,
408 primary key (client_group_id, userid)
411 - Integrer brestore en mode javascript
413 .ls_dir(jobid,pathid)
414 .ls_file(jobid,pathid)
415 .get_pathid(jobid,"/")
416 .genbsr (fileid, fileid, fileid, fileid, fileid...)
417 -> on peut utiliser une table dans la base pour faire ca
420 > 1. Unloading tapes assistent.
422 > I'm using a script which selects tapes to unload. The idea is to
423 > remove all volumes from the library that contain a current set of
424 > backups. Basically, find the volumes from the most recent full backups
425 > and all volumes that depend on these. Ignore older fulls and their
426 > differentials and incrementals.
428 > This is to ensure that, at the time volumes are unloaded, a complete
429 > set of backups can be stored safely.
432 Jobs -> Job Zoom -> View Media -> Select them -> Eject
434 Yes, it's a very good idea, i see no difficulty to implement this kind of
438 Media -> Made a Safe backup set
439 -> Select Client(s) -> Select Job(s) -> Backup set
441 I think that i can do some sort of assistant to that.
442 (with next, next next)
445 > While volumes are prepared for unloading, I disable them, so Bacula
446 > will not try to use them. Later, they are automatically re-enabled.
448 x Do you use the Enabled flag for that ? It's a good idea.
450 > Move these volumes (if possible) to the export slots.
452 I have already some code for that, but at this time it doesn't use
453 the mtx-script from bacula. (or bacula-sd commands)
455 I have to change this, so user have a working mtx-scripts, and we use
456 it everywhere. (The best solution is to send command to bacula-dir)
458 > Later, request volumes to fill up the pools so there are usable
459 > volumes for later backups around. Load these volumes from the import
460 > slots to the regular working slots, and do an 'update slots'.
462 I use the Scratch pool for this sort of things, but we could use an other
465 Media -> I/O -> Fill pools -> Select pool(s) -> import selections
468 x Bug dans la determination des jours de la semaine (exemple de la full
469 le premier dimanche du mois)
472 - Avoir la version 2.0 et la version 2.2 en ligne (pour que les utilisateurs
473 ne se trompent pas dans les versions)
474 - Supprimer les (need bacula >= 1.xx) (dans la derniere version)
477 - Faire un test de non regression avec pleins d'erreur
478 o pb inclusion (distante, locale)
479 o pb exclusion (distante, locale)
480 o pb execution de commande
481 o pb de config avec test du -t des differents daemon
482 x Utiliser PQescapeStringConn a la place de PQescapeString
483 - Utiliser la lib pcre
484 - Rendre les scripts bacula-ctl-xxx LSB
485 x Pouvoir utiliser les uid numeriques dans le backup des acl
486 - Avoir un script qui dump la configuration pour faire
488 p modifier l'organisation de la table version (pour pouvoir ajouter
489 les versions de bweb par exemple)
490 - utiliser la meme fonction pour read_close_session et append_close_session
491 x pb dans le message de chargement d'une bande pendant une resto
493 Please mount Volume "R40175" or label a new one for
494 Pas le bon message pour une resto (label a new one)
495 - Impossible de lancer une restauration en meme temps qu'un backup sur
496 un autochanger. Le code dans jobq.c qui controle les MaxConcurrentJobs
497 ne prend pas en compte les autochanger avec plusieurs drives. Ce code
498 fait surement doublon avec le nouveau code de reservation.
499 Il faudrait le simplifier, et compter les jobs de restauration comme les
500 jobs normaux. Le patch précédent ne changeait pas le MaxConcurrentJobs
501 comme il faut à la fin du backup.
504 o Envoyer la liste de tous les fichiers au client dans un format simple
505 /path/ LSTAT # un / a la fin pour un repertoire
508 o Le client construit un hash disque (ou en memoire ou les deux)
509 o A chaque repertoire/fichier on verifie la presence du fichier dans le hash
510 et on peut aussi comparer date/taille/bloc
511 - Si le fichier n'est pas dedans, on le backup
512 - Si le fichier est present on verifie les attributs et on mark le fichier comme vu
513 o A la fin, on parcours tous le hash pour trouver les fichiers qui ne sont pas vu et
514 on envoie la liste des fichiers supprimes avec le fileindex=0 et pourquoi pas la date
515 du jour dans le champ mtime
516 o Utiliser systematiquement l'option ignorecase sous windows
517 p Ajouter une option pour avoir la table de stat
518 Enable Statistic = yes/no
519 Statistic retention = 4 years
520 o use mmap to map hash ? (on 32b, we are limited to 1 or 2GB)
523 ef->data = mmap(NULL, ef->data_size, PROT_READ,
524 MAP_SHARED, fileno(ef->fp), 0);
526 fm = CreateFileMapping((HANDLE) _get_osfhandle (fileno(ef->fp)),
532 ef->data = MapViewOfFile(fm,
540 ef = eet_internal_read(ef);
547 if (ef->data) munmap((void*)ef->data, ef->data_size);
549 if (ef->data) UnmapViewOfFile (ef->data);
552 if (ef->fp) fclose(ef->fp);
554 - Accurate backup (kern)
557 *3. FD does a normal backup and at the same time makes a list of all files on
558 the system (in the FileSet), marking which ones were just now backed up.
559 4. For each file backed up send attributes/data to SD. Note, this is done
560 during step 3 above. Minor difference, the connection with the SD is not
561 dropped at the end of the backup -- see later.
562 *5. Send the list of all files including those backed up to the Dir
563 --> Send to SD and DIR at the same time ?
564 filed/backup.c/encode_and_send_attributes
566 6. Dir computes files and deleted files.
567 7. Dir sends list of additional files (new files) to backup, and list of files
569 8. FD does backup of files Dir says to save.
570 9. FD sends SD attrs of backed up files
571 10. FD sends SD delete records for files Dir wants deleted.
572 *11. FD connection to SD can be closed, this part of the backup is done.
573 *12. FD sends new list of files just backed up to Dir
574 *13. Dir adds newly backed up files to previous list sent by FD
575 *14. Dir "batch" inserts complete new list in the catalog (I forgot the name
576 of the new table). Note this table has nothing to do with the File table.
577 *15. Dir deletes previous list in catalog.
578 *16. Dir does normal batch insert of attributes from SD, but must handle
579 deleted records. Note, this will probably happen at the same time as the
585 0001088: volume FirstWritten attribute is set to time of mount request, not time of first write
586 Description When a Bacula job requests mounting a tape volume that is not present in the drive,
587 once the tape is mounted, its FirstWritten attribute is set to the time when the volume was requested.
588 Consequently, if the job has been waiting longer than the maximum use duration of the volume,
589 the volume is promoted to Used immediately because the maximum use duration has apparently expired before
590 the use has even started.
592 To avoid that, the FirstWritten attribute should be set to the time the volume was mounted (= the current time when the setting takes place).
594 x Backup a file that is not in accurate list (change NOCHG to LINK, FILE, etc..)
595 * Manage JobFiles (Deleted compte pour 1 ?)
597 x Utiliser le check_accurate dans find_one et declencher le save_file
598 si besoin en desactivant le incremental.
599 x ne va pas marcher avec le strip path (la recherche est faite avant le strip path)
600 * on peut utiliser le champs LStat de la base pour noter que le fichier est supprimé...
602 CREATE TEMPORARY TABLE btemp2 AS (
603 SELECT max(FileId) as FileId, PathId, FilenameId
604 FROM (SELECT FileId, PathId, FilenameId FROM File WHERE JobId IN (39867,40341)) AS F
605 GROUP BY PathId, FilenameId )
607 SELECT Path.Path, Filename.Name, File.FileIndex, File.JobId, File.LStat
609 SELECT max(FileId) as FileId, PathId, FilenameId
610 FROM (SELECT FileId, PathId, FilenameId FROM File WHERE JobId IN (11,13)) AS F
611 GROUP BY PathId, FilenameId
613 JOIN Filename ON (Filename.FilenameId = Temp.FilenameId)
614 JOIN Path ON (Path.PathId = Temp.PathId)
615 JOIN File ON (File.FileId = Temp.FileId)
619 SELECT File.FileIndex, Path.Path, Filename.Name, File.LStat
620 FROM btemp2 JOIN Path USING (PathId) JOIN Filename USING (FilenameId)
621 JOIN File USING (FileId)
622 WHERE File.FileIndex > 0
627 SELECT DISTINCT ON (PathId, FilenameId) FileIndex, Path, Name, LStat
628 FROM File JOIN Filename USING (FilenameId) JOIN Path USING (PathId) WHERE JobId IN (40341)
629 ORDER BY PathId, FilenameId, JobId DESC
634 - Every dates have to be in ISO format
636 - JobLevel, JobStatus, etc.. have to use C constant T,R,a,A,f...
637 - Sizes are always in bytes (no suffix)
638 - Numbers have to be used without commas
639 - If we change (add) something, we must always add new elements
642 For director status on running jobs, it will be great to display :
643 JobId, Client name, Job Name, Level, Start Time and Status
646 x Utiliser une alist dans les runscripts
657 console = "xxxx", "yyyy", "zzzz"
661 o cleanup bextract to use filed code