sconb 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/sconb/version.rb +1 -1
- data/lib/sconb.rb +40 -19
- data/spec/config_test_multi +4 -1
- data/spec/sconb_spec.rb +11 -0
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5c5e18b93db4b66082d25aa8c270858e572d6bd5
|
4
|
+
data.tar.gz: 50eb6adc5e2756f97797b33b898ea70e5f570fa4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2221bdfc63d7912663c82af6181fd0951d4aeff590a6c88b14c1e9e1feb34417af493667f650490ec446502037dfd39563ec78f38529faecb7d8b6127c0b966c
|
7
|
+
data.tar.gz: f25ff865d164c8b821385e54376f108a9a6baed156e1fcb66ae42629d29399391719a360eac5fb2a12b4487c59e8fb2ece143ecdfa23d6aa97e1f7a673d63cf3
|
data/lib/sconb/version.rb
CHANGED
data/lib/sconb.rb
CHANGED
@@ -2,6 +2,7 @@ require "sconb/version"
|
|
2
2
|
require "thor"
|
3
3
|
require "net/ssh"
|
4
4
|
require "json"
|
5
|
+
require "pp"
|
5
6
|
|
6
7
|
module Sconb
|
7
8
|
class CLI < Thor
|
@@ -14,12 +15,12 @@ module Sconb
|
|
14
15
|
file = File.expand_path(path)
|
15
16
|
configs = {}
|
16
17
|
unless File.readable?(file)
|
17
|
-
puts configs
|
18
|
+
puts configs
|
18
19
|
return
|
19
20
|
end
|
20
|
-
|
21
|
+
|
21
22
|
allconfig = config_load(path, '*')
|
22
|
-
configs['*'] = allconfig unless allconfig.size
|
23
|
+
configs['*'] = allconfig unless allconfig.size <= 1
|
23
24
|
IO.foreach(file) do |line|
|
24
25
|
next if line =~ /^\s*(?:#.*)?$/
|
25
26
|
if line =~ /^\s*(\S+)\s*=(.*)$/
|
@@ -28,23 +29,32 @@ module Sconb
|
|
28
29
|
key, value = line.strip.split(/\s+/, 2)
|
29
30
|
end
|
30
31
|
next if value.nil?
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
32
|
+
|
33
|
+
# Host
|
34
|
+
if key.downcase == 'host'
|
35
|
+
negative_hosts, positive_hosts = value.to_s.split(/\s+/).partition { |h| h.start_with?('!') }
|
36
|
+
positive_hosts.each do | host |
|
37
|
+
next if host == '*'
|
38
|
+
config = config_load(path, host)
|
39
|
+
|
40
|
+
allconfig.each do |key, value|
|
41
|
+
next unless config.key? key
|
42
|
+
config.delete key if config[key] == allconfig[key]
|
43
|
+
end
|
44
|
+
|
45
|
+
configs[host] = config
|
40
46
|
end
|
47
|
+
end
|
41
48
|
|
42
|
-
|
49
|
+
# Match
|
50
|
+
if key.downcase == 'match'
|
51
|
+
configs[key + ' ' + value] = config_load(path, value)
|
43
52
|
end
|
53
|
+
|
44
54
|
end
|
45
55
|
puts JSON.pretty_generate configs
|
46
56
|
end
|
47
|
-
|
57
|
+
|
48
58
|
desc "restore < dump.json > .ssh/config", "Restore .ssh/config from JSON"
|
49
59
|
def restore()
|
50
60
|
ssh_configs = []
|
@@ -52,9 +62,13 @@ module Sconb
|
|
52
62
|
configs = JSON.parse(json)
|
53
63
|
configs.each do |host, config|
|
54
64
|
ssh_config = ''
|
55
|
-
|
65
|
+
unless host.match(/^Match /)
|
66
|
+
ssh_config << 'Host ' + host + "\n"
|
67
|
+
else
|
68
|
+
ssh_config << host + "\n"
|
69
|
+
end
|
56
70
|
config.each do |key, value|
|
57
|
-
next if key.downcase == 'host' || key.downcase == 'identityfilecontent'
|
71
|
+
next if key.downcase == 'host' || key.downcase == 'match' || key.downcase == 'identityfilecontent'
|
58
72
|
if key.downcase == 'identityfile'
|
59
73
|
value.each_with_index do |keyfile,i|
|
60
74
|
ssh_config << ' ' + key + ' ' + keyfile + "\n"
|
@@ -103,7 +117,7 @@ module Sconb
|
|
103
117
|
settings = {}
|
104
118
|
file = File.expand_path(path)
|
105
119
|
return settings unless File.readable?(file)
|
106
|
-
|
120
|
+
|
107
121
|
globals = {}
|
108
122
|
matched_host = nil
|
109
123
|
multi_host = []
|
@@ -136,9 +150,16 @@ module Sconb
|
|
136
150
|
else
|
137
151
|
matched_host = positive_hosts.select { |h| host =~ pattern2regex(h) }.first
|
138
152
|
end
|
139
|
-
|
153
|
+
settings[key] = host unless matched_host.nil?
|
154
|
+
seen_host = true
|
155
|
+
elsif key.downcase == 'match'
|
156
|
+
if host == value
|
157
|
+
matched_host = true
|
158
|
+
else
|
159
|
+
matched_host = nil
|
160
|
+
end
|
161
|
+
settings[key] = host unless matched_host.nil?
|
140
162
|
seen_host = true
|
141
|
-
settings[key] = host
|
142
163
|
elsif !seen_host
|
143
164
|
if key.downcase == 'identityfile'
|
144
165
|
(globals[key] ||= []) << value
|
data/spec/config_test_multi
CHANGED
@@ -6,10 +6,13 @@ Host github.com
|
|
6
6
|
TCPKeepAlive yes
|
7
7
|
IdentitiesOnly yes
|
8
8
|
|
9
|
+
Match exec "nmcli connection status id <ap-name> 2> /dev/null"
|
10
|
+
ProxyCommand ssh -W %h:%p github.com
|
11
|
+
|
9
12
|
Host gist
|
10
13
|
User git
|
11
14
|
Port 22
|
12
15
|
Hostname gist.github.com
|
13
16
|
IdentityFile spec/github_rsa
|
14
17
|
TCPKeepAlive yes
|
15
|
-
IdentitiesOnly yes
|
18
|
+
IdentitiesOnly yes
|
data/spec/sconb_spec.rb
CHANGED
@@ -40,6 +40,10 @@ OUT
|
|
40
40
|
"TCPKeepAlive": "yes",
|
41
41
|
"IdentitiesOnly": "yes"
|
42
42
|
},
|
43
|
+
"Match exec \\"nmcli connection status id <ap-name> 2> /dev/null\\"": {
|
44
|
+
"Match": "exec \\"nmcli connection status id <ap-name> 2> /dev/null\\"",
|
45
|
+
"ProxyCommand": "ssh -W %h:%p github.com"
|
46
|
+
},
|
43
47
|
"gist": {
|
44
48
|
"Host": "gist",
|
45
49
|
"User": "git",
|
@@ -111,6 +115,10 @@ OUT
|
|
111
115
|
],
|
112
116
|
"TCPKeepAlive": "yes",
|
113
117
|
"IdentitiesOnly": "yes"
|
118
|
+
},
|
119
|
+
"Match exec \\"nmcli connection status id <ap-name> 2> /dev/null\\"": {
|
120
|
+
"Match": "exec \\"nmcli connection status id <ap-name> 2> /dev/null\\"",
|
121
|
+
"ProxyCommand": "ssh -W %h:%p github.com"
|
114
122
|
}
|
115
123
|
}
|
116
124
|
INN
|
@@ -135,6 +143,9 @@ Host gist
|
|
135
143
|
IdentityFile spec/github_rsa
|
136
144
|
TCPKeepAlive yes
|
137
145
|
IdentitiesOnly yes
|
146
|
+
|
147
|
+
Match exec "nmcli connection status id <ap-name> 2> /dev/null"
|
148
|
+
ProxyCommand ssh -W %h:%p github.com
|
138
149
|
OUT
|
139
150
|
end
|
140
151
|
end
|