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;
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) {
100 $zebraidx_log_opt = '';
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' );
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;
194 my $num_records_deleted = 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 $num_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);
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 $num_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 (OUT, ">:utf8 ", "$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, 'intra');
325 my $record = MARC::Record->new;
327 foreach my $item (@items){
328 my $record = Item2Marc($item, $record_number);
329 push @itemsrecord, $record->field($itemtag);
331 $record->insert_fields_ordered(@itemsrecord);
332 my $itemsxml=$record->as_xml_record();
333 my $searchstring = '<record>\n';
334 my $index = index($itemsxml, '<record>\n', 0);
335 $itemsxml = substr($itemsxml, $index + length($searchstring));
336 $searchstring = '</record>';
337 $marcxml = substr($marcxml, 0, index($marcxml, $searchstring));
338 $marcxml .= $itemsxml;
342 print OUT $marcxml if $marcxml;
347 my ($marc) = get_corrected_marc_record($record_type, $record_number, $noxml);
349 # FIXME - when more than one record is exported and $as_xml is true,
350 # the output file is not valid XML - it's just multiple <record> elements
351 # strung together with no single root element. zebraidx doesn't seem
352 # to care, though, at least if you're using the GRS-1 filter. It does
353 # care if you're using the DOM filter, which requires valid XML file(s).
354 print OUT ($as_xml) ? $marc->as_xml_record(C4::Context->preference('marcflavour')) : $marc->as_usmarc();
358 print "\nRecords exported: $num_exported\n" if ( $verbose_logging );
360 return $num_exported;
363 sub export_marc_records_from_list {
364 my ($record_type, $entries, $directory, $as_xml, $noxml) = @_;
366 my $num_exported = 0;
367 open (OUT, ">:utf8 ", "$directory/exported_records") or die $!;
370 foreach my $record_number ( map { $_->{biblio_auth_number} }
371 grep { !$found{ $_->{biblio_auth_number} }++ }
373 print "." if ( $verbose_logging );
374 print "\r$i" unless ($i++ %100 or !$verbose_logging);
375 my ($marc) = get_corrected_marc_record($record_type, $record_number, $noxml);
377 # FIXME - when more than one record is exported and $as_xml is true,
378 # the output file is not valid XML - it's just multiple <record> elements
379 # strung together with no single root element. zebraidx doesn't seem
380 # to care, though, at least if you're using the GRS-1 filter. It does
381 # care if you're using the DOM filter, which requires valid XML file(s).
382 print OUT ($as_xml) ? $marc->as_xml_record(C4::Context->preference('marcflavour')) : $marc->as_usmarc();
386 print "\nRecords exported: $num_exported\n" if ( $verbose_logging );
388 return $num_exported;
391 sub generate_deleted_marc_records {
392 my ($record_type, $entries, $directory, $as_xml) = @_;
394 my $num_exported = 0;
395 open (OUT, ">:utf8 ", "$directory/exported_records") or die $!;
397 foreach my $record_number (map { $_->{biblio_auth_number} } @$entries ) {
398 print "\r$i" unless ($i++ %100 or !$verbose_logging);
399 print "." if ( $verbose_logging );
401 my $marc = MARC::Record->new();
402 if ($record_type eq 'biblio') {
403 fix_biblio_ids($marc, $record_number, $record_number);
405 fix_authority_id($marc, $record_number);
407 if (C4::Context->preference("marcflavour") eq "UNIMARC") {
408 fix_unimarc_100($marc);
411 print OUT ($as_xml) ? $marc->as_xml_record(C4::Context->preference("marcflavour")) : $marc->as_usmarc();
414 print "\nRecords exported: $num_exported\n" if ( $verbose_logging );
416 return $num_exported;
421 sub get_corrected_marc_record {
422 my ($record_type, $record_number, $noxml) = @_;
424 my $marc = get_raw_marc_record($record_type, $record_number, $noxml);
428 if ($record_type eq 'biblio') {
429 my $succeeded = fix_biblio_ids($marc, $record_number);
430 return unless $succeeded;
432 fix_authority_id($marc, $record_number);
434 if (C4::Context->preference("marcflavour") eq "UNIMARC") {
435 fix_unimarc_100($marc);
442 sub get_raw_marc_record {
443 my ($record_type, $record_number, $noxml) = @_;
446 if ($record_type eq 'biblio') {
448 my $fetch_sth = $dbh->prepare_cached("SELECT marc FROM biblioitems WHERE biblionumber = ?");
449 $fetch_sth->execute($record_number);
450 if (my ($blob) = $fetch_sth->fetchrow_array) {
451 $marc = MARC::Record->new_from_usmarc($blob);
452 $fetch_sth->finish();
454 return; # failure to find a bib is not a problem -
455 # a delete could have been done before
456 # trying to process a record update
459 eval { $marc = GetMarcBiblio($record_number); };
461 # here we do warn since catching an exception
462 # means that the bib was found but failed
464 warn "error retrieving biblio $record_number";
469 C4::Biblio::EmbedItemsInMarcBiblio($marc, $record_number);
471 eval { $marc = GetAuthority($record_number); };
473 warn "error retrieving authority $record_number";
481 # FIXME - this routine is suspect
482 # It blanks the Leader/00-05 and Leader/12-16 to
483 # force them to be recalculated correct when
484 # the $marc->as_usmarc() or $marc->as_xml() is called.
485 # But why is this necessary? It would be a serious bug
486 # in MARC::Record (definitely) and MARC::File::XML (arguably)
487 # if they are emitting incorrect leader values.
490 my $leader = $marc->leader;
491 substr($leader, 0, 5) = ' ';
492 substr($leader, 10, 7) = '22 ';
493 $marc->leader(substr($leader, 0, 24));
497 # FIXME - it is essential to ensure that the biblionumber is present,
498 # otherwise, Zebra will choke on the record. However, this
499 # logic belongs in the relevant C4::Biblio APIs.
501 my $biblionumber = shift;
502 my $biblioitemnumber;
504 $biblioitemnumber = shift;
506 my $sth = $dbh->prepare(
507 "SELECT biblioitemnumber FROM biblioitems WHERE biblionumber=?");
508 $sth->execute($biblionumber);
509 ($biblioitemnumber) = $sth->fetchrow_array;
511 unless ($biblioitemnumber) {
512 warn "failed to get biblioitemnumber for biblio $biblionumber";
517 # FIXME - this is cheating on two levels
518 # 1. C4::Biblio::_koha_marc_update_bib_ids is meant to be an internal function
519 # 2. Making sure that the biblionumber and biblioitemnumber are correct and
520 # present in the MARC::Record object ought to be part of GetMarcBiblio.
522 # On the other hand, this better for now than what rebuild_zebra.pl used to
523 # do, which was duplicate the code for inserting the biblionumber
524 # and biblioitemnumber
525 C4::Biblio::_koha_marc_update_bib_ids($marc, '', $biblionumber, $biblioitemnumber);
530 sub fix_authority_id {
531 # FIXME - as with fix_biblio_ids, the authid must be present
532 # for Zebra's sake. However, this really belongs
533 # in C4::AuthoritiesMarc.
534 my ($marc, $authid) = @_;
535 unless ($marc->field('001') and $marc->field('001')->data() eq $authid){
536 $marc->delete_field($marc->field('001'));
537 $marc->insert_fields_ordered(MARC::Field->new('001',$authid));
541 sub fix_unimarc_100 {
542 # FIXME - again, if this is necessary, it belongs in C4::AuthoritiesMarc.
546 if ( length($marc->subfield( 100, "a" )) == 35 ) {
547 $string = $marc->subfield( 100, "a" );
548 my $f100 = $marc->field(100);
549 $marc->delete_field($f100);
552 $string = POSIX::strftime( "%Y%m%d", localtime );
554 $string = sprintf( "%-*s", 35, $string );
556 substr( $string, 22, 6, "frey50" );
557 unless ( length($marc->subfield( 100, "a" )) == 35 ) {
558 $marc->delete_field($marc->field(100));
559 $marc->insert_grouped_field(MARC::Field->new( 100, "", "", "a" => $string ));
564 my ($record_type, $op, $record_dir, $reset_index, $noshadow, $record_format, $zebraidx_log_opt) = @_;
566 my $zebra_server = ($record_type eq 'biblio') ? 'biblioserver' : 'authorityserver';
567 my $zebra_db_name = ($record_type eq 'biblio') ? 'biblios' : 'authorities';
568 my $zebra_config = C4::Context->zebraconfig($zebra_server)->{'config'};
569 my $zebra_db_dir = C4::Context->zebraconfig($zebra_server)->{'directory'};
571 system("zebraidx -c $zebra_config $zebraidx_log_opt -g $record_format -d $zebra_db_name init") if $reset_index;
572 system("zebraidx -c $zebra_config $zebraidx_log_opt $noshadow -g $record_format -d $zebra_db_name $op $record_dir");
573 system("zebraidx -c $zebra_config $zebraidx_log_opt -g $record_format -d $zebra_db_name commit") unless $noshadow;
579 $0: reindex MARC bibs and/or authorities in Zebra.
581 Use this batch job to reindex all biblio or authority
582 records in your Koha database. This job is useful
583 only if you are using Zebra; if you are using the 'NoZebra'
584 mode, this job should not be used.
587 -b index bibliographic records
589 -a index authority records
591 -z select only updated and deleted
592 records marked in the zebraqueue
593 table. Cannot be used with -r
596 -r clear Zebra index before
597 adding records to index
599 -d Temporary directory for indexing.
600 If not specified, one is automatically
601 created. The export directory
602 is automatically deleted unless
603 you supply the -k switch.
605 -k Do not delete export directory.
607 -s Skip export. Used if you have
608 already exported the records
611 -noxml index from ISO MARC blob
612 instead of MARC XML. This
613 option is recommended only
616 -x export and index as xml instead of is02709 (biblios only).
617 use this if you might have records > 99,999 chars,
619 -nosanitize export biblio/authority records directly from DB marcxml
620 field without sanitizing records. It speed up
621 dump process but could fail if DB contains badly
622 encoded records. Works only with -x,
624 -w skip shadow indexing for this batch
626 -y do NOT clear zebraqueue after indexing; normally,
627 after doing batch indexing, zebraqueue should be
628 marked done for the affected record type(s) so that
629 a running zebraqueue_daemon doesn't try to reindex
630 the same records - specify -y to override this.
631 Cannot be used with -z.
633 -v increase the amount of logging. Normally only
634 warnings and errors from the indexing are shown.
636 -munge-config Deprecated option to try
637 to fix Zebra config files.
638 --help or -h show this message.
642 # FIXME: the following routines are deprecated and
643 # will be removed once it is determined whether
644 # a script to fix Zebra configuration files is
648 # creating zebra-biblios.cfg depending on system
651 # getting zebraidx directory
653 foreach (qw(/usr/local/bin/zebraidx
662 unless ($zebraidxdir) {
664 ERROR: could not find zebraidx directory
665 ERROR: Either zebra is not installed,
666 ERROR: or it's in a directory I don't checked.
667 ERROR: do a which zebraidx and edit this file to add the result you get
671 $zebraidxdir =~ s/\/bin\/.*//;
672 print "Info : zebra is in $zebraidxdir \n";
674 # getting modules directory
676 foreach (qw(/usr/local/lib/idzebra-2.0/modules/mod-grs-xml.so
677 /usr/local/lib/idzebra/modules/mod-grs-xml.so
678 /usr/lib/idzebra/modules/mod-grs-xml.so
679 /usr/lib/idzebra-2.0/modules/mod-grs-xml.so
686 unless ($modulesdir) {
688 ERROR: could not find mod-grs-xml.so directory
689 ERROR: Either zebra is not properly compiled (libxml2 is not setup and you don t have mod-grs-xml.so,
690 ERROR: or it's in a directory I don't checked.
691 ERROR: find where mod-grs-xml.so is and edit this file to add the result you get
695 $modulesdir =~ s/\/modules\/.*//;
696 print "Info: zebra modules dir : $modulesdir\n";
698 # getting tab directory
700 foreach (qw(/usr/local/share/idzebra/tab/explain.att
701 /usr/local/share/idzebra-2.0/tab/explain.att
702 /usr/share/idzebra/tab/explain.att
703 /usr/share/idzebra-2.0/tab/explain.att
712 ERROR: could not find explain.att directory
713 ERROR: Either zebra is not properly compiled,
714 ERROR: or it's in a directory I don't checked.
715 ERROR: find where explain.att is and edit this file to add the result you get
719 $tabdir =~ s/\/tab\/.*//;
720 print "Info: tab dir : $tabdir\n";
723 # AUTHORITIES creating directory structure
725 my $created_dir_or_file = 0;
727 if ( $verbose_logging ) {
728 print "====================\n";
729 print "checking directories & files for authorities\n";
730 print "====================\n";
732 unless (-d "$authorityserverdir") {
733 system("mkdir -p $authorityserverdir");
734 print "Info: created $authorityserverdir\n";
735 $created_dir_or_file++;
737 unless (-d "$authorityserverdir/lock") {
738 mkdir "$authorityserverdir/lock";
739 print "Info: created $authorityserverdir/lock\n";
740 $created_dir_or_file++;
742 unless (-d "$authorityserverdir/register") {
743 mkdir "$authorityserverdir/register";
744 print "Info: created $authorityserverdir/register\n";
745 $created_dir_or_file++;
747 unless (-d "$authorityserverdir/shadow") {
748 mkdir "$authorityserverdir/shadow";
749 print "Info: created $authorityserverdir/shadow\n";
750 $created_dir_or_file++;
752 unless (-d "$authorityserverdir/tab") {
753 mkdir "$authorityserverdir/tab";
754 print "Info: created $authorityserverdir/tab\n";
755 $created_dir_or_file++;
757 unless (-d "$authorityserverdir/key") {
758 mkdir "$authorityserverdir/key";
759 print "Info: created $authorityserverdir/key\n";
760 $created_dir_or_file++;
763 unless (-d "$authorityserverdir/etc") {
764 mkdir "$authorityserverdir/etc";
765 print "Info: created $authorityserverdir/etc\n";
766 $created_dir_or_file++;
770 # AUTHORITIES : copying mandatory files
772 # the record model, depending on marc flavour
773 unless (-f "$authorityserverdir/tab/record.abs") {
774 if (C4::Context->preference("marcflavour") eq "UNIMARC") {
775 system("cp -f $kohadir/etc/zebradb/marc_defs/unimarc/authorities/record.abs $authorityserverdir/tab/record.abs");
776 print "Info: copied record.abs for UNIMARC\n";
778 system("cp -f $kohadir/etc/zebradb/marc_defs/marc21/authorities/record.abs $authorityserverdir/tab/record.abs");
779 print "Info: copied record.abs for USMARC\n";
781 $created_dir_or_file++;
783 unless (-f "$authorityserverdir/tab/sort-string-utf.chr") {
784 system("cp -f $kohadir/etc/zebradb/lang_defs/fr/sort-string-utf.chr $authorityserverdir/tab/sort-string-utf.chr");
785 print "Info: copied sort-string-utf.chr\n";
786 $created_dir_or_file++;
788 unless (-f "$authorityserverdir/tab/word-phrase-utf.chr") {
789 system("cp -f $kohadir/etc/zebradb/lang_defs/fr/sort-string-utf.chr $authorityserverdir/tab/word-phrase-utf.chr");
790 print "Info: copied word-phase-utf.chr\n";
791 $created_dir_or_file++;
793 unless (-f "$authorityserverdir/tab/auth1.att") {
794 system("cp -f $kohadir/etc/zebradb/authorities/etc/bib1.att $authorityserverdir/tab/auth1.att");
795 print "Info: copied auth1.att\n";
796 $created_dir_or_file++;
798 unless (-f "$authorityserverdir/tab/default.idx") {
799 system("cp -f $kohadir/etc/zebradb/etc/default.idx $authorityserverdir/tab/default.idx");
800 print "Info: copied default.idx\n";
801 $created_dir_or_file++;
804 unless (-f "$authorityserverdir/etc/ccl.properties") {
805 # system("cp -f $kohadir/etc/zebradb/ccl.properties ".C4::Context->zebraconfig('authorityserver')->{ccl2rpn});
806 system("cp -f $kohadir/etc/zebradb/ccl.properties $authorityserverdir/etc/ccl.properties");
807 print "Info: copied ccl.properties\n";
808 $created_dir_or_file++;
810 unless (-f "$authorityserverdir/etc/pqf.properties") {
811 # system("cp -f $kohadir/etc/zebradb/pqf.properties ".C4::Context->zebraconfig('authorityserver')->{ccl2rpn});
812 system("cp -f $kohadir/etc/zebradb/pqf.properties $authorityserverdir/etc/pqf.properties");
813 print "Info: copied pqf.properties\n";
814 $created_dir_or_file++;
818 # AUTHORITIES : copying mandatory files
820 unless (-f C4::Context->zebraconfig('authorityserver')->{config}) {
821 open ZD,">:utf8 ",C4::Context->zebraconfig('authorityserver')->{config};
823 # generated by KOHA/misc/migration_tools/rebuild_zebra.pl
824 profilePath:\${srcdir:-.}:$authorityserverdir/tab/:$tabdir/tab/:\${srcdir:-.}/tab/
827 # Files that describe the attribute sets supported.
832 modulePath:$modulesdir/modules/
833 # Specify record type
834 iso2709.recordType:grs.marcxml.record
836 recordId: (auth1,Local-Number)
842 lockDir: $authorityserverdir/lock
845 register: $authorityserverdir/register:4G
846 shadow: $authorityserverdir/shadow:4G
848 # Temp File area for result sets
849 setTmpDir: $authorityserverdir/tmp
851 # Temp File area for index program
852 keyTmpDir: $authorityserverdir/key
854 # Approx. Memory usage during indexing
858 print "Info: creating zebra-authorities.cfg\n";
859 $created_dir_or_file++;
862 if ($created_dir_or_file) {
863 print "Info: created : $created_dir_or_file directories & files\n";
865 print "Info: file & directories OK\n";
870 if ( $verbose_logging ) {
871 print "====================\n";
872 print "checking directories & files for biblios\n";
873 print "====================\n";
877 # BIBLIOS : creating directory structure
879 unless (-d "$biblioserverdir") {
880 system("mkdir -p $biblioserverdir");
881 print "Info: created $biblioserverdir\n";
882 $created_dir_or_file++;
884 unless (-d "$biblioserverdir/lock") {
885 mkdir "$biblioserverdir/lock";
886 print "Info: created $biblioserverdir/lock\n";
887 $created_dir_or_file++;
889 unless (-d "$biblioserverdir/register") {
890 mkdir "$biblioserverdir/register";
891 print "Info: created $biblioserverdir/register\n";
892 $created_dir_or_file++;
894 unless (-d "$biblioserverdir/shadow") {
895 mkdir "$biblioserverdir/shadow";
896 print "Info: created $biblioserverdir/shadow\n";
897 $created_dir_or_file++;
899 unless (-d "$biblioserverdir/tab") {
900 mkdir "$biblioserverdir/tab";
901 print "Info: created $biblioserverdir/tab\n";
902 $created_dir_or_file++;
904 unless (-d "$biblioserverdir/key") {
905 mkdir "$biblioserverdir/key";
906 print "Info: created $biblioserverdir/key\n";
907 $created_dir_or_file++;
909 unless (-d "$biblioserverdir/etc") {
910 mkdir "$biblioserverdir/etc";
911 print "Info: created $biblioserverdir/etc\n";
912 $created_dir_or_file++;
916 # BIBLIOS : copying mandatory files
918 # the record model, depending on marc flavour
919 unless (-f "$biblioserverdir/tab/record.abs") {
920 if (C4::Context->preference("marcflavour") eq "UNIMARC") {
921 system("cp -f $kohadir/etc/zebradb/marc_defs/unimarc/biblios/record.abs $biblioserverdir/tab/record.abs");
922 print "Info: copied record.abs for UNIMARC\n";
924 system("cp -f $kohadir/etc/zebradb/marc_defs/marc21/biblios/record.abs $biblioserverdir/tab/record.abs");
925 print "Info: copied record.abs for USMARC\n";
927 $created_dir_or_file++;
929 unless (-f "$biblioserverdir/tab/sort-string-utf.chr") {
930 system("cp -f $kohadir/etc/zebradb/lang_defs/fr/sort-string-utf.chr $biblioserverdir/tab/sort-string-utf.chr");
931 print "Info: copied sort-string-utf.chr\n";
932 $created_dir_or_file++;
934 unless (-f "$biblioserverdir/tab/word-phrase-utf.chr") {
935 system("cp -f $kohadir/etc/zebradb/lang_defs/fr/sort-string-utf.chr $biblioserverdir/tab/word-phrase-utf.chr");
936 print "Info: copied word-phase-utf.chr\n";
937 $created_dir_or_file++;
939 unless (-f "$biblioserverdir/tab/bib1.att") {
940 system("cp -f $kohadir/etc/zebradb/biblios/etc/bib1.att $biblioserverdir/tab/bib1.att");
941 print "Info: copied bib1.att\n";
942 $created_dir_or_file++;
944 unless (-f "$biblioserverdir/tab/default.idx") {
945 system("cp -f $kohadir/etc/zebradb/etc/default.idx $biblioserverdir/tab/default.idx");
946 print "Info: copied default.idx\n";
947 $created_dir_or_file++;
949 unless (-f "$biblioserverdir/etc/ccl.properties") {
950 # system("cp -f $kohadir/etc/zebradb/ccl.properties ".C4::Context->zebraconfig('biblioserver')->{ccl2rpn});
951 system("cp -f $kohadir/etc/zebradb/ccl.properties $biblioserverdir/etc/ccl.properties");
952 print "Info: copied ccl.properties\n";
953 $created_dir_or_file++;
955 unless (-f "$biblioserverdir/etc/pqf.properties") {
956 # system("cp -f $kohadir/etc/zebradb/pqf.properties ".C4::Context->zebraconfig('biblioserver')->{ccl2rpn});
957 system("cp -f $kohadir/etc/zebradb/pqf.properties $biblioserverdir/etc/pqf.properties");
958 print "Info: copied pqf.properties\n";
959 $created_dir_or_file++;
963 # BIBLIOS : copying mandatory files
965 unless (-f C4::Context->zebraconfig('biblioserver')->{config}) {
966 open ZD,">:utf8 ",C4::Context->zebraconfig('biblioserver')->{config};
968 # generated by KOHA/misc/migrtion_tools/rebuild_zebra.pl
969 profilePath:\${srcdir:-.}:$biblioserverdir/tab/:$tabdir/tab/:\${srcdir:-.}/tab/
972 # Files that describe the attribute sets supported.
977 modulePath:$modulesdir/modules/
978 # Specify record type
979 iso2709.recordType:grs.marcxml.record
981 recordId: (bib1,Local-Number)
987 lockDir: $biblioserverdir/lock
990 register: $biblioserverdir/register:4G
991 shadow: $biblioserverdir/shadow:4G
993 # Temp File area for result sets
994 setTmpDir: $biblioserverdir/tmp
996 # Temp File area for index program
997 keyTmpDir: $biblioserverdir/key
999 # Approx. Memory usage during indexing
1003 print "Info: creating zebra-biblios.cfg\n";
1004 $created_dir_or_file++;
1007 if ($created_dir_or_file) {
1008 print "Info: created : $created_dir_or_file directories & files\n";
1010 print "Info: file & directories OK\n";