Bugzilla – Attachment 2900 Details for
Bug 4878
Command line tool for getting and setting sysprefs
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Proposed patch
0001-Bug-4878-Command-line-tool-for-getting-and-setting-s.patch (text/plain), 9.56 KB, created by
Jesse Weaver
on 2010-12-21 21:27:40 UTC
(
hide
)
Description:
Proposed patch
Filename:
MIME Type:
Creator:
Jesse Weaver
Created:
2010-12-21 21:27:40 UTC
Size:
9.56 KB
patch
obsolete
>From 15521f58f83e3edb5390af59f1be608383179607 Mon Sep 17 00:00:00 2001 >From: Jesse Weaver <pianohacker@gmail.com> >Date: Tue, 21 Dec 2010 14:19:29 -0700 >Subject: [PATCH] Bug 4878 - Command-line tool for getting and setting sysprefs > >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 >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 4878
: 2900