hocho 0.3.0 → 0.3.5
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/README.md +15 -1
- data/hocho.gemspec +3 -3
- data/lib/hocho/drivers/mitamae.rb +1 -1
- data/lib/hocho/drivers/ssh_base.rb +10 -4
- data/lib/hocho/host.rb +27 -2
- data/lib/hocho/property_providers/ruby_script.rb +27 -0
- data/lib/hocho/version.rb +1 -1
- metadata +14 -13
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 2f61962a1136d9599c8cecf5befa6700f5ae547847a2b38e3a4a3aaeba849438
         | 
| 4 | 
            +
              data.tar.gz: ed1d9cb144c79c3589ecfef262d45e367c35c109d7d4280233e64e2f844dbe6a
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: c057b7c3a289dfbc0a9dac7bf294cec8807af1d26744ff098f76b963df4626763eabeec0a7482c0186c09c99656b5bbfdbbfea92ec7c2c4cdfa93f42149c4c25
         | 
| 7 | 
            +
              data.tar.gz: 7423407b1f272b38ba82c31041e3010206a71f05c1d2b07a3dea40c9a49cf58ecc2b16473d3d07aa0fe648d2aadc6fdad59c299038c22840cefed169d8d9cdca
         | 
    
        data/README.md
    CHANGED
    
    | @@ -27,18 +27,30 @@ Or install it yourself as: | |
| 27 27 |  | 
| 28 28 | 
             
                $ gem install hocho
         | 
| 29 29 |  | 
| 30 | 
            -
            ##  | 
| 30 | 
            +
            ## Usage
         | 
| 31 31 |  | 
| 32 32 | 
             
            ``` yaml
         | 
| 33 33 | 
             
            # hocho.yml
         | 
| 34 34 | 
             
            inventory_providers:
         | 
| 35 35 | 
             
              file:
         | 
| 36 36 | 
             
                path: './hosts'
         | 
| 37 | 
            +
             | 
| 37 38 | 
             
            property_providers:
         | 
| 39 | 
            +
              ## Provide default values to host properties (reverse_merge).
         | 
| 38 40 | 
             
              - add_default:
         | 
| 39 41 | 
             
                  properties:
         | 
| 40 42 | 
             
                    blah: blahblah
         | 
| 41 43 | 
             
                    # preferred_driver: mitamae
         | 
| 44 | 
            +
                    attributes:
         | 
| 45 | 
            +
                      node_attributes_goes_here: hello
         | 
| 46 | 
            +
             | 
| 47 | 
            +
              ## Run ruby script to mutate host properties
         | 
| 48 | 
            +
              - ruby_script:
         | 
| 49 | 
            +
                  name: name-for-your-convenience # optional
         | 
| 50 | 
            +
                  script: 'host.properties[:hello] = Time.now.xmlschema'
         | 
| 51 | 
            +
                ## or 
         | 
| 52 | 
            +
                # file: path/to/script.rb
         | 
| 53 | 
            +
             | 
| 42 54 | 
             
            # driver_options:
         | 
| 43 55 | 
             
            #   mitamae:
         | 
| 44 56 | 
             
            #     mitamae_prepare_script: 'wget -O /usr/local/bin/mitamae https://...'
         | 
| @@ -52,6 +64,8 @@ test.example.org: | |
| 52 64 | 
             
              properties:
         | 
| 53 65 | 
             
                # preferred_driver: bundler
         | 
| 54 66 | 
             
                # preferred_driver: mitamae
         | 
| 67 | 
            +
                attributes:
         | 
| 68 | 
            +
                  node_attributes_goes_here: hello
         | 
| 55 69 | 
             
                run_list:
         | 
| 56 70 | 
             
                  - roles/app/default.rb
         | 
| 57 71 | 
             
            ```
         | 
    
        data/hocho.gemspec
    CHANGED
    
    | @@ -20,10 +20,10 @@ Gem::Specification.new do |spec| | |
| 20 20 |  | 
| 21 21 | 
             
              spec.add_dependency "thor"
         | 
| 22 22 | 
             
              spec.add_dependency "itamae"
         | 
| 23 | 
            -
              spec.add_dependency "net-ssh"
         | 
| 23 | 
            +
              spec.add_dependency "net-ssh", ">= 4.1.0"
         | 
| 24 24 | 
             
              spec.add_dependency "hashie"
         | 
| 25 25 |  | 
| 26 | 
            -
              spec.add_development_dependency "bundler" | 
| 27 | 
            -
              spec.add_development_dependency "rake" | 
| 26 | 
            +
              spec.add_development_dependency "bundler"
         | 
| 27 | 
            +
              spec.add_development_dependency "rake"
         | 
| 28 28 | 
             
              spec.add_development_dependency "rspec"
         | 
| 29 29 | 
             
            end
         | 
| @@ -25,7 +25,7 @@ module Hocho | |
| 25 25 | 
             
                    exitstatus, _ = if @mitamae_path.start_with?('/')
         | 
| 26 26 | 
             
                      ssh_run("test -x #{@mitamae_path.shellescape}", error: false)
         | 
| 27 27 | 
             
                    else
         | 
| 28 | 
            -
                      ssh_run(" | 
| 28 | 
            +
                      ssh_run("#{@mitamae_path.shellescape} version 2>/dev/null >/dev/null", error: false)
         | 
| 29 29 | 
             
                    end
         | 
| 30 30 | 
             
                    exitstatus == 0
         | 
| 31 31 | 
             
                  end
         | 
| @@ -21,14 +21,15 @@ module Hocho | |
| 21 21 |  | 
| 22 22 | 
             
                    ssh_cmd = ['ssh', *host.openssh_config.flat_map { |l| ['-o', "\"#{l}\""] }].join(' ')
         | 
| 23 23 | 
             
                    shm_exclude = shm_prefix.map{ |_| "--exclude=#{_}" }
         | 
| 24 | 
            -
                     | 
| 24 | 
            +
                    compress = host.compress? ? ['-z'] : []
         | 
| 25 | 
            +
                    rsync_cmd = [*%w(rsync -a --copy-links --copy-unsafe-links --delete --exclude=.git), *compress, *shm_exclude, '--rsh', ssh_cmd, '.', "#{host.hostname}:#{host_basedir}"]
         | 
| 25 26 |  | 
| 26 27 | 
             
                    puts "=> $ #{rsync_cmd.shelljoin}"
         | 
| 27 28 | 
             
                    system(*rsync_cmd, chdir: base_dir) or raise 'failed to rsync'
         | 
| 28 29 |  | 
| 29 30 | 
             
                    unless shm_prefix.empty?
         | 
| 30 31 | 
             
                      shm_include = shm_prefix.map{ |_| "--include=#{_.sub(%r{/\z},'')}/***" }
         | 
| 31 | 
            -
                      rsync_cmd = [*%w(rsync - | 
| 32 | 
            +
                      rsync_cmd = [*%w(rsync -a --copy-links --copy-unsafe-links --delete), *compress, *shm_include, '--exclude=*', '--rsh', ssh_cmd, '.', "#{host.hostname}:#{host_shm_basedir}"]
         | 
| 32 33 | 
             
                      puts "=> $ #{rsync_cmd.shelljoin}"
         | 
| 33 34 | 
             
                      system(*rsync_cmd, chdir: base_dir) or raise 'failed to rsync'
         | 
| 34 35 | 
             
                      shm_prefix.each do |x|
         | 
| @@ -70,7 +71,12 @@ module Hocho | |
| 70 71 |  | 
| 71 72 | 
             
                    temporary_passphrase = SecureRandom.base64(129).chomp
         | 
| 72 73 |  | 
| 73 | 
            -
                     | 
| 74 | 
            +
                    local_supports_pbkdf2 = system(*%w(openssl enc -pbkdf2), in: File::NULL, out: File::NULL, err: [:child, :out])
         | 
| 75 | 
            +
                    remote_supports_pbkdf2 = begin
         | 
| 76 | 
            +
                                               exitstatus, * = ssh_run("openssl enc -pbkdf2", error: false, &:eof!)
         | 
| 77 | 
            +
                                               exitstatus == 0
         | 
| 78 | 
            +
                                             end
         | 
| 79 | 
            +
                    derive = local_supports_pbkdf2 && remote_supports_pbkdf2 ? %w(-pbkdf2) : []
         | 
| 74 80 |  | 
| 75 81 | 
             
                    encrypted_password = IO.pipe do |r,w|
         | 
| 76 82 | 
             
                      w.write temporary_passphrase
         | 
| @@ -88,7 +94,7 @@ module Hocho | |
| 88 94 | 
             
                      raise unless temp_executable.start_with?('/')
         | 
| 89 95 |  | 
| 90 96 | 
             
                      ssh_run("chmod 0700 #{temp_executable.shellescape}; cat > #{temp_executable.shellescape}; chmod +x #{temp_executable.shellescape}") do |ch|
         | 
| 91 | 
            -
                        ch.send_data("#!/bin/bash\nexec openssl enc -aes-128-cbc -d -a -md sha256 -pass env:#{passphrase_env_name} <<< #{encrypted_password.shellescape}\n")
         | 
| 97 | 
            +
                        ch.send_data("#!/bin/bash\nexec openssl enc -aes-128-cbc -d -a -md sha256 #{derive.shelljoin} -pass env:#{passphrase_env_name} <<< #{encrypted_password.shellescape}\n")
         | 
| 92 98 | 
             
                        ch.eof!
         | 
| 93 99 | 
             
                      end
         | 
| 94 100 |  | 
    
        data/lib/hocho/host.rb
    CHANGED
    
    | @@ -1,6 +1,7 @@ | |
| 1 1 | 
             
            require 'hocho/utils/symbolize'
         | 
| 2 2 | 
             
            require 'hashie'
         | 
| 3 3 | 
             
            require 'net/ssh'
         | 
| 4 | 
            +
            require 'net/ssh/proxy/jump'
         | 
| 4 5 | 
             
            require 'net/ssh/proxy/command'
         | 
| 5 6 |  | 
| 6 7 | 
             
            module Hocho
         | 
| @@ -150,6 +151,8 @@ module Hocho | |
| 150 151 | 
             
                     [["Port", value]]
         | 
| 151 152 | 
             
                    when :proxy
         | 
| 152 153 | 
             
                      case value
         | 
| 154 | 
            +
                      when Net::SSH::Proxy::Jump
         | 
| 155 | 
            +
                        [["ProxyJump", value.jump_proxies]]
         | 
| 153 156 | 
             
                      when Net::SSH::Proxy::Command
         | 
| 154 157 | 
             
                       [["ProxyCommand", value.command_line_template]]
         | 
| 155 158 | 
             
                      when false
         | 
| @@ -163,6 +166,17 @@ module Hocho | |
| 163 166 | 
             
                     [["User", value]]
         | 
| 164 167 | 
             
                    when :user_known_hosts_file
         | 
| 165 168 | 
             
                     [["UserKnownHostsFile", value]]
         | 
| 169 | 
            +
                    when :verify_host_key
         | 
| 170 | 
            +
                      case value
         | 
| 171 | 
            +
                      when :never
         | 
| 172 | 
            +
                        [["StrictHostKeyChecking", "no"]]
         | 
| 173 | 
            +
                      when :accept_new_or_local_tunnel
         | 
| 174 | 
            +
                        [["StrictHostKeyChecking", "accept-new"]]
         | 
| 175 | 
            +
                      when :accept_new
         | 
| 176 | 
            +
                        [["StrictHostKeyChecking", "accept-new"]]
         | 
| 177 | 
            +
                      when :always
         | 
| 178 | 
            +
                        [["StrictHostKeyChecking", "yes"]]
         | 
| 179 | 
            +
                      end
         | 
| 166 180 | 
             
                    end
         | 
| 167 181 | 
             
                  end.compact.map do |keyval|
         | 
| 168 182 | 
             
                    keyval.join(separator)
         | 
| @@ -195,9 +209,16 @@ module Hocho | |
| 195 209 |  | 
| 196 210 | 
             
                def make_ssh_connection
         | 
| 197 211 | 
             
                  alt = false
         | 
| 212 | 
            +
                  # A workaround for a bug on net-ssh: https://github.com/net-ssh/net-ssh/issues/764
         | 
| 213 | 
            +
                  # :strict_host_key_checking is translated from ssh config. However, Net::SSH.start does not accept
         | 
| 214 | 
            +
                  # the option as valid one. Remove this part when net-ssh fixes the bug.
         | 
| 215 | 
            +
                  options = ssh_options
         | 
| 216 | 
            +
                  unless Net::SSH::VALID_OPTIONS.include?(:strict_host_key_checking)
         | 
| 217 | 
            +
                    options.delete(:strict_host_key_checking)
         | 
| 218 | 
            +
                  end
         | 
| 198 219 | 
             
                  begin
         | 
| 199 | 
            -
                    Net::SSH.start(name, nil,  | 
| 200 | 
            -
                  rescue Net::SSH::Exception => e
         | 
| 220 | 
            +
                    Net::SSH.start(name, nil, options)
         | 
| 221 | 
            +
                  rescue Net::SSH::Exception, Errno::ECONNREFUSED, Net::SSH::Proxy::ConnectError => e
         | 
| 201 222 | 
             
                    raise if alt
         | 
| 202 223 | 
             
                    raise unless alternate_ssh_options_available?
         | 
| 203 224 | 
             
                    puts "[#{name}] Trying alternate_ssh_options due to #{e.inspect}"
         | 
| @@ -206,5 +227,9 @@ module Hocho | |
| 206 227 | 
             
                    retry
         | 
| 207 228 | 
             
                  end
         | 
| 208 229 | 
             
                end
         | 
| 230 | 
            +
             | 
| 231 | 
            +
                def compress?
         | 
| 232 | 
            +
                  properties.fetch(:compress, true)
         | 
| 233 | 
            +
                end
         | 
| 209 234 | 
             
              end
         | 
| 210 235 | 
             
            end
         | 
| @@ -0,0 +1,27 @@ | |
| 1 | 
            +
            module Hocho
         | 
| 2 | 
            +
              module PropertyProviders
         | 
| 3 | 
            +
                class RubyScript
         | 
| 4 | 
            +
                  def initialize(name: nil, script: nil, file: nil)
         | 
| 5 | 
            +
                    @template = case
         | 
| 6 | 
            +
                    when script
         | 
| 7 | 
            +
                      compile(script, "(#{name || 'ruby_script'})")
         | 
| 8 | 
            +
                    when file
         | 
| 9 | 
            +
                      compile(File.read(file), name ? "(#{name})" : file)
         | 
| 10 | 
            +
                    end
         | 
| 11 | 
            +
                  end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                  def determine(host)
         | 
| 14 | 
            +
                    @template.new(host).run
         | 
| 15 | 
            +
                    nil
         | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  private
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  Template = Struct.new(:host)
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                  def compile(script, name)
         | 
| 23 | 
            +
                    binding.eval("Class.new(Template) { def run;\n#{script}\nend; }", name, 0)
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
            end
         | 
    
        data/lib/hocho/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: hocho
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.3. | 
| 4 | 
            +
              version: 0.3.5
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - sorah (Shota Fukumori)
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2020-06-13 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: thor
         | 
| @@ -44,14 +44,14 @@ dependencies: | |
| 44 44 | 
             
                requirements:
         | 
| 45 45 | 
             
                - - ">="
         | 
| 46 46 | 
             
                  - !ruby/object:Gem::Version
         | 
| 47 | 
            -
                    version:  | 
| 47 | 
            +
                    version: 4.1.0
         | 
| 48 48 | 
             
              type: :runtime
         | 
| 49 49 | 
             
              prerelease: false
         | 
| 50 50 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 51 51 | 
             
                requirements:
         | 
| 52 52 | 
             
                - - ">="
         | 
| 53 53 | 
             
                  - !ruby/object:Gem::Version
         | 
| 54 | 
            -
                    version:  | 
| 54 | 
            +
                    version: 4.1.0
         | 
| 55 55 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 56 56 | 
             
              name: hashie
         | 
| 57 57 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -70,30 +70,30 @@ dependencies: | |
| 70 70 | 
             
              name: bundler
         | 
| 71 71 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 72 72 | 
             
                requirements:
         | 
| 73 | 
            -
                - - " | 
| 73 | 
            +
                - - ">="
         | 
| 74 74 | 
             
                  - !ruby/object:Gem::Version
         | 
| 75 | 
            -
                    version: ' | 
| 75 | 
            +
                    version: '0'
         | 
| 76 76 | 
             
              type: :development
         | 
| 77 77 | 
             
              prerelease: false
         | 
| 78 78 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 79 79 | 
             
                requirements:
         | 
| 80 | 
            -
                - - " | 
| 80 | 
            +
                - - ">="
         | 
| 81 81 | 
             
                  - !ruby/object:Gem::Version
         | 
| 82 | 
            -
                    version: ' | 
| 82 | 
            +
                    version: '0'
         | 
| 83 83 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 84 84 | 
             
              name: rake
         | 
| 85 85 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 86 86 | 
             
                requirements:
         | 
| 87 | 
            -
                - - " | 
| 87 | 
            +
                - - ">="
         | 
| 88 88 | 
             
                  - !ruby/object:Gem::Version
         | 
| 89 | 
            -
                    version: ' | 
| 89 | 
            +
                    version: '0'
         | 
| 90 90 | 
             
              type: :development
         | 
| 91 91 | 
             
              prerelease: false
         | 
| 92 92 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 93 93 | 
             
                requirements:
         | 
| 94 | 
            -
                - - " | 
| 94 | 
            +
                - - ">="
         | 
| 95 95 | 
             
                  - !ruby/object:Gem::Version
         | 
| 96 | 
            -
                    version: ' | 
| 96 | 
            +
                    version: '0'
         | 
| 97 97 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 98 98 | 
             
              name: rspec
         | 
| 99 99 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -142,6 +142,7 @@ files: | |
| 142 142 | 
             
            - lib/hocho/property_providers.rb
         | 
| 143 143 | 
             
            - lib/hocho/property_providers/add_default.rb
         | 
| 144 144 | 
             
            - lib/hocho/property_providers/base.rb
         | 
| 145 | 
            +
            - lib/hocho/property_providers/ruby_script.rb
         | 
| 145 146 | 
             
            - lib/hocho/runner.rb
         | 
| 146 147 | 
             
            - lib/hocho/utils/finder.rb
         | 
| 147 148 | 
             
            - lib/hocho/utils/symbolize.rb
         | 
| @@ -167,7 +168,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 167 168 | 
             
                - !ruby/object:Gem::Version
         | 
| 168 169 | 
             
                  version: '0'
         | 
| 169 170 | 
             
            requirements: []
         | 
| 170 | 
            -
            rubygems_version: 3. | 
| 171 | 
            +
            rubygems_version: 3.1.2
         | 
| 171 172 | 
             
            signing_key: 
         | 
| 172 173 | 
             
            specification_version: 4
         | 
| 173 174 | 
             
            summary: Server provisioning tool with itamae
         |