Bug 11926: Add a cronjob
authorJonathan Druart <jonathan.druart@biblibre.com>
Thu, 4 Sep 2014 09:32:43 +0000 (11:32 +0200)
committerTomas Cohen Arazi <tomascohen@gmail.com>
Wed, 22 Oct 2014 18:17:07 +0000 (15:17 -0300)
Signed-off-by: Chris Cormack <chris@bigballofwax.co.nz>
Signed-off-by: Katrin Fischer <katrin.fischer.83@web.de>
Signed-off-by: Tomas Cohen Arazi <tomascohen@gmail.com>
C4/UsageStats.pm
koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/admin.pref
misc/cronjobs/share_usage_with_koha_community.pl [new file with mode: 0644]

index a5478b7..0187f86 100644 (file)
@@ -1,25 +1,23 @@
 package UsageStats;
 
-# Copyright 2000-2003 Katipo Communications
-# Copyright 2010 BibLibre
-# Parts Copyright 2010 Catalyst IT
-#
 # 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.
+# Copyright 2014 BibLibre
+#
+# 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 3 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.
+# 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.
+# You should have received a copy of the GNU General Public License
+# along with Koha; if not, see <http://www.gnu.org/licenses>.
 
-use strict;
+use Modern::Perl;
 use C4::Context;
 use POSIX qw(strftime);
 use LWP::UserAgent;
@@ -35,13 +33,6 @@ hea.koha-community.org is the server that centralize Koha setups informations
 Koha libraries are encouraged to provide informations about their collections,
 their structure,...
 
-This package is normally only called by a cronjob, like
-0 3 1 * * export KOHA_CONF=/home/koha/etc/koha-conf.xml; export PERL5LIB=/home/koha/src; perl /home/koha/src/C4/UsageStats.pm
-
-IMPORTANT : please do NOT run the cron on the 1st, but on another day. The idea is to avoid all
-Koha libraries sending their data at the same time ! So choose any day between 1 and 28 !
-
-
 =head2 NeedUpdate
 
   $needUpdateYN = C4::UsageStats::NeedUpdate;
@@ -59,42 +50,15 @@ sub NeedUpdate {
     # Need to launch cron.
     return 1 if $now - $lastupdated >= 2592000;
 
-    # Cron no need to be launched.
+    # Data don't need to be updated
     return 0;
 }
 
-=head2 LaunchCron
-
-  LaunchCron();
-
-Compute results and send them to the centralized server
-
-=cut
-
-sub LaunchCron {
-    if (!C4::Context->preference('UsageStatsShare')) {
-      die ("UsageStats is not configured");
-    }
-    if (NeedUpdate) {
-        C4::Context->set_preference('UsageStatsLastUpdateTime', strftime("%s", localtime));
-        my $data = BuildReport();
-        ReportToCommunity($data);
-    }
-}
-
-=head2 Builreport
-
-  BuildReport();
-
-retrieve some database volumety and systempreferences that will be sent to hea server
-
-=cut
-
 sub BuildReport {
     my $report = {
-        'library' => {
-            'name' => C4::Context->preference('UsageStatsLibraryName'),
-            'id' => C4::Context->preference('UsageStatsID') || 0,
+        library => {
+            name => C4::Context->preference('UsageStatsLibraryName') || q||,
+            id => C4::Context->preference('UsageStatsID') || 0,
         },
     };
 
@@ -104,257 +68,262 @@ sub BuildReport {
     }
 
     # Get systempreferences.
-    foreach (qw/ AcqCreateItem
- AcqWarnOnDuplicateInvoice
- AcqViewBaskets
- BasketConfirmations
- OrderPdfFormat
- casAuthentication
- casLogout
- AllowPkiAuth
- DebugLevel
- delimiter
- noItemTypeImages
- virtualshelves
- AutoLocation
- IndependentBranches
- SessionStorage
- Persona
- AuthDisplayHierarchy
- AutoCreateAuthorities
- BiblioAddsAuthorities
- dontmerge
- UseAuthoritiesForTracings
- CatalogModuleRelink
- hide_marc
- IntranetBiblioDefaultView
- LabelMARCView
- OpacSuppression
- SeparateHoldings
- UseControlNumber
- advancedMARCeditor
- DefaultClassificationSource
- EasyAnalyticalRecords
- autoBarcode
- item-level_itypes
- marcflavour
- PrefillItem
- z3950NormalizeAuthor
- SpineLabelAutoPrint
- SpineLabelShowPrintOnBibDetails
- BlockReturnOfWithdrawnItems
- CalculateFinesOnReturn
- AgeRestrictionOverride
- AllFinesNeedOverride
- AllowFineOverride
- AllowItemsOnHoldCheckout
- AllowNotForLoanOverride
- AllowRenewalLimitOverride
- AllowReturnToBranch
- AllowTooManyOverride
- AutomaticItemReturn
- AutoRemoveOverduesRestrictions
- CircControl
- HomeOrHoldingBranch
- HomeOrHoldingBranchReturn
- InProcessingToShelvingCart
- IssueLostItem
- IssuingInProcess
- ManInvInNoissuesCharge
- OverduesBlockCirc
- RenewalPeriodBase
- RenewalSendNotice
- RentalsInNoissuesCharge
- ReturnBeforeExpiry
- ReturnToShelvingCart
- TransfersMaxDaysWarning
- UseBranchTransferLimits
- useDaysMode
- UseTransportCostMatrix
- UseCourseReserves
- finesCalendar
- FinesIncludeGracePeriod
- finesMode
- RefundLostItemFeeOnReturn
- WhenLostChargeReplacementFee
- WhenLostForgiveFine
- AllowHoldDateInFuture
- AllowHoldPolicyOverride
- AllowHoldsOnDamagedItems
- AllowHoldsOnPatronsPossessions
- AllowOnShelfHolds
- AutoResumeSuspendedHolds
- canreservefromotherbranches
- decreaseLoanHighHolds
- DisplayMultiPlaceHold
- emailLibrarianWhenHoldIsPlaced
- ExpireReservesMaxPickUpDelay
- OPACAllowHoldDateInFuture
- OPACAllowUserToChooseBranch
- ReservesControlBranch
- ReservesNeedReturns
- SuspendHoldsIntranet
- SuspendHoldsOpac
- TransferWhenCancelAllWaitingHolds
- AllowAllMessageDeletion
- AllowOfflineCirculation
- CircAutocompl
- CircAutoPrintQuickSlip
- DisplayClearScreenButton
- FilterBeforeOverdueReport
- FineNotifyAtCheckin
- itemBarcodeFallbackSearch
- itemBarcodeInputFilter
- previousIssuesDefaultSortOrder
- RecordLocalUseOnReturn
- soundon
- SpecifyDueDate
- todaysIssuesDefaultSortOrder
- UpdateTotalIssuesOnCirc
- UseTablesortForCirc
- WaitingNotifyAtCheckin
- AllowSelfCheckReturns
- AutoSelfCheckAllowed
- FRBRizeEditions
- OPACFRBRizeEditions
- AmazonCoverImages
- OPACAmazonCoverImages
- Babeltheque
- BakerTaylorEnabled
- GoogleJackets
- HTML5MediaEnabled
- IDreamBooksReadometer
- IDreamBooksResults
- IDreamBooksReviews
- LibraryThingForLibrariesEnabled
- LocalCoverImages
- OPACLocalCoverImages
- NovelistSelectEnabled
- XISBN
- OpenLibraryCovers
- UseKohaPlugins
- SyndeticsEnabled
-  TagsEnabled
- CalendarFirstDayOfWeek
- opaclanguagesdisplay
- AuthoritiesLog
- BorrowersLog
- CataloguingLog
- FinesLog
- IssueLog
- LetterLog
- ReturnLog
- SubscriptionLog
- AuthorisedValueImages
- BiblioDefaultView
- COinSinOPACResults
- DisplayOPACiconsXSLT
- hidelostitems
- HighlightOwnItemsOnOPAC
- OpacAddMastheadLibraryPulldown
- OPACDisplay856uAsImage
- OpacHighlightedWords
- OpacKohaUrl
- OpacMaintenance
- OpacPublic
- OpacSeparateHoldings
- OPACShowBarcode
- OPACShowCheckoutName
- OpacShowFiltersPulldownMobile
- OPACShowHoldQueueDetails
- OpacShowLibrariesPulldownMobile
- OpacShowRecentComments
- OPACShowUnusedAuthorities
- OpacStarRatings
- opacthemes
- OPACURLOpenInNewWindow
- OpacAuthorities
- opacbookbag
- OpacBrowser
- OpacBrowseResults
- OpacCloud
- OPACFinesTab
- OpacHoldNotes
- OpacItemLocation
- OpacPasswordChange
- OPACPatronDetails
- OPACpatronimages
- OPACPopupAuthorsSearch
- OpacTopissue
- opacuserlogin
- QuoteOfTheDay
- RequestOnOpac
- reviewson
- ShowReviewer
- ShowReviewerPhoto
- SocialNetworks
- suggestion
- AllowPurchaseSuggestionBranchChoice
- OpacAllowPublicListCreation
- OpacAllowSharingPrivateLists
- OPACItemHolds
- OpacRenewalAllowed
- OpacRenewalBranch
- OPACViewOthersSuggestions
- SearchMyLibraryFirst
- singleBranchMode
- AnonSuggestions
- EnableOpacSearchHistory
- OPACPrivacy
- opacreadinghistory
- TrackClicks
- PatronSelfRegistration
- OPACShelfBrowser
- AddPatronLists
- AutoEmailOpacUser
- AutoEmailPrimaryAddress
- autoMemberNum
- BorrowerRenewalPeriodBase
- checkdigit
- EnableBorrowerFiles
- EnhancedMessagingPreferences
- ExtendedPatronAttributes
- intranetreadinghistory
- memberofinstitution
- patronimages
- TalkingTechItivaPhoneNotification
- uppercasesurnames
- IncludeSeeFromInSearches
- OpacGroupResults
- QueryAutoTruncate
- QueryFuzzy
- QueryStemming
- QueryWeightFields
- TraceCompleteSubfields
- TraceSubjectSubdivisions
- UseICU
- UseQueryParser
- defaultSortField
- displayFacetCount
- OPACdefaultSortField
- OPACItemsResultsDisplay
- expandedSearchOption
- IntranetNumbersPreferPhrase
- OPACNumbersPreferPhrase
- opacSerialDefaultTab
- RenewSerialAddsSuggestion
- RoutingListAddReserves
- RoutingSerials
- SubscriptionHistory
- Display856uAsImage
- DisplayIconsXSLT
- StaffAuthorisedValueImages
- template
- yuipath
- HidePatronName
- intranetbookbag
- StaffDetailItemSelection
- viewISBD
- viewLabeledMARC
- viewMARC
- ILS-DI
- OAI-PMH
- version/) {
+    foreach (
+        qw/
+        AcqCreateItem
+        AcqWarnOnDuplicateInvoice
+        AcqViewBaskets
+        BasketConfirmations
+        OrderPdfFormat
+        casAuthentication
+        casLogout
+        AllowPkiAuth
+        DebugLevel
+        delimiter
+        noItemTypeImages
+        virtualshelves
+        AutoLocation
+        IndependentBranches
+        SessionStorage
+        Persona
+        AuthDisplayHierarchy
+        AutoCreateAuthorities
+        BiblioAddsAuthorities
+        dontmerge
+        UseAuthoritiesForTracings
+        CatalogModuleRelink
+        hide_marc
+        IntranetBiblioDefaultView
+        LabelMARCView
+        OpacSuppression
+        SeparateHoldings
+        UseControlNumber
+        advancedMARCeditor
+        DefaultClassificationSource
+        EasyAnalyticalRecords
+        autoBarcode
+        item-level_itypes
+        marcflavour
+        PrefillItem
+        z3950NormalizeAuthor
+        SpineLabelAutoPrint
+        SpineLabelShowPrintOnBibDetails
+        BlockReturnOfWithdrawnItems
+        CalculateFinesOnReturn
+        AgeRestrictionOverride
+        AllFinesNeedOverride
+        AllowFineOverride
+        AllowItemsOnHoldCheckout
+        AllowNotForLoanOverride
+        AllowRenewalLimitOverride
+        AllowReturnToBranch
+        AllowTooManyOverride
+        AutomaticItemReturn
+        AutoRemoveOverduesRestrictions
+        CircControl
+        HomeOrHoldingBranch
+        HomeOrHoldingBranchReturn
+        InProcessingToShelvingCart
+        IssueLostItem
+        IssuingInProcess
+        ManInvInNoissuesCharge
+        OverduesBlockCirc
+        RenewalPeriodBase
+        RenewalSendNotice
+        RentalsInNoissuesCharge
+        ReturnBeforeExpiry
+        ReturnToShelvingCart
+        TransfersMaxDaysWarning
+        UseBranchTransferLimits
+        useDaysMode
+        UseTransportCostMatrix
+        UseCourseReserves
+        finesCalendar
+        FinesIncludeGracePeriod
+        finesMode
+        RefundLostItemFeeOnReturn
+        WhenLostChargeReplacementFee
+        WhenLostForgiveFine
+        AllowHoldDateInFuture
+        AllowHoldPolicyOverride
+        AllowHoldsOnDamagedItems
+        AllowHoldsOnPatronsPossessions
+        AllowOnShelfHolds
+        AutoResumeSuspendedHolds
+        canreservefromotherbranches
+        decreaseLoanHighHolds
+        DisplayMultiPlaceHold
+        emailLibrarianWhenHoldIsPlaced
+        ExpireReservesMaxPickUpDelay
+        OPACAllowHoldDateInFuture
+        OPACAllowUserToChooseBranch
+        ReservesControlBranch
+        ReservesNeedReturns
+        SuspendHoldsIntranet
+        SuspendHoldsOpac
+        TransferWhenCancelAllWaitingHolds
+        AllowAllMessageDeletion
+        AllowOfflineCirculation
+        CircAutocompl
+        CircAutoPrintQuickSlip
+        DisplayClearScreenButton
+        FilterBeforeOverdueReport
+        FineNotifyAtCheckin
+        itemBarcodeFallbackSearch
+        itemBarcodeInputFilter
+        previousIssuesDefaultSortOrder
+        RecordLocalUseOnReturn
+        soundon
+        SpecifyDueDate
+        todaysIssuesDefaultSortOrder
+        UpdateTotalIssuesOnCirc
+        UseTablesortForCirc
+        WaitingNotifyAtCheckin
+        AllowSelfCheckReturns
+        AutoSelfCheckAllowed
+        FRBRizeEditions
+        OPACFRBRizeEditions
+        AmazonCoverImages
+        OPACAmazonCoverImages
+        Babeltheque
+        BakerTaylorEnabled
+        GoogleJackets
+        HTML5MediaEnabled
+        IDreamBooksReadometer
+        IDreamBooksResults
+        IDreamBooksReviews
+        LibraryThingForLibrariesEnabled
+        LocalCoverImages
+        OPACLocalCoverImages
+        NovelistSelectEnabled
+        XISBN
+        OpenLibraryCovers
+        UseKohaPlugins
+        SyndeticsEnabled
+        TagsEnabled
+        CalendarFirstDayOfWeek
+        opaclanguagesdisplay
+        AuthoritiesLog
+        BorrowersLog
+        CataloguingLog
+        FinesLog
+        IssueLog
+        LetterLog
+        ReturnLog
+        SubscriptionLog
+        AuthorisedValueImages
+        BiblioDefaultView
+        COinSinOPACResults
+        DisplayOPACiconsXSLT
+        hidelostitems
+        HighlightOwnItemsOnOPAC
+        OpacAddMastheadLibraryPulldown
+        OPACDisplay856uAsImage
+        OpacHighlightedWords
+        OpacKohaUrl
+        OpacMaintenance
+        OpacPublic
+        OpacSeparateHoldings
+        OPACShowBarcode
+        OPACShowCheckoutName
+        OpacShowFiltersPulldownMobile
+        OPACShowHoldQueueDetails
+        OpacShowLibrariesPulldownMobile
+        OpacShowRecentComments
+        OPACShowUnusedAuthorities
+        OpacStarRatings
+        opacthemes
+        OPACURLOpenInNewWindow
+        OpacAuthorities
+        opacbookbag
+        OpacBrowser
+        OpacBrowseResults
+        OpacCloud
+        OPACFinesTab
+        OpacHoldNotes
+        OpacItemLocation
+        OpacPasswordChange
+        OPACPatronDetails
+        OPACpatronimages
+        OPACPopupAuthorsSearch
+        OpacTopissue
+        opacuserlogin
+        QuoteOfTheDay
+        RequestOnOpac
+        reviewson
+        ShowReviewer
+        ShowReviewerPhoto
+        SocialNetworks
+        suggestion
+        AllowPurchaseSuggestionBranchChoice
+        OpacAllowPublicListCreation
+        OpacAllowSharingPrivateLists
+        OPACItemHolds
+        OpacRenewalAllowed
+        OpacRenewalBranch
+        OPACViewOthersSuggestions
+        SearchMyLibraryFirst
+        singleBranchMode
+        AnonSuggestions
+        EnableOpacSearchHistory
+        OPACPrivacy
+        opacreadinghistory
+        TrackClicks
+        PatronSelfRegistration
+        OPACShelfBrowser
+        AddPatronLists
+        AutoEmailOpacUser
+        AutoEmailPrimaryAddress
+        autoMemberNum
+        BorrowerRenewalPeriodBase
+        checkdigit
+        EnableBorrowerFiles
+        EnhancedMessagingPreferences
+        ExtendedPatronAttributes
+        intranetreadinghistory
+        memberofinstitution
+        patronimages
+        TalkingTechItivaPhoneNotification
+        uppercasesurnames
+        IncludeSeeFromInSearches
+        OpacGroupResults
+        QueryAutoTruncate
+        QueryFuzzy
+        QueryStemming
+        QueryWeightFields
+        TraceCompleteSubfields
+        TraceSubjectSubdivisions
+        UseICU
+        UseQueryParser
+        defaultSortField
+        displayFacetCount
+        OPACdefaultSortField
+        OPACItemsResultsDisplay
+        expandedSearchOption
+        IntranetNumbersPreferPhrase
+        OPACNumbersPreferPhrase
+        opacSerialDefaultTab
+        RenewSerialAddsSuggestion
+        RoutingListAddReserves
+        RoutingSerials
+        SubscriptionHistory
+        Display856uAsImage
+        DisplayIconsXSLT
+        StaffAuthorisedValueImages
+        template
+        yuipath
+        HidePatronName
+        intranetbookbag
+        StaffDetailItemSelection
+        viewISBD
+        viewLabeledMARC
+        viewMARC
+        ILS-DI
+        OAI-PMH
+        version
+        /
+      )
+    {
         $report->{systempreferences}{$_} = C4::Context->preference($_);
     }
     return $report;
@@ -369,16 +338,18 @@ Send to hea.koha-community.org database informations
 =cut
 
 sub ReportToCommunity {
-    my $data = shift;
-    my $json = uri_encode(to_json($data), 1);
-
-    my $ua = LWP::UserAgent->new;
-    my $req = HTTP::Request->new(POST => "http://hea.koha-community.org/upload.pl");
-    $req->content_type('application/x-www-form-urlencoded');
-    $req->content("data=$json");
-    my $res = $ua->request($req);
-    my $content = from_json($res->decoded_content);
-    C4::Context->set_preference('UsageStatsID', $content->{library}{library_id});
+      my $data = shift;
+      my $json = uri_encode( to_json($data), 1 );
+
+      my $ua = LWP::UserAgent->new;
+      my $req =
+        HTTP::Request->new( POST => "http://hea.koha-community.org/upload.pl" );
+      $req->content_type('application/x-www-form-urlencoded');
+      $req->content("data=$json");
+      my $res     = $ua->request($req);
+      my $content = from_json( $res->decoded_content );
+      C4::Context->set_preference( 'UsageStatsID',
+          $content->{library}{library_id} );
 }
 
 =head2 _count
@@ -390,13 +361,12 @@ Count the number of records in $table tables
 =cut
 
 sub _count {
-    my $table = shift;
+      my $table = shift;
 
-    my $dbh = C4::Context->dbh;
-    my $sth = $dbh->prepare("SELECT count(*) from $table");
-    $sth->execute;
-    return $sth->fetchrow_array;
+      my $dbh = C4::Context->dbh;
+      my $sth = $dbh->prepare("SELECT count(*) from $table");
+      $sth->execute;
+      return $sth->fetchrow_array;
 }
 
-&LaunchCron;
 1;
index bbdcc73..1c15ac0 100644 (file)
@@ -115,18 +115,15 @@ Administration:
             - is the search engine used.
     Usage Stats:
         -
-            - pref: UsageStatsLastUpdateTime
-              default: 0
-            - stores the last time when cron were launch
-        -
-            - pref: UsageStatsID
-              default:
-            -
-        -
             - pref: UsageStatsShare
-              default:
-            -
+              default: 0
+              choices:
+                  yes: Share
+                  no: "Don't share"
+            - data volumetry with Koha community. You can see the data on the <a href="http://hea.koha-community.org">Hea Koha community website</a>.
         -
+            - The library name
             - pref: UsageStatsLibraryName
-              default:
-            -
+            - will be shown on <a href="http://hea.koha-community.org">Hea Koha community website</a>.
+            - If this name is empty, you will sent data anonymously
+            - Note that this value has no effect if UsageStatsShare system preference is set to "Don't share"
diff --git a/misc/cronjobs/share_usage_with_koha_community.pl b/misc/cronjobs/share_usage_with_koha_community.pl
new file mode 100644 (file)
index 0000000..acc7fd5
--- /dev/null
@@ -0,0 +1,98 @@
+#!/usr/bin/perl
+
+use Modern::Perl;
+
+use Pod::Usage;
+use Getopt::Long;
+
+use C4::Context;
+use C4::UsageStats;
+
+
+my ( $help, $verbose );
+GetOptions(
+    'h|help'                 => \$help,
+    'v|verbose'              => \$verbose,
+) || pod2usage(1);
+
+if ($help) {
+    pod2usage(1);
+}
+
+unless( C4::Context->preference('UsageStatsShare') ) {
+  pod2usage (q|The UsageStats system preference is not set. If your library  wants to share their usage statistics with the Koha community, you have to switch on this system preference|);
+  exit 1;
+}
+
+my $need_update = C4::UsageStats::NeedUpdate();
+
+if ( $need_update ) {
+    say "Data need to be updated" if $verbose;
+    my $report = C4::UsageStats::BuildReport();
+    C4::UsageStats::ReportToCommunity($report);
+    C4::Context->set_preference('UsageStatsLastUpdateTime', strftime("%s", localtime));
+} elsif( $verbose ) {
+    say "Data don't need to be updated";
+}
+
+=head1 NAME
+
+share_usage_with_koha_community.pl - Share your library's usage with the Koha community
+
+=head1 SYNOPSIS
+
+share_usage_with_koha_community.pl [-h|--help] [-v|--verbose]
+
+If the UsageStatsShare system preference is set, you can launch this script to share your usage with the Koha community.
+
+Collecting Koha usage statistics will help developpers to know how Koha is used across the world.
+
+This script will sent the volumetry for the biblio and authority records, issues, reserves, orders and subscription.
+
+Only the total number is retrieved. In no case private data will be shared!
+
+In order to know which parts of Koha modules are used, this script will collect some system preference values.
+
+If you want to tell us who you are, you can fill the UsageStatsLibraryName system preference with your library name.
+
+All these data will be analysed on the http://hea.koha-community.org Koha community website.
+
+IMPORTANT : please do NOT run the cron on the 1st, but on another day. The idea is to avoid all
+Koha libraries sending their data at the same time ! So choose any day between 1 and 28 !
+
+=head1 OPTIONS
+
+=over
+
+=item B<-h|--help>
+
+Print a brief help message
+
+=item B<-v|--verbose>
+
+Verbose mode.
+
+=back
+
+=head1 AUTHOR
+
+Alex Arnaud <alex.arnaud@biblibre.com>
+
+Jonathan Druart <jonathan.druart@biblibre.com>
+
+=head1 COPYRIGHT
+
+Copyright 2014 BibLibre
+
+=head1 LICENSE
+
+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 3 of the License, or (at your option) any later version.
+
+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.
+
+=cut