geminid

A Sandboxed Gemini server
git clone git@git.mpah.dev/geminid.git
Log | Files | Refs | README

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)))