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