[Koha-patches] [PATCH] Bug 4878 - Command-line tool for getting and setting sysprefs
Jesse Weaver
pianohacker at gmail.com
Tue Dec 21 22:24:32 CET 2010
New script misc/admin/koha-preferences - Allows getting and setting of
sysprefs one-at-a-time or in bulk. More info:
misc/admin/koha-preferences help
or:
misc/admin/koha-preferences manual
---
misc/admin/koha-preferences | 324 +++++++++++++++++++++++++++++++++++++++++++
1 files changed, 324 insertions(+), 0 deletions(-)
create mode 100755 misc/admin/koha-preferences
diff --git a/misc/admin/koha-preferences b/misc/admin/koha-preferences
new file mode 100755
index 0000000..a9e33f4
--- /dev/null
+++ b/misc/admin/koha-preferences
@@ -0,0 +1,324 @@
+#!/usr/bin/perl
+#
+# Copyright 2010 Jesse Weaver, Koha Dev Team
+#
+# 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 C4::Boolean;
+use C4::Context;
+use C4::Debug;
+use C4::Log;
+use Getopt::Long;
+use Pod::Usage;
+use YAML::Syck qw();
+$YAML::Syck::ImplicitTyping = 1;
+$YAML::Syck::SortKeys = 1;
+our %NOT_SET_PREFS = map { $_, 1 } qw( Version );
+
+=head1 NAME
+
+koha-preferences - Get, set, dump and load Koha system preferences
+
+=head1 SYNOPSIS
+
+misc/admin/koha-preferences COMMAND ...
+
+=cut
+
+sub print_usage {
+ my ( $annoyed ) = @_;
+
+ if ( $annoyed ) {
+ pod2usage( -verbose => 1, -exitval => 1, -output => \*STDERR );
+ } else {
+ pod2usage( -verbose => 1, -exitval => 0 );
+ }
+}
+
+sub _debug {
+ my ( $message ) = @_;
+
+ print STDERR $message . "\n" if ( $C4::Debug::debug );
+}
+
+sub _normalize_value {
+ my ($row) = @_;
+
+ # AFAIK, there are no sysprefs where NULL has a different meaning than ''.
+ return ( $row->{'value'} || '' ) unless ( $row->{'type'} eq 'YesNo' );
+
+ #
+ # In theory, YesNo sysprefs should always contain 1/0.
+ # In practice, however, they don't.
+ # - Yogi Berra
+ #
+ my $bool_value = eval {
+ return C4::Boolean::true_p( $row->{'value'} ) ? 1 : 0;
+ };
+ if ( $@ ) {
+ return 0;
+ } else {
+ return $bool_value;
+ }
+}
+
+sub _set_preference {
+ my ( $preference, $value ) = @_;
+
+ _debug( "Setting $preference to $value" );
+
+ C4::Context->set_preference( $preference, $value );
+ logaction( 'SYSTEMPREFERENCE', 'MODIFY', undef, $preference . " | " . $value );
+}
+
+sub GetPreferences {
+ my $dbh = C4::Context->dbh;
+
+ return {
+ map { $_->{'variable'}, _normalize_value($_) }
+ @{ $dbh->selectall_arrayref( "
+ SELECT
+ variable, value, type
+ FROM systempreferences
+ ", { Slice => {} } ) }
+ };
+}
+
+sub SetPreferences {
+ my ( %preferences ) = @_;
+
+ my $dbh = C4::Context->dbh;
+
+ # First, a quick check to make sure all of the system preferences exist
+ my $current_state = $dbh->selectall_arrayref( "
+ SELECT
+ variable, type, value
+ FROM systempreferences
+ WHERE variable IN (" . join( ', ', map( "?", keys %preferences ) ) . ")
+ ", { Slice => {} }, keys %preferences );
+
+ exit 2 if ( scalar( @$current_state ) != scalar( keys %preferences ) );
+
+ foreach my $row ( @$current_state ) {
+ # YAML::Syck encodes no as '', so deal with that
+ $preferences{$row->{'variable'}} = $preferences{$row->{'variable'}} eq '' ? 0 : C4::Boolean::true_p( $preferences{$row->{'variable'}} ) if ( $row->{'type'} eq 'YesNo' );
+ }
+
+ # Iterate through again, now that we've checked all of the YesNo sysprefs
+
+ foreach my $row ( @$current_state ) {
+ next if ( $preferences{$row->{'variable'}} eq $row->{'value'} );
+
+ _set_preference( $row->{'variable'}, $preferences{$row->{'variable'}} );
+ }
+}
+
+sub _fetch_preference {
+ my ( $preference ) = @_;
+
+ my $dbh = C4::Context->dbh;
+
+ my $row = $dbh->selectrow_hashref( "
+ SELECT
+ variable, value, type
+ FROM systempreferences
+ WHERE variable = ?
+ LIMIT 1
+ ", {}, $preference );
+
+ exit 2 unless ( $row );
+
+ return $row;
+}
+
+sub GetPreference {
+ my ( $preference ) = @_;
+
+ my $row = _fetch_preference( $preference );
+
+ return _normalize_value( $row );
+}
+
+sub SetPreference {
+ my ( $preference, $value ) = @_;
+
+ my $row = _fetch_preference( $preference );
+
+ $value = C4::Boolean::true_p($value) ? 1 : 0 if ( $row->{'type'} eq 'YesNo' );
+
+ exit 3 if ( $value eq $row->{'value'} );
+
+ _set_preference( $preference, $value );
+}
+
+sub ClearPreference {
+ my ( $preference ) = @_;
+
+ my $value = '';
+
+ my $row = _fetch_preference( $preference );
+
+ $value = 0 if ( $row->{'type'} eq 'YesNo' );
+
+ exit 3 if ( $value eq $row->{'value'} );
+
+ _set_preference( $preference, $value );
+}
+
+=head1 OPTIONS
+
+COMMAND can be any of the following:
+
+=over
+
+=item B<dump> [ -o I<OUTFILE> ]
+
+Dump all of Koha's system preferences as a simple YAML mapping into OUTFILE or
+STDOUT.
+
+=item B<load> [ -i I<INFILE> ] [ -f|--force ]
+
+Reads system preferences specified in YAML in INFILE or STDIN. Will exit with a
+status of 2, without setting any sysprefs, if any of the sysprefs do not exist.
+Will also exit if any of the sysprefs are YesNo and have an invalid value.
+
+If there is a Version syspref in the input, it will not be set in the database,
+but it will be checked to make sure the running Koha version is equal or higher.
+The script will exit with a status of 4 if this is not true. Pass the -f option
+to skip this check.
+
+=item B<get> I<PREFERENCE>
+
+Print the value of the system preference PREFERENCE, followed by a newline. If
+no such syspref exists, will exit with a status of 2.
+
+=item B<set> I<PREFERENCE> I<VALUE>
+
+Set the system preference PREFERENCE to the value VALUE. If no such syspref
+exists, will exit with a status of 2. If the syspref already has that value,
+will exit with a status of 3.
+
+If the syspref is YesNo, will accept only a boolean value, but the syntax for
+these is fairly lax (yes/no, on/off, 1/0, n/y, true/false are all accepted).
+
+=item B<clear> I<PREFERENCE>
+
+Clears the value of the system preference PREFERENCE. If no such syspref exists,
+will exit with a status of 2. Will set YesNo sysprefs to 'false'.
+
+=item B<manual>
+
+Print a longer, more detailed manual.
+
+=cut
+
+my %commands = (
+ dump => sub{
+ my ( $outfile );
+
+ GetOptions(
+ 'o:s' => \$outfile
+ ) || _print_usage( 1 );
+
+ if ( $outfile ) {
+ YAML::Syck::DumpFile( $outfile, GetPreferences() );
+ } else {
+ print YAML::Syck::Dump( GetPreferences() );
+ }
+ },
+ load => sub {
+ my ( $infile, $force_version );
+
+ GetOptions(
+ 'i:s' => \$infile,
+ 'f' => \$force_version,
+ );
+
+ my $preferences = YAML::Syck::LoadFile($infile || \*STDIN);
+
+ die "Expected a YAML mapping" if ( ref($preferences) ne 'HASH' );
+
+ die "Tried to load preferences for version " . $preferences->{'Version'} . ", we are " . C4::Context->preference( 'Version' ) if ( $preferences->{'Version'} && C4::Context->preference( 'Version' ) < $preferences->{'Version'} );
+
+ my %prefs_to_set = (
+ map { $_, $preferences->{$_} }
+ grep { !$NOT_SET_PREFS{$_} }
+ keys %$preferences
+ );
+
+ SetPreferences( %prefs_to_set );
+ },
+ get => sub {
+ my ( $preference ) = @_;
+
+ print_usage() unless ( $preference );
+
+ print GetPreference( $preference ) . "\n";
+ },
+ set => sub {
+ my ( $preference, $value ) = @_;
+
+ print_usage() unless ( $preference && defined($value) );
+
+ SetPreference( $preference, $value );
+ },
+ clear => sub {
+ my ( $preference ) = @_;
+
+ print_usage() unless ( $preference );
+
+ ClearPreference( $preference );
+ },
+ manual => sub {
+ pod2usage( -verbose => 2 );
+ }
+);
+
+print_usage() if ( $ARGV[0] =~ /^(-h|--help|-help|help)$/ );
+
+print_usage( 1 ) if ( !$ARGV[0] || ref($commands{$ARGV[0]}) ne 'CODE' );
+
+$command = $commands{$ARGV[0]};
+shift @ARGV;
+$command->(@ARGV);
+
+=item B<help>
+
+Print a short usage message.
+
+=back
+
+=head1 EXAMPLES
+
+ $ export KOHA_DEBUG=1 # Used here to show what is being stored
+ $ misc/admin/koha-preferences get viewISBD
+ 0
+ $ misc/admin/koha-preferences set viewISBD on
+ Setting viewISBD to 1
+ $ misc/admin/koha-preferences dump -o preferences.yaml
+ $ [ edit preferences.yaml ]
+ $ misc/admin/koha-preferences load -i preferences.yaml
+ $ misc/admin/koha-preferences load -i preferences-too-new.yaml
+ Tried to load preferences for version 3.0500012, we are 3.0300009 at misc/admin/koha-preferences line 255
+ $ misc/admin/koha-preferences load # Can also work from STDIN
+ XISBN: false
+ viewMARC: y
+ [ Control-D ]
+ Setting viewMARC to 1
+ Setting XISBN to 0
+
+=cut
--
1.7.1
More information about the Koha-patches
mailing list