corosync.aug 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. (* Process /etc/corosync/corosync.conf *)
  2. (* The lens is based on the corosync.conf(5) man page *)
  3. module Corosync =
  4. autoload xfm
  5. let comment = Util.comment
  6. let empty = Util.empty
  7. let dels = Util.del_str
  8. let eol = Util.eol
  9. let ws = del /[ \t]+/ " "
  10. let wsc = del /:[ \t]+/ ": "
  11. let indent = del /[ \t]*/ ""
  12. (* We require that braces are always followed by a newline *)
  13. let obr = del /\{([ \t]*)\n/ "{\n"
  14. let cbr = del /[ \t]*}[ \t]*\n/ "}\n"
  15. let ikey (k:regexp) = indent . key k
  16. let section (n:regexp) (b:lens) =
  17. [ ikey n . ws . obr . (b|empty|comment)* . cbr ]
  18. let kv (k:regexp) (v:regexp) =
  19. [ ikey k . wsc . store v . eol ]
  20. (* FIXME: it would be much more concise to write *)
  21. (* [ key k . ws . (bare | quoted) ] *)
  22. (* but the typechecker trips over that *)
  23. let qstr (k:regexp) =
  24. let delq = del /['"]/ "\"" in
  25. let bare = del /["']?/ "" . store /[^"' \t\n]+/ . del /["']?/ "" in
  26. let quoted = delq . store /.*[ \t].*/ . delq in
  27. [ ikey k . wsc . bare . eol ]
  28. |[ ikey k . wsc . quoted . eol ]
  29. (* A integer subsection *)
  30. let interface =
  31. let setting =
  32. kv "ringnumber" Rx.integer
  33. |kv "mcastport" Rx.integer
  34. |kv "ttl" Rx.integer
  35. |kv "broadcast" /yes|no/
  36. |qstr /bindnetaddr|mcastaddr/ in
  37. section "interface" setting
  38. (* The totem section *)
  39. let totem =
  40. let setting =
  41. kv "clear_node_high_bit" /yes|no/
  42. |kv "rrp_mode" /none|active|passive/
  43. |kv "vsftype" /none|ykd/
  44. |kv "secauth" /on|off/
  45. |kv "crypto_model" /nss|openssl/
  46. |kv "crypto_cipher" /none|nss|aes256|aes192|aes128/
  47. |kv "crypto_hash" /none|md5|sha1|sha256|sha384|sha512/
  48. |kv "transport" /udp|iba|udpu/
  49. |kv "version" Rx.integer
  50. |kv "nodeid" Rx.integer
  51. |kv "threads" Rx.integer
  52. |kv "netmtu" Rx.integer
  53. |kv "token" Rx.integer
  54. |kv "token_retransmit" Rx.integer
  55. |kv "hold" Rx.integer
  56. |kv "token_retransmits_before_loss_const" Rx.integer
  57. |kv "join" Rx.integer
  58. |kv "send_join" Rx.integer
  59. |kv "consensus" Rx.integer
  60. |kv "merge" Rx.integer
  61. |kv "downcheck" Rx.integer
  62. |kv "fail_to_recv_const" Rx.integer
  63. |kv "seqno_unchanged_const" Rx.integer
  64. |kv "heartbeat_failures_allowed" Rx.integer
  65. |kv "max_network_delay" Rx.integer
  66. |kv "max_messages" Rx.integer
  67. |kv "window_size" Rx.integer
  68. |kv "rrp_problem_count_timeout" Rx.integer
  69. |kv "rrp_problem_count_threshold" Rx.integer
  70. |kv "rrp_token_expired_timeout" Rx.integer
  71. |qstr /cluster_name/
  72. |interface in
  73. section "totem" setting
  74. let common_logging =
  75. kv "to_syslog" /yes|no|on|off/
  76. |kv "to_stderr" /yes|no|on|off/
  77. |kv "to_logfile" /yes|no|on|off/
  78. |kv "debug" /yes|no|on|off|trace/
  79. |kv "logfile_priority" /alert|crit|debug|emerg|err|info|notice|warning/
  80. |kv "syslog_priority" /alert|crit|debug|emerg|err|info|notice|warning/
  81. |kv "syslog_facility" /daemon|local0|local1|local2|local3|local4|local5|local6|local7/
  82. |qstr /logfile|tags/
  83. (* A logger_subsys subsection *)
  84. let logger_subsys =
  85. let setting =
  86. qstr /subsys/
  87. |common_logging in
  88. section "logger_subsys" setting
  89. (* The logging section *)
  90. let logging =
  91. let setting =
  92. kv "fileline" /yes|no|on|off/
  93. |kv "function_name" /yes|no|on|off/
  94. |kv "timestamp" /yes|no|on|off/
  95. |common_logging
  96. |logger_subsys in
  97. section "logging" setting
  98. (* The resource section *)
  99. let common_resource =
  100. kv "max" Rx.decimal
  101. |kv "poll_period" Rx.integer
  102. |kv "recovery" /reboot|shutdown|watchdog|none/
  103. let memory_used =
  104. let setting =
  105. common_resource in
  106. section "memory_used" setting
  107. let load_15min =
  108. let setting =
  109. common_resource in
  110. section "load_15min" setting
  111. let system =
  112. let setting =
  113. load_15min
  114. |memory_used in
  115. section "system" setting
  116. (* The resources section *)
  117. let resources =
  118. let setting =
  119. system in
  120. section "resources" setting
  121. (* The quorum section *)
  122. let quorum =
  123. let setting =
  124. qstr /provider/
  125. |kv "expected_votes" Rx.integer
  126. |kv "votes" Rx.integer
  127. |kv "wait_for_all" Rx.integer
  128. |kv "last_man_standing" Rx.integer
  129. |kv "last_man_standing_window" Rx.integer
  130. |kv "auto_tie_breaker" Rx.integer
  131. |kv "two_node" Rx.integer in
  132. section "quorum" setting
  133. (* The service section *)
  134. let service =
  135. let setting =
  136. qstr /name|ver/ in
  137. section "service" setting
  138. (* The uidgid section *)
  139. let uidgid =
  140. let setting =
  141. qstr /uid|gid/ in
  142. section "uidgid" setting
  143. (* The node section *)
  144. let node =
  145. let setting =
  146. qstr /ring[0-9]_addr/
  147. |kv "nodeid" Rx.integer
  148. |kv "name" Rx.hostname
  149. |kv "quorum_votes" Rx.integer in
  150. section "node" setting
  151. (* The nodelist section *)
  152. let nodelist =
  153. let setting =
  154. node in
  155. section "nodelist" setting
  156. let lns = (comment|empty|totem|quorum|logging|resources|service|uidgid|nodelist)*
  157. let xfm = transform lns (incl "/etc/corosync/corosync.conf")