summaryrefslogtreecommitdiffstats
path: root/syntax/haproxy.vim
diff options
context:
space:
mode:
Diffstat (limited to 'syntax/haproxy.vim')
-rw-r--r--syntax/haproxy.vim360
1 files changed, 360 insertions, 0 deletions
diff --git a/syntax/haproxy.vim b/syntax/haproxy.vim
new file mode 100644
index 00000000..54c54c3c
--- /dev/null
+++ b/syntax/haproxy.vim
@@ -0,0 +1,360 @@
+if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haproxy') == -1
+
+" Vim syntax file
+" Language: HAproxy
+" Maintainer: Dan Reif
+" Last Change: Mar 2, 2018
+" Version: 0.5
+" URL: https://github.com/CH-DanReif/haproxy.vim
+
+" For version 5.x: Clear all syntax items
+" For version 6.x: Quit when a syntax file was already loaded
+if version < 600
+ syntax clear
+elseif exists("b:current_syntax")
+ finish
+endif
+
+if version >= 600
+ setlocal iskeyword=_,-,a-z,A-Z,48-57
+else
+ set iskeyword=_,-,a-z,A-Z,48-57
+endif
+
+
+" Escaped chars
+syn match hapEscape +\\\(\\\| \|n\|r\|t\|#\|x\x\x\)+
+
+" Match whitespace at the end of a line
+syn match hapNothingErr /\s\+\ze\(#.*\)\?$/ contained nextgroup=hapGreedyComment
+" Match anything other than whitespace; flag as error if found. 'contained'
+" because comments are valid where otherwise only hapNothing is.
+syn match hapNothingErr /\s*\zs[^# \t][^#]*/ contained nextgroup=hapGreedyComment
+
+" Comments
+syn match hapComment /\(^\|\s\)#.*$/ contains=hapTodo
+" `acl foo path_reg hi[#]mom` is an error because [ is unclosed. (!!!)
+syn match hapGreedyComment /#.*$/ contained containedin=hapAclRemainder contains=hapTodo
+syn keyword hapTodo TODO FIXME XXX contained
+
+" `daemon#hi mom` is perfectly valid. :/
+syn cluster hapNothing contains=hapNothingErr,hapGreedyComment
+
+" Case-insensitive matching
+syn case ignore
+
+" Sections
+syn match hapSection /^\s*\(global\|defaults\)/
+syn match hapSection /^\s*\(backend\|frontend\|listen\|ruleset\|userlist\)/ skipwhite nextgroup=hapSectLabel
+syn match hapSectLabel /\S\+/ skipwhite nextgroup=hapIp1 contained
+syn match hapIp1 /\(\d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}\)\?:\d\{1,5}/ nextgroup=hapIp2 contained
+syn match hapIp2 /,\(\d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}\)\?:\d\{1,5}/hs=s+1 nextgroup=hapIp2 contained
+
+" Timeouts. We try to hint towards the use of 'ms' and 's' when
+" g:haproxy_guess_ms_sec is set. We consider the lack of either 'ms' or 's'
+" as an error when haproxy_enforce_ms_sec is set. (HAproxy's default is 'ms',
+" but that arguably leads to ambiguity in the config.)
+if get(g:, 'haproxy_guess_ms_sec', 1)
+ " Timeouts and such specified in ms, where seconds are *allowed*, but are
+ " probably a mistake.
+ syn match hapNumberMS /\d\+m\?s/ contained transparent
+ syn match hapError /\d\+\zss\ze/ contained containedin=hapNumberMS
+endif
+if get(g:, 'haproxy_enforce_ms_sec', 1)
+ syn match hapNumberMS /\d\+\(m\?s\)\?/ contained transparent
+ syn match hapError /\d\+\(m\?s\)\@!\(\D\|$\)/ contained containedin=hapNumberMS
+ syn match hapNumberMS /\d\+m\?s/ contained
+else
+ syn match hapNumberMS /\d\+m\?s/ contained
+endif
+if get(g:, 'haproxy_guess_ms_sec', 1)
+ " Timeouts generally specified in whole seconds, where we want to highlight
+ " errant 'm's.
+ syn match hapNumberSec /\d\+m\?s/ contained transparent
+ syn match hapError /\d\+\zsm\zes/ contained containedin=hapNumberSec
+endif
+if get(g:, 'haproxy_enforce_ms_sec', 1)
+ syn match hapNumberSec /\d\+\(m\?s\)\?/ contained transparent
+ syn match hapError /\d\+\(m\?s\)\@!\(\D\|$\)/ contained containedin=hapNumberSec
+ syn match hapNumberSec /\d\+m\?s/ contained
+else
+ syn match hapNumberSec /\d\+m\?s/ contained
+endif
+" Other numbers, no 'ms'.
+syn match hapNumber /[0-9]\+/ contained
+
+" Timeout types
+syn keyword hapTimeoutType connect client server contained skipwhite nextgroup=hapNumberMS
+
+" URIs
+syn match hapAbsURI /\/\S*/ contained
+syn match hapURI /\S*/ contained
+
+" File paths (always absolute, and never just '/' unless you're insane)
+syn match hapFilePath /\/\S\+/ contained
+
+" SSL configuration keywords
+syn match hapSSLCiphersAll /\s\+\zs.*/ contained transparent
+syn match hapSSLCiphersError /.\+/ contained containedin=hapSSLCiphersAll
+syn match hapSSLCiphers /\([-+!]\?[A-Z0-9-]\+[:+]\)*[-+!]\?[A-Z0-9-]\+/ contained containedin=hapSSLCiphersAll
+
+"
+" ACLs
+"
+
+" This comes first, lest it gobble up everything else.
+syn match hapAclName /\S\+/ contained skipwhite nextgroup=hapAclCriterion
+syn match hapAclCriterion /FALSE\|HTTP\|HTTP_1\.0\|HTTP_1\.1\|HTTP_CONTENT\|HTTP_URL_ABS\|HTTP_URL_SLASH\|HTTP_URL_STAR\|LOCALHOST\|METH_CONNECT\|METH_GET\|METH_HEAD\|METH_OPTIONS\|METH_POST\|METH_TRACE\|RDP_COOKIE\|REQ_CONTENT\|TRUE\|WAIT_END\|\(req_rdp_cookie\|s\?cook\|s\?hdr\|http_auth_group\|urlp\)\(_\(beg\|dir\|dom\|end\|len\|reg\|sub\|cnt\)\)\?([^)]*)\|\(req_ssl_[a-z]\+\|base\|method\|path\|req_ver\|resp_ver\|url\)\(_\(beg\|dir\|dom\|end\|len\|reg\|sub\|cnt\)\)\?/ contained skipwhite nextgroup=hapAclConverterOrNothing
+" This one's a bit tricky. Match zero or more converters, and then *require* the
+" space afterwards. Strictly speaking, deviates from the BNF, but only in
+" pathological cases ('acl lolwat TRUE,upper').
+syn match hapAclConverterOrNothing /\(,\(\(base64\|bool\|cpl\|debug\|even\|hex\|lower\|neg\|not\|odd\|upper\|url_dec\)\|\(add\|and\|bytes\|crc32\|da-csv-conv\|div\|djb2\|field\|http_date\|in_table\|ipmask\|json\|language\|ltime\|map\|mod\|mul\|or\|regsub\|capture-req\|capture-res\|sdbm\|sub\|table_[a-z0-9_]\+\|utime\|word\|wt6\|xor\)([^)]*)\)\)*\s\+/ contained nextgroup=hapAclFlag,hapAclFlagWithParameter,hapAclOperator
+syn match hapAclFlag /-[-in]/ contained skipwhite nextgroup=hapAclFlag,hapAclFlagWithParameter,hapAclOperator
+syn match hapAclFlagWithParameter /-[fmMu]/ contained skipwhite nextgroup=hapAclFlagParameter
+syn match hapAclFlagParameter /\S\+/ contained skipwhite nextgroup=hapAclFlag,hapAclFlagWithParameter,hapAclOperator
+syn match hapAclOperator /eq\|ge\|gt\|le\|lt/ contained skipwhite
+syn match hapAclRemainder /.*/ contained transparent
+
+" Generic tune.ssl
+syn match hapParam /tune\.ssl\.[a-z0-9-]\+/
+" tune.ssl where we know what follows
+syn match hapParam /tune\.ssl\.default-dh-param/ skipwhite nextgroup=hapNumber
+
+syn keyword hapSSLServerVerify none required contained skipwhite nextgroup=@hapNothing
+
+" Keywords deprecated for at least a decade. Kill 'em.
+syn keyword hapError cliexp srvexp
+
+" Parameters
+syn keyword hapParam timeout skipwhite nextgroup=hapTimeoutType
+syn keyword hapParam chroot pidfile skipwhite nextgroup=hapFilePath
+syn keyword hapParam clitimeout skipwhite nextgroup=hapNumberMS
+syn keyword hapParam contimeout skipwhite nextgroup=hapNumberMS
+syn keyword hapParam daemon debug disabled skipwhite nextgroup=@hapNothing
+syn keyword hapParam enabled skipwhite nextgroup=@hapNothing
+syn keyword hapParam fullconn maxconn skipwhite nextgroup=hapNumber
+syn keyword hapParam gid skipwhite nextgroup=hapNumber
+syn keyword hapParam group
+syn keyword hapParam grace skipwhite nextgroup=hapNumberMS
+syn keyword hapParam monitor-uri skipwhite nextgroup=hapAbsURI
+syn keyword hapParam nbproc skipwhite nextgroup=hapNumber
+syn keyword hapParam noepoll nopoll skipwhite nextgroup=@hapNothing
+syn keyword hapParam quiet skipwhite nextgroup=@hapNothing
+syn keyword hapParam redispatch retries skipwhite nextgroup=hapNumber
+" 'add' takes exactly one string, not regexes
+syn keyword hapParam reqadd reqiadd skipwhite nextgroup=hapOneStringIfUnless
+syn keyword hapParam rspadd rspiadd skipwhite nextgroup=hapOneStringIfUnless
+" All of these take exactly one regexp
+syn match hapParam /reqi\?\(allow\|del\)/ skipwhite nextgroup=hapOneRegexpIfUnless
+syn match hapParam /reqi\?\(deny\|pass\)/ skipwhite nextgroup=hapOneRegexpIfUnless
+syn match hapParam /reqi\?\(tarpit\)/ skipwhite nextgroup=hapOneRegexpIfUnless
+syn match hapParam /rspi\?\(del\|deny\)/ skipwhite nextgroup=hapOneRegexpIfUnless
+" 'rep' is unique in taking two regexes (one search, one replace)
+syn keyword hapParam reqrep reqirep skipwhite nextgroup=hapRegSearchReplIfUnless
+syn keyword hapParam rsprep rspirep skipwhite nextgroup=hapRegSearchReplIfUnless
+syn keyword hapParam reqsetbe reqisetbe skipwhite nextgroup=hapRegexpBE
+syn keyword hapParam server source
+syn keyword hapParam srvtimeout skipwhite nextgroup=hapNumberMS
+syn keyword hapParam uid ulimit-n skipwhite nextgroup=hapNumber
+syn keyword hapParam user
+syn keyword hapParam acl skipwhite nextgroup=hapAclName
+syn keyword hapParam errorloc skipwhite nextgroup=hapStatusURI
+syn keyword hapParam errorloc302 errorloc303 skipwhite nextgroup=hapStatusURI
+syn keyword hapParam default_backend skipwhite nextgroup=hapSectLabel
+syn keyword hapParam use_backend skipwhite nextgroup=hapSectLabel
+syn keyword hapParam appsession skipwhite nextgroup=hapAppSess
+syn keyword hapParam bind skipwhite nextgroup=hapIp1
+syn keyword hapParam balance skipwhite nextgroup=hapBalance
+syn keyword hapParam cookie skipwhite nextgroup=hapCookieNam
+syn keyword hapParam capture skipwhite nextgroup=hapCapture
+syn keyword hapParam dispatch skipwhite nextgroup=hapIpPort
+syn keyword hapParam source skipwhite nextgroup=hapIpPort
+syn keyword hapParam mode skipwhite nextgroup=hapMode
+syn keyword hapParam monitor-net skipwhite nextgroup=hapIPv4Mask
+syn keyword hapParam option skipwhite nextgroup=hapOption
+syn keyword hapParam stats skipwhite nextgroup=hapStats
+syn keyword hapParam server skipwhite nextgroup=hapServerN
+syn keyword hapParam source skipwhite nextgroup=hapServerEOL
+syn keyword hapParam log skipwhite nextgroup=hapGLog,hapLogIp,hapFilePath
+syn keyword hapParam ca-base skipwhite nextgroup=hapFilePath
+syn keyword hapParam crt-base skipwhite nextgroup=hapFilePath
+syn keyword hapParam ssl-default-bind-ciphers skipwhite nextgroup=hapSSLCiphersAll
+syn keyword hapParam ssl-default-bind-options skipwhite nextgroup=hapGLog,hapLogIp
+syn keyword hapParam ssl-server-verify skipwhite nextgroup=hapSSLServerVerify
+syn keyword hapParam errorfile skipwhite nextgroup=hapStatusPath
+syn keyword hapParam http-request skipwhite nextgroup=hapHttpRequestVerb
+" Transparent is a Vim keyword, so we need a regexp to match it
+syn match hapParam /transparent/
+
+" Options and additional parameters
+syn keyword hapAppSess len timeout contained
+syn keyword hapBalance roundrobin source contained
+syn keyword hapLen len contained
+syn keyword hapGLog global contained
+syn keyword hapMode http tcp health contained
+syn keyword hapOption abortonclose allbackups checkcache clitcpka dontlognull contained
+syn keyword hapOption forceclose forwardfor http-server-close contained
+syn keyword hapOption httpchk httpclose httplog keepalive logasap contained
+syn keyword hapOption persist srvtcpka ssl-hello-chk contained
+syn keyword hapOption tcplog tcpka tcpsplice contained
+syn keyword hapOption except contained skipwhite nextgroup=hapIPv4Mask
+" Transparent is a Vim keyword, so we need a regexp to match it
+syn match hapOption /transparent/ contained
+syn keyword hapStats realm auth scope enable contained
+syn keyword hapStats uri contained skipwhite nextgroup=hapAbsURI
+syn keyword hapStats socket contained skipwhite nextgroup=hapFilePath
+syn keyword hapStats timeout contained skipwhite nextgroup=hapNumberMS
+syn keyword hapLogFac kern user mail daemon auth syslog lpr news contained skipwhite nextgroup=hapLogLvl
+syn keyword hapLogFac uucp cron auth2 ftp ntp audit alert cron2 contained skipwhite nextgroup=hapLogLvl
+syn keyword hapLogFac local0 local1 local2 local3 local4 local5 local6 local7 contained skipwhite nextgroup=hapLogLvl
+syn keyword hapLogLvl emerg alert crit err warning notice info debug contained
+syn keyword hapCookieKey rewrite insert nocache postonly indirect prefix contained skipwhite nextgroup=hapCookieKey
+syn keyword hapCapture cookie contained skipwhite nextgroup=hapNameLen
+syn keyword hapCapture request response contained skipwhite nextgroup=hapHeader
+syn keyword hapHeader header contained skipwhite nextgroup=hapNameLen
+syn keyword hapSrvKey backup cookie check inter rise fall port contained
+syn keyword hapSrvKey source minconn maxconn weight usesrc contained
+syn match hapStatus /\d\{3}/ contained
+syn match hapStatusPath /\d\{3}/ contained skipwhite nextgroup=hapFilePath
+syn match hapStatusURI /\d\{3}/ contained skipwhite nextgroup=hapURI
+syn match hapIPv4Mask /\d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}\(\/\d\{1,2}\)\?/ contained
+syn match hapLogIp /\d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}/ contained skipwhite nextgroup=hapLogFac
+syn match hapIpPort /\d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}:\d\{1,5}/ contained
+syn match hapServerAd /\d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}\(:[+-]\?\d\{1,5}\)\?/ contained skipwhite nextgroup=hapSrvEOL
+syn match hapNameLen /\S\+/ contained skipwhite nextgroup=hapLen
+syn match hapCookieNam /\S\+/ contained skipwhite nextgroup=hapCookieKey
+syn match hapServerN /\S\+/ contained skipwhite nextgroup=hapServerAd
+syn region hapSrvEOL start=/\S/ end=/$/ contains=hapSrvKey contained
+
+" Brutally stolen from https://github.com/vim-perl/vim-perl:
+syn match hapPerlSpecialMatch "\\\%(\o\{1,3}\|x\%({\x\+}\|\x\{1,2}\)\|c.\|[^cx]\)" contained extend
+syn match hapPerlSpecialMatch "\\." extend contained contains=NONE
+syn match hapPerlSpecialMatch "\\\\" contained
+syn match hapPerlSpecialMatch "\\[1-9]" contained extend
+syn match hapPerlSpecialMatch "\\g\%(\d\+\|{\%(-\=\d\+\|\h\w*\)}\)" contained
+syn match hapPerlSpecialMatch "\\k\%(<\h\w*>\|'\h\w*'\)" contained
+syn match hapPerlSpecialMatch "{\d\+\%(,\%(\d\+\)\=\)\=}" contained
+syn match hapPerlSpecialMatch "\[[]-]\=[^\[\]]*[]-]\=\]" contained extend
+syn match hapPerlSpecialMatch "[+*()?.]" contained
+syn match hapPerlSpecialMatch "(?[#:=!]" contained
+syn match hapPerlSpecialMatch "(?[impsx]*\%(-[imsx]\+\)\=)" contained
+syn match hapPerlSpecialMatch "(?\%([-+]\=\d\+\|R\))" contained
+syn match hapPerlSpecialMatch "(?\%(&\|P[>=]\)\h\w*)" contained
+
+syn region hapOneRegexpIfUnless contained start=/\S/ end=/\(\ze\s\|$\)/ skip=/\\ / contains=hapPerlSpecialMatch nextgroup=hapIfUnless,@hapNothing skipwhite
+syn region hapRegSearchReplIfUnless contained start=/\S/ end=/\(\s\|$\)/ skip=/\\ / contains=hapPerlSpecialMatch nextgroup=hapRegReplIfUnless skipwhite
+syn region hapRegReplIfUnless contained start=/\S/ end=/$/ contains=hapComment,hapEscape,hapPerlSpecialMatch nextgroup=hapIfUnless skipwhite
+syn region hapRegexpBE contained start=/\S/ end=/\(\s\|$\)/ skip=/\\ / contains=hapPerlSpecialMatch nextgroup=hapSectLabel skipwhite
+
+"
+" http-request
+"
+" http-request verbs that don't allow parameters
+syn keyword hapHttpRequestVerb allow tarpit silent-drop contained skipwhite nextgroup=hapHttpIfUnless
+" http-request verbs with optional parameters
+syn keyword hapHttpRequestVerb auth deny contained skipwhite nextgroup=hapHttpIfUnless,hapHttpRequestParam
+" http-request verbs with required parameters
+syn keyword hapHttpRequestVerb redirect add-header set-header capture contained skipwhite nextgroup=hapHttpRequestParam
+syn keyword hapHttpRequestVerb del-header set-nice set-log-level replace-header contained skipwhite nextgroup=hapHttpRequestParam
+syn keyword hapHttpRequestVerb replace-value set-method set-path set-query contained skipwhite nextgroup=hapHttpRequestParam
+syn keyword hapHttpRequestVerb set-uri set-tos set-mark contained skipwhite nextgroup=hapHttpRequestParam
+" http-request verbs with both parenthetical arguments and required parameters
+syn match hapHttpRequestVerb /\(add-acl\|del-acl\|del-map\|set-map\)([^)]*)/ contained skipwhite nextgroup=hapHttpRequestParam
+syn match hapHttpRequestVerb /\(set-var\|unset-var\)([^)]*)/ contained skipwhite nextgroup=hapHttpRequestParam
+syn match hapHttpRequestVerb /\(sc-inc-gpc0\|sc-set-gpt0\)([^)]*)/ contained skipwhite nextgroup=hapHttpRequestParam
+" http-request verbs with parenthetical arguments, but without parameters
+syn match hapHttpRequestVerb /\(unset-var\|sc-inc-gpc0\)([^)]*)/ contained skipwhite nextgroup=hapHttpIfUnless
+
+" Listed first because we want to match this rather than hapHttpRequestParam,
+" which can be just about anything (including these two keywords). 'keyword'
+" is actually higher priority inside the highlighter, but we'll play it extra
+" safe by doing this ordering trick, too.
+syn keyword hapIfUnless if unless contained skipwhite nextgroup=hapIfUnlessCond
+
+" A little bit of fancy footwork here, because we want to match the log-format
+" parameters inside of the string separately.
+syn match hapHttpRequestParam /|S\+/ contained skipwhite nextgroup=hapIfUnless,hapHttpRequestParam transparent
+syn match hapHttpLogFormatStr /%\[[^][]\+\]/ contained containedin=hapHttpRequestParam
+syn match hapHttpLogFormatErr /%\(\[[^][]\+\]\)\@!.*/ contained containedin=hapHttpRequestParam
+syn match hapHttpRequestParamLiteral /[^%]\+/ contained containedin=hapHttpRequestParam
+
+
+" Define the default highlighting.
+" For version 5.7 and earlier: only when not done already
+" For version 5.8 and later: only when an item doesn't have highlighting yet
+if version < 508
+ command -nargs=+ HiLink hi link <args>
+else
+ command -nargs=+ HiLink hi def link <args>
+endif
+
+HiLink hapError Error
+HiLink hapNothingErr hapError
+HiLink hapEscape SpecialChar
+HiLink hapComment Comment
+HiLink hapGreedyComment Comment
+HiLink hapTodo Todo
+HiLink hapSection Underlined
+HiLink hapSectLabel Identifier
+HiLink hapParam Keyword
+HiLink hapSSLCiphers String
+HiLink hapSSLCiphersError Error
+HiLink hapTimeoutType hapParam
+
+HiLink hapOneRegexpIfUnless String
+HiLink hapTwoRegexpsIfUnless hapRegexp
+HiLink hapRegReplIfUnless hapRegexp
+HiLink hapRegexpBE hapRegexp
+HiLink hapPerlSpecialMatch Special
+HiLink hapFilePath String
+HiLink hapURI String
+HiLink hapAbsURI hapURI
+HiLink hapIp1 Number
+HiLink hapIp2 hapIp1
+HiLink hapLogIp hapIp1
+HiLink hapIpPort hapIp1
+HiLink hapIPv4Mask hapIp1
+HiLink hapServerAd hapIp1
+HiLink hapStatus Number
+HiLink hapStatusPath hapStatus
+HiLink hapStatusURI hapStatus
+HiLink hapNumber Number
+HiLink hapNumberMS hapNumber
+HiLink hapNumberSec hapNumber
+
+HiLink hapAclName Identifier
+HiLink hapAclCriterion String
+HiLink hapAclConverterOrNothing Special
+HiLink hapAclFlag Special
+HiLink hapAclFlagWithParameter Special
+HiLink hapAclFlagParameter String
+HiLink hapAclOperator Operator
+HiLink hapAclPattern String
+
+HiLink hapHttpRequestVerb Operator
+HiLink hapIfUnless Operator
+HiLink hapHttpRequestParamLiteral String
+HiLink hapHttpLogFormatStr Special
+HiLink hapHttpLogFormatErr Error
+
+HiLink hapOption Operator
+HiLink hapAppSess hapOption
+HiLink hapBalance hapOption
+HiLink hapCapture hapOption
+HiLink hapCookieKey hapOption
+HiLink hapHeader hapOption
+HiLink hapGLog hapOption
+HiLink hapLogFac hapOption
+HiLink hapLogLvl hapOption
+HiLink hapMode hapOption
+HiLink hapStats hapOption
+HiLink hapLen hapOption
+HiLink hapSrvKey hapOption
+
+
+delcommand HiLink
+
+let b:current_syntax = "haproxy"
+" vim: ts=8
+
+endif