diff --git a/src/tetras-back b/src/tetras-back index dc3bb7f0fb199488aa124d0fd70813fcc333582c..702c32d65f852f8894c03d7fa802573de19a109f 100755 --- a/src/tetras-back +++ b/src/tetras-back @@ -57,6 +57,7 @@ my %MESSAGES = ( rebancher le disque dès que possible", }, ); +my $version="v1.1"; # Read/SaveCfg snippet from # http://www.perlmonks.org/?displaytype=print;node_id=464358 @@ -270,6 +271,7 @@ sub start_daemon(){ my $status = $running_backups{$uuid}->join(); $Logger->debug("thread join: $status"); $CFG::CFG{DISKS}{KNOWN}{$uuid}{last_backup}=$status; + $CFG::CFG{DISKS}{RUNNING}=~ s/ $uuid//; delete $running_backups{$uuid}; } } @@ -311,6 +313,7 @@ sub start_daemon(){ if(exists($CFG::CFG{DISKS}{KNOWN}{$uuid})){ # known disc $CFG::CFG{DISKS}{KNOWN}{$uuid}{'last_seen'}=time(); + $CFG::CFG{DISKS}{RUNNING}.=" $uuid"; save_config(); notify(); $Logger->remove("message"); @@ -395,10 +398,12 @@ sub send_command($){ # Pase args my $ap = Getopt::ArgParse->new_parser( + prog => 'Tetras Back '.$version, description => 'Programme modulaire de sauvegarde sur disque externe', ); $ap->add_args( + ['--version', '-v', type=>'Bool', help=>'Print the program version'], ['--start', '-d', type=>'Bool', help=>'Start the daemon'], ['--stop', type=>'Bool', help=>'Stop the daemon'], ['--register', '-r', type=>'Scalar', metavar=>"FIFO", @@ -416,7 +421,10 @@ $ap->add_args( ); my $arguments = $ap->parse_args(); -if ($arguments->get_attr('start')){ +if ($arguments->get_attr('version')){ + print "Tetras-back ".$version."\n"; + exit(0); +}elsif ($arguments->get_attr('start')){ start_daemon(); }elsif($arguments->get_attr('stop')){ if ( -e $MAINFIFO){ diff --git a/src/www/actions.php b/src/www/actions.php deleted file mode 100644 index 3ca154ff9e6dedd7839f6fdadf0d1bd85dce26e5..0000000000000000000000000000000000000000 --- a/src/www/actions.php +++ /dev/null @@ -1,48 +0,0 @@ - <!DOCTYPE html> -<html> -<head> -<meta charset="UTF-8"> -<meta name="author" content="David Beniamine and Felix Coudurier"> -<link rel="stylesheet" href="style.css"/> -<title>Tetras Back</title> -<div id="box"> -<div id="content"> -<?php include("header.php") ?> -<p> -<?php - extract($_POST); - //echo "actions '$action', uuid '$uuid', name '$name', dev '$dev'<br/>"; - $cmd = "/usr/local/sbin/tetras-back"; - switch($action){ - case "save" : - $message = "Enregistrement du disque '$uuid' sous le nom '$name'"; - $args = "--save ".escapeshellarg($uuid)."=".escapeshellarg($name); - break; - case "trigger" : - if ( !strcmp($dev,"")){ - $message = "Impossible de lancer une sauvegarde sur le disque '$name' car il n'est pas connecté"; - }else{ - $message = "Déclenchement de sauvegarde sur le disque '$name'"; - $args = "--plug ".escapeshellarg($dev); - } - break; - case "forget": - $message = "Désenregistrement du disque $name"; - $args = "--forget ".escapeshellarg($uuid); - break; - } - echo $message; - if (strcmp($args, "")){ - //echo "<p>execution de '$cmd $args'</p>"; - shell_exec("$cmd $args"); - } -?> -</p> -<p> -<a href="index.php">Retour a l'accueil</a> -</p> -<?php - include("footer.php"); -?> -</div> -</div> diff --git a/src/www/discs.js b/src/www/discs.js index fa95ded939e6d37178170882d2a75d6ef5cc53d7..fcee49be361e9852786a8c42352aaeee6d76a4c3 100644 --- a/src/www/discs.js +++ b/src/www/discs.js @@ -3,5 +3,5 @@ $(function() { $.get('discs.php', function(data) { $('#discs').html(data); }); - }, 15000); + }, 30000); }); diff --git a/src/www/discs.php b/src/www/discs.php index a3369a5bb5b151539d5c0c290c4a4d811c860002..dfb4bfef5d090ff3ce00256d91f6d253fd0d466c 100644 --- a/src/www/discs.php +++ b/src/www/discs.php @@ -24,59 +24,35 @@ $format = 'd-m-Y H:i:s'; //var_dump($conf); ?> -<h2 id="disques"> Disques </h2> -<h3 id="disques-connectes"> Disques Connectés </h3> +<h2 id="disques"> Disques connectés ou connus</h2> <p> -Dans cette section apparaissent tous les disques actuellement connectés à votre serveur. -Afin d'effectuer des sauvegardes sur un disque, il faut l'enregistrer (cette action n'est nécessaire qu'une fois) en lui donnant un nom (par exemple DisqueA). Le disque apparaitra alors dans la <a href="#disques-connus">liste des disques connus</a>. </p> -<p> -<strong>Attention</strong> Cette liste se rafraichit toutes les 15 secondes, il faut donc entrer le nom rapidement. +<strong>Attention</strong> Cette liste se rafraichit toutes les 30 secondes, il faut donc entrer le nom rapidement lors de l'enregistrement du disque. </p> -<div id='connected'> +<div id='known'> <div class="scroll"> <table> -<tr><th>Device</th><th>Identifiant unique</th><th>Actions</th></tr> - -<?php - //One line by connected entry - //add save button + text field that triggers tetras-back \-\-save uuid=name - foreach ($conf['CONNECTED'] as $uuid => $dev) : -?> -<tr><td><?php echo $dev ?></td><td><?php echo $uuid ?></td> +<tr> +<th>Nom</th><th>Identifiant unique</th><th>État</th><th>Derniere connexion</th> +<th>Derniere sauvegarde</th><th>Actions</th> +</tr> +<?php foreach ($conf['CONNECTED'] as $uuid => $dev) : ?> +<?php if(!array_key_exists($uuid, $conf['KNOWN'])):?> +<tr><td>Inconnu</td><td><?php echo $uuid ?></td><td><?php echo "Connecté ($dev)" ?></td> +<td>Inconnu</td><td>Inconnu</td> <td> -<form action="actions.php" method="post"> -<input type="hidden" name="uuid" value="<?php echo $uuid ?>"> -<input type="hidden" name="action" value="save"> -<input type="text" name="name" placeholder="Entrez un nom"> -<input type="submit" value="Enregistrer"> + <form action="index.php#disques" method="post"> + <input type="hidden" name="uuid" value="<?php echo $uuid ?>"> + <input type="hidden" name="action" value="save"> + <input type="text" name="name" title="Le nom sous lequel votre disque sera connu" placeholder="Entrez un nom"> + <input type="submit" value="Enregistrer" title="Enregistrer le disque pour pouvoir effectuer des sauvegardes dessus"> </form> </td> </tr> +<?php endif ?> <?php endforeach ?> -</table> -</div> -</div> -<h3 id="disques-connus"> Disques Connus </h3> -<p> -Voici la liste des disques (USB) connus avec l'état de la dernière sauvegarde -effectuée dessus.</p> -<p>À chaque fois qu'un de ces disques est connecté au serveur (en USB), -une sauvegarde se déclenche automatiquement.</p> -<p> -Pour qu'un disque apparaisse ici, il faut le connecter au serveur et l'enregistrer depuis la <a href="#disques-connectes">liste des disques connectés</a>. -</p> -<p> -Si vous cliquez sur le bouton "Oublier", le disque ne sera plus utilisé pour la sauvegarde mais aucun fichier ne sera supprimé. -</p> -<div id='known'> -<div class="scroll"> -<table> -<tr> -<th>Nom</th><th>Identifiant unique</th><th>Derniere connexion</th> -<th>Derniere sauvegarde</th><th>Actions</th> -</tr> <?php +$inprogress = $conf['RUNNING']; foreach ($conf['KNOWN'] as $uuid => $value) : $name=$value['name']; if( $value['last_seen'] != 'Never' ){ @@ -109,26 +85,40 @@ foreach ($conf['KNOWN'] as $uuid => $value) : <tr> <td><?php echo $name ?></td> <td><?php echo $uuid ?></td> +<?php if(!empty($dev)): ?> + <?php if(preg_match("/$uuid/", $inprogress) == 1): ?> + <td>Sauvegarde en cours</td> + <?php else: ?> + <td><?php echo "Connecté ($dev)" ?> + <?php endif ?> +<?php else: ?> + <td>Enregistré, déconnecté</td> +<?php endif ?> <td><?php echo $last_seen ?></td> <td><?php echo $last_backup_state ?></td> <td> - <form action="actions.php" method="post"> +<?php if(!$disablebuttonsauegarde && empty($inprogress) && !empty($dev)): ?> + <form action="index.php#disques" method="post"> <input type="hidden" name="name" value="<?php echo $name ?>"> <input type="hidden" name="dev" value="<?php echo $dev ?>"> <input type="hidden" name="uuid" value="<?php echo $uuid ?>"> <input type="hidden" name="action" value="trigger"> - <input type="submit" value="Sauvegarder"> + <input type="submit" title="Déclencer manuellement une sauvegarde" value="Sauvegarder"> </form> - <form action="actions.php" method="post"> +<?php endif ?> + <form action="index.php#disques" method="post"> <input type="hidden" name="name" value="<?php echo $name ?>"> <input type="hidden" name="uuid" value="<?php echo $uuid ?>"> <input type="hidden" name="dev" value="<?php echo $dev ?>"> <input type="hidden" name="action" value="forget"> - <input type="submit" value="Oublier"> + <input type="submit" title="Ne plus utiliser ce disque pour la sauvegarde, aucun fichier ne sera supprimé" value="Oublier"> </form> </td> </tr> <?php endforeach ?> +<?php + $disablebuttonsauegarde=false; +?> </table> </div> </div> diff --git a/src/www/index.php b/src/www/index.php index e1d11fd3c32a20b522cae21b4980fe1988181dc4..1a5deab9e1da302b436d36a4cdfd966eeecabcf6 100644 --- a/src/www/index.php +++ b/src/www/index.php @@ -1,7 +1,7 @@ <!DOCTYPE html> <html> <head> -<title>Tetras Back</title> +<title><?php echo exec("tetras-back --version")?></title> <script src="https://code.jquery.com/jquery-1.8.2.min.js"></script> <meta charset="UTF-8"> <meta name="author" content="David Beniamine and Felix Coudurier"> @@ -11,17 +11,55 @@ <div id="box"> <div id="content"> <?php include("header.php") ?> +<?php + extract($_POST); + //echo "actions '$action', uuid '$uuid', name '$name', dev '$dev'<br/>"; + $cmd = "/usr/local/sbin/tetras-back"; + switch($action){ + case "save" : + if($name!=""){ + $message = "Le disque '".$uuid."' a été enregistré sous le nom '".$name."'.\\n"; + $message .= "Une sauvegarde sera déclenchée à chaque connexion du disque."; + $args = "--save ".escapeshellarg($uuid)."=".escapeshellarg($name); + }else{ + $message="Veullez donner un nom au disque avant de cliquer sur enregistrer"; + } + break; + case "trigger" : + if ( !strcmp($dev,"")){ + $message = "Impossible de lancer une sauvegarde sur le disque '".$name."' car il n'est pas connecté."; + }else{ + $message = "Une sauvegarde a été déclenchée sur le disque '".$name."'.\\n"; + $mssage .= "Vous recevrez un mail une fois la sauvegarde finie, vous pouvez aussi suivre son avancement en bas de cette page."; + $args = "--plug ".escapeshellarg($dev); + $disablebuttonsauegarde=true; + } + break; + case "forget": + $message = "Le disque '".$name."' a bien été désenregistré.\\n"; + $message .="Aucun fichier n'a été supprimé, mais nous n'effectuerons plus de sauvegardes sur ce disque."; + $args = "--forget ".escapeshellarg($uuid); + break; + } + if (strcmp($args, "")){ + //echo "<p>execution de '$cmd $args'</p>"; + shell_exec("$cmd $args"); + } + $mail=trim(exec("grep 'root:' /etc/aliases | cut -d : -f 2")); +?> <p> Bienvenue sur la page de gestion des disques externes (USB) pour la sauvegarde de votre serveur</p> -<p>Cette page vous permet de configurer vos disques de sauvegardes en 4 étapes : +<?php if(empty($mail)): ?> +<strong> Attention : </strong> L'adresse e-mail n'est pas configuré, vous ne serez pas prévenu par e-mail à la fin des sauvegardes +<?php endif ?> +<p>Il suffit de 4 étapes pour effectuer des sauvegardes sur un disque : <ol> <li> Branchez un disque USB dédié aux sauvegardes sur votre serveur</li> -<li> Vérifiez qu'il apparaisse dans la <a href="#disques-connectes">liste des disques connectés</a> ci-dessous et enregistrez le (donnez lui un nom). -<li> Allez dans la <a href="#disques-connus">liste des disques connus</a> et déclanchez la première sauvegarde en appyant sur le bouton "Sauvegarder".</li> -<li> À la fin de la sauvegarde, vous recevrez un mail, vous pouvez aussi suivre son avancement <a href="#logs">en bas de cette page</a>.</li> +<li> Enregistrez votre disque depuis la <a href="#disques">liste des disques</a> (donnez lui un nom)</li> +<li> Vous pouvez maintenant déclancher la première sauvegarde en appyant sur le bouton "Sauvegarder".</li> +<li> À la fin de la sauvegarde, vous recevrez un mail à l'adresse : <?php echo $mail ?>, vous pouvez aussi suivre son avancement <a href="#logs">en bas de cette page</a>.</li> </ol> -</p> <p> -Une fois que vous avez effectué ces 4 étapes, il n'est plus nécessaire de venir sur cette page, il suffit de brancher votre disque pour démarrer la sauvegarde et le retirer une fois le mail indiquant la fin de la sauvegarde reçue. +Une fois que vous avez effectué ces étapes, il suffit de brancher votre disque pour démarrer la sauvegarde. Un mail vous indiquera que la sauvegarde est terminée et que vous pouvez retirer le disque. </p> <p> Vous pouvez toujours revenir ici pour suivre l'avancée des sauvegardes, voir la date de dernière sauvegarde sur chaque disque ou configurer d'autres disques de sauvegardes. @@ -34,9 +72,21 @@ Vous pouvez toujours revenir ici pour suivre l'avancée des sauvegardes, voir la </div> <script src='./mainlog.js'></script> <script src='./discs.js'></script> + <?php include("footer.php"); ?> +<?php if(!empty($message)): ?> + <script> + $.get('log.php', function(data) { + $('#mainlog').html(data); + }); + $.get('discs.php', function(data) { + $('#discs').html(data); + }); + alert("<?php echo $message;?>"); + </script> +<?php endif ?> </div> </div> </body> diff --git a/src/www/log.php b/src/www/log.php index 07e2a815d12bcf3d0067a151097877eccb005b96..dfa7e5fe45c938eb2915b08c2a379e84e7c1770b 100644 --- a/src/www/log.php +++ b/src/www/log.php @@ -21,12 +21,9 @@ $output = file('/var/log/tetras-back/main.log'); $lines = array_reverse($output); ?> -<h2 id="logs"> Logs </h2> +<h2 id="logs"> Messages </h2> <p> -Voici le log, c'est à dire les messages écrit par le système de sauvegarde. -</p> -<p> -Ce log vous permet de suivre l'avancée de la sauvegarde en temps réel (pas besoin de rafraichir la page) et de comprendre la cause de l'erreur en cas d'echec de la sauvegarde.</p> +Le log ci-dessous correspond aux messages écrits par le système de sauvegarde, il vous permet de suivre l'avancée de la sauvegarde en temps réel (pas besoin de rafraichir la page) et de comprendre la cause de l'erreur en cas d'echec de la sauvegarde.</p> <div class="scroll"> <div id="log"> <pre><code>