config.ml (2921B)
1 open Otoml 2 3 type srv = 4 { mutable key : string 5 ; mutable cert : string 6 ; mutable dir : string 7 ; mutable logfile : string 8 ; mutable port : int 9 ; mutable max_req : int 10 ; mutable host : Unix.inet_addr 11 ; sock : Lwt_unix.file_descr 12 ; tls : Tls.Core.tls_version * Tls.Core.tls_version 13 ; mutable owner : string 14 } 15 16 let config : srv = 17 { key = Filename.concat (Sys.getcwd ()) "certs/key.pem" 18 ; cert = Filename.concat (Sys.getcwd ()) "certs/cert.pem" 19 ; port = 1965 20 ; dir = "./" 21 ; logfile = "/tmp/ogemini.log" 22 ; host = Unix.inet_addr_loopback 23 ; sock = Lwt_unix.(socket PF_INET SOCK_STREAM 0) 24 ; max_req = 50 25 ; tls = Tls.Core.(`TLS_1_2, `TLS_1_3) 26 ; owner = "user" 27 } 28 29 let parse filename = 30 let conf = Sys.file_exists filename in 31 match conf with 32 | false -> 33 Logs.warn 34 @@ fun m -> m "Configuration file %s not found, using default settings" filename 35 | true -> 36 (try 37 let toml = Otoml.Parser.from_file filename in 38 let cfg = ref config in 39 (match Otoml.find toml Otoml.get_string [ "servers"; "dir" ] with 40 | "" -> Logs.warn @@ fun m -> m "[servers] dir config is empty. Defaults to './'" 41 | dir -> !cfg.dir <- dir); 42 (match Otoml.find toml Otoml.get_string [ "servers"; "logfile" ] with 43 | "" -> Logs.warn @@ fun m -> m "[servers] logfile config is empty. Defaults to '/tmp/ogemini.log'" 44 | logfile -> !cfg.logfile <- logfile); 45 (match Otoml.find toml Otoml.get_string [ "servers"; "cert" ] with 46 | "" -> Logs.warn @@ fun m -> m "[servers] cert config is empty" 47 | cert -> !cfg.cert <- cert); 48 (match Otoml.find toml Otoml.get_string [ "servers"; "key" ] with 49 | "" -> Logs.warn @@ fun m -> m "[servers] key config is empty" 50 | key -> !cfg.key <- key); 51 (match Otoml.find toml Otoml.get_string [ "servers"; "host" ] with 52 | "" -> 53 Logs.warn @@ fun m -> m "[servers] host config is empty. Defaults to localhost" 54 | host -> !cfg.host <- Unix.inet_addr_of_string host); 55 (match Otoml.find toml (Otoml.get_integer ~strict:false) [ "servers"; "port" ] with 56 | port -> !cfg.port <- port); 57 (match Otoml.find toml (Otoml.get_string ~strict:false) [ "servers"; "owner" ] with 58 | "" -> Logs.warn @@ fun m -> m "[servers] owner config is empty" 59 | owner -> !cfg.owner <- owner); 60 match Otoml.find toml Otoml.get_integer [ "servers"; "max_req" ] with 61 | max_req -> !cfg.max_req <- max_req 62 with 63 | Sys_error err -> failwith 64 (Printf.sprintf 65 "Could not read config file: %s" 66 err) 67 | Otoml.Parse_error (pos, msg) -> 68 failwith 69 (Printf.sprintf 70 "Could not parse config file %s: %s" 71 filename 72 (Otoml.Parser.format_parse_error pos msg)))