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