Source file mirage_impl_syslog.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
open Functoria
open Mirage_impl_console
open Mirage_impl_misc
open Mirage_impl_pclock
open Mirage_impl_stack
module Key = Mirage_key

type syslog_config = {
  hostname : string;
  server : Ipaddr.t option;
  port : int option;
  truncate : int option;
}

let syslog_config ?port ?truncate ?server hostname =
  { hostname; server; port; truncate }

let default_syslog_config =
  let hostname = "no_name"
  and server = None
  and port = None
  and truncate = None in
  { hostname; server; port; truncate }

type syslog = SYSLOG

let syslog = Type.v SYSLOG
let opt p s = Fmt.(option @@ (any ("~" ^^ s ^^ ":") ++ p))
let opt_int = opt Fmt.int
let opt_string = opt (fun pp v -> Format.fprintf pp "%S" v)
let pkg sublibs = [ package ~min:"0.3.0" ~max:"0.4.0" ~sublibs "logs-syslog" ]

let syslog_udp_conf config =
  let endpoint = Key.syslog config.server in
  let port = Key.syslog_port config.port in
  let hostname = Key.syslog_hostname config.hostname in
  let packages = pkg [ "mirage" ] in
  let keys = Key.[ v endpoint; v hostname; v port ] in
  let connect _i modname = function
    | [ console; pclock; stack ] ->
        Fmt.str
          "@[<v 2>match %a with@ | None -> Lwt.return_unit@ | Some server ->@ \
           let port = %a in@ let reporter =@ %s.create %s %s %s ~hostname:%a \
           ?port server %a ()@ in@ Logs.set_reporter reporter;@ \
           Lwt.return_unit@]"
          pp_key endpoint pp_key port modname console pclock stack pp_key
          hostname (opt_int "truncate") config.truncate
    | _ -> failwith (connect_err "syslog udp" 3)
  in
  impl ~packages ~keys ~connect "Logs_syslog_mirage.Udp"
    (console @-> pclock @-> stackv4v6 @-> syslog)

let syslog_udp ?(config = default_syslog_config) ?(console = default_console)
    ?(clock = default_posix_clock) stack =
  syslog_udp_conf config $ console $ clock $ stack

let syslog_tcp_conf config =
  let endpoint = Key.syslog config.server in
  let port = Key.syslog_port config.port in
  let hostname = Key.syslog_hostname config.hostname in
  let packages = pkg [ "mirage" ] in
  let keys = Key.[ v endpoint; v hostname; v port ] in
  let connect _i modname = function
    | [ console; pclock; stack ] ->
        Fmt.str
          "@[<v 2>match %a with@ | None -> Lwt.return_unit@ | Some server ->@ \
           let port = %a in@ %s.create %s %s %s ~hostname:%a ?port server %a \
           () >>= function@ | Ok reporter -> Logs.set_reporter reporter; \
           Lwt.return_unit@ | Error e -> invalid_arg e@]"
          pp_key endpoint pp_key port modname console pclock stack pp_key
          hostname (opt_int "truncate") config.truncate
    | _ -> failwith (connect_err "syslog tcp" 3)
  in
  impl ~packages ~keys ~connect "Logs_syslog_mirage.Tcp"
    (console @-> pclock @-> stackv4v6 @-> syslog)

let syslog_tcp ?(config = default_syslog_config) ?(console = default_console)
    ?(clock = default_posix_clock) stack =
  syslog_tcp_conf config $ console $ clock $ stack

let syslog_tls_conf ?keyname config =
  let endpoint = Key.syslog config.server in
  let port = Key.syslog_port config.port in
  let hostname = Key.syslog_hostname config.hostname in
  let packages = pkg [ "mirage"; "mirage.tls" ] in
  let keys = Key.[ v endpoint; v hostname; v port ] in
  let connect _i modname = function
    | [ console; pclock; stack; kv ] ->
        Fmt.str
          "@[<v 2>match %a with@ | None -> Lwt.return_unit@ | Some server ->@ \
           let port = %a in@ %s.create %s %s %s %s ~hostname:%a ?port server \
           %a %a () >>= function@ | Ok reporter -> Logs.set_reporter reporter; \
           Lwt.return_unit@ | Error e -> invalid_arg e@]"
          pp_key endpoint pp_key port modname console pclock stack kv pp_key
          hostname (opt_int "truncate") config.truncate (opt_string "keyname")
          keyname
    | _ -> failwith (connect_err "syslog tls" 4)
  in
  impl ~packages ~keys ~connect "Logs_syslog_mirage_tls.Tls"
    (console @-> pclock @-> stackv4v6 @-> Mirage_impl_kv.ro @-> syslog)

let syslog_tls ?(config = default_syslog_config) ?keyname
    ?(console = default_console) ?(clock = default_posix_clock) stack kv =
  syslog_tls_conf ?keyname config $ console $ clock $ stack $ kv