sconb 0.0.5 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
         
     |