]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/support-scripts/settings-tester.pl
Revised to avoid the use of XPathContext, which required a more current
[Evergreen.git] / Open-ILS / src / support-scripts / settings-tester.pl
1 #!/usr/bin/perl
2 # vim:noet:ts=4:
3
4 BEGIN {
5         eval "use OpenSRF::Utils::Config;";
6         die "Please ensure that /openils/lib/perl5 is in your PERL5LIB environment variable.
7         You must run this script as the 'opensrf' user.\n" if ($@);
8         eval "use Error qw/:try/;";
9         die "Please install Error.pm.\n" if ($@);
10         eval "use UNIVERSAL::require;";
11         die "Please install the UNIVERSAL::Require perl module.\n" if ($@);
12         eval "use Getopt::Long;";
13         die "Please install the Getopt::Long perl module.\n" if ($@);
14         eval "use Net::Domain;";
15         die "Please install the Net::Domain perl module.\n" if ($@);
16 }
17
18 my $output = '';
19 my $perloutput = '';
20
21 my ($gather, $hostname, $core_config, $tmpdir) =
22         (0, Net::Domain::hostfqdn(), '/openils/conf/opensrf_core.xml', '/tmp/');
23
24 GetOptions(
25         'gather' => \$gather,
26         'hostname=s' => \$hostname,
27         'config_file=s' => \$core_config,
28         'tempdir=s' => \$tmpdir,
29 );
30
31 while (my $mod = <DATA>) {
32         chomp $mod;
33         warn "Please install $mod\n" unless ($mod->use);
34         $perloutput .= "Please install the $mod Perl module.\n";
35         print "$mod version ".${$mod."::VERSION"}."\n" unless ($@);
36 }
37
38 use OpenSRF::Transport::SlimJabber::Client;
39 use OpenSRF::Utils::SettingsParser;
40 use OpenSRF::Utils::SettingsClient;
41 use Data::Dumper;
42 use DBI;
43
44 (my $conf_dir = $core_config) =~ s#(.*)/.*#$1#;
45
46
47 OpenSRF::Utils::Config->load(config_file => $core_config);
48 my $conf = OpenSRF::Utils::Config->current;
49 my $j_username    = $conf->bootstrap->username;
50 my $j_password    = $conf->bootstrap->passwd;
51 my $j_port    = $conf->bootstrap->port;
52 my $j_domain    = $conf->bootstrap->domains->[0];
53 my $settings_config = $conf->bootstrap->settings_config;
54 my $logfile    = $conf->bootstrap->logfile;
55 (my $log_dir = $logfile) =~ s#(.*)/.*#$1#;
56
57
58 print "\nChecking Jabber connection\n";
59 # connect to jabber 
60 my $client = OpenSRF::Transport::SlimJabber::Client->new(
61     port => $j_port, 
62     username => $j_username, 
63     password => $j_password,
64     host => $j_domain,
65     resource => 'test123'
66 );
67
68
69 my $je = undef;
70 try {
71     unless($client->initialize()) {
72         $je = "* Unable to connect to jabber server $j_domain\n";
73         warn "* Unable to connect to jabber server $j_domain\n";
74     }
75 } catch Error with {
76     $je = "* Error connecting to jabber:\n" . shift() . "\n";
77     warn "* Error connecting to jabber:\n" . shift() . "\n";
78 };
79
80 print "* Jabber successfully connected\n" unless ($je);
81 $output .= ($je) ? $je : "* Jabber successfully connected\n";
82
83 my $xmlparser = XML::LibXML->new();
84 my $osrfxml = $xmlparser->parse_file($settings_config);
85
86 print "\nChecking database connections\n";
87 # Check database connections
88 my @databases = $osrfxml->findnodes('//database');
89 foreach my $database (@databases) {
90         my $db_name = $database->findvalue("./db");     
91         my $db_host = $database->findvalue("./host");   
92         my $db_port = $database->findvalue("./port");   
93         my $db_user = $database->findvalue("./user");   
94         my $db_pw = $database->findvalue("./pw");       
95         my $osrf_xpath;
96         foreach my $node ($database->findnodes("ancestor::node()")) {
97                 $osrf_xpath .= "/" . $node->nodeName unless $node->nodeName eq '#document';
98         }
99         $output .= test_db_connect($db_name, $db_host, $db_port, $db_user, $db_pw, $osrf_xpath);
100 }
101
102 print "\nChecking database drivers to ensure <driver> matches <language>\n";
103 # Check database drivers
104 # if language eq 'C', driver eq 'pgsql'
105 # if language eq 'perl', driver eq 'Pg'
106 my @drivers = $osrfxml->findnodes('//driver');
107 foreach my $driver_node (@drivers) {
108         my $language;
109         my $driver_xpath;
110         my @driver_xpath_nodes;
111         foreach my $node ($driver_node->findnodes("ancestor::node()")) {
112                 next if $node->nodeName eq "#document";
113                 $driver_xpath .= "/" . $node->nodeName;
114                 push @driver_xpath_nodes, $node->nodeName;
115         }
116         my $lang_xpath;
117         my $driver = $driver_node->findvalue("child::text()");
118         while (pop(@driver_xpath_nodes) && scalar(@driver_xpath_nodes) > 0 && !$language) {
119                 $lang_xpath = "/" . join('/', @driver_xpath_nodes) . "/language";
120                 my @lang_nodes = $osrfxml->findnodes($lang_xpath);
121                 next unless scalar(@lang_nodes > 0);
122                 $language = $lang_nodes[0]->findvalue("child::text()");
123         }
124         my $result;
125         if ($driver eq "pgsql") {
126                 if ($language eq "C") {
127                         $result = "* OK: $driver language is $language in $lang_xpath\n";
128                 } else {
129                         $result = "* ERROR: $driver language is $language in $lang_xpath\n";
130                         warn $result;
131                 }
132         } elsif ($driver eq "Pg") {
133                 if ($language eq "perl") {
134                         $result = "* OK: $driver language is $language in $lang_xpath\n";
135                 } elsif ($driver_xpath =~ /reporter/) {
136                         $result = "* OK: $driver language is allowed to be undefined for reporter application\n";
137                 } else {
138                         $result = "* ERROR: $driver language is $language in $lang_xpath\n";
139                         warn $result;
140                 }
141         } else {
142                 $result = "* ERROR: Unknown driver $driver in $driver_xpath\n";
143                 warn $result;
144         }
145         print $result;
146         $output .= $result;
147 }
148
149
150 $output .= check_libdbd();
151
152 if ($gather) {
153         get_debug_info( $tmpdir, $log_dir, $conf_dir, $perloutput, $output );
154 }
155
156 sub test_db_connect {
157         my ($db_name, $db_host, $db_port, $db_user, $db_pw, $osrf_xpath) = @_;
158
159         my $dsn = "dbi:Pg:dbname=$db_name;host=$db_host;port=$db_port";
160         my $de = undef;
161         try {
162                 unless( DBI->connect($dsn, $db_user, $db_pw) ) {
163                         $de = "* $osrf_xpath :: Unable to connect to database $dsn, user=$db_user, password=$db_pw\n";
164                         warn "* $osrf_xpath :: Unable to connect to database $dsn, user=$db_user, password=$db_pw\n";
165                 }
166         } catch Error with {
167                 $de = "* $osrf_xpath :: Unable to connect to database $dsn, user=$db_user, password=$db_pw\n" . shift() . "\n";
168                 warn "* $osrf_xpath :: Unable to connect to database $dsn, user=$db_user, password=$db_pw\n" . shift() . "\n";
169         };
170         print "* $osrf_xpath :: Successfully connected to database $dsn\n" unless ($de);
171         return ($de) ? $de : "* $osrf_xpath :: Successfully connected to database $dsn\n";
172 }
173
174 sub check_libdbd {
175         my $results;
176         my $de = undef;
177         my @location = `locate libdbdpgsql.so`;
178         if (scalar(@location) > 1) {
179
180                 my $res = "Found more than one location for libdbdpgsql.so.
181   We have found that system packages don't link against libdbi.so;
182   therefore, we strongly recommend compiling libdbi and libdbi-drivers from source.\n";
183                 $results .= $res;
184                 print $res;
185         }
186         foreach my $loc (@location) {
187                 my @linkage = `ldd $loc`;
188                 if (!grep(/libdbi/, @linkage)) {
189                         my $res = "libdbi.so was not linked against $loc - you probably need to compile from source.\n";
190                         $results .= $res;
191                         print $res;
192                 }
193         }
194         return $results;
195 }
196
197 sub get_debug_info {
198   my $temp_dir = shift; # place we can write files
199   my $log = shift; # location of the log directory
200   my $config = shift; # location of the config files
201   my $perl_test = shift; # output from the Perl prereq testing
202   my $config_test = shift; # output from the config file testing
203
204   my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
205   my $oils_time = sprintf("%04d-%02d-%02d_%02dh-%02d-%02d", $year+1900, $mon, $mday, $hour, $min, $sec);
206   
207   # evil approach that requires no other Perl dependencies
208   chdir($temp_dir);
209   my $oils_debug_dir = "$temp_dir/oils_$oils_time";
210
211   # Replace with something Perlish
212   mkdir($oils_debug_dir) or die $!;
213
214   # Replace with File::Copy
215   system("cp $log/*log $oils_debug_dir");
216
217   # Passwords will go through in the clear for now
218   system("cp $config/*xml $oils_debug_dir");
219
220   # Get Perl output
221   open(FH, ">", "$oils_debug_dir/perl_test.out") or die $!;
222   print FH $perl_test;
223   close(FH);
224
225   # Get XML output
226   open(FH, ">", "$oils_debug_dir/xml_test.out") or die $!;
227   print FH $config_test;
228   close(FH);
229   
230   # Tar this up - does any system not have tar?
231   system("tar czf oils_$oils_time.tar.gz oils_$oils_time");
232
233   # Clean up after ourselves, somewhat dangerously
234   system("rm -fr $oils_debug_dir");
235
236   print "Wrote your debug information to $temp_dir/oils_$oils_time.tar.gz.\n";
237 }
238
239 __DATA__
240 LWP::UserAgent
241 XML::LibXML
242 XML::LibXSLT
243 Net::Server::PreFork
244 Cache::Memcached
245 Class::DBI
246 Class::DBI::AbstractSearch
247 Template
248 DBD::Pg
249 Net::Z3950
250 MARC::Record
251 MARC::Charset
252 MARC::File::XML
253 Text::Aspell
254 CGI
255 DateTime::TimeZone
256 DateTime
257 DateTime::Format::ISO8601
258 Unix::Syslog
259 GD::Graph3d
260 JavaScript::SpiderMonkey
261 Log::Log4perl
262 Email::Send
263 Text::CSV