X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fpatches%2Ftesting%2Feblstodo;h=fab93c6dd4e1b1904bd6def8f5b7fa1bcbe298c1;hb=c9afaad5555ddc8abcafa8d49bae819985e23246;hp=5095726bb3e0ffb92613766a56b73d1f708023f8;hpb=c1640ac783f9d75054816eb56db546ff5a60e4e3;p=bacula%2Fbacula diff --git a/bacula/patches/testing/eblstodo b/bacula/patches/testing/eblstodo index 5095726bb3..fab93c6dd4 100644 --- a/bacula/patches/testing/eblstodo +++ b/bacula/patches/testing/eblstodo @@ -1,12 +1,35 @@ Idees ------ +Despool attributes later + - use spool_attribute parameter (0,1,2) + foreach spool_file (spool_files) + ask to director ok/discard + despool_attr + end_of_despool + +Continious Backup Linux + - stap +http://www.redhat.com/magazine/011sep05/features/systemtap/ +http://sourceware.org/systemtap/ + +Deduplication: + proba de collision en fonction de la taille du hash + http://en.wikipedia.org/wiki/Birthday_attack + Cryptage : - Pouvoir configurer les algos de cryptage - Pouvoir choisir de crypter dans le fileset - Pouvoir choisir de forcer le cryptage dans la definition du client. +Lister les fichiers sur le client : + - Avoir un mode comme restore + - Avoir une api list files client=xxx where=yyy + Dans la filed/job.c:handle_client_request, ajouter une commande + dans struct s_cmds cmds; et si possible utiliser le code de finlib + - A voir, pourquoi ne pas utiliser mark/unmark comme dans une resto + pour construire un fileset ? Sauvegarde des postes nomades : - Le client doit pouvoir initier les sauvegardes @@ -34,11 +57,13 @@ Sauvegarde des postes nomades : (4) & (5) DIR -> (PROX <-> PROX) -> FD connection (fileset, storage..) (6) & (7) FD -> (PROX <-> PROX) -> SD + - Utilisation d'une sorte proxy https Bconsole : - - Ajouter l'historique dans la bconsole + p Ajouter l'historique dans la bconsole - Ajouter une commande pour bloquer un drive + - Ajouter de la completion automatique sur les commandes Sauvegarde SAN : - Avoir un SD sur chaque FD @@ -48,40 +73,587 @@ Sauvegarde SAN : * le script de mtx doit faire ses demandes au director sur un autochanger commun + - Tout le monde voit le lecteur, et le client doit demander la permission + pour despooler son bloc de XG au director. + + - On fait du round robbin avec tout le monde, et on utilise un disque + local pour spooler. + + - 50 clients qui spoolent en local, c'est plus rapide que vers 1 point + central + + Gestion des stats : - Ajouter la gestion des stats dans le client et le sd - Ajouter un M_STATS dans la gestion des messages - générer un format simple UNIXSTAMP|label|unit|value - possibilité d'ajouter ça dans la base de donnée ou dans rrd +Exchange backup: +http://www.petri.co.il/brick_level_backup_of_mailboxes_by_using_exmerge.htm + +API : + + - apr (apache portable runtime) pour les exemples de chargement + de module dynamique (win32, linux, etc...) + http://svn.apache.org/viewvc/apr/apr/trunk/dso/ + + - exemple apache + http://modules.apache.org/doc/API.html + + - comment charger les librairies dependantes d'un hook + ex: ACL -> -lacl + GZIP -> -lgz + + - nommer les hook (a la place d'une structure de pointeur) + ex: + "action", mod_action_handler + + - interface + - opendir + - readdir + - closedir + - mkdir + - stat + - open + - close + - read + - write + - seek + - get_perm + - set_perm + - configuration... (ajout automatique avant de charger le fichier de conf) + - init + - destroy + + - version + - name + + - exemple de hook/module + - cryptage ? + - checksum (MD5/SHA1) + - ACL/droits + - compression (LZO, GZIP, BZIP) + + - initialiser le jcr avec seulement les hooks utiles + + - configuration + - declarer les modules utiles + - les options doivent utiliser le nom du module + ex: + GZIP level = 2 + ACL use uid = yes + etc... TODO ---- bweb : + - Support sqlite + SELECT strftime('%Y-%m-%d', Job.StartTime) FROM Job LIMIT 1; + x Voir les groupes d'un client + - Overview, pouvoir choisir entre la job_old et l'autre + - utiliser des noms de table plus proche (brestore -> bweb ?) + - Balloon +Btw., the vertical axis was the number of files +while the size of the ballon is the volume (in MB +or GB). Those could be switched, though, depending on what looks better. + +What are you using for color-coding the ballons? +That could be a variety of different things like +client, client group, backup level (full, +incremental, etc.,) that adds context to the size +and position that is already present in the chart. + + x Ajouter mount,umount,release,status pour chaque device + - Ajouter le viewfileset dans l'interface de resto + x Ajouter la labelisation de bande et l'ajout de media (add et label) + - Ajouter la possibilité de lancer des migrations et des + verification. + - Quand on deplace un media, il faut prendre le enabled depuis + la nouvelle localisation (en javascript) + o On ajoute une combo (Backup/Migration/Verify) + o On peut regarder dans l'historique des job quel est le bon type + o Quand on relance, on spécifie le type directement + o Il faut adapter le status client pour traiter les autres type + de job (par exemple, si c'est pas un backup/restore, pas de status dir) + + + x Ajouter une vue par groupe et par date (sur 7, 15 ou 30 jours) + + lu ma me je ve sa di + groupe1 v v x w v v v q1 + |-- s1 v v v v v v v q2 + |-- s2 v v x v v v v + `-- s3 v v v w v v v + +---8<-------8<--------8<--------8<----------8<------------------ + +ALTER TABLE Status ADD COLUMN severity int; +UPDATE status SET severity = 15; +UPDATE status SET severity = 100 where jobstatus = 'f'; +UPDATE status SET severity = 90 where jobstatus = 'A'; +UPDATE status SET severity = 10 where jobstatus = 'T'; + +-- Affiche par groupe et date le statut des jobs (q1) +SELECT date_part('day', date) AS day, date, client_group_name, JobStatusLong, + JobStatus, nb_job, joberrors +FROM ( + SELECT date_trunc('day', job_old.StartTime) AS date, + MAX(severity) AS severity, + COUNT(1) AS nb_job, + SUM(JobErrors) AS joberrors, + client_group_name + FROM job_old + JOIN client_group_member USING (ClientId) + JOIN client_group USING (client_group_id) + JOIN Status USING (JobStatus) + WHERE StartTime > '2007-10-01' AND StartTime < '2007-11-19' + + GROUP BY client_group_name, date +) AS sub JOIN Status USING (severity) + ORDER BY client_group_name, date + +-- Affiche un client_group en detail (q2) +SELECT date, client, JobStatusLong, JobStatus, nb_job, joberrors +FROM ( + SELECT date_trunc('day', job_old.StartTime) AS date, + Client.Name AS client, + MAX(severity) AS severity, + COUNT(1) AS nb_job, + SUM(JobErrors) AS joberrors + FROM job_old + JOIN client_group_member USING (ClientId) + JOIN client_group USING (client_group_id) + JOIN Client USING (ClientId) + JOIN Status USING (JobStatus) + WHERE StartTime > '2007-10-01' + AND client_group_name = '0-SAVES_SIGMA1' + + GROUP BY client, date +) AS sub JOIN Status USING (severity) + ORDER BY client, date + +---8<-------8<--------8<--------8<----------8<------------------ + + - Quand on clique dessus on arrive sur la liste des jobs en question + Groupe -> Jobs + Job -> Log + + x Ajouter une variable pour remplacer NOW() dans les queries + origin = arg->{origin} || NOW(); + - Ajouter des stats en % + +---8<-------8<--------8<--------8<----------8<------------------ + +SELECT client_group_name, (nb_ok::float/(nb_ok+nb_other)*100)::numeric(6,3) AS percent_ok +FROM ( + + SELECT + SUM(CASE WHEN JobStatus='T' THEN 1 + ELSE 0 END) AS nb_ok, + SUM(CASE WHEN JobStatus='A' THEN 1 + WHEN JobStatus='f' THEN 1 + WHEN JobStatus='E' THEN 1 + WHEN JobStatus='e' THEN 1 + ELSE 0 END) AS nb_other, + client_group_name + FROM job_old + JOIN client_group_member USING (ClientId) + JOIN client_group USING (client_group_id) + + WHERE StartTime > '2007-10-01' + GROUP BY client_group_name +) AS subq + +SELECT Name, (nb_ok::float/(nb_ok+nb_other)*100)::numeric(6,3) AS percent_ok +FROM ( + + SELECT + SUM(CASE WHEN JobStatus='T' THEN 1 + ELSE 0 END) AS nb_ok, + SUM(CASE WHEN JobStatus='A' THEN 1 + WHEN JobStatus='f' THEN 1 + WHEN JobStatus='E' THEN 1 + WHEN JobStatus='e' THEN 1 + ELSE 0 END) AS nb_other, + Client.Name AS name + FROM job_old + JOIN Client USING (ClientId) + + WHERE StartTime > '2007-10-01' + AND JobStatus IN ('T', 'A', 'f', 'E', 'e') + GROUP BY Client.Name +) AS subq + + + +---8<-------8<--------8<--------8<----------8<------------------ + + Nb backup OK + ------------- x 100 => par groupe de client + Nb backup + + - Il faut ajouter une estimation des jobs qui auraient + du se lancer (a voir avec les schedules) + + - Affichage en html/csv pour des stats + grp, nb client, nb backup, nb ok, nb err, nb cancel, + %ok, nb files, nb gig, time - Ajouter la liste des fichiers (quand il n'y en a pas trop) - - Ajouter la liste des medias qui vont expirer ? - Ajouter un mode qui compte le nombre de fichier sous bfileview + x Ajouter une estimation de progression du backup basé sur le nombre + de fichier et le nombre de Mo + x Ajouter un bouton suivant/precedant dans la vue des logs + x Ajouter la liste des medias qui vont/ont expirer et les pruner + x Fixer les purge/prune de multiple volumes + x Ajouter une gestion des utilisateurs avec des roles + o Liste des roles possibles + * view_stats + * configure + * run_job + * run_restore + * view_history + * view_log + * view_media + * view_pool + * update_media + * view_autochanger + * update_autochanger + * cancel_job + + o Avoir des profiles ayant certains roles + * admin (all) + * customer (view_stats, view_history, view_log) + * production (all - configure) + ... + + o Pour faire la difference entre les groupes de la vue et + les groupes d'acl, il faut ajouter un champs dans la table + client_group (visible bool). + + o Ajout de 4 tables dans le catalogue + - bweb_user (userid, username, passwd, comment) passwd with apache ? + - bweb_role (roleid, rolename) + - bweb_role_member (roleid, userid) + + - bweb_client_group_acl (client_group_id, userid) + - bweb_pool_acl (poolid, userid) + + o Il faudrait aussi pouvoir choisir le login admin... + + x On specifie par user si on veut filter par les groupes (gestion un peu + chiante, il faut ajouter les hosts dans les groupes, sinon, ils sont + invisibles) + + x On recupere ce champs quand on check les can_do(); et apres, on le regarde + avant d'envoyer le JOIN de filtre. (Attention, admin n'est pas soumis a ca) + + x On peut ajouter une option dans la Config pour activer ce mode ou pas. + + x Regarder la possibilite de recuperer toutes les roles au debut pour + adapter les pages web... Il n'y a que les menus/actions autorises qui + seraient affiches. (bp cancel => role cancel_job, configuration => role configure) + + * on utilise le commentaire depuis une page web, comme ca + on gere la traduction sans toucher a la base + +CREATE TABLE bweb_user +( + userid serial not null, + username text not null, + use_acl boolean default false, + comment text default '', + passwd text default '', + primary key (userid) +); +CREATE UNIQUE INDEX bweb_user_idx on bweb_user (username); + +CREATE TABLE bweb_role +( + roleid serial not null, + rolename text not null, +-- comment text default '', + primary key (roleid) +); +CREATE UNIQUE INDEX bweb_role_idx on bweb_role (rolename); + +INSERT INTO bweb_role (rolename) VALUES ('r_user_mgnt'); +INSERT INTO bweb_role (rolename) VALUES ('r_delete_job'); +INSERT INTO bweb_role (rolename) VALUES ('r_prune'); +INSERT INTO bweb_role (rolename) VALUES ('r_purge'); +INSERT INTO bweb_role (rolename) VALUES ('r_group_mgnt'); +INSERT INTO bweb_role (rolename) VALUES ('r_location_mgnt'); +INSERT INTO bweb_role (rolename) VALUES ('r_cancel_job'); +INSERT INTO bweb_role (rolename) VALUES ('r_run_job'); +INSERT INTO bweb_role (rolename) VALUES ('r_configure'); +INSERT INTO bweb_role (rolename) VALUES ('r_client_status'); +INSERT INTO bweb_role (rolename) VALUES ('r_view_job'); + +CREATE TABLE bweb_role_member +( + roleid integer not null, + userid integer not null, + primary key (roleid, userid) +); + +CREATE TABLE bweb_client_group_acl +( + client_group_id integer not null, + userid integer not null, + primary key (client_group_id, userid) +); + - Integrer brestore en mode javascript o ajouter une api .ls_dir(jobid,pathid) .ls_file(jobid,pathid) .get_pathid(jobid,"/") .genbsr (fileid, fileid, fileid, fileid, fileid...) + -> on peut utiliser une table dans la base pour faire ca + cf bat -bacula : +> 1. Unloading tapes assistent. +> +> I'm using a script which selects tapes to unload. The idea is to +> remove all volumes from the library that contain a current set of +> backups. Basically, find the volumes from the most recent full backups +> and all volumes that depend on these. Ignore older fulls and their +> differentials and incrementals. +> +> This is to ensure that, at the time volumes are unloaded, a complete +> set of backups can be stored safely. + +Already ok + Jobs -> Job Zoom -> View Media -> Select them -> Eject + +Yes, it's a very good idea, i see no difficulty to implement this kind of +tool. + +Users go to + Media -> Made a Safe backup set + -> Select Client(s) -> Select Job(s) -> Backup set + +I think that i can do some sort of assistant to that. +(with next, next next) + +> While volumes are prepared for unloading, I disable them, so Bacula +> will not try to use them. Later, they are automatically re-enabled. + +x Do you use the Enabled flag for that ? It's a good idea. + +> Move these volumes (if possible) to the export slots. + +I have already some code for that, but at this time it doesn't use +the mtx-script from bacula. (or bacula-sd commands) + +I have to change this, so user have a working mtx-scripts, and we use +it everywhere. (The best solution is to send command to bacula-dir) + +> Later, request volumes to fill up the pools so there are usable +> volumes for later backups around. Load these volumes from the import +> slots to the regular working slots, and do an 'update slots'. + +I use the Scratch pool for this sort of things, but we could use an other +assistant for that. + +Media -> I/O -> Fill pools -> Select pool(s) -> import selections + +bschedule: + x Bug dans la determination des jours de la semaine (exemple de la full + le premier dimanche du mois) + +manuel : + - Avoir la version 2.0 et la version 2.2 en ligne (pour que les utilisateurs + ne se trompent pas dans les versions) + - Supprimer les (need bacula >= 1.xx) (dans la derniere version) + +bacula : - Faire un test de non regression avec pleins d'erreur o pb inclusion (distante, locale) o pb exclusion (distante, locale) o pb execution de commande - - Utiliser PQescapeStringConn a la place de PQescapeString + o pb de config avec test du -t des differents daemon + x Utiliser PQescapeStringConn a la place de PQescapeString - Utiliser la lib pcre - Rendre les scripts bacula-ctl-xxx LSB x Pouvoir utiliser les uid numeriques dans le backup des acl - Avoir un script qui dump la configuration pour faire des bug reports - - modifier l'organisation de la table version (pour pouvoir ajouter + p modifier l'organisation de la table version (pour pouvoir ajouter les versions de bweb par exemple) + - utiliser la meme fonction pour read_close_session et append_close_session + x pb dans le message de chargement d'une bande pendant une resto + + Please mount Volume "R40175" or label a new one for + Pas le bon message pour une resto (label a new one) + - Impossible de lancer une restauration en meme temps qu'un backup sur + un autochanger. Le code dans jobq.c qui controle les MaxConcurrentJobs + ne prend pas en compte les autochanger avec plusieurs drives. Ce code + fait surement doublon avec le nouveau code de reservation. + Il faudrait le simplifier, et compter les jobs de restauration comme les + jobs normaux. Le patch précédent ne changeait pas le MaxConcurrentJobs + comme il faut à la fin du backup. + + x Accurate backup + o Envoyer la liste de tous les fichiers au client dans un format simple + /path/ LSTAT # un / a la fin pour un repertoire + /path/file LSTAT + + o Le client construit un hash disque (ou en memoire ou les deux) + o A chaque repertoire/fichier on verifie la presence du fichier dans le hash + et on peut aussi comparer date/taille/bloc + - Si le fichier n'est pas dedans, on le backup + - Si le fichier est present on verifie les attributs et on mark le fichier comme vu + o A la fin, on parcours tous le hash pour trouver les fichiers qui ne sont pas vu et + on envoie la liste des fichiers supprimes avec le fileindex=0 et pourquoi pas la date + du jour dans le champ mtime + o Utiliser systematiquement l'option ignorecase sous windows + p Ajouter une option pour avoir la table de stat + Enable Statistic = yes/no + Statistic retention = 4 years + o use mmap to map hash ? (on 32b, we are limited to 1 or 2GB) + +#ifndef _WIN32 + ef->data = mmap(NULL, ef->data_size, PROT_READ, + MAP_SHARED, fileno(ef->fp), 0); +#else + fm = CreateFileMapping((HANDLE) _get_osfhandle (fileno(ef->fp)), + NULL, + PAGE_READONLY, + 0, + 0, + NULL); + ef->data = MapViewOfFile(fm, + FILE_MAP_READ, + 0, + 0, + ef->data_size); + CloseHandle(fm); +#endif + + ef = eet_internal_read(ef); + if (!ef) +@@ -892,11 +862,7 @@ + free(ef->header); + } + +#ifndef _WIN32 + if (ef->data) munmap((void*)ef->data, ef->data_size); +#else + if (ef->data) UnmapViewOfFile (ef->data); +#endif + +if (ef->fp) fclose(ef->fp); + + - Accurate backup (kern) +1. Run bconsole +2. Dir -> FD run job +*3. FD does a normal backup and at the same time makes a list of all files on +the system (in the FileSet), marking which ones were just now backed up. +4. For each file backed up send attributes/data to SD. Note, this is done +during step 3 above. Minor difference, the connection with the SD is not +dropped at the end of the backup -- see later. +*5. Send the list of all files including those backed up to the Dir + --> Send to SD and DIR at the same time ? + filed/backup.c/encode_and_send_attributes + +6. Dir computes files and deleted files. +7. Dir sends list of additional files (new files) to backup, and list of files +deleted. +8. FD does backup of files Dir says to save. +9. FD sends SD attrs of backed up files +10. FD sends SD delete records for files Dir wants deleted. +*11. FD connection to SD can be closed, this part of the backup is done. +*12. FD sends new list of files just backed up to Dir +*13. Dir adds newly backed up files to previous list sent by FD +*14. Dir "batch" inserts complete new list in the catalog (I forgot the name +of the new table). Note this table has nothing to do with the File table. +*15. Dir deletes previous list in catalog. +*16. Dir does normal batch insert of attributes from SD, but must handle +deleted records. Note, this will probably happen at the same time as the +items 13-15. + + + + - TODO: + 0001088: volume FirstWritten attribute is set to time of mount request, not time of first write + Description When a Bacula job requests mounting a tape volume that is not present in the drive, + once the tape is mounted, its FirstWritten attribute is set to the time when the volume was requested. + Consequently, if the job has been waiting longer than the maximum use duration of the volume, + the volume is promoted to Used immediately because the maximum use duration has apparently expired before + the use has even started. + +To avoid that, the FirstWritten attribute should be set to the time the volume was mounted (= the current time when the setting takes place). + + x Backup a file that is not in accurate list (change NOCHG to LINK, FILE, etc..) + * Manage JobFiles (Deleted compte pour 1 ?) + + x Utiliser le check_accurate dans find_one et declencher le save_file + si besoin en desactivant le incremental. + x ne va pas marcher avec le strip path (la recherche est faite avant le strip path) + * on peut utiliser le champs LStat de la base pour noter que le fichier est supprimé... + + CREATE TEMPORARY TABLE btemp2 AS ( + SELECT max(FileId) as FileId, PathId, FilenameId + FROM (SELECT FileId, PathId, FilenameId FROM File WHERE JobId IN (39867,40341)) AS F + GROUP BY PathId, FilenameId ) + + SELECT Path.Path, Filename.Name, File.FileIndex, File.JobId, File.LStat + FROM ( + SELECT max(FileId) as FileId, PathId, FilenameId + FROM (SELECT FileId, PathId, FilenameId FROM File WHERE JobId IN (11,13)) AS F + GROUP BY PathId, FilenameId + ) AS Temp + JOIN Filename ON (Filename.FilenameId = Temp.FilenameId) + JOIN Path ON (Path.PathId = Temp.PathId) + JOIN File ON (File.FileId = Temp.FileId) + WHERE FileIndex > 0 + + + SELECT File.FileIndex, Path.Path, Filename.Name, File.LStat + FROM btemp2 JOIN Path USING (PathId) JOIN Filename USING (FilenameId) + JOIN File USING (FileId) + WHERE File.FileIndex > 0 + + DROP TABLE btemp2 +*/ +/* +SELECT DISTINCT ON (PathId, FilenameId) FileIndex, Path, Name, LStat + FROM File JOIN Filename USING (FilenameId) JOIN Path USING (PathId) WHERE JobId IN (40341) + ORDER BY PathId, FilenameId, JobId DESC +*/ + + - .api mode: +Some ideas : +- Every dates have to be in ISO format +YYYY-MM-DD HH:MM:SS +- JobLevel, JobStatus, etc.. have to use C constant T,R,a,A,f... +- Sizes are always in bytes (no suffix) +- Numbers have to be used without commas +- If we change (add) something, we must always add new elements +at the end. + +For director status on running jobs, it will be great to display : +JobId, Client name, Job Name, Level, Start Time and Status + + + x Utiliser une alist dans les runscripts + +RunScript { + console = "xxxx" + console = "yyy" + console = "zzzz" +} + +or possibly + +RunScript { + console = "xxxx", "yyyy", "zzzz" + console = "aaaa" +} + + o cleanup bextract to use filed code