4 #use warnings; FIXME - Bug 2505
8 use File::Temp qw/ tempdir /;
11 use C4::AuthoritiesMarc;
15 # script that checks zebradir structure & create directories & mandatory files if needed
19 $|=1; # flushes output
20 # If the cron job starts us in an unreadable dir, we will break without
22 chdir $ENV{HOME} if (!(-r '.'));
35 my $process_zebraqueue;
36 my $do_not_clear_zebraqueue;
37 my $verbose_logging = 0;
38 my $zebraidx_log_opt = " -v none,fatal,warn ";
39 my $result = GetOptions(
44 'nosanitize' => \$nosanitize,
48 'munge-config' => \$do_munge,
50 'h|help' => \$want_help,
52 'y' => \$do_not_clear_zebraqueue,
53 'z' => \$process_zebraqueue,
54 'v+' => \$verbose_logging,
58 if (not $result or $want_help) {
63 if (not $biblios and not $authorities) {
64 my $msg = "Must specify -b or -a to reindex bibs or authorities\n";
65 $msg .= "Please do '$0 --help' to see usage.\n";
69 if ($authorities and $as_xml) {
70 my $msg = "Cannot specify both -a and -x\n";
71 $msg .= "Please do '$0 --help' to see usage.\n";
75 if ( !$as_xml and $nosanitize ) {
76 my $msg = "Cannot specify both -no_xml and -nosanitize\n";
77 $msg .= "Please do '$0 --help' to see usage.\n";
81 if ($process_zebraqueue and ($skip_export or $reset)) {
82 my $msg = "Cannot specify -r or -s if -z is specified\n";
83 $msg .= "Please do '$0 --help' to see usage.\n";
87 if ($process_zebraqueue and $do_not_clear_zebraqueue) {
88 my $msg = "Cannot specify both -y and -z\n";
89 $msg .= "Please do '$0 --help' to see usage.\n";
97 # -v is for verbose, which seems backwards here because of how logging is set
98 # on the CLI of zebraidx. It works this way. The default is to not log much
99 if ($verbose_logging >= 2) {
100 $zebraidx_log_opt = '-v none,fatal,warn,all';
104 unless ($directory) {
106 $directory = tempdir(CLEANUP => ($keep_export ? 0 : 1));
110 my $biblioserverdir = C4::Context->zebraconfig('biblioserver')->{directory};
111 my $authorityserverdir = C4::Context->zebraconfig('authorityserver')->{directory};
113 my $kohadir = C4::Context->config('intranetdir');
114 my $dbh = C4::Context->dbh;
115 my ($biblionumbertagfield,$biblionumbertagsubfield) = &GetMarcFromKohaField("biblio.biblionumber","");
116 my ($biblioitemnumbertagfield,$biblioitemnumbertagsubfield) = &GetMarcFromKohaField("biblioitems.biblioitemnumber","");
118 if ( $verbose_logging ) {
119 print "Zebra configuration information\n";
120 print "================================\n";
121 print "Zebra biblio directory = $biblioserverdir\n";
122 print "Zebra authorities directory = $authorityserverdir\n";
123 print "Koha directory = $kohadir\n";
124 print "BIBLIONUMBER in : $biblionumbertagfield\$$biblionumbertagsubfield\n";
125 print "BIBLIOITEMNUMBER in : $biblioitemnumbertagfield\$$biblioitemnumbertagsubfield\n";
126 print "================================\n";
134 index_records('authority', $directory, $skip_export, $process_zebraqueue, $as_xml, $noxml, $nosanitize, $do_not_clear_zebraqueue, $verbose_logging, $zebraidx_log_opt, $authorityserverdir);
136 print "skipping authorities\n" if ( $verbose_logging );
140 index_records('biblio', $directory, $skip_export, $process_zebraqueue, $as_xml, $noxml, $nosanitize, $do_not_clear_zebraqueue, $verbose_logging, $zebraidx_log_opt, $biblioserverdir);
142 print "skipping biblios\n" if ( $verbose_logging );
146 if ( $verbose_logging ) {
147 print "====================\n";
149 print "====================\n";
152 print "NOTHING cleaned : the export $directory has been kept.\n";
153 print "You can re-run this script with the -s ";
155 print " and -d $directory parameters";
160 print "if you just want to rebuild zebra after changing the record.abs\n";
161 print "or another zebra config file\n";
163 unless ($use_tempdir) {
164 # if we're using a temporary directory
165 # created by File::Temp, it will be removed
167 rmtree($directory, 0, 1);
168 print "directory $directory deleted\n";
172 # This checks to see if the zebra directories exist under the provided path.
173 # If they don't, then zebra is likely to spit the dummy. This returns true
174 # if the directories had to be created, false otherwise.
175 sub check_zebra_dirs {
176 my ($base) = shift() . '/';
177 my $needed_repairing = 0;
178 my @dirs = ( '', 'key', 'register', 'shadow', 'tmp' );
179 foreach my $dir (@dirs) {
180 my $bdir = $base . $dir;
182 $needed_repairing = 1;
183 mkdir $bdir || die "Unable to create '$bdir': $!\n";
184 print "$0: needed to create '$bdir'\n";
187 return $needed_repairing;
188 } # ---------- end of subroutine check_zebra_dirs ----------
191 my ($record_type, $directory, $skip_export, $process_zebraqueue, $as_xml, $noxml, $nosanitize, $do_not_clear_zebraqueue, $verbose_logging, $zebraidx_log_opt, $server_dir) = @_;
193 my $num_records_exported = 0;
195 my $need_reset = check_zebra_dirs($server_dir);
197 print "$0: found broken zebra server directories: forcing a rebuild\n";
200 if ($skip_export && $verbose_logging) {
201 print "====================\n";
202 print "SKIPPING $record_type export\n";
203 print "====================\n";
205 if ( $verbose_logging ) {
206 print "====================\n";
207 print "exporting $record_type\n";
208 print "====================\n";
210 mkdir "$directory" unless (-d $directory);
211 mkdir "$directory/$record_type" unless (-d "$directory/$record_type");
212 if ($process_zebraqueue) {
213 my $entries = select_zebraqueue_records($record_type, 'deleted');
214 mkdir "$directory/del_$record_type" unless (-d "$directory/del_$record_type");
215 $records_deleted = generate_deleted_marc_records($record_type, $entries, "$directory/del_$record_type", $as_xml);
216 mark_zebraqueue_batch_done($entries);
217 $entries = select_zebraqueue_records($record_type, 'updated');
218 mkdir "$directory/upd_$record_type" unless (-d "$directory/upd_$record_type");
219 $num_records_exported = export_marc_records_from_list($record_type,
220 $entries, "$directory/upd_$record_type", $as_xml, $noxml, $records_deleted);
221 mark_zebraqueue_batch_done($entries);
223 my $sth = select_all_records($record_type);
224 $num_records_exported = export_marc_records_from_sth($record_type, $sth, "$directory/$record_type", $as_xml, $noxml, $nosanitize);
225 unless ($do_not_clear_zebraqueue) {
226 mark_all_zebraqueue_done($record_type);
232 # and reindexing everything
234 if ( $verbose_logging ) {
235 print "====================\n";
236 print "REINDEXING zebra\n";
237 print "====================\n";
239 my $record_fmt = ($as_xml) ? 'marcxml' : 'iso2709' ;
240 if ($process_zebraqueue) {
241 do_indexing($record_type, 'delete', "$directory/del_$record_type", $reset, $noshadow, $record_fmt, $zebraidx_log_opt)
242 if %$records_deleted;
243 do_indexing($record_type, 'update', "$directory/upd_$record_type", $reset, $noshadow, $record_fmt, $zebraidx_log_opt)
244 if $num_records_exported;
246 do_indexing($record_type, 'update', "$directory/$record_type", $reset, $noshadow, $record_fmt, $zebraidx_log_opt)
247 if ($num_records_exported or $skip_export);
252 sub select_zebraqueue_records {
253 my ($record_type, $update_type) = @_;
255 my $server = ($record_type eq 'biblio') ? 'biblioserver' : 'authorityserver';
256 my $op = ($update_type eq 'deleted') ? 'recordDelete' : 'specialUpdate';
258 my $sth = $dbh->prepare("SELECT id, biblio_auth_number
264 $sth->execute($server, $op);
265 my $entries = $sth->fetchall_arrayref({});
268 sub mark_all_zebraqueue_done {
269 my ($record_type) = @_;
271 my $server = ($record_type eq 'biblio') ? 'biblioserver' : 'authorityserver';
273 my $sth = $dbh->prepare("UPDATE zebraqueue SET done = 1
276 $sth->execute($server);
279 sub mark_zebraqueue_batch_done {
282 $dbh->{AutoCommit} = 0;
283 my $sth = $dbh->prepare("UPDATE zebraqueue SET done = 1 WHERE id = ?");
285 foreach my $id (map { $_->{id} } @$entries) {
288 $dbh->{AutoCommit} = 1;
291 sub select_all_records {
292 my $record_type = shift;
293 return ($record_type eq 'biblio') ? select_all_biblios() : select_all_authorities();
296 sub select_all_authorities {
297 my $sth = $dbh->prepare("SELECT authid FROM auth_header");
302 sub select_all_biblios {
303 my $sth = $dbh->prepare("SELECT biblionumber FROM biblioitems ORDER BY biblionumber");
308 sub export_marc_records_from_sth {
309 my ($record_type, $sth, $directory, $as_xml, $noxml, $nosanitize) = @_;
311 my $num_exported = 0;
312 open my $fh, '>:encoding(UTF-8) ', "$directory/exported_records" or die $!;
314 my ( $itemtag, $itemsubfield ) = GetMarcFromKohaField("items.itemnumber",'');
315 while (my ($record_number) = $sth->fetchrow_array) {
316 print "." if ( $verbose_logging );
317 print "\r$i" unless ($i++ %100 or !$verbose_logging);
319 my $marcxml = $record_type eq 'biblio'
320 ? GetXmlBiblio( $record_number )
321 : GetAuthorityXML( $record_number );
322 if ($record_type eq 'biblio'){
323 my @items = GetItemsInfo($record_number);
325 my $record = MARC::Record->new;
326 $record->encoding('UTF-8');
328 foreach my $item (@items){
329 my $record = Item2Marc($item, $record_number);
330 push @itemsrecord, $record->field($itemtag);
332 $record->insert_fields_ordered(@itemsrecord);
333 my $itemsxml = $record->as_xml_record();
335 substr($marcxml, 0, length($marcxml)-10) .
336 substr($itemsxml, index($itemsxml, "</leader>\n", 0) + 10);
340 print {$fh} $marcxml if $marcxml;
345 my ($marc) = get_corrected_marc_record($record_type, $record_number, $noxml);
347 # FIXME - when more than one record is exported and $as_xml is true,
348 # the output file is not valid XML - it's just multiple <record> elements
349 # strung together with no single root element. zebraidx doesn't seem
350 # to care, though, at least if you're using the GRS-1 filter. It does
351 # care if you're using the DOM filter, which requires valid XML file(s).
353 print {$fh} ($as_xml) ? $marc->as_xml_record(C4::Context->preference('marcflavour')) : $marc->as_usmarc();
357 warn "Error exporting record $record_number ($record_type) ".($noxml ? "not XML" : "XML");
361 print "\nRecords exported: $num_exported\n" if ( $verbose_logging );
363 return $num_exported;
366 sub export_marc_records_from_list {
367 my ($record_type, $entries, $directory, $as_xml, $noxml, $records_deleted) = @_;
369 my $num_exported = 0;
370 open my $fh, '>:encoding(UTF-8)', "$directory/exported_records" or die $!;
373 # Skip any deleted records. We check for this anyway, but this reduces error spam
374 my %found = %$records_deleted;
375 foreach my $record_number ( map { $_->{biblio_auth_number} }
376 grep { !$found{ $_->{biblio_auth_number} }++ }
378 print "." if ( $verbose_logging );
379 print "\r$i" unless ($i++ %100 or !$verbose_logging);
380 my ($marc) = get_corrected_marc_record($record_type, $record_number, $noxml);
382 # FIXME - when more than one record is exported and $as_xml is true,
383 # the output file is not valid XML - it's just multiple <record> elements
384 # strung together with no single root element. zebraidx doesn't seem
385 # to care, though, at least if you're using the GRS-1 filter. It does
386 # care if you're using the DOM filter, which requires valid XML file(s).
387 print {$fh} ($as_xml) ? $marc->as_xml_record(C4::Context->preference('marcflavour')) : $marc->as_usmarc();
391 print "\nRecords exported: $num_exported\n" if ( $verbose_logging );
393 return $num_exported;
396 sub generate_deleted_marc_records {
397 my ($record_type, $entries, $directory, $as_xml) = @_;
399 my $records_deleted = {};
400 open my $fh, '>:encoding(UTF-8)', "$directory/exported_records" or die $!;
402 foreach my $record_number (map { $_->{biblio_auth_number} } @$entries ) {
403 print "\r$i" unless ($i++ %100 or !$verbose_logging);
404 print "." if ( $verbose_logging );
406 my $marc = MARC::Record->new();
407 if ($record_type eq 'biblio') {
408 fix_biblio_ids($marc, $record_number, $record_number);
410 fix_authority_id($marc, $record_number);
412 if (C4::Context->preference("marcflavour") eq "UNIMARC") {
413 fix_unimarc_100($marc);
416 print {$fh} ($as_xml) ? $marc->as_xml_record(C4::Context->preference("marcflavour")) : $marc->as_usmarc();
418 $records_deleted->{$record_number} = 1;
420 print "\nRecords exported: $i\n" if ( $verbose_logging );
422 return $records_deleted;
427 sub get_corrected_marc_record {
428 my ($record_type, $record_number, $noxml) = @_;
430 my $marc = get_raw_marc_record($record_type, $record_number, $noxml);
434 if ($record_type eq 'authority') {
435 fix_authority_id($marc, $record_number);
437 if (C4::Context->preference("marcflavour") eq "UNIMARC") {
438 fix_unimarc_100($marc);
445 sub get_raw_marc_record {
446 my ($record_type, $record_number, $noxml) = @_;
449 if ($record_type eq 'biblio') {
451 my $fetch_sth = $dbh->prepare_cached("SELECT marc FROM biblioitems WHERE biblionumber = ?");
452 $fetch_sth->execute($record_number);
453 if (my ($blob) = $fetch_sth->fetchrow_array) {
454 $marc = MARC::Record->new_from_usmarc($blob);
456 warn "error creating MARC::Record from $blob";
459 # failure to find a bib is not a problem -
460 # a delete could have been done before
461 # trying to process a record update
463 $fetch_sth->finish();
466 eval { $marc = GetMarcBiblio($record_number, 1); };
468 # here we do warn since catching an exception
469 # means that the bib was found but failed
471 warn "error retrieving biblio $record_number";
476 eval { $marc = GetAuthority($record_number); };
478 warn "error retrieving authority $record_number";
486 # FIXME - this routine is suspect
487 # It blanks the Leader/00-05 and Leader/12-16 to
488 # force them to be recalculated correct when
489 # the $marc->as_usmarc() or $marc->as_xml() is called.
490 # But why is this necessary? It would be a serious bug
491 # in MARC::Record (definitely) and MARC::File::XML (arguably)
492 # if they are emitting incorrect leader values.
495 my $leader = $marc->leader;
496 substr($leader, 0, 5) = ' ';
497 substr($leader, 10, 7) = '22 ';
498 $marc->leader(substr($leader, 0, 24));
502 # FIXME - it is essential to ensure that the biblionumber is present,
503 # otherwise, Zebra will choke on the record. However, this
504 # logic belongs in the relevant C4::Biblio APIs.
506 my $biblionumber = shift;
507 my $biblioitemnumber;
509 $biblioitemnumber = shift;
511 my $sth = $dbh->prepare(
512 "SELECT biblioitemnumber FROM biblioitems WHERE biblionumber=?");
513 $sth->execute($biblionumber);
514 ($biblioitemnumber) = $sth->fetchrow_array;
516 unless ($biblioitemnumber) {
517 warn "failed to get biblioitemnumber for biblio $biblionumber";
522 # FIXME - this is cheating on two levels
523 # 1. C4::Biblio::_koha_marc_update_bib_ids is meant to be an internal function
524 # 2. Making sure that the biblionumber and biblioitemnumber are correct and
525 # present in the MARC::Record object ought to be part of GetMarcBiblio.
527 # On the other hand, this better for now than what rebuild_zebra.pl used to
528 # do, which was duplicate the code for inserting the biblionumber
529 # and biblioitemnumber
530 C4::Biblio::_koha_marc_update_bib_ids($marc, '', $biblionumber, $biblioitemnumber);
535 sub fix_authority_id {
536 # FIXME - as with fix_biblio_ids, the authid must be present
537 # for Zebra's sake. However, this really belongs
538 # in C4::AuthoritiesMarc.
539 my ($marc, $authid) = @_;
540 unless ($marc->field('001') and $marc->field('001')->data() eq $authid){
541 $marc->delete_field($marc->field('001'));
542 $marc->insert_fields_ordered(MARC::Field->new('001',$authid));
546 sub fix_unimarc_100 {
547 # FIXME - again, if this is necessary, it belongs in C4::AuthoritiesMarc.
551 if ( length($marc->subfield( 100, "a" )) == 35 ) {
552 $string = $marc->subfield( 100, "a" );
553 my $f100 = $marc->field(100);
554 $marc->delete_field($f100);
557 $string = POSIX::strftime( "%Y%m%d", localtime );
559 $string = sprintf( "%-*s", 35, $string );
561 substr( $string, 22, 6, "frey50" );
562 unless ( length($marc->subfield( 100, "a" )) == 35 ) {
563 $marc->delete_field($marc->field(100));
564 $marc->insert_grouped_field(MARC::Field->new( 100, "", "", "a" => $string ));
569 my ($record_type, $op, $record_dir, $reset_index, $noshadow, $record_format, $zebraidx_log_opt) = @_;
571 my $zebra_server = ($record_type eq 'biblio') ? 'biblioserver' : 'authorityserver';
572 my $zebra_db_name = ($record_type eq 'biblio') ? 'biblios' : 'authorities';
573 my $zebra_config = C4::Context->zebraconfig($zebra_server)->{'config'};
574 my $zebra_db_dir = C4::Context->zebraconfig($zebra_server)->{'directory'};
576 system("zebraidx -c $zebra_config $zebraidx_log_opt -g $record_format -d $zebra_db_name init") if $reset_index;
577 system("zebraidx -c $zebra_config $zebraidx_log_opt $noshadow -g $record_format -d $zebra_db_name $op $record_dir");
578 system("zebraidx -c $zebra_config $zebraidx_log_opt -g $record_format -d $zebra_db_name commit") unless $noshadow;
584 $0: reindex MARC bibs and/or authorities in Zebra.
586 Use this batch job to reindex all biblio or authority
587 records in your Koha database. This job is useful
588 only if you are using Zebra; if you are using the 'NoZebra'
589 mode, this job should not be used.
592 -b index bibliographic records
594 -a index authority records
596 -z select only updated and deleted
597 records marked in the zebraqueue
598 table. Cannot be used with -r
601 -r clear Zebra index before
602 adding records to index
604 -d Temporary directory for indexing.
605 If not specified, one is automatically
606 created. The export directory
607 is automatically deleted unless
608 you supply the -k switch.
610 -k Do not delete export directory.
612 -s Skip export. Used if you have
613 already exported the records
616 -noxml index from ISO MARC blob
617 instead of MARC XML. This
618 option is recommended only
621 -x export and index as xml instead of is02709 (biblios only).
622 use this if you might have records > 99,999 chars,
624 -nosanitize export biblio/authority records directly from DB marcxml
625 field without sanitizing records. It speed up
626 dump process but could fail if DB contains badly
627 encoded records. Works only with -x,
629 -w skip shadow indexing for this batch
631 -y do NOT clear zebraqueue after indexing; normally,
632 after doing batch indexing, zebraqueue should be
633 marked done for the affected record type(s) so that
634 a running zebraqueue_daemon doesn't try to reindex
635 the same records - specify -y to override this.
636 Cannot be used with -z.
638 -v increase the amount of logging. Normally only
639 warnings and errors from the indexing are shown.
640 Use log level 2 (-v -v) to include all Zebra logs.
642 -munge-config Deprecated option to try
643 to fix Zebra config files.
644 --help or -h show this message.
648 # FIXME: the following routines are deprecated and
649 # will be removed once it is determined whether
650 # a script to fix Zebra configuration files is
654 # creating zebra-biblios.cfg depending on system
657 # getting zebraidx directory
659 foreach (qw(/usr/local/bin/zebraidx
668 unless ($zebraidxdir) {
670 ERROR: could not find zebraidx directory
671 ERROR: Either zebra is not installed,
672 ERROR: or it's in a directory I don't checked.
673 ERROR: do a which zebraidx and edit this file to add the result you get
677 $zebraidxdir =~ s/\/bin\/.*//;
678 print "Info : zebra is in $zebraidxdir \n";
680 # getting modules directory
682 foreach (qw(/usr/local/lib/idzebra-2.0/modules/mod-grs-xml.so
683 /usr/local/lib/idzebra/modules/mod-grs-xml.so
684 /usr/lib/idzebra/modules/mod-grs-xml.so
685 /usr/lib/idzebra-2.0/modules/mod-grs-xml.so
692 unless ($modulesdir) {
694 ERROR: could not find mod-grs-xml.so directory
695 ERROR: Either zebra is not properly compiled (libxml2 is not setup and you don t have mod-grs-xml.so,
696 ERROR: or it's in a directory I don't checked.
697 ERROR: find where mod-grs-xml.so is and edit this file to add the result you get
701 $modulesdir =~ s/\/modules\/.*//;
702 print "Info: zebra modules dir : $modulesdir\n";
704 # getting tab directory
706 foreach (qw(/usr/local/share/idzebra/tab/explain.att
707 /usr/local/share/idzebra-2.0/tab/explain.att
708 /usr/share/idzebra/tab/explain.att
709 /usr/share/idzebra-2.0/tab/explain.att
718 ERROR: could not find explain.att directory
719 ERROR: Either zebra is not properly compiled,
720 ERROR: or it's in a directory I don't checked.
721 ERROR: find where explain.att is and edit this file to add the result you get
725 $tabdir =~ s/\/tab\/.*//;
726 print "Info: tab dir : $tabdir\n";
729 # AUTHORITIES creating directory structure
731 my $created_dir_or_file = 0;
733 if ( $verbose_logging ) {
734 print "====================\n";
735 print "checking directories & files for authorities\n";
736 print "====================\n";
738 unless (-d "$authorityserverdir") {
739 system("mkdir -p $authorityserverdir");
740 print "Info: created $authorityserverdir\n";
741 $created_dir_or_file++;
743 unless (-d "$authorityserverdir/lock") {
744 mkdir "$authorityserverdir/lock";
745 print "Info: created $authorityserverdir/lock\n";
746 $created_dir_or_file++;
748 unless (-d "$authorityserverdir/register") {
749 mkdir "$authorityserverdir/register";
750 print "Info: created $authorityserverdir/register\n";
751 $created_dir_or_file++;
753 unless (-d "$authorityserverdir/shadow") {
754 mkdir "$authorityserverdir/shadow";
755 print "Info: created $authorityserverdir/shadow\n";
756 $created_dir_or_file++;
758 unless (-d "$authorityserverdir/tab") {
759 mkdir "$authorityserverdir/tab";
760 print "Info: created $authorityserverdir/tab\n";
761 $created_dir_or_file++;
763 unless (-d "$authorityserverdir/key") {
764 mkdir "$authorityserverdir/key";
765 print "Info: created $authorityserverdir/key\n";
766 $created_dir_or_file++;
769 unless (-d "$authorityserverdir/etc") {
770 mkdir "$authorityserverdir/etc";
771 print "Info: created $authorityserverdir/etc\n";
772 $created_dir_or_file++;
776 # AUTHORITIES : copying mandatory files
778 # the record model, depending on marc flavour
779 unless (-f "$authorityserverdir/tab/record.abs") {
780 if (C4::Context->preference("marcflavour") eq "UNIMARC") {
781 system("cp -f $kohadir/etc/zebradb/marc_defs/unimarc/authorities/record.abs $authorityserverdir/tab/record.abs");
782 print "Info: copied record.abs for UNIMARC\n";
784 system("cp -f $kohadir/etc/zebradb/marc_defs/marc21/authorities/record.abs $authorityserverdir/tab/record.abs");
785 print "Info: copied record.abs for USMARC\n";
787 $created_dir_or_file++;
789 unless (-f "$authorityserverdir/tab/sort-string-utf.chr") {
790 system("cp -f $kohadir/etc/zebradb/lang_defs/fr/sort-string-utf.chr $authorityserverdir/tab/sort-string-utf.chr");
791 print "Info: copied sort-string-utf.chr\n";
792 $created_dir_or_file++;
794 unless (-f "$authorityserverdir/tab/word-phrase-utf.chr") {
795 system("cp -f $kohadir/etc/zebradb/lang_defs/fr/sort-string-utf.chr $authorityserverdir/tab/word-phrase-utf.chr");
796 print "Info: copied word-phase-utf.chr\n";
797 $created_dir_or_file++;
799 unless (-f "$authorityserverdir/tab/auth1.att") {
800 system("cp -f $kohadir/etc/zebradb/authorities/etc/bib1.att $authorityserverdir/tab/auth1.att");
801 print "Info: copied auth1.att\n";
802 $created_dir_or_file++;
804 unless (-f "$authorityserverdir/tab/default.idx") {
805 system("cp -f $kohadir/etc/zebradb/etc/default.idx $authorityserverdir/tab/default.idx");
806 print "Info: copied default.idx\n";
807 $created_dir_or_file++;
810 unless (-f "$authorityserverdir/etc/ccl.properties") {
811 # system("cp -f $kohadir/etc/zebradb/ccl.properties ".C4::Context->zebraconfig('authorityserver')->{ccl2rpn});
812 system("cp -f $kohadir/etc/zebradb/ccl.properties $authorityserverdir/etc/ccl.properties");
813 print "Info: copied ccl.properties\n";
814 $created_dir_or_file++;
816 unless (-f "$authorityserverdir/etc/pqf.properties") {
817 # system("cp -f $kohadir/etc/zebradb/pqf.properties ".C4::Context->zebraconfig('authorityserver')->{ccl2rpn});
818 system("cp -f $kohadir/etc/zebradb/pqf.properties $authorityserverdir/etc/pqf.properties");
819 print "Info: copied pqf.properties\n";
820 $created_dir_or_file++;
824 # AUTHORITIES : copying mandatory files
826 unless (-f C4::Context->zebraconfig('authorityserver')->{config}) {
827 open my $zd, '>:encoding(UTF-8)' ,C4::Context->zebraconfig('authorityserver')->{config};
829 # generated by KOHA/misc/migration_tools/rebuild_zebra.pl
830 profilePath:\${srcdir:-.}:$authorityserverdir/tab/:$tabdir/tab/:\${srcdir:-.}/tab/
833 # Files that describe the attribute sets supported.
838 modulePath:$modulesdir/modules/
839 # Specify record type
840 iso2709.recordType:grs.marcxml.record
842 recordId: (auth1,Local-Number)
848 lockDir: $authorityserverdir/lock
851 register: $authorityserverdir/register:4G
852 shadow: $authorityserverdir/shadow:4G
854 # Temp File area for result sets
855 setTmpDir: $authorityserverdir/tmp
857 # Temp File area for index program
858 keyTmpDir: $authorityserverdir/key
860 # Approx. Memory usage during indexing
864 print "Info: creating zebra-authorities.cfg\n";
865 $created_dir_or_file++;
868 if ($created_dir_or_file) {
869 print "Info: created : $created_dir_or_file directories & files\n";
871 print "Info: file & directories OK\n";
876 if ( $verbose_logging ) {
877 print "====================\n";
878 print "checking directories & files for biblios\n";
879 print "====================\n";
883 # BIBLIOS : creating directory structure
885 unless (-d "$biblioserverdir") {
886 system("mkdir -p $biblioserverdir");
887 print "Info: created $biblioserverdir\n";
888 $created_dir_or_file++;
890 unless (-d "$biblioserverdir/lock") {
891 mkdir "$biblioserverdir/lock";
892 print "Info: created $biblioserverdir/lock\n";
893 $created_dir_or_file++;
895 unless (-d "$biblioserverdir/register") {
896 mkdir "$biblioserverdir/register";
897 print "Info: created $biblioserverdir/register\n";
898 $created_dir_or_file++;
900 unless (-d "$biblioserverdir/shadow") {
901 mkdir "$biblioserverdir/shadow";
902 print "Info: created $biblioserverdir/shadow\n";
903 $created_dir_or_file++;
905 unless (-d "$biblioserverdir/tab") {
906 mkdir "$biblioserverdir/tab";
907 print "Info: created $biblioserverdir/tab\n";
908 $created_dir_or_file++;
910 unless (-d "$biblioserverdir/key") {
911 mkdir "$biblioserverdir/key";
912 print "Info: created $biblioserverdir/key\n";
913 $created_dir_or_file++;
915 unless (-d "$biblioserverdir/etc") {
916 mkdir "$biblioserverdir/etc";
917 print "Info: created $biblioserverdir/etc\n";
918 $created_dir_or_file++;
922 # BIBLIOS : copying mandatory files
924 # the record model, depending on marc flavour
925 unless (-f "$biblioserverdir/tab/record.abs") {
926 if (C4::Context->preference("marcflavour") eq "UNIMARC") {
927 system("cp -f $kohadir/etc/zebradb/marc_defs/unimarc/biblios/record.abs $biblioserverdir/tab/record.abs");
928 print "Info: copied record.abs for UNIMARC\n";
930 system("cp -f $kohadir/etc/zebradb/marc_defs/marc21/biblios/record.abs $biblioserverdir/tab/record.abs");
931 print "Info: copied record.abs for USMARC\n";
933 $created_dir_or_file++;
935 unless (-f "$biblioserverdir/tab/sort-string-utf.chr") {
936 system("cp -f $kohadir/etc/zebradb/lang_defs/fr/sort-string-utf.chr $biblioserverdir/tab/sort-string-utf.chr");
937 print "Info: copied sort-string-utf.chr\n";
938 $created_dir_or_file++;
940 unless (-f "$biblioserverdir/tab/word-phrase-utf.chr") {
941 system("cp -f $kohadir/etc/zebradb/lang_defs/fr/sort-string-utf.chr $biblioserverdir/tab/word-phrase-utf.chr");
942 print "Info: copied word-phase-utf.chr\n";
943 $created_dir_or_file++;
945 unless (-f "$biblioserverdir/tab/bib1.att") {
946 system("cp -f $kohadir/etc/zebradb/biblios/etc/bib1.att $biblioserverdir/tab/bib1.att");
947 print "Info: copied bib1.att\n";
948 $created_dir_or_file++;
950 unless (-f "$biblioserverdir/tab/default.idx") {
951 system("cp -f $kohadir/etc/zebradb/etc/default.idx $biblioserverdir/tab/default.idx");
952 print "Info: copied default.idx\n";
953 $created_dir_or_file++;
955 unless (-f "$biblioserverdir/etc/ccl.properties") {
956 # system("cp -f $kohadir/etc/zebradb/ccl.properties ".C4::Context->zebraconfig('biblioserver')->{ccl2rpn});
957 system("cp -f $kohadir/etc/zebradb/ccl.properties $biblioserverdir/etc/ccl.properties");
958 print "Info: copied ccl.properties\n";
959 $created_dir_or_file++;
961 unless (-f "$biblioserverdir/etc/pqf.properties") {
962 # system("cp -f $kohadir/etc/zebradb/pqf.properties ".C4::Context->zebraconfig('biblioserver')->{ccl2rpn});
963 system("cp -f $kohadir/etc/zebradb/pqf.properties $biblioserverdir/etc/pqf.properties");
964 print "Info: copied pqf.properties\n";
965 $created_dir_or_file++;
969 # BIBLIOS : copying mandatory files
971 unless (-f C4::Context->zebraconfig('biblioserver')->{config}) {
972 open my $zd, '>:encoding(UTF-8)', C4::Context->zebraconfig('biblioserver')->{config};
974 # generated by KOHA/misc/migrtion_tools/rebuild_zebra.pl
975 profilePath:\${srcdir:-.}:$biblioserverdir/tab/:$tabdir/tab/:\${srcdir:-.}/tab/
978 # Files that describe the attribute sets supported.
983 modulePath:$modulesdir/modules/
984 # Specify record type
985 iso2709.recordType:grs.marcxml.record
987 recordId: (bib1,Local-Number)
993 lockDir: $biblioserverdir/lock
996 register: $biblioserverdir/register:4G
997 shadow: $biblioserverdir/shadow:4G
999 # Temp File area for result sets
1000 setTmpDir: $biblioserverdir/tmp
1002 # Temp File area for index program
1003 keyTmpDir: $biblioserverdir/key
1005 # Approx. Memory usage during indexing
1009 print "Info: creating zebra-biblios.cfg\n";
1010 $created_dir_or_file++;
1013 if ($created_dir_or_file) {
1014 print "Info: created : $created_dir_or_file directories & files\n";
1016 print "Info: file & directories OK\n";