let global_knownhosts_file = spaces_entry /GlobalKnownHostsFile/i
+ let rekey_limit = [ indent . key /RekeyLimit/i . spc_eq .
+ [ label "amount" . value_to_spc ] .
+ [ spc . label "duration" . value_to_spc ]? . eol ]
+
let special_entry = send_env
| proxy_command
| remote_fw
| ciphers
| algorithms
| pubkey_accepted_key_types
- | global_knownhosts_file
+ | global_knownhosts_file
+ | rekey_limit
let key_re = /[A-Za-z0-9]+/
- - /SendEnv|Host|ProxyCommand|RemoteForward|LocalForward|MACs|Ciphers|(HostKey|Kex)Algorithms|PubkeyAcceptedKeyTypes|GlobalKnownHostsFile/i
+ - /SendEnv|Host|Match|ProxyCommand|RemoteForward|LocalForward|MACs|Ciphers|(HostKey|Kex)Algorithms|PubkeyAcceptedKeyTypes|GlobalKnownHostsFile|RekeyLimit/i
let other_entry = [ indent . key key_re
let host = [ key /Host/i . spc . value_to_eol . eol . entry* ]
+ let condition_entry =
+ let k = /[A-Za-z0-9]+/ in
+ let no_spc = Quote.do_dquote_opt (store /[^"' \t\r\n=]+/) in
+ let with_spc = Quote.do_quote (store /[^"'\t\r\n]* [^"'\t\r\n]*/) in
+ [ spc . key k . spc . no_spc ]
+ | [ spc . key k . spc . with_spc ]
+
+ let match_cond =
+ [ label "Condition" . condition_entry+ . eol ]
+
+ let match_entry = entry
+
+ let match =
+ [ key /Match/i . match_cond
+ . [ label "Settings" . match_entry+ ]
+ ]
+
+
(************************************************************************
* Group: LENS
*************************************************************************)
- let lns = entry* . host*
+ let lns = entry* . (host | match)*
let xfm = transform lns (incl "/etc/ssh/ssh_config" .
incl (Sys.getenv("HOME") . "/.ssh/config") .