3 # Copyright 2010 Jesse Weaver, Koha Dev Team
5 # This file is part of Koha.
7 # Koha is free software; you can redistribute it and/or modify it under the
8 # terms of the GNU General Public License as published by the Free Software
9 # Foundation; either version 2 of the License, or (at your option) any later
12 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
13 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14 # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License along
17 # with Koha; if not, write to the Free Software Foundation, Inc.,
18 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
28 $YAML::Syck::ImplicitTyping = 1;
29 $YAML::Syck::SortKeys = 1;
30 our %NOT_SET_PREFS = map { $_, 1 } qw( Version );
34 koha-preferences - Get, set, dump and load Koha system preferences
38 misc/admin/koha-preferences COMMAND ...
46 pod2usage( -verbose => 1, -exitval => 1, -output => \*STDERR );
48 pod2usage( -verbose => 1, -exitval => 0 );
55 print STDERR $message . "\n" if ( $C4::Debug::debug );
58 sub _normalize_value {
61 # AFAIK, there are no sysprefs where NULL has a different meaning than ''.
62 return ( $row->{'value'} || '' ) unless ( $row->{'type'} eq 'YesNo' );
65 # In theory, YesNo sysprefs should always contain 1/0.
66 # In practice, however, they don't.
69 my $bool_value = eval {
70 return C4::Boolean::true_p( $row->{'value'} ) ? 1 : 0;
80 my ( $preference, $value ) = @_;
82 _debug( "Setting $preference to $value" );
84 C4::Context->set_preference( $preference, $value );
85 logaction( 'SYSTEMPREFERENCE', 'MODIFY', undef, $preference . " | " . $value );
89 my $dbh = C4::Context->dbh;
92 map { $_->{'variable'}, _normalize_value($_) }
93 @{ $dbh->selectall_arrayref( "
96 FROM systempreferences
97 ", { Slice => {} } ) }
102 my ( %preferences ) = @_;
104 my $dbh = C4::Context->dbh;
106 # First, a quick check to make sure all of the system preferences exist
107 my $current_state = $dbh->selectall_arrayref( "
109 variable, type, value
110 FROM systempreferences
111 WHERE variable IN (" . join( ', ', map( "?", keys %preferences ) ) . ")
112 ", { Slice => {} }, keys %preferences );
114 exit 2 if ( scalar( @$current_state ) != scalar( keys %preferences ) );
116 foreach my $row ( @$current_state ) {
117 # YAML::Syck encodes no as '', so deal with that
118 $preferences{$row->{'variable'}} = $preferences{$row->{'variable'}} eq '' ? 0 : C4::Boolean::true_p( $preferences{$row->{'variable'}} ) if ( $row->{'type'} eq 'YesNo' );
121 # Iterate through again, now that we've checked all of the YesNo sysprefs
123 foreach my $row ( @$current_state ) {
124 next if ( $preferences{$row->{'variable'}} eq $row->{'value'} );
126 _set_preference( $row->{'variable'}, $preferences{$row->{'variable'}} );
130 sub _fetch_preference {
131 my ( $preference ) = @_;
133 my $dbh = C4::Context->dbh;
135 my $row = $dbh->selectrow_hashref( "
137 variable, value, type
138 FROM systempreferences
141 ", {}, $preference );
143 exit 2 unless ( $row );
149 my ( $preference ) = @_;
151 my $row = _fetch_preference( $preference );
153 return _normalize_value( $row );
157 my ( $preference, $value ) = @_;
159 my $row = _fetch_preference( $preference );
161 $value = C4::Boolean::true_p($value) ? 1 : 0 if ( $row->{'type'} eq 'YesNo' );
163 exit 3 if ( $value eq $row->{'value'} );
165 _set_preference( $preference, $value );
168 sub ClearPreference {
169 my ( $preference ) = @_;
173 my $row = _fetch_preference( $preference );
175 $value = 0 if ( $row->{'type'} eq 'YesNo' );
177 exit 3 if ( $value eq $row->{'value'} );
179 _set_preference( $preference, $value );
184 COMMAND can be any of the following:
188 =item B<dump> [ -o I<OUTFILE> ]
190 Dump all of Koha's system preferences as a simple YAML mapping into OUTFILE or
193 =item B<load> [ -i I<INFILE> ] [ -f|--force ]
195 Reads system preferences specified in YAML in INFILE or STDIN. Will exit with a
196 status of 2, without setting any sysprefs, if any of the sysprefs do not exist.
197 Will also exit if any of the sysprefs are YesNo and have an invalid value.
199 If there is a Version syspref in the input, it will not be set in the database,
200 but it will be checked to make sure the running Koha version is equal or higher.
201 The script will exit with a status of 4 if this is not true. Pass the -f option
204 =item B<get> I<PREFERENCE>
206 Print the value of the system preference PREFERENCE, followed by a newline. If
207 no such syspref exists, will exit with a status of 2.
209 =item B<set> I<PREFERENCE> I<VALUE>
211 Set the system preference PREFERENCE to the value VALUE. If no such syspref
212 exists, will exit with a status of 2. If the syspref already has that value,
213 will exit with a status of 3.
215 If the syspref is YesNo, will accept only a boolean value, but the syntax for
216 these is fairly lax (yes/no, on/off, 1/0, n/y, true/false are all accepted).
218 =item B<clear> I<PREFERENCE>
220 Clears the value of the system preference PREFERENCE. If no such syspref exists,
221 will exit with a status of 2. Will set YesNo sysprefs to 'false'.
225 Print a longer, more detailed manual.
235 ) || _print_usage( 1 );
238 YAML::Syck::DumpFile( $outfile, GetPreferences() );
240 print YAML::Syck::Dump( GetPreferences() );
244 my ( $infile, $force_version );
248 'f' => \$force_version,
251 my $preferences = YAML::Syck::LoadFile($infile || \*STDIN);
253 die "Expected a YAML mapping" if ( ref($preferences) ne 'HASH' );
255 die "Tried to load preferences for version " . $preferences->{'Version'} . ", we are " . C4::Context->preference( 'Version' ) if ( $preferences->{'Version'} && C4::Context->preference( 'Version' ) < $preferences->{'Version'} );
258 map { $_, $preferences->{$_} }
259 grep { !$NOT_SET_PREFS{$_} }
263 SetPreferences( %prefs_to_set );
266 my ( $preference ) = @_;
268 print_usage() unless ( $preference );
270 print GetPreference( $preference ) . "\n";
273 my ( $preference, $value ) = @_;
275 print_usage() unless ( $preference && defined($value) );
277 SetPreference( $preference, $value );
280 my ( $preference ) = @_;
282 print_usage() unless ( $preference );
284 ClearPreference( $preference );
287 pod2usage( -verbose => 2 );
291 print_usage() if ( $ARGV[0] =~ /^(-h|--help|-help|help)$/ );
293 print_usage( 1 ) if ( !$ARGV[0] || ref($commands{$ARGV[0]}) ne 'CODE' );
295 $command = $commands{$ARGV[0]};
301 Print a short usage message.
307 $ export KOHA_DEBUG=1 # Used here to show what is being stored
308 $ misc/admin/koha-preferences get viewISBD
310 $ misc/admin/koha-preferences set viewISBD on
311 Setting viewISBD to 1
312 $ misc/admin/koha-preferences dump -o preferences.yaml
313 $ [ edit preferences.yaml ]
314 $ misc/admin/koha-preferences load -i preferences.yaml
315 $ misc/admin/koha-preferences load -i preferences-too-new.yaml
316 Tried to load preferences for version 3.0500012, we are 3.0300009 at misc/admin/koha-preferences line 255
317 $ misc/admin/koha-preferences load # Can also work from STDIN
321 Setting viewMARC to 1