This lens tries to keep as close as possible to `man 5 keepalived.conf` where possible.
About: License
- This file is licenced under the LGPLv2+, like the rest of Augeas.
+ This file is licenced under the LGPL v2+, like the rest of Augeas.
About: Lens Usage
To be documented
(* View: sep_spc *)
let sep_spc = Sep.space
-(* View: sep_opt_spc *)
-let sep_opt_spc = Sep.opt_space
-
-(* View: sep_dquot *)
-let sep_dquot = Util.del_str "\""
-
-(* View: lbracket *)
-let lbracket = Util.del_str "{"
-
-(* View: rbracket *)
-let rbracket = Util.del_str "}"
-
(* View: comment
Map comments in "#comment" nodes *)
let comment = Util.comment_generic /[ \t]*[#!][ \t]*/ "# "
(* View: sto_num *)
let sto_num = store Rx.relinteger
+(* View: sto_ipv6 *)
+let sto_ipv6 = store Rx.ipv6
+
(* View: sto_to_eol *)
let sto_to_eol = store /[^#! \t\n][^#!\n]*[^#! \t\n]|[^#! \t\n]/
(* View: field *)
-let field (kw:string) (sto:lens) = indent . Build.key_value_line_comment kw sep_spc sto comment_eol
+let field (kw:regexp) (sto:lens) = indent . Build.key_value_line_comment kw sep_spc sto comment_eol
(* View: flag
A single word *)
let flag (kw:regexp) = [ indent . key kw . comment_or_eol ]
-(* View: lens_block
-A generic block with a title lens *)
-let lens_block (title:lens) (sto:lens) = [ indent . title . opt_eol . lbracket
- . (sto | empty | comment)+
- . indent . rbracket . eol ]
+(* View: ip_port
+ An IP <space> port pair *)
+let ip_port = [ label "ip" . sto_word ] . sep_spc . [ label "port" . sto_num ]
+
+(* View: lens_block
+A generic block with a title lens.
+The definition is very similar to Build.block_newlines
+but uses a different type of <comment>. *)
+let lens_block (title:lens) (sto:lens) =
+ [ indent . title
+ . Build.block_newlines sto comment . eol ]
(* View: block
A simple block with just a block title *)
-let block (kw:string) (sto:lens) = lens_block (key kw) sto
+let block (kw:regexp) (sto:lens) = lens_block (key kw) sto
-(* View: named_block
+(* View: named_block
A block with a block title and name *)
let named_block (kw:string) (sto:lens) = lens_block (key kw . sep_spc . sto_word) sto
(* View: named_block_arg_title
A title lens for named_block_arg *)
-let named_block_arg_title (kw:string) (name:string) (arg:string) =
+let named_block_arg_title (kw:string) (name:string) (arg:string) =
key kw . sep_spc
. [ label name . sto_word ]
. sep_spc
(* View: named_block_arg
A block with a block title, a name and an argument *)
-let named_block_arg (kw:string) (name:string) (arg:string) (sto:lens) =
+let named_block_arg (kw:string) (name:string) (arg:string) (sto:lens) =
lens_block (named_block_arg_title kw name arg) sto
(* View: global_defs_field
Possible fields in the global_defs block *)
-let global_defs_field = block "notification_email" email
- | field "notification_email_from" sto_email_addr
- | field "smtp_server" sto_word
- | field "smtp_connect_timeout" sto_num
- | field "lvs_id" sto_word
- | field "router_id" sto_word
+let global_defs_field =
+ let word_re = "smtp_server"|"lvs_id"|"router_id"|"vrrp_mcast_group4"
+ in let ipv6_re = "vrrp_mcast_group6"
+ in let num_re = "smtp_connect_timeout"
+ in block "notification_email" email
+ | field "notification_email_from" sto_email_addr
+ | field word_re sto_word
+ | field num_re sto_num
+ | field ipv6_re sto_ipv6
(* View: global_defs
A global_defs block *)
| block "static_routes" static_routes_field
-(* View: global_conf
+(* View: global_conf
A global configuration entry *)
let global_conf = global_defs | static_routes
*************************************************************************)
(*View: vrrp_sync_group_field *)
-let vrrp_sync_group_field = block "group" [ indent . key word . comment_or_eol ]
+let vrrp_sync_group_field =
+ let to_eol_re = /notify(_master|_backup|_fault|_stop|_deleted)?/
+ in let flag_re = "smtp_alert"
+ in field to_eol_re sto_to_eol
+ | flag flag_re
+ | block "group" [ indent . key word . comment_or_eol ]
(* View: vrrp_sync_group *)
let vrrp_sync_group = named_block "vrrp_sync_group" vrrp_sync_group_field
(* View: vrrp_instance_field *)
-let vrrp_instance_field = field "state" sto_word
- | field "interface" sto_word
- | field "lvs_sync_daemon_interface" sto_word
- | field "virtual_router_id" sto_num
- | field "priority" sto_num
- | field "advert_int" sto_num
- | field "garp_master_delay" sto_num
- | field "notify_master" sto_to_eol
- | field "notify_backup" sto_to_eol
- | field "notify_fault" sto_to_eol
- | flag "smtp_alert"
- | flag "nopreempt"
- | flag "ha_suspend"
- | flag "debug"
- | block "authentication" (
- field "auth_type" sto_word
- | field "auth_pass" sto_word
- )
- | block "virtual_ipaddress" static_ipaddress_field
- | block "track_interface" ( flag word )
- | block "track_script" ( flag word )
+let vrrp_instance_field =
+ let word_re = "state" | "interface" | "lvs_sync_daemon_interface"
+ in let num_re = "virtual_router_id" | "priority" | "advert_int" | /garp_master_(delay|repeat|refresh|refresh_repeat)/
+ in let to_eol_re = /notify(_master|_backup|_fault|_stop|_deleted)?/ | /(mcast|unicast)_src_ip/
+ in let flag_re = "smtp_alert" | "nopreempt" | "ha_suspend" | "debug" | "use_vmac" | "vmac_xmit_base" | "native_ipv6" | "dont_track_primary" | "preempt_delay"
+ in field word_re sto_word
+ | field num_re sto_num
+ | field to_eol_re sto_to_eol
+ | flag flag_re
+ | block "authentication" (
+ field /auth_(type|pass)/ sto_word
+ )
+ | block "virtual_ipaddress" static_ipaddress_field
+ | block /track_(interface|script)/ ( flag word )
+ | block "unicast_peer" static_ipaddress_field
(* View: vrrp_instance *)
let vrrp_instance = named_block "vrrp_instance" vrrp_instance_field
(* View: vrrp_script_field *)
-let vrrp_script_field = field "script" sto_to_eol
- | field "interval" sto_num
- | field "weight" sto_num
+let vrrp_script_field =
+ let num_re = "interval" | "weight" | "fall" | "raise"
+ in let to_eol_re = "script"
+ in field to_eol_re sto_to_eol
+ | field num_re sto_num
(* View: vrrp_script *)
let vrrp_script = named_block "vrrp_script" vrrp_script_field
(************************************************************************
- * Group: LVS CONFIGURATION
+ * Group: REAL SERVER CHECKS CONFIGURATION
*************************************************************************)
(* View: tcp_check_field *)
-let tcp_check_field = field "connect_timeout" sto_num
- | field "connect_port" sto_num
+let tcp_check_field =
+ let word_re = "bindto"
+ in let num_re = /connect_(timeout|port)/
+ in field word_re sto_word
+ | field num_re sto_num
+
+(* View: misc_check_field *)
+let misc_check_field =
+ let flag_re = "misc_dynamic"
+ in let num_re = "misc_timeout"
+ in let to_eol_re = "misc_path"
+ in field num_re sto_num
+ | flag flag_re
+ | field to_eol_re sto_to_eol
+
+(* View: smtp_host_check_field *)
+let smtp_host_check_field =
+ let word_re = "connect_ip" | "bindto"
+ in let num_re = "connect_port"
+ in field word_re sto_word
+ | field num_re sto_num
+
+(* View: smtp_check_field *)
+let smtp_check_field =
+ let word_re = "connect_ip" | "bindto"
+ in let num_re = "connect_timeout" | "retry" | "delay_before_retry"
+ in let to_eol_re = "helo_name"
+ in field word_re sto_word
+ | field num_re sto_num
+ | field to_eol_re sto_to_eol
+ | block "host" smtp_host_check_field
+
+(* View: http_url_check_field *)
+let http_url_check_field =
+ let word_re = "digest"
+ in let num_re = "status_code"
+ in let to_eol_re = "path"
+ in field word_re sto_word
+ | field num_re sto_num
+ | field to_eol_re sto_to_eol
+
+(* View: http_check_field *)
+let http_check_field =
+ let num_re = /connect_(timeout|port)/ | "nb_get_retry" | "delay_before_retry"
+ in field num_re sto_num
+ | block "url" http_url_check_field
(* View: real_server_field *)
-let real_server_field = field "weight" sto_num
- | block "TCP_CHECK" tcp_check_field
+let real_server_field =
+ let num_re = "weight"
+ in let flag_re = "inhibit_on_failure"
+ in let to_eol_re = /notify_(up|down)/
+ in field num_re sto_num
+ | flag flag_re
+ | field to_eol_re sto_to_eol
+ | block "TCP_CHECK" tcp_check_field
+ | block "MISC_CHECK" misc_check_field
+ | block "SMTP_CHECK" smtp_check_field
+ | block /(HTTP|SSL)_GET/ http_check_field
+
+(************************************************************************
+ * Group: LVS CONFIGURATION
+ *************************************************************************)
(* View: virtual_server_field *)
-let virtual_server_field = field "delay_loop" sto_num
- | field "lb_algo" sto_word
- | field "lb_kind" sto_word
- | field "nat_mask" sto_word
- | field "protocol" sto_word
- | named_block_arg "real_server" "ip" "port" real_server_field
+let virtual_server_field =
+ let num_re = "delay_loop" | "persistence_timeout" | "quorum" | "hysteresis"
+ in let word_re = /lb_(algo|kind)/ | "nat_mask" | "protocol" | "persistence_granularity"
+ | "virtualhost"
+ in let flag_re = "ops" | "ha_suspend" | "alpha" | "omega"
+ in let to_eol_re = /quorum_(up|down)/
+ in let ip_port_re = "sorry_server"
+ in field num_re sto_num
+ | field word_re sto_word
+ | flag flag_re
+ | field to_eol_re sto_to_eol
+ | field ip_port_re ip_port
+ | named_block_arg "real_server" "ip" "port" real_server_field
(* View: virtual_server *)
let virtual_server = named_block_arg "virtual_server" "ip" "port" virtual_server_field
(* Variable: filter *)
let filter = incl "/etc/keepalived/keepalived.conf"
- . Util.stdexcl
let xfm = transform lns filter