(* $Id: netplex_config.mli 1496 2010-11-27 21:49:12Z gerd $ *)

(** Read the configuration file *)

open Netplex_types

exception Config_error of string

val read_config_file : string -> config_file
  (** Reads a filename and returns the representation object *)

val repr_config_file : string -> config_tree -> config_file
  (** [repr_config_file name tree]: converts the [tree] to a full
      [config_file] object. [name] is the filename reported by the
      object.
   *)

val read_netplex_config : 
      parallelization_type ->
      logger_factory list ->
      workload_manager_factory list ->
      processor_factory list -> 
      config_file ->
        netplex_config
  (** Reads a configuration file like:
    *
    * {[ netplex {
    *      controller {
    *          ...
    *          logging {
    *          ...
    *          };
    *      };
    *      service {
    *          name = "name_of_service";
    *          protocol {
    *              name = "name_of_protocol";
    *              lstn_backlog = <n>;
    *              lstn_reuseaddr = <bool>;
    *              so_keepalive = <bool>;
    *              address {
    *                  type = "local";
    *                  path = "socketname";
    *              };
    *              address {
    *                  type = "internet";
    *                  bind = "bind_address:port";
    *              };
    *              ...
    *          };
    *          processor {
    *              type = "type_of_processor";
    *              ...
    *          };
    *          workload_manager {
    *              type = "type_of_manager";
    *              ...
    *          };
    *      }
    *   }
    * ]}
    *
    * The [controller] section is explained in {!Netplex_controller}.
    * 
    * The [logging] section is explained in {!Netplex_log}.
    *
    * The [service] section may also contain two parameters [user] and
    * [group]. They instruct the service container to drop root privileges
    * and to become the configured user and group. Note that this is only
    * possible in multi-processing mode.
    *
    * Address types:
    * - [local]: This is a OS-dependent default IPC mechanism for local
    *   connections. On Unix, [local] means Unix Domain sockets. On Win32,
    *   [local] means the [w32_pipe_file] mechanism. In [path], the name
    *   of the Unix Domain socket or the file with the pipe name must be
    *   specified.
    * - [internet]: Internet socket. In [bind] the bind address and the
    *   bind port are given.
    * - [unixdomain]: Unix domain sockets. In [path] give the path.
    * - [socket_file]: An emulation of Unix Domain sockets: A server socket
    *   bound to [127.0.0.1] and an anonymous port is used instead. The
    *   port number is written to a file. The file must be given as [path].
    * - [w32_pipe]: Win32 named pipes. The name of the pipe is given
    *   as [path].
    * - [w32_pipe_file]: An emulation of Unix Domain sockets: A named
    *   pipe with an unpredictable random name is created instead. The
    *   name of this pipe is written to the file given by [path]
    * - [container]: this special address causes that a separate [local]
    *   socket is created for each started container. The name of the
    *   socket file is automatically chosen. The names of the socket
    *   files can be queried with {!Netplex_cenv.lookup_container_sockets}.
    *   This type of socket is useful to control the load sent to each
    *   container directly, e.g. to drive a farm of worker processes.
    * 
    * {b More documentation}: See {!Netplex_intro.webserver} for a 
    * complete example of a config file. See {!Netplex_intro.crsock}
    * for explanations how to specify sockets in the config file.
   *)
