Keepalived

Parses /etc/keepalived/keepalived.conf

Author: Raphael Pinson rap.nosp@m.hink@gmai.nosp@m.l.com

Summary
KeepalivedParses /etc/keepalived/keepalived.conf
ReferenceThis lens tries to keep as close as possible to `man 5 keepalived.conf` where possible.
LicenseThis file is licenced under the LGPL v2+, like the rest of Augeas.
Lens UsageTo be documented
Configuration filesThis lens applies to /etc/keepalived/keepalived.conf.
ExamplesThe Test_Keepalived file contains various examples and tests.
USEFUL PRIMITIVES
Comments and empty lines
indent
eol
opt_eol
sep_spc
commentMap comments in “#comment” nodes
comment_eolMap comments at eol
comment_or_eolA comment_eol or eol
emptyMap empty lines
sto_email_addr
word
word_slash
sto_word
sto_num
sto_to_eol
field
flagA single word
ip_portAn IP <space> port pair
lens_blockA generic block with a title lens.
blockA simple block with just a block title
named_blockA block with a block title and name
named_block_arg_titleA title lens for named_block_arg
named_block_argA block with a block title, a name and an argument
GLOBAL CONFIGURATION
emailA simple email address entry
global_defs_fieldPossible fields in the global_defs block
global_defsA global_defs block
prefixlenA prefix for IP addresses
ipaddrAn IP address or range with an optional mask
ipdevA device for IP addresses
static_ipaddress_fieldThe whole string is fed to ip addr add.
static_routes_fieldsrc $SRC_IP to $DST_IP dev $SRC_DEVICE
static_routes
global_confA global configuration entry
VRRP CONFIGURATION
vrrp_sync_group_field
vrrp_sync_group
vrrp_instance_field
vrrp_instance
vrrp_script_field
vrrp_script
vrrpd_confcontains subblocks of VRRP synchronization group(s) and VRRP instance(s)
REAL SERVER CHECKS CONFIGURATION
tcp_check_field
misc_check_field
smtp_host_check_field
smtp_check_field
http_url_check_field
http_check_field
real_server_field
LVS CONFIGURATION
virtual_server_field
virtual_server
virtual_server_group_field
virtual_server_group
lvs_confcontains subblocks of Virtual server group(s) and Virtual server(s)
lnsThe keepalived lens
filter

Reference

This lens tries to keep as close as possible to `man 5 keepalived.conf` where possible.

License

This file is licenced under the LGPL v2+, like the rest of Augeas.

Lens Usage

To be documented

Configuration files

This lens applies to /etc/keepalived/keepalived.conf.  See filter.

Examples

The Test_Keepalived file contains various examples and tests.

USEFUL PRIMITIVES

Comments and empty lines

indent

let indent = Util.indent

eol

let eol = Util.eol

opt_eol

let opt_eol = del /[ \t]*\n?/ " "

sep_spc

let sep_spc = Sep.space

comment

let comment = Util.comment_generic /[ \t]*[#!][ \t]*/ "# "

Map comments in “#comment” nodes

comment_eol

let comment_eol = Util.comment_generic /[ \t]*[#!][ \t]*/ " # "

Map comments at eol

comment_or_eol

let comment_or_eol = comment_eol | (del /[ \t]*[#!]?\n/ "\n")

A comment_eol or eol

empty

let empty = Util.empty

Map empty lines

sto_email_addr

let sto_email_addr = store Rx.email_addr

word

let word = Rx.word

word_slash

let word_slash = word | "/"

sto_word

let sto_word = store word

sto_num

let sto_num = store Rx.relinteger

sto_to_eol

let sto_to_eol = store /[^#! \t\n][^#!\n]*[^#! \t\n]|[^#! \t\n]/

field

let field (kw:regexp) (sto:lens) = indent . Build.key_value_line_comment kw sep_spc sto comment_eol

flag

let flag (kw:regexp) = [ indent . key kw . comment_or_eol ]

A single word

ip_port

let ip_port = [ label "ip" . sto_word ] . sep_spc . [ label "port" . sto_num ]

An IP <space> port pair

lens_block

let lens_block (title:lens) (sto:lens) = [ indent . title . Build.block_newlines sto comment . eol ]

A generic block with a title lens.  The definition is very similar to Build.block_newlines but uses a different type of comment.

block

let block (kw:regexp) (sto:lens) = lens_block (key kw) sto

A simple block with just a block title

named_block

let named_block (kw:string) (sto:lens) = lens_block (key kw . sep_spc . sto_word) sto

A block with a block title and name

named_block_arg_title

let named_block_arg_title (kw:string) (name:string) (arg:string) = key kw . sep_spc . [ label name . sto_word ] . sep_spc . [ label arg . sto_word ]

A title lens for named_block_arg

named_block_arg

let named_block_arg (kw:string) (name:string) (arg:string) (sto:lens) = lens_block (named_block_arg_title kw name arg) sto

A block with a block title, a name and an argument

GLOBAL CONFIGURATION

email

let email = [ indent . label "email" . sto_email_addr . comment_or_eol ]

A simple email address entry

global_defs_field

let global_defs_field = let word_re = "smtp_server"|"lvs_id"|"router_id" 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

Possible fields in the global_defs block

global_defs

let global_defs = block "global_defs" global_defs_field

A global_defs block

prefixlen

let prefixlen = [ label "prefixlen" . Util.del_str "/" . sto_num ]

A prefix for IP addresses

ipaddr

let ipaddr = label "ipaddr" . store /[0-9.-]+/ . prefixlen?

An IP address or range with an optional mask

ipdev

let ipdev = [ key "dev" . sep_spc . sto_word ]

A device for IP addresses

static_ipaddress_field

let static_ipaddress_field = [ indent . ipaddr . (sep_spc . ipdev)? . comment_or_eol ]

The whole string is fed to ip addr add.  You can truncate the string anywhere you like and let ip addr add use defaults for the rest of the string.  To be refined with fields according to `ip addr help`.

static_routes_field

let static_routes_field = [ indent . label "route" . [ key "src" . sto_word ] . sep_spc . [ key "to" . sto_word ] . sep_spc . [ key "dev" . sto_word ] . comment_or_eol ]

src $SRC_IP to $DST_IP dev $SRC_DEVICE

static_routes

let static_routes = block "static_ipaddress" static_ipaddress_field | block "static_routes" static_routes_field

global_conf

let global_conf = global_defs | static_routes

A global configuration entry

VRRP CONFIGURATION

vrrp_sync_group_field

let vrrp_sync_group_field = block "group" [ indent . key word . comment_or_eol ]

vrrp_sync_group

let vrrp_sync_group = named_block "vrrp_sync_group" vrrp_sync_group_field

vrrp_instance_field

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" in let to_eol_re = /notify_(master|backup|fault)/ in let flag_re = "smtp_alert" | "nopreempt" | "ha_suspend" | "debug" 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 )

vrrp_instance

let vrrp_instance = named_block "vrrp_instance" vrrp_instance_field

vrrp_script_field

let vrrp_script_field = let num_re = "interval" | "weight" in let to_eol_re = "script" in field to_eol_re sto_to_eol | field num_re sto_num

vrrp_script

let vrrp_script = named_block "vrrp_script" vrrp_script_field

vrrpd_conf

let vrrpd_conf = vrrp_sync_group | vrrp_instance | vrrp_script

contains subblocks of VRRP synchronization group(s) and VRRP instance(s)

REAL SERVER CHECKS CONFIGURATION

tcp_check_field

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

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

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

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

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

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

real_server_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

LVS CONFIGURATION

virtual_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

virtual_server

let virtual_server = named_block_arg "virtual_server" "ip" "port" virtual_server_field

virtual_server_group_field

let virtual_server_group_field = [ indent . label "vip" . [ ipaddr ] . sep_spc . [ label "port" . sto_num ] . comment_or_eol ]

virtual_server_group

let virtual_server_group = named_block "virtual_server_group" virtual_server_group_field

lvs_conf

let lvs_conf = virtual_server | virtual_server_group

contains subblocks of Virtual server group(s) and Virtual server(s)

lns

let lns = ( empty | comment | global_conf | vrrpd_conf | lvs_conf )*

The keepalived lens

filter

Provides unit tests and examples for the Keepalived lens.
let indent = Util.indent
let eol = Util.eol
let opt_eol = del /[ \t]*\n?/ " "
let sep_spc = Sep.space
let comment = Util.comment_generic /[ \t]*[#!][ \t]*/ "# "
Map comments in “#comment” nodes
let comment_eol = Util.comment_generic /[ \t]*[#!][ \t]*/ " # "
Map comments at eol
let comment_or_eol = comment_eol | (del /[ \t]*[#!]?\n/ "\n")
A comment_eol or eol
let empty = Util.empty
Map empty lines
let sto_email_addr = store Rx.email_addr
let word = Rx.word
let word_slash = word | "/"
let sto_word = store word
let sto_num = store Rx.relinteger
let sto_to_eol = store /[^#! \t\n][^#!\n]*[^#! \t\n]|[^#! \t\n]/
let field (kw:regexp) (sto:lens) = indent . Build.key_value_line_comment kw sep_spc sto comment_eol
let flag (kw:regexp) = [ indent . key kw . comment_or_eol ]
A single word
let ip_port = [ label "ip" . sto_word ] . sep_spc . [ label "port" . sto_num ]
An IP space port pair
let lens_block (title:lens) (sto:lens) = [ indent . title . Build.block_newlines sto comment . eol ]
A generic block with a title lens.
let block (kw:regexp) (sto:lens) = lens_block (key kw) sto
A simple block with just a block title
let named_block (kw:string) (sto:lens) = lens_block (key kw . sep_spc . sto_word) sto
A block with a block title and name
let named_block_arg_title (kw:string) (name:string) (arg:string) = key kw . sep_spc . [ label name . sto_word ] . sep_spc . [ label arg . sto_word ]
A title lens for named_block_arg
let named_block_arg (kw:string) (name:string) (arg:string) (sto:lens) = lens_block (named_block_arg_title kw name arg) sto
A block with a block title, a name and an argument
let email = [ indent . label "email" . sto_email_addr . comment_or_eol ]
A simple email address entry
let global_defs_field = let word_re = "smtp_server"|"lvs_id"|"router_id" 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
Possible fields in the global_defs block
let global_defs = block "global_defs" global_defs_field
A global_defs block
let prefixlen = [ label "prefixlen" . Util.del_str "/" . sto_num ]
A prefix for IP addresses
let ipaddr = label "ipaddr" . store /[0-9.-]+/ . prefixlen?
An IP address or range with an optional mask
let ipdev = [ key "dev" . sep_spc . sto_word ]
A device for IP addresses
let static_ipaddress_field = [ indent . ipaddr . (sep_spc . ipdev)? . comment_or_eol ]
The whole string is fed to ip addr add.
let static_routes_field = [ indent . label "route" . [ key "src" . sto_word ] . sep_spc . [ key "to" . sto_word ] . sep_spc . [ key "dev" . sto_word ] . comment_or_eol ]
src $SRC_IP to $DST_IP dev $SRC_DEVICE
let static_routes = block "static_ipaddress" static_ipaddress_field | block "static_routes" static_routes_field
let global_conf = global_defs | static_routes
A global configuration entry
let vrrp_sync_group_field = block "group" [ indent . key word . comment_or_eol ]
let vrrp_sync_group = named_block "vrrp_sync_group" vrrp_sync_group_field
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" in let to_eol_re = /notify_(master|backup|fault)/ in let flag_re = "smtp_alert" | "nopreempt" | "ha_suspend" | "debug" 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 )
let vrrp_instance = named_block "vrrp_instance" vrrp_instance_field
let vrrp_script_field = let num_re = "interval" | "weight" in let to_eol_re = "script" in field to_eol_re sto_to_eol | field num_re sto_num
let vrrp_script = named_block "vrrp_script" vrrp_script_field
let vrrpd_conf = vrrp_sync_group | vrrp_instance | vrrp_script
contains subblocks of VRRP synchronization group(s) and VRRP instance(s)
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
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
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
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
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
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
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
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
let virtual_server = named_block_arg "virtual_server" "ip" "port" virtual_server_field
let virtual_server_group_field = [ indent . label "vip" . [ ipaddr ] . sep_spc . [ label "port" . sto_num ] . comment_or_eol ]
let virtual_server_group = named_block "virtual_server_group" virtual_server_group_field
let lvs_conf = virtual_server | virtual_server_group
contains subblocks of Virtual server group(s) and Virtual server(s)
let lns = ( empty | comment | global_conf | vrrpd_conf | lvs_conf )*
The keepalived lens
Close