View | Details | Raw Unified | Return to bug 27267
Collapse All | Expand All

(-)a/misc/zebra_indexer.pl (-1 / +108 lines)
Line 0 Link Here
0
- 
1
#!/usr/bin/perl
2
3
use strict;
4
use warnings;
5
6
use IPC::Open3;
7
use FindBin;
8
9
while (1){
10
    run();
11
    sleep 5;
12
}
13
14
sub run {
15
    if ( _zebra_needs_indexing() ){
16
        _run_zebra();
17
    }
18
}
19
20
#NOTE: This could also be done using a separate script but this is more self-contained
21
sub _zebra_needs_indexing {
22
    my $pid;
23
    if ( $pid = fork ){
24
        waitpid( $pid, 0 );
25
        my $child_exit_status = $? >> 8;
26
        if ($child_exit_status == 0){
27
            return 1;
28
        }
29
        else {
30
            return;
31
        }
32
    }
33
    elsif ( ! defined $pid ){
34
        warn "Failed to fork!";
35
        exit 1;
36
    }
37
    elsif ( $pid == 0 ){
38
        my $count = _get_count();
39
        if ( $count && $count > 0 ){
40
            exit 0;
41
        }
42
        else {
43
            exit 1;
44
        }
45
    }
46
}
47
48
sub _run_zebra {
49
    my $zebra_indexer = "$FindBin::Bin/migration_tools/rebuild_zebra.pl";
50
    my @command = ($zebra_indexer,"-b","-a","-z");
51
52
    my $pid = open3(my $child_in, '>&STDOUT', '>&STDERR', @command);
53
    waitpid($pid,0);
54
}
55
56
sub _get_count {
57
    my $count;
58
    my $dbh = _get_dbh();
59
    if ($dbh){
60
        my $sql = "SELECT COUNT(*) AS count FROM zebraqueue WHERE done = 0;";
61
        my $sth = $dbh->prepare($sql);
62
        if ($sth){
63
            $sth->execute();
64
            $count = $sth->fetchrow_arrayref->[0];
65
        }
66
    }
67
    return $count;
68
}
69
70
sub _get_dbh {
71
    my $conf = _get_db_config($ENV{KOHA_CONF});
72
    my $dsn = "dbi:$conf->{db_driver}:database=$conf->{db_name};host=$conf->{db_host};port=$conf->{db_port}".($conf->{tls_options}? $conf->{tls_options} : "");
73
    require DBI;
74
    my $dbh = DBI->connect("$dsn","$conf->{user}","$conf->{pass}");
75
    return $dbh;
76
}
77
78
sub _get_db_config {
79
    my ($kohaconf_filename) = @_;
80
    my $db_config = {};
81
    require XML::LibXML;
82
    my $doc = XML::LibXML->load_xml(location => $kohaconf_filename);
83
    my $root = $doc->documentElement;
84
    my @nodelist = $root->findnodes("./config");
85
    my $config = $nodelist[0];
86
    $db_config->{db_driver} = _get_value($config,"db_scheme");
87
    $db_config->{db_name} = _get_value($config,"database");
88
    $db_config->{db_host} = _get_value($config,"hostname");
89
    $db_config->{db_port} = _get_value($config,"port") || '';
90
    $db_config->{user} = _get_value($config,"user");
91
    $db_config->{pass} = _get_value($config,"pass");
92
    my $tls = _get_value($config,"tls");
93
    if ($tls && $tls eq 'yes'){
94
        my $ca = _get_value($config,"ca");
95
        my $cert = _get_value($config,"cert");
96
        my $key = _get_value($config,"key");
97
        $db_config->{tls_options} = ";mysql_ssl=1;mysql_ssl_client_key=".$key.";mysql_ssl_client_cert=".$cert.";mysql_ssl_ca_file=".$ca;
98
    }
99
    return $db_config;
100
}
101
102
sub _get_value {
103
    my ($parent,$tag) = @_;
104
    my $node = $parent->findnodes("./$tag");
105
    if ($node){
106
        return $node->to_literal();
107
    }
108
}

Return to bug 27267