Idees ------ 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 - Au niveau firewall, il ne doit y avoir que 1 connexion (1) Localhost | | +-------+ (4) +---------------+ | | |<----| | +--------+ (5) +-------+ | | | | DIRECTOR | | |<------+ | | | |---->| | | FD | | PROXY | | | PROXY | (3) +-------+-------+ | +-------> <-+---> | | +--------+ (6) +-^-----+ (2) | | +-------v-------+ /-\ | | | (7) | | | | | +-----> STORAGE | | | | | | | Initiate backup | | +-------+ +---------------+ --------------+ | (1) Network (1) & (2) BEGIN Backup (3) Bconsole like - Run command (4) & (5) DIR -> (PROX <-> PROX) -> FD connection (fileset, storage..) (6) & (7) FD -> (PROX <-> PROX) -> SD - Utilisation d'une sorte proxy https Bconsole : p Ajouter l'historique dans la bconsole - Ajouter une commande pour bloquer un drive Sauvegarde SAN : - Avoir un SD sur chaque FD - Avoir une serie de script qui : * bascule le lecteur en local * lance le SD * 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 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 : - 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. - 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) - 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 - 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 un mode qui compte le nombre de fichier sous bfileview 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 > 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: - 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 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 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 - 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. - 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 Utiliser une alist dans les runscripts RunScript { console = "xxxx" console = "yyy" console = "zzzz" } or possibly RunScript { console = "xxxx", "yyyy", "zzzz" console = "aaaa" } o fix segfault when config files are empty