]> git.evergreen-ils.org Git - working/Evergreen.git/blob - OpenSRF/src/perlmods/OpenSRF/Utils/SettingsClient.pm
checking for HASH ref explicitly
[working/Evergreen.git] / OpenSRF / src / perlmods / OpenSRF / Utils / SettingsClient.pm
1 use strict; use warnings;
2 package OpenSRF::Utils::SettingsClient;
3 use OpenSRF::Utils::SettingsParser;
4 use OpenSRF::System;
5 use OpenSRF::AppSession;
6 use OpenSRF::Utils::Config;
7 use OpenSRF::EX qw(:try);
8
9 use vars qw/$host_config/;
10
11
12 sub new {return bless({},shift());}
13 my $session;
14 $host_config = undef;
15
16 my $we_cache = 1;
17 sub set_cache {
18         my($self, $val) = @_;
19         if(defined($val)) { $we_cache = $val; }
20 }
21
22
23 # ------------------------------------
24 # utility method for grabbing config info
25 sub config_value {
26         my($self,@keys) = @_;
27
28
29         my $bsconfig = OpenSRF::Utils::Config->current;
30         my $host = $bsconfig->env->hostname;
31
32         if($we_cache) {
33                 if(!$host_config) { grab_host_config($host); }
34         } else {
35                 grab_host_config($host);
36         }
37
38         if(!$host_config) {
39                 throw OpenSRF::EX::Config ("Unable to retrieve host config for $host" );
40         }
41
42         my $hash = $host_config;
43
44         # XXX TO DO, check local config 'version', 
45         # call out to settings server when necessary....
46         try {
47                 for my $key (@keys) {
48                         if(!ref($hash) eq 'HASH'){
49                                 return undef;
50                         }
51                         $hash = $hash->{$key};
52                 }
53
54         } catch Error with {
55                 my $e = shift;
56                 throw OpenSRF::EX::Config ("No Config information for @keys : $e : $@");
57         };
58
59         return $hash;
60
61 }
62
63
64 # XXX make smarter and more robust...
65 sub grab_host_config {
66
67         my $host = shift;
68
69         warn "Grabbing Host config for $host\n";
70         OpenSRF::System->bootstrap_client(client_name => "system_client");
71         $session = OpenSRF::AppSession->create( "opensrf.settings" ) unless $session;
72         my $bsconfig = OpenSRF::Utils::Config->current;
73
74         my $resp;
75         my $req;
76         try {
77
78                 if( ! ($session->connect()) ) {die "Settings Connect timed out\n";}
79                 $req = $session->request( "opensrf.settings.host_config.get", $host );
80                 $resp = $req->recv( timeout => 10 );
81
82         } catch OpenSRF::EX with {
83
84                 my $e = shift;
85                 warn "Connection to Settings Failed  $e : $@ ***\n";
86                 die $e;
87         };
88
89         if(!$resp) {
90                 warn "No Response from settings server...going to sleep\n";
91                 sleep;
92         }
93
94         if( $resp && UNIVERSAL::isa( $resp, "OpenSRF::EX" ) ) {
95                 throw $resp;
96         }
97
98         $host_config = $resp->content();
99         $req->finish();
100         $session->disconnect();
101         $session->finish;
102         $session->kill_me();
103 }
104
105
106
107 1;