]> matita.cs.unibo.it Git - helm.git/blob - helm/http_getter/http_getter_env.ml
ignore comments and blank line in servers file
[helm.git] / helm / http_getter / http_getter_env.ml
1 (*
2  * Copyright (C) 2003:
3  *    Stefano Zacchiroli <zack@cs.unibo.it>
4  *    for the HELM Team http://helm.cs.unibo.it/
5  *
6  *  This file is part of HELM, an Hypertextual, Electronic
7  *  Library of Mathematics, developed at the Computer Science
8  *  Department, University of Bologna, Italy.
9  *
10  *  HELM is free software; you can redistribute it and/or
11  *  modify it under the terms of the GNU General Public License
12  *  as published by the Free Software Foundation; either version 2
13  *  of the License, or (at your option) any later version.
14  *
15  *  HELM is distributed in the hope that it will be useful,
16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  *  GNU General Public License for more details.
19  *
20  *  You should have received a copy of the GNU General Public License
21  *  along with HELM; if not, write to the Free Software
22  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston,
23  *  MA  02111-1307, USA.
24  *
25  *  For details, see the HELM World-Wide-Web page,
26  *  http://helm.cs.unibo.it/
27  *)
28
29 open Http_getter_types;;
30 open Printf;;
31 open Pxp_document;;
32 open Pxp_types;;
33 open Pxp_yacc;;
34
35 let version = Http_getter_const.version
36
37 type setting_src =
38   | Environment (* read setting from environment variables *)
39   | Conffile    (* read setting from configuration file *)
40   | Both        (* read setting from both; environment override config file *)
41
42 let conf_file_tree = ref None
43
44 let (conf_file, conf_dir) =
45   try
46     let conf_dir =
47       Pcre.replace ~pat:"/$" (Sys.getenv "HELM_CONFIGURATION_DIR")
48     in
49     (conf_dir ^ "/" ^ Http_getter_const.conffile, conf_dir)
50   with Not_found -> failwith "HELM_CONFIGURATION_DIR undefined"
51
52 let safe_getenv ?(from = Both) var =
53   (let rec read_from_file () =
54     (match !conf_file_tree with
55     | None ->
56         conf_file_tree :=
57           Some
58             (parse_wfcontent_entity
59               default_config (from_file conf_file) default_spec);
60         read_from_file ()
61     | Some t ->
62         (try
63           Some (find_element (String.lowercase var) t)#data
64         with Not_found -> None))
65   in
66   let read_from_env () = try Some (Sys.getenv var) with Not_found -> None in
67   let return_value name = function
68     | Some v -> v
69     | None -> failwith ("Setting " ^ name ^ " is not defined")
70   in
71   (match from with
72   | Environment -> return_value var (read_from_env ())
73   | Conffile -> return_value var (read_from_file ())
74   | Both ->
75       (match read_from_env () with
76       | None -> return_value var (read_from_file ())
77       | v -> return_value var v)))
78
79 let servers_file = safe_getenv "HTTP_GETTER_SERVERS_FILE"
80 let parse_servers () =
81   List.rev (Http_getter_misc.fold_file
82     (fun servers line ->
83       if Http_getter_misc.is_blank_line line then servers else line::servers)
84     []
85     servers_file)
86 ;;
87 let servers = ref (parse_servers ())
88 let reload_servers () = servers := parse_servers ()
89
90 let cic_dbm = safe_getenv "HTTP_GETTER_CIC_DBM"
91 let nuprl_dbm = safe_getenv "HTTP_GETTER_NUPRL_DBM"
92 let rdf_dbm = safe_getenv "HTTP_GETTER_RDF_DBM"
93 let xsl_dbm = safe_getenv "HTTP_GETTER_XSL_DBM"
94 let xml_index = safe_getenv "HTTP_GETTER_XML_INDEXNAME"
95 let rdf_index = safe_getenv "HTTP_GETTER_RDF_INDEXNAME"
96 let xsl_index = safe_getenv "HTTP_GETTER_XSL_INDEXNAME"
97 let cic_dir = safe_getenv "HTTP_GETTER_CIC_DIR"
98 let nuprl_dir = safe_getenv "HTTP_GETTER_NUPRL_DIR"
99 let rdf_dir = safe_getenv "HTTP_GETTER_RDF_DIR"
100 let dtd_dir = safe_getenv "HTTP_GETTER_DTD_DIR"
101
102 let port =
103   let port = safe_getenv "HTTP_GETTER_PORT" in
104   try
105     int_of_string port
106   with Failure "int_of_string" ->
107     failwith ("Invalid port value: " ^ port)
108 let host =
109   let buf = Buffer.create 20 in
110   Shell.call ~stdout:(Shell.to_buffer buf) [Shell.cmd "hostname" ["-f"]];
111   Pcre.replace ~pat:"\n+$" (Buffer.contents buf)
112 let my_own_url =
113   sprintf
114     "http://%s%s" (* without trailing '/' *)
115     host
116     (if port = 80 then "" else (sprintf ":%d" port))
117 let dtd_base_url = safe_getenv "HTTP_GETTER_DTD_BASE_URL"
118
119 let cache_mode =
120   match String.lowercase (safe_getenv "HTTP_GETTER_CACHE_MODE") with
121   | "normal" -> Enc_normal
122   | "gz" -> Enc_gzipped
123   | mode -> failwith ("Invalid cache mode: " ^ mode)
124
125 let reload () =
126   reload_servers ()
127
128 let env_to_string () =
129   sprintf
130 "HTTP Getter %s (the OCaml one!)
131
132 cic_dbm:\t%s
133 nuprl_dbm:\t%s
134 rdf_dbm:\t%s
135 xsl_dbm:\t%s
136 xml_index:\t%s
137 rdf_index:\t%s
138 xsl_index:\t%s
139 cic_dir:\t%s
140 nuprl_dir:\t%s
141 rdf_dir:\t%s
142 dtd_dir:\t%s
143 servers_file:\t%s
144 host:\t\t%s
145 port:\t\t%d
146 my_own_url:\t%s
147 dtd_base_url:\t%s
148 cache_mode:\t%s
149 conf_file:\t%s
150 conf_dir:\t%s
151 servers:
152 \t%s
153 "
154     version cic_dbm nuprl_dbm rdf_dbm xsl_dbm xml_index rdf_index xsl_index
155     cic_dir nuprl_dir rdf_dir dtd_dir servers_file host port my_own_url
156     dtd_base_url
157     (match cache_mode with Enc_normal -> "Normal" | Enc_gzipped -> "GZipped")
158     conf_file conf_dir
159     (String.concat "\n\t" (* servers list prepended with server number *)
160       (List.map
161         (let idx = ref ~-1 in
162         fun server -> incr idx; sprintf "%3d: %s" !idx server)
163         !servers))
164
165 let add_server ?position url =
166   (match position with
167   | Some p -> Http_getter_misc.add_line ~fname:servers_file ~position:p url
168   | None -> Http_getter_misc.add_line ~fname:servers_file url);
169   reload_servers ()
170
171 let remove_server position =
172   Http_getter_misc.remove_line ~fname:servers_file position;
173   reload_servers ()
174