Release 1.1.1.
[rsync-backup] / check-bkp-status.in
index 6dd3efc..75ddf60 100644 (file)
@@ -153,6 +153,7 @@ html_header () {
 <html>
 <head>
   <title>$now rsync-backup report</title>
+  <meta name=viewport content="width=device-width initial-scale=1.0">
   <style type='text/css'><!--
        body {
          background: white;
@@ -221,7 +222,17 @@ html_header () {
          padding: 1ex;
          background: #eee;
          border: solid thin black;
-         overflow-y: auto;
+         overflow: auto;
+       }
+
+       pre.logdump { max-height: 120ex; }
+
+       .hide { display: none; }
+       a.expand-button {
+         float: right;
+         font-size: medium;
+         font-weight: initial;
+         padding-top: 1ex;
        }
 
        div.logdump-info {
@@ -231,6 +242,56 @@ html_header () {
          border: solid thin black;
        }
   --></style>
+  <script type='text/javascript'><!--
+       var LAST_EXPAND = null;
+       function elt(id) { return document.getElementById(id); }
+       function elt_class_p(elt, cls) {
+         return elt.className.match('\\\\b' + cls + '\\\\b');
+       }
+       function add_elt_class(elt, cls) {
+         if (!elt_class_p(elt, cls)) elt.className += ' ' + cls;
+       }
+       function rm_elt_class(elt, cls) {
+         elt.className = elt.className.replace(
+           new RegExp('\\\\s*\\\\b' + cls + '\\\\b\\\\s*'), ' ');
+       }
+       function toggle_expand(ev, tag) {
+         var d = elt('logdump-' + tag);
+         var b = elt('expand-' + tag);
+         if (elt_class_p(d, 'hide')) do_show(d, b);
+         else do_hide(d, b);
+         ev.preventDefault();
+       }
+       function do_show(d, b) {
+         rm_elt_class(d, 'hide');
+         b.textContent = '[hide]';
+       }
+       function do_hide(d, b) {
+         add_elt_class(d, 'hide');
+         b.textContent = '[show]';
+         if (LAST_EXPAND !== null && d === LAST_EXPAND[0])
+           LAST_EXPAND = null;
+       }
+       function expand_log(tag) {
+         if (LAST_EXPAND !== null) do_hide(LAST_EXPAND[0], LAST_EXPAND[1]);
+         var d = elt('logdump-' + tag);
+         var b = elt('expand-' + tag);
+         if (elt_class_p(d, 'hide')) {
+           LAST_EXPAND = [d, b];
+           do_show(d, b);
+         }
+       }
+       function make_toggle_button(tag) {
+         document.write(
+           "<a class=expand-button id='expand-" + tag + "' href='#' " +
+              "onclick='toggle_expand(event, \"" + tag + "\")'>" +
+           "[show]" +
+           "</a>");
+       }
+       function hide_logdump(tag) {
+         add_elt_class(elt('logdump-' + tag), 'hide');
+       }
+  --></script>
 </head>
 <body>
 
@@ -255,7 +316,10 @@ EOF
 html_hosttbl_fs () {
   case $3 in
     winning) link="" knil="" ;;
-    *) link="<a href='#log-$host:$fs'>" knil="</a>";;
+    *)
+      link="<a href='#log-$host:$fs' onclick='expand_log(\"$host:$fs\")'>"
+      knil="</a>"
+      ;;
   esac
   cat <<EOF
   <tr class=fs>
@@ -279,19 +343,27 @@ EOF
 html_logdump_begin () {
   cat <<EOF
 
-<h2><a name='log-$1:$2'>Log tail for <tt>$1:$2</tt></a></h2>
+<h2 id='log-$1:$2'><a name='log-$1:$2'>Log tail for <tt>$1:$2</tt></a>
+<script type='text/javascript'><!--
+       make_toggle_button('$1:$2');
+--></script></h2>
 EOF
 }
 
 html_logdump_info () {
   cat <<EOF
-<div class=logdump-info>$3</div>
+<div id='logdump-$1:$2' class=logdump-info><script type='text/javascript'><!--
+       hide_logdump('$1:$2');
+--></script>$3</div>
 EOF
 }
 
 html_logdump_file () {
   cat <<EOF
-<pre class=logdump>
+<pre id='logdump-$1:$2' class=logdump>
+<script type='text/javascript'><!--
+       hide_logdump('$1:$2');
+--></script>$3</div>
 EOF
   cat "$3"
   cat <<EOF
@@ -305,8 +377,8 @@ html_footer () {
   cat <<EOF
 
 <div class=footer>
-  Checked at $now $now_time.
-  <br><tt>rsync-backup</tt> $VERSION; &copy; 2014 Mark Wooding
+  Checked at $now $now_time<br>
+  <tt>rsync-backup</tt> $VERSION; &copy; 2014 Mark Wooding
 </div>
 
 </body>
@@ -335,7 +407,7 @@ backup () {
       case $host:$fs in $p) matchp=t; break ;; esac
     done
     case $matchp in nil) return ;; esac
-    when=$(sqlite3 $INDEXDB \
+    when=$(sqlite3 -batch -list -separator \| -noheader $INDEXDB \
       "SELECT MAX(date) FROM idx WHERE host = '$host' AND fs = '$fs';")
     case $when in
       "")