From bec92f2d432e383f27751df2f89076d320cad3e4 Mon Sep 17 00:00:00 2001
From: David Beniamine <david.beniamine@tetras-libre.fr>
Date: Thu, 26 Oct 2017 15:04:52 +0200
Subject: [PATCH] Refonte de l'interface
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

+ CHG: Unification des deux tables
+ CHG: Tests de validité dans les posts
+ CHG: Seuls les boutons utilisables apparaissemt
+ CHG: Plusde page "action.php"
+ CHG: Alert javascript pour confirmer les actions
+ CHG: Explications plus clair
+ ADD: Affichage du mail destinataire
+ ADD: Etat du disque plus lisible
---
 src/tetras-back     | 10 +++++-
 src/www/actions.php | 48 --------------------------
 src/www/discs.js    |  2 +-
 src/www/discs.php   | 82 ++++++++++++++++++++-------------------------
 src/www/index.php   | 64 +++++++++++++++++++++++++++++++----
 src/www/log.php     |  7 ++--
 6 files changed, 105 insertions(+), 108 deletions(-)
 delete mode 100644 src/www/actions.php

diff --git a/src/tetras-back b/src/tetras-back
index dc3bb7f..702c32d 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 3ca154f..0000000
--- 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 fa95ded..fcee49b 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 a3369a5..dfb4bfe 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 e1d11fd..1a5deab 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 07e2a81..dfa7e5f 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>
-- 
GitLab