From 0007ba75d9f9b1b150ec0b0bff0aebfaa56d8580 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fr=C3=A9d=C3=A9rick?= <frederick.capovilla@libeo.com>
Date: Wed, 27 Nov 2013 13:46:24 -0500
Subject: [PATCH] Adds a page to access log files on the server from the intranet.

The directory used is defined by the "publiclogdir" preference in
koha-conf.xml.
---
 .../prog/en/modules/reports/report_files.tt        |   62 +++++++++++++
 .../prog/en/modules/reports/reports-home.tt        |    1 +
 reports/report_files.pl                            |   94 ++++++++++++++++++++
 3 files changed, 157 insertions(+), 0 deletions(-)
 create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/reports/report_files.tt
 create mode 100755 reports/report_files.pl

diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/reports/report_files.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/reports/report_files.tt
new file mode 100644
index 0000000..6e1208a
--- /dev/null
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/reports/report_files.tt
@@ -0,0 +1,62 @@
+[% INCLUDE 'doc-head-open.inc' %]
+<title>Report/log files</title>
+[% INCLUDE 'doc-head-close.inc' %]
+<script type="text/javascript" src="[% themelang %]/lib/jquery/plugins/jquery.tablesorter.min.js"></script>
+<script type="text/JavaScript" language="JavaScript">
+	//<![CDATA[
+		$(document).ready(function() {
+    		$("#files").tablesorter({
+    				widgets : ['zebra'],
+                    headers: {2:{sorter: false}}
+    			});
+    	});
+	//]]>
+</script>
+</head>
+<body>
+[% INCLUDE 'header.inc' %]
+[% INCLUDE 'cat-search.inc' %]
+
+<div id="breadcrumbs"><a href="/cgi-bin/koha/mainpage.pl">Home</a> &rsaquo; <a href="/cgi-bin/koha/reports/reports-home.pl">Reports</a> &rsaquo; Report/log files</div>
+
+<div id="doc3" class="yui-t2">
+   <div id="bd">
+	<div id="yui-main">
+	<div class="yui-b">
+
+	<h1>Report/log files</h1>
+
+[% IF ( error_no_publiclogdir ) %]
+    <div class="dialog alert"><strong>Error : </strong>Report/log files could not be found because the "publiclogdir" option was not set in "koha-conf.xml". Contact your system administrator to add this option.</div>
+[% ELSE %]
+    [% IF ( files_loop ) %]
+        <table id="files">
+            <thead>
+                <tr>
+                    <th>Name</th>
+                    <th>Size (bytes)</th>
+                    <th>Date last modified</th>
+                </tr>
+            </thead>
+            <tbody>
+                [% FOREACH file IN files_loop %]
+                <tr>
+                    <td><a href="/cgi-bin/koha/reports/report_files.pl?id=[% file.id |url %]">[% file.name %]</a></td>
+                    <td align="right">[% file.size %]</td>
+                    <td>[% file.date %]</td>
+                </tr>
+                [% END %]
+            </tbody>
+        </table>
+    [% ELSE %]
+        No file found.
+    [% END %]
+[% END %]
+
+</div>
+</div>
+<div class="yui-b">
+[% INCLUDE 'reports-menu.inc' %]
+</div>
+</div>
+[% INCLUDE 'intranet-bottom.inc' %]
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/reports/reports-home.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/reports/reports-home.tt
index c7744fa..1e61219 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/reports/reports-home.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/reports/reports-home.tt
@@ -66,6 +66,7 @@
         <li><a href="http://schema.koha-community.org/" target="blank">Koha database schema</a></li>
         <li><a href="http://wiki.koha-community.org/wiki/SQL_Reports_Library" target="blank">Koha reports library</a></li>
         <!--<li><a href="/cgi-bin/koha/reports/stats.screen.pl">Till reconciliation</a></li> -->
+        <li><a href="/cgi-bin/koha/reports/report_files.pl">Report/log files</a></li>
 	</ul></div>
 </div>
 
diff --git a/reports/report_files.pl b/reports/report_files.pl
new file mode 100755
index 0000000..85df685
--- /dev/null
+++ b/reports/report_files.pl
@@ -0,0 +1,94 @@
+#!/usr/bin/perl
+
+# Frédérick Capovilla, 2011 - Libéo
+#
+# Show a list of all the files in the directory specified by the option 
+# "publiclogdir" in koha-conf.xml so they can be downloaded by users with the 
+# "reports" permission.
+# 
+# This file is part of Koha.
+#
+# Koha is free software; you can redistribute it and/or modify it under the
+# terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with Koha; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+use strict;
+use warnings;
+use C4::Auth;
+use CGI;
+use C4::Context;
+use C4::Output;
+use C4::Koha;
+use File::stat;
+
+my $input      = new CGI;
+my $file_id = $input->param("id");
+my $directory = C4::Context->config('publiclogdir');
+
+my ($template, $borrowernumber, $cookie)
+	= get_template_and_user({template_name => "reports/report_files.tt",
+				query => $input,
+				type => "intranet",
+				authnotrequired => 0,
+				flagsrequired => {reports => '*'},
+				});
+				
+unless($directory) {
+    $template->param(error_no_publiclogdir => 1);
+}
+else {
+    #Get the files list
+    my @files_list;
+	opendir(DIR, $directory);
+
+    my $i=0;
+    foreach my $filename (readdir(DIR)) {
+        my $full_path = "$directory/$filename";
+        next if ($filename =~ /^\./ or -d $full_path);
+
+        my $st = stat($full_path);
+        push(@files_list, {name => $filename, 
+                           date => scalar localtime($st->mtime), 
+                           size => $st->size,
+                           id   => $i});
+        $i++;
+    }
+    closedir(DIR);
+
+    # If we received a file_id and it is valid, send the file to the browser
+    if(defined $file_id and $file_id >= 0 and $file_id < scalar @files_list){
+        my $filename = $files_list[$file_id]->{name};
+        binmode STDOUT;
+        # Open the selected file and send it to the browser
+        print $input->header(-type => 'application/x-download',
+                             -name => "$filename",
+                             -Content_length => -s "$directory/$filename",
+                             -attachment => "$filename");
+
+        open FILE, "<:utf8", "$directory/$filename";
+        binmode FILE;
+
+        my $buf;
+        while(read(FILE, $buf, 65536)) {
+            print $buf;
+        }
+        close FILE;
+
+        exit(1);
+    }
+    else{
+        # Send the file list to the template
+        $template->param(files_loop => \@files_list);
+    }
+}
+
+output_html_with_http_headers $input, $cookie, $template->output;
-- 
1.7.2.5