3 Parses ssh client configuration
5 Author: Jiri Suchomel <jsuchome@suse.cz>
11 This file is licensed under the GPL.
14 Sample usage of this lens in augtool
17 augtool> set /files/etc/ssh/ssh_config/Host example.com
18 augtool> set /files/etc/ssh/ssh_config/Host[.='example.com']/RemoteForward/machine1:1234 machine2:5678
19 augtool> set /files/etc/ssh/ssh_config/Host[.='example.com']/Ciphers/1 aes128-ctr
20 augtool> set /files/etc/ssh/ssh_config/Host[.='example.com']/Ciphers/2 aes192-ctr
28 (************************************************************************
29 * Group: USEFUL PRIMITIVES
30 *************************************************************************)
33 let spc = Util.del_ws_spc
35 let comment = Util.comment
36 let empty = Util.empty
37 let comma = Util.del_str ","
38 let indent = Util.indent
39 let value_to_eol = store Rx.space_in
40 let value_to_spc = store Rx.no_spaces
41 let value_to_comma = store /[^, \t\r\n]+/
44 (************************************************************************
46 *************************************************************************)
48 let array_entry (k:regexp) =
49 [ indent . key k . counter "array_entry"
50 . [ spc . seq "array_entry" . value_to_spc]* . eol ]
52 let commas_entry (k:regexp) =
53 let value = [ seq "commas_entry" . value_to_comma]
54 in [ key k . counter "commas_entry" . spc .
55 Build.opt_list value comma . eol ]
57 let fw_entry (k:regexp) = [ indent . key k . spc .
58 [ key /[^ \t\r\n\/]+/ . spc . value_to_eol . eol ]]
60 let send_env = array_entry /SendEnv/i
62 let proxy_command = [ indent . key /ProxyCommand/i . spc . value_to_eol . eol ]
64 let remote_fw = fw_entry /RemoteForward/i
65 let local_fw = fw_entry /LocalForward/i
67 let ciphers = commas_entry /Ciphers/i
68 let macs = commas_entry /MACs/i
70 let special_entry = send_env
77 let key_re = /[A-Za-z0-9]+/
78 - /SendEnv|Host|ProxyCommand|RemoteForward|LocalForward|MACs|Ciphers/i
81 let other_entry = [ indent . key key_re
82 . spc . value_to_spc . eol ]
84 let entry = comment | empty
88 let host = [ key /Host/i . spc . value_to_eol . eol . entry* ]
91 (************************************************************************
93 *************************************************************************)
95 let lns = entry* . host*
97 let xfm = transform lns (incl "/etc/ssh/ssh_config" .
98 incl (Sys.getenv("HOME") . "/.ssh/config"))