kanrisuru 0.10.0 → 0.12.1
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/.github/CONTRIBUTING.md +9 -9
- data/.github/ISSUE_TEMPLATE/bug_report.md +7 -8
- data/.rspec +1 -1
- data/CHANGELOG.md +127 -102
- data/CODE_OF_CONDUCT.md +10 -10
- data/README.md +19 -90
- data/kanrisuru.gemspec +2 -1
- data/lib/kanrisuru/command.rb +7 -0
- data/lib/kanrisuru/core/archive.rb +11 -35
- data/lib/kanrisuru/core/disk.rb +0 -3
- data/lib/kanrisuru/core/dmi.rb +1 -1
- data/lib/kanrisuru/core/file.rb +4 -11
- data/lib/kanrisuru/core/find.rb +6 -11
- data/lib/kanrisuru/core/mount.rb +14 -15
- data/lib/kanrisuru/core/socket.rb +2 -1
- data/lib/kanrisuru/core/stream.rb +1 -2
- data/lib/kanrisuru/core/zypper.rb +6 -23
- data/lib/kanrisuru/os_package/collection.rb +58 -0
- data/lib/kanrisuru/os_package/define.rb +34 -0
- data/lib/kanrisuru/os_package/include.rb +163 -0
- data/lib/kanrisuru/os_package.rb +3 -245
- data/lib/kanrisuru/remote/cpu.rb +5 -1
- data/lib/kanrisuru/remote/fstab.rb +5 -5
- data/lib/kanrisuru/result.rb +5 -4
- data/lib/kanrisuru/util.rb +1 -1
- data/lib/kanrisuru/version.rb +1 -1
- data/spec/functional/core/apt_spec.rb +22 -30
- data/spec/functional/core/archive_spec.rb +96 -120
- data/spec/functional/core/find_spec.rb +94 -113
- data/spec/functional/core/mount_spec.rb +121 -0
- data/spec/functional/core/socket_spec.rb +23 -28
- data/spec/functional/core/stream_spec.rb +12 -12
- data/spec/functional/core/transfer_spec.rb +108 -131
- data/spec/functional/core/yum_spec.rb +58 -83
- data/spec/functional/remote/cluster_spec.rb +11 -2
- data/spec/functional/remote/cpu_spec.rb +104 -0
- data/spec/functional/remote/env_spec.rb +3 -5
- data/spec/helper/stub_network.rb +35 -16
- data/spec/helper/test_hosts.rb +11 -1
- data/spec/integration/core/apt_spec.rb +2 -3
- data/spec/integration/core/archive_spec.rb +8 -13
- data/spec/integration/core/disk_spec.rb +2 -3
- data/spec/integration/core/dmi_spec.rb +2 -3
- data/spec/integration/core/file_spec.rb +4 -14
- data/spec/integration/core/find_spec.rb +3 -3
- data/spec/integration/core/group_spec.rb +2 -3
- data/spec/integration/core/ip_spec.rb +2 -3
- data/spec/integration/core/path_spec.rb +2 -3
- data/spec/integration/core/socket_spec.rb +2 -4
- data/spec/integration/core/stat_spec.rb +2 -3
- data/spec/integration/core/stream_spec.rb +6 -9
- data/spec/integration/core/system_spec.rb +2 -4
- data/spec/integration/core/transfer_spec.rb +4 -9
- data/spec/integration/core/user_spec.rb +2 -4
- data/spec/integration/core/yum_spec.rb +2 -3
- data/spec/integration/core/zypper_spec.rb +5 -6
- data/spec/integration/remote/cpu_spec.rb +2 -3
- data/spec/integration/remote/env_spec.rb +2 -3
- data/spec/integration/remote/fstab_spec.rb +2 -3
- data/spec/integration/remote/host_spec.rb +2 -3
- data/spec/integration/remote/memory_spec.rb +2 -2
- data/spec/integration/remote/os_spec.rb +2 -3
- data/spec/integration/remote/remote_file_spec.rb +9 -15
- data/spec/spec_helper.rb +12 -3
- data/spec/unit/command_spec.rb +19 -1
- data/spec/unit/core/find_spec.rb +1 -1
- data/spec/unit/core/yum_spec.rb +1 -1
- data/spec/unit/mode_spec.rb +2 -2
- data/spec/unit/remote/cluster_spec.rb +3 -1
- data/spec/unit/remote/cpu_spec.rb +1 -2
- data/spec/unit/remote/env_spec.rb +1 -3
- data/spec/unit/util_spec.rb +13 -0
- metadata +23 -4
| @@ -0,0 +1,104 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'spec_helper'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            RSpec.describe Kanrisuru::Remote::Cpu do
         | 
| 6 | 
            +
              before(:all) do
         | 
| 7 | 
            +
                StubNetwork.stub!
         | 
| 8 | 
            +
              end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              after(:all) do
         | 
| 11 | 
            +
                StubNetwork.unstub!
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              context 'with metal' do
         | 
| 15 | 
            +
                let(:host) do
         | 
| 16 | 
            +
                  Kanrisuru::Remote::Host.new(
         | 
| 17 | 
            +
                    host: 'metal-host',
         | 
| 18 | 
            +
                    username: 'ubuntu',
         | 
| 19 | 
            +
                    keys: ['id_rsa']
         | 
| 20 | 
            +
                  )
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                before do
         | 
| 24 | 
            +
                  StubNetwork.stub_command!(:lscpu) do |_args|
         | 
| 25 | 
            +
                    struct = Kanrisuru::Core::System::CPUArchitecture.new
         | 
| 26 | 
            +
                    struct.architecture = 'x86_64'
         | 
| 27 | 
            +
                    struct.cores = 48
         | 
| 28 | 
            +
                    struct.byte_order = 'Little Endian'
         | 
| 29 | 
            +
                    struct.address_sizes = ['46 bits physical', '48 bits virtual']
         | 
| 30 | 
            +
                    struct.operation_modes = %w[32-bit 64-bit]
         | 
| 31 | 
            +
                    struct.online_cpus = 0
         | 
| 32 | 
            +
                    struct.threads_per_core = 2
         | 
| 33 | 
            +
                    struct.cores_per_socket = 12
         | 
| 34 | 
            +
                    struct.sockets = 2
         | 
| 35 | 
            +
                    struct.numa_mode = nil
         | 
| 36 | 
            +
                    struct.vendor_id = 'GenuineIntel'
         | 
| 37 | 
            +
                    struct.cpu_family = 6
         | 
| 38 | 
            +
                    struct.model = 63
         | 
| 39 | 
            +
                    struct.model_name = 'Intel(R) Xeon(R) CPU E5-2680 v3 @ 2.50GHz'
         | 
| 40 | 
            +
                    struct.stepping = 2
         | 
| 41 | 
            +
                    struct.cpu_mhz = 1200.16
         | 
| 42 | 
            +
                    struct.cpu_max_mhz = 3300.0
         | 
| 43 | 
            +
                    struct.cpu_min_mhz = 1200.0
         | 
| 44 | 
            +
                    struct.bogo_mips = nil
         | 
| 45 | 
            +
                    struct.virtualization = 'VT-x'
         | 
| 46 | 
            +
                    struct.hypervisor_vendor = nil
         | 
| 47 | 
            +
                    struct.virtualization_type = nil
         | 
| 48 | 
            +
                    struct.l1d_cache = '768 KiB'
         | 
| 49 | 
            +
                    struct.l1i_cache = '768 KiB'
         | 
| 50 | 
            +
                    struct.l2_cache = '6 MiB'
         | 
| 51 | 
            +
                    struct.l3_cache = '60 MiB'
         | 
| 52 | 
            +
                    struct.numa_nodes = 2
         | 
| 53 | 
            +
                    struct.vulnerabilities = [
         | 
| 54 | 
            +
                      Kanrisuru::Core::System::CPUArchitectureVulnerability.new('Itlb multihit',
         | 
| 55 | 
            +
                                                                                'KVM: Mitigation: Split huge pages'),
         | 
| 56 | 
            +
                      Kanrisuru::Core::System::CPUArchitectureVulnerability.new('L1tf',
         | 
| 57 | 
            +
                                                                                'Mitigation; PTE Inversion; VMX conditional cache flushes, SMT vulnerable'),
         | 
| 58 | 
            +
                      Kanrisuru::Core::System::CPUArchitectureVulnerability.new('Mds',
         | 
| 59 | 
            +
                                                                                'Mitigation; Clear CPU buffers; SMT vulnerable'),
         | 
| 60 | 
            +
                      Kanrisuru::Core::System::CPUArchitectureVulnerability.new('Meltdown', 'Mitigation; PTI'),
         | 
| 61 | 
            +
                      Kanrisuru::Core::System::CPUArchitectureVulnerability.new('Spec store bypass',
         | 
| 62 | 
            +
                                                                                'Mitigation; Speculative Store Bypass disabled via prctl and seccomp'),
         | 
| 63 | 
            +
                      Kanrisuru::Core::System::CPUArchitectureVulnerability.new('Spectre v1',
         | 
| 64 | 
            +
                                                                                'Mitigation; usercopy/swapgs barriers and __user pointer sanitization'),
         | 
| 65 | 
            +
                      Kanrisuru::Core::System::CPUArchitectureVulnerability.new('Spectre v2',
         | 
| 66 | 
            +
                                                                                'Mitigation; Full generic retpoline, IBPB conditional, IBRS_FW, STIBP conditional, RSB filling'),
         | 
| 67 | 
            +
                      Kanrisuru::Core::System::CPUArchitectureVulnerability.new('Srbds', 'Not affected'),
         | 
| 68 | 
            +
                      Kanrisuru::Core::System::CPUArchitectureVulnerability.new('Tsx async abort', 'Not affected')
         | 
| 69 | 
            +
                    ]
         | 
| 70 | 
            +
                    struct.flags = %w[fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge
         | 
| 71 | 
            +
                                      mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm cpuid_fault epb invpcid_single pti intel_ppin ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm xsaveopt cqm_llc cqm_occup_llc dtherm ida arat pln pts md_clear flush_l1d]
         | 
| 72 | 
            +
                    struct
         | 
| 73 | 
            +
                  end
         | 
| 74 | 
            +
                end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                after do
         | 
| 77 | 
            +
                  StubNetwork.unstub_command!(:lscpu)
         | 
| 78 | 
            +
                end
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                it 'gets host cpu attributes' do
         | 
| 81 | 
            +
                  expect(host.cpu.architecture).to eq('x86_64')
         | 
| 82 | 
            +
                  expect(host.cpu.cores).to eq(48)
         | 
| 83 | 
            +
                  expect(host.cpu.byte_order).to eq('Little Endian')
         | 
| 84 | 
            +
                  expect(host.cpu.address_sizes).to eq(['46 bits physical', '48 bits virtual'])
         | 
| 85 | 
            +
                  expect(host.cpu.threads_per_core).to eq(2)
         | 
| 86 | 
            +
                  expect(host.cpu.cores_per_socket).to eq(12)
         | 
| 87 | 
            +
                  expect(host.cpu.sockets).to eq(2)
         | 
| 88 | 
            +
                  expect(host.cpu.vendor_id).to eq('GenuineIntel')
         | 
| 89 | 
            +
                  expect(host.cpu.cpu_family).to eq(6)
         | 
| 90 | 
            +
                  expect(host.cpu.model).to eq(63)
         | 
| 91 | 
            +
                  expect(host.cpu.model_name).to eq('Intel(R) Xeon(R) CPU E5-2680 v3 @ 2.50GHz')
         | 
| 92 | 
            +
                  expect(host.cpu.cpu_mhz).to eq(1200.16)
         | 
| 93 | 
            +
                  expect(host.cpu.cpu_max_mhz).to eq(3300.0)
         | 
| 94 | 
            +
                  expect(host.cpu.cpu_min_mhz).to eq(1200.0)
         | 
| 95 | 
            +
                  expect(host.cpu.hypervisor).to be_nil
         | 
| 96 | 
            +
                  expect(host.cpu.virtualization_type).to be_nil
         | 
| 97 | 
            +
                  # expect(host.cpu.l1d_cache).to eq("768 KiB")
         | 
| 98 | 
            +
                  # expect(host.cpu.l1i_cache).to eq("768 KiB")
         | 
| 99 | 
            +
                  # expect(host.cpu.l2_cache).to eq("6 MiB")
         | 
| 100 | 
            +
                  # expect(host.cpu.l3_cache).to eq("60 MiB")
         | 
| 101 | 
            +
                  expect(host.cpu.numa_nodes).to eq(2)
         | 
| 102 | 
            +
                end
         | 
| 103 | 
            +
              end
         | 
| 104 | 
            +
            end
         | 
| @@ -3,13 +3,12 @@ | |
| 3 3 | 
             
            require 'spec_helper'
         | 
| 4 4 |  | 
| 5 5 | 
             
            RSpec.describe Kanrisuru::Remote::Env do
         | 
| 6 | 
            -
             | 
| 7 | 
            -
              let (:env) { Kanrisuru::Remote::Env.new }
         | 
| 6 | 
            +
              let(:env) { described_class.new }
         | 
| 8 7 |  | 
| 9 8 | 
             
              it 'adds a environment variable' do
         | 
| 10 9 | 
             
                env['VAR1'] = 'hello'
         | 
| 11 10 | 
             
                expect(env.count).to eq(1)
         | 
| 12 | 
            -
                expect(env.to_h).to eq({'VAR1' => 'hello'})
         | 
| 11 | 
            +
                expect(env.to_h).to eq({ 'VAR1' => 'hello' })
         | 
| 13 12 | 
             
                expect(env.to_s).to eq('export VAR1=hello;')
         | 
| 14 13 | 
             
                expect(env['VAR1']).to eq('hello')
         | 
| 15 14 | 
             
              end
         | 
| @@ -19,7 +18,7 @@ RSpec.describe Kanrisuru::Remote::Env do | |
| 19 18 | 
             
                env['var2'] = 'world'
         | 
| 20 19 |  | 
| 21 20 | 
             
                expect(env.count).to eq(2)
         | 
| 22 | 
            -
                expect(env.to_h).to eq({'VAR1' => 'hello', 'VAR2' => 'world'})
         | 
| 21 | 
            +
                expect(env.to_h).to eq({ 'VAR1' => 'hello', 'VAR2' => 'world' })
         | 
| 23 22 | 
             
                expect(env.to_s).to eq('export VAR1=hello; export VAR2=world;')
         | 
| 24 23 | 
             
                expect(env['VAR1']).to eq('hello')
         | 
| 25 24 | 
             
                expect(env['VAR2']).to eq('world')
         | 
| @@ -46,5 +45,4 @@ RSpec.describe Kanrisuru::Remote::Env do | |
| 46 45 |  | 
| 47 46 | 
             
                expect(env.count).to eq(0)
         | 
| 48 47 | 
             
              end
         | 
| 49 | 
            -
             | 
| 50 48 | 
             
            end
         | 
    
        data/spec/helper/stub_network.rb
    CHANGED
    
    | @@ -17,7 +17,7 @@ class StubNetwork | |
| 17 17 |  | 
| 18 18 | 
             
                  unless Kanrisuru::Remote::Os.instance_methods(false).include?(:initialize_alias)
         | 
| 19 19 | 
             
                    Kanrisuru::Remote::Os.class_eval do
         | 
| 20 | 
            -
                      alias_method :initialize_alias, :initialize | 
| 20 | 
            +
                      alias_method :initialize_alias, :initialize
         | 
| 21 21 | 
             
                      define_method :initialize do |host|
         | 
| 22 22 | 
             
                        @host = host
         | 
| 23 23 |  | 
| @@ -32,25 +32,46 @@ class StubNetwork | |
| 32 32 | 
             
                    end
         | 
| 33 33 | 
             
                  end
         | 
| 34 34 |  | 
| 35 | 
            -
                   | 
| 36 | 
            -
                    Kanrisuru::Result.class_eval do
         | 
| 37 | 
            -
                      alias_method :initialize_alias, :initialize 
         | 
| 38 | 
            -
                      def initialize(command)
         | 
| 39 | 
            -
                        @command = command
         | 
| 40 | 
            -
                        @data = nil
         | 
| 35 | 
            +
                  return if Kanrisuru::Result.instance_methods(false).include?(:initialize_alias)
         | 
| 41 36 |  | 
| 42 | 
            -
             | 
| 37 | 
            +
                  Kanrisuru::Result.class_eval do
         | 
| 38 | 
            +
                    alias_method :initialize_alias, :initialize
         | 
| 39 | 
            +
                    def initialize(command, parse_result = false, &block)
         | 
| 40 | 
            +
                      @command = command
         | 
| 41 | 
            +
                      @data = nil
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                      @data = block.call(@command) if @command.success? && block_given? && parse_result
         | 
| 44 | 
            +
                      @error = @command.to_a if @command.failure?
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                      ## Define getter methods on result that maps to
         | 
| 47 | 
            +
                      ## the same methods of a data struct.
         | 
| 48 | 
            +
                      return unless @command.success? && Kanrisuru::Util.present?(@data) && @data.class.ancestors.include?(Struct)
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                      method_names = @data.members
         | 
| 51 | 
            +
                      self.class.class_eval do
         | 
| 52 | 
            +
                        method_names.each do |method_name|
         | 
| 53 | 
            +
                          define_method method_name do
         | 
| 54 | 
            +
                            @data[method_name]
         | 
| 55 | 
            +
                          end
         | 
| 56 | 
            +
                        end
         | 
| 43 57 | 
             
                      end
         | 
| 44 58 | 
             
                    end
         | 
| 45 59 | 
             
                  end
         | 
| 46 60 | 
             
                end
         | 
| 47 61 |  | 
| 48 | 
            -
                def stub_command!(method, &block)
         | 
| 62 | 
            +
                def stub_command!(method, opts = {}, &block)
         | 
| 49 63 | 
             
                  Kanrisuru::Remote::Host.class_eval do
         | 
| 50 64 | 
             
                    alias_method "#{method}_alias", method
         | 
| 51 65 |  | 
| 52 66 | 
             
                    define_method(method) do |*args|
         | 
| 53 | 
            -
                       | 
| 67 | 
            +
                      command = Kanrisuru::Command.new(method.to_s)
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                      status = opts[:status] || 0
         | 
| 70 | 
            +
                      command.handle_status(status)
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                      Kanrisuru::Result.new(command, true) do |_cmd|
         | 
| 73 | 
            +
                        block.call(args)
         | 
| 74 | 
            +
                      end
         | 
| 54 75 | 
             
                    end
         | 
| 55 76 | 
             
                  end
         | 
| 56 77 | 
             
                end
         | 
| @@ -67,11 +88,11 @@ class StubNetwork | |
| 67 88 | 
             
                  end
         | 
| 68 89 |  | 
| 69 90 | 
             
                  Kanrisuru::Remote::Os.class_eval do
         | 
| 70 | 
            -
                    alias_method :initialize, :initialize_alias | 
| 91 | 
            +
                    alias_method :initialize, :initialize_alias
         | 
| 71 92 | 
             
                  end
         | 
| 72 93 |  | 
| 73 94 | 
             
                  Kanrisuru::Result.class_eval do
         | 
| 74 | 
            -
                    alias_method :initialize, :initialize_alias | 
| 95 | 
            +
                    alias_method :initialize, :initialize_alias
         | 
| 75 96 | 
             
                  end
         | 
| 76 97 | 
             
                end
         | 
| 77 98 |  | 
| @@ -106,13 +127,11 @@ class StubNetwork | |
| 106 127 | 
             
                      hardware_platform: 'x86_64',
         | 
| 107 128 | 
             
                      processor: 'x86_64',
         | 
| 108 129 | 
             
                      release: 'opensuse-leap',
         | 
| 109 | 
            -
                      version:15.2
         | 
| 130 | 
            +
                      version: 15.2
         | 
| 110 131 | 
             
                    }
         | 
| 111 132 | 
             
                  }
         | 
| 112 133 |  | 
| 113 | 
            -
                  defaults[name].key?(property) | 
| 114 | 
            -
                    defaults[name][property] : nil
         | 
| 134 | 
            +
                  defaults[name][property] if defaults[name].key?(property)
         | 
| 115 135 | 
             
                end
         | 
| 116 | 
            -
             | 
| 117 136 | 
             
              end
         | 
| 118 137 | 
             
            end
         | 
    
        data/spec/helper/test_hosts.rb
    CHANGED
    
    | @@ -1,5 +1,7 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            +
            require 'securerandom'
         | 
| 4 | 
            +
             | 
| 3 5 | 
             
            class TestHosts
         | 
| 4 6 | 
             
              class << self
         | 
| 5 7 | 
             
                def each_os(opts = {}, &block)
         | 
| @@ -7,7 +9,10 @@ class TestHosts | |
| 7 9 | 
             
                    next unless test?(os_name)
         | 
| 8 10 | 
             
                    next if opts[:only] && !only?(opts, os_name)
         | 
| 9 11 |  | 
| 10 | 
            -
                     | 
| 12 | 
            +
                    host_json = TestHosts.host(os_name)
         | 
| 13 | 
            +
                    spec_dir = spec_dir(host_json)
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                    block.call(os_name, host_json, spec_dir)
         | 
| 11 16 | 
             
                  end
         | 
| 12 17 | 
             
                end
         | 
| 13 18 |  | 
| @@ -15,6 +20,11 @@ class TestHosts | |
| 15 20 | 
             
                  hosts(name)
         | 
| 16 21 | 
             
                end
         | 
| 17 22 |  | 
| 23 | 
            +
                def spec_dir(host_json)
         | 
| 24 | 
            +
                  random_string = SecureRandom.hex
         | 
| 25 | 
            +
                  "#{host_json['home']}/.kanrisuru_spec_files_#{random_string[0..5]}"
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
             | 
| 18 28 | 
             
                def only?(opts, name)
         | 
| 19 29 | 
             
                  ((opts[:only].instance_of?(Array) && opts[:only].include?(name)) ||
         | 
| 20 30 | 
             
                    (opts[:only].instance_of?(String) && opts[:only] == name))
         | 
| @@ -2,10 +2,9 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            require 'spec_helper'
         | 
| 4 4 |  | 
| 5 | 
            -
             | 
| 6 | 
            -
               | 
| 5 | 
            +
            TestHosts.each_os(only: %w[debian ubuntu]) do |os_name, host_json|
         | 
| 6 | 
            +
              RSpec.describe Kanrisuru::Core::Apt do
         | 
| 7 7 | 
             
                context "with #{os_name}" do
         | 
| 8 | 
            -
                  let(:host_json) { TestHosts.host(os_name) }
         | 
| 9 8 | 
             
                  let(:host) do
         | 
| 10 9 | 
             
                    Kanrisuru::Remote::Host.new(
         | 
| 11 10 | 
             
                      host: host_json['hostname'],
         | 
| @@ -2,22 +2,20 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            require 'spec_helper'
         | 
| 4 4 |  | 
| 5 | 
            -
             | 
| 6 | 
            -
               | 
| 5 | 
            +
            TestHosts.each_os do |os_name, host_json, spec_dir|
         | 
| 6 | 
            +
              RSpec.describe Kanrisuru::Core::Archive do
         | 
| 7 7 | 
             
                context "with #{os_name}" do
         | 
| 8 8 | 
             
                  before(:all) do
         | 
| 9 | 
            -
                    host_json = TestHosts.host(os_name)
         | 
| 10 9 | 
             
                    host = Kanrisuru::Remote::Host.new(
         | 
| 11 10 | 
             
                      host: host_json['hostname'],
         | 
| 12 11 | 
             
                      username: host_json['username'],
         | 
| 13 12 | 
             
                      keys: [host_json['ssh_key']]
         | 
| 14 13 | 
             
                    )
         | 
| 15 14 |  | 
| 16 | 
            -
                    host.mkdir( | 
| 15 | 
            +
                    host.mkdir(spec_dir, silent: true)
         | 
| 17 16 | 
             
                    host.disconnect
         | 
| 18 17 | 
             
                  end
         | 
| 19 18 |  | 
| 20 | 
            -
                  let(:host_json) { TestHosts.host(os_name) }
         | 
| 21 19 | 
             
                  let(:host) do
         | 
| 22 20 | 
             
                    Kanrisuru::Remote::Host.new(
         | 
| 23 21 | 
             
                      host: host_json['hostname'],
         | 
| @@ -26,22 +24,19 @@ RSpec.describe Kanrisuru::Core::Archive do | |
| 26 24 | 
             
                    )
         | 
| 27 25 | 
             
                  end
         | 
| 28 26 |  | 
| 29 | 
            -
                  let(:spec_dir) { "#{host_json['home']}/.kanrisuru_spec_files" }
         | 
| 30 | 
            -
             | 
| 31 27 | 
             
                  after do
         | 
| 32 28 | 
             
                    host.disconnect
         | 
| 33 29 | 
             
                  end
         | 
| 34 30 |  | 
| 35 31 | 
             
                  after(:all) do
         | 
| 36 | 
            -
                    host_json = TestHosts.host(os_name)
         | 
| 37 32 | 
             
                    host = Kanrisuru::Remote::Host.new(
         | 
| 38 33 | 
             
                      host: host_json['hostname'],
         | 
| 39 34 | 
             
                      username: host_json['username'],
         | 
| 40 35 | 
             
                      keys: [host_json['ssh_key']]
         | 
| 41 36 | 
             
                    )
         | 
| 42 37 |  | 
| 43 | 
            -
                    host.rmdir( | 
| 44 | 
            -
                    host.rmdir("#{ | 
| 38 | 
            +
                    host.rmdir(spec_dir)
         | 
| 39 | 
            +
                    host.rmdir("#{spec_dir}/extract-tar-files") if host.dir?("#{spec_dir}/extract-tar-files")
         | 
| 45 40 | 
             
                    host.disconnect
         | 
| 46 41 | 
             
                  end
         | 
| 47 42 |  | 
| @@ -126,10 +121,10 @@ RSpec.describe Kanrisuru::Core::Archive do | |
| 126 121 | 
             
                    paths = result.map(&:path)
         | 
| 127 122 | 
             
                    expect(paths.include?('test2.config')).to eq(false)
         | 
| 128 123 |  | 
| 129 | 
            -
                    host.mkdir("#{ | 
| 130 | 
            -
                    host.tar('extract', 'archive.tar', directory: "#{ | 
| 124 | 
            +
                    host.mkdir("#{spec_dir}/extract-tar-files", silent: true)
         | 
| 125 | 
            +
                    host.tar('extract', 'archive.tar', directory: "#{spec_dir}/extract-tar-files")
         | 
| 131 126 |  | 
| 132 | 
            -
                    result = host.ls(path: "#{ | 
| 127 | 
            +
                    result = host.ls(path: "#{spec_dir}/extract-tar-files")
         | 
| 133 128 | 
             
                    paths = result.map(&:path)
         | 
| 134 129 |  | 
| 135 130 | 
             
                    expect(paths.include?('test1.config')).to eq(true)
         | 
| @@ -2,10 +2,9 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            require 'spec_helper'
         | 
| 4 4 |  | 
| 5 | 
            -
             | 
| 6 | 
            -
               | 
| 5 | 
            +
            TestHosts.each_os do |os_name, host_json|
         | 
| 6 | 
            +
              RSpec.describe Kanrisuru::Core::Disk do
         | 
| 7 7 | 
             
                context "with #{os_name}" do
         | 
| 8 | 
            -
                  let(:host_json) { TestHosts.host(os_name) }
         | 
| 9 8 | 
             
                  let(:host) do
         | 
| 10 9 | 
             
                    Kanrisuru::Remote::Host.new(
         | 
| 11 10 | 
             
                      host: host_json['hostname'],
         | 
| @@ -2,10 +2,9 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            require 'spec_helper'
         | 
| 4 4 |  | 
| 5 | 
            -
             | 
| 6 | 
            -
               | 
| 5 | 
            +
            TestHosts.each_os do |os_name, host_json|
         | 
| 6 | 
            +
              RSpec.describe Kanrisuru::Core::Dmi do
         | 
| 7 7 | 
             
                context "with #{os_name}" do
         | 
| 8 | 
            -
                  let(:host_json) { TestHosts.host(os_name) }
         | 
| 9 8 | 
             
                  let(:host) do
         | 
| 10 9 | 
             
                    Kanrisuru::Remote::Host.new(
         | 
| 11 10 | 
             
                      host: host_json['hostname'],
         | 
| @@ -2,22 +2,20 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            require 'spec_helper'
         | 
| 4 4 |  | 
| 5 | 
            -
             | 
| 6 | 
            -
               | 
| 5 | 
            +
            TestHosts.each_os do |os_name, host_json, spec_dir|
         | 
| 6 | 
            +
              RSpec.describe Kanrisuru::Core::File do
         | 
| 7 7 | 
             
                context "with #{os_name}" do
         | 
| 8 8 | 
             
                  before(:all) do
         | 
| 9 | 
            -
                    host_json = TestHosts.host(os_name)
         | 
| 10 9 | 
             
                    host = Kanrisuru::Remote::Host.new(
         | 
| 11 10 | 
             
                      host: host_json['hostname'],
         | 
| 12 11 | 
             
                      username: host_json['username'],
         | 
| 13 12 | 
             
                      keys: [host_json['ssh_key']]
         | 
| 14 13 | 
             
                    )
         | 
| 15 14 |  | 
| 16 | 
            -
                    host.mkdir( | 
| 15 | 
            +
                    host.mkdir(spec_dir, silent: true)
         | 
| 17 16 | 
             
                    host.disconnect
         | 
| 18 17 | 
             
                  end
         | 
| 19 18 |  | 
| 20 | 
            -
                  let(:host_json) { TestHosts.host(os_name) }
         | 
| 21 19 | 
             
                  let(:host) do
         | 
| 22 20 | 
             
                    Kanrisuru::Remote::Host.new(
         | 
| 23 21 | 
             
                      host: host_json['hostname'],
         | 
| @@ -26,25 +24,18 @@ RSpec.describe Kanrisuru::Core::File do | |
| 26 24 | 
             
                    )
         | 
| 27 25 | 
             
                  end
         | 
| 28 26 |  | 
| 29 | 
            -
                  let(:spec_dir) { "#{host_json['home']}/.kanrisuru_spec_files" }
         | 
| 30 | 
            -
             | 
| 31 27 | 
             
                  after do
         | 
| 32 28 | 
             
                    host.disconnect
         | 
| 33 29 | 
             
                  end
         | 
| 34 30 |  | 
| 35 31 | 
             
                  after(:all) do
         | 
| 36 | 
            -
                    host_json = TestHosts.host(os_name)
         | 
| 37 32 | 
             
                    host = Kanrisuru::Remote::Host.new(
         | 
| 38 33 | 
             
                      host: host_json['hostname'],
         | 
| 39 34 | 
             
                      username: host_json['username'],
         | 
| 40 35 | 
             
                      keys: [host_json['ssh_key']]
         | 
| 41 36 | 
             
                    )
         | 
| 42 37 |  | 
| 43 | 
            -
                    host.rm( | 
| 44 | 
            -
                    if host.dir?("#{host_json['home']}/extract-tar-files")
         | 
| 45 | 
            -
                      host.rm("#{host_json['home']}/extract-tar-files", force: true,
         | 
| 46 | 
            -
                                                                        recursive: true)
         | 
| 47 | 
            -
                    end
         | 
| 38 | 
            +
                    host.rm(spec_dir, force: true, recursive: true)
         | 
| 48 39 | 
             
                    host.disconnect
         | 
| 49 40 | 
             
                  end
         | 
| 50 41 |  | 
| @@ -356,7 +347,6 @@ RSpec.describe Kanrisuru::Core::File do | |
| 356 347 | 
             
                    data = host.cat('/etc/hosts').command.raw_result
         | 
| 357 348 | 
             
                    doc = data.map(&:lines).flatten
         | 
| 358 349 |  | 
| 359 | 
            -
                    lines = doc.length
         | 
| 360 350 | 
             
                    words = doc.map(&:split).flatten
         | 
| 361 351 | 
             
                    chars = doc.map(&:length).flatten
         | 
| 362 352 |  | 
| @@ -2,10 +2,9 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            require 'spec_helper'
         | 
| 4 4 |  | 
| 5 | 
            -
             | 
| 6 | 
            -
               | 
| 5 | 
            +
            TestHosts.each_os do |os_name, host_json|
         | 
| 6 | 
            +
              RSpec.describe Kanrisuru::Core::Find do
         | 
| 7 7 | 
             
                context "with #{os_name}" do
         | 
| 8 | 
            -
                  let(:host_json) { TestHosts.host(os_name) }
         | 
| 9 8 | 
             
                  let(:host) do
         | 
| 10 9 | 
             
                    Kanrisuru::Remote::Host.new(
         | 
| 11 10 | 
             
                      host: host_json['hostname'],
         | 
| @@ -19,6 +18,7 @@ RSpec.describe Kanrisuru::Core::Find do | |
| 19 18 | 
             
                  end
         | 
| 20 19 |  | 
| 21 20 | 
             
                  it 'finds home directory' do
         | 
| 21 | 
            +
                    host.su('root')
         | 
| 22 22 | 
             
                    result = host.find(paths: '/home')
         | 
| 23 23 | 
             
                    home = result.find { |item| item.path == host_json['home'] }
         | 
| 24 24 | 
             
                    expect(home.path).to eq(host_json['home'])
         | 
| @@ -2,10 +2,9 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            require 'spec_helper'
         | 
| 4 4 |  | 
| 5 | 
            -
             | 
| 6 | 
            -
               | 
| 5 | 
            +
            TestHosts.each_os do |os_name, host_json|
         | 
| 6 | 
            +
              RSpec.describe Kanrisuru::Core::Group do
         | 
| 7 7 | 
             
                context "with #{os_name}" do
         | 
| 8 | 
            -
                  let(:host_json) { TestHosts.host(os_name) }
         | 
| 9 8 | 
             
                  let(:host) do
         | 
| 10 9 | 
             
                    Kanrisuru::Remote::Host.new(
         | 
| 11 10 | 
             
                      host: host_json['hostname'],
         | 
| @@ -2,10 +2,9 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            require 'spec_helper'
         | 
| 4 4 |  | 
| 5 | 
            -
             | 
| 6 | 
            -
               | 
| 5 | 
            +
            TestHosts.each_os do |os_name, host_json|
         | 
| 6 | 
            +
              RSpec.describe Kanrisuru::Core::IP do
         | 
| 7 7 | 
             
                context "with #{os_name}" do
         | 
| 8 | 
            -
                  let(:host_json) { TestHosts.host(os_name) }
         | 
| 9 8 | 
             
                  let(:host) do
         | 
| 10 9 | 
             
                    Kanrisuru::Remote::Host.new(
         | 
| 11 10 | 
             
                      host: host_json['hostname'],
         | 
| @@ -2,10 +2,9 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            require 'spec_helper'
         | 
| 4 4 |  | 
| 5 | 
            -
             | 
| 6 | 
            -
               | 
| 5 | 
            +
            TestHosts.each_os do |os_name, host_json|
         | 
| 6 | 
            +
              RSpec.describe Kanrisuru::Core::Path do
         | 
| 7 7 | 
             
                context "with #{os_name}" do
         | 
| 8 | 
            -
                  let(:host_json) { TestHosts.host(os_name) }
         | 
| 9 8 | 
             
                  let(:host) do
         | 
| 10 9 | 
             
                    Kanrisuru::Remote::Host.new(
         | 
| 11 10 | 
             
                      host: host_json['hostname'],
         | 
| @@ -2,11 +2,9 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            require 'spec_helper'
         | 
| 4 4 |  | 
| 5 | 
            -
             | 
| 6 | 
            -
               | 
| 5 | 
            +
            TestHosts.each_os do |os_name, host_json|
         | 
| 6 | 
            +
              RSpec.describe Kanrisuru::Core::Socket do
         | 
| 7 7 | 
             
                context "with #{os_name}" do
         | 
| 8 | 
            -
                  let(:host_json) { TestHosts.host(os_name) }
         | 
| 9 | 
            -
             | 
| 10 8 | 
             
                  let(:host) do
         | 
| 11 9 | 
             
                    Kanrisuru::Remote::Host.new(
         | 
| 12 10 | 
             
                      host: host_json['hostname'],
         | 
| @@ -2,10 +2,9 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            require 'spec_helper'
         | 
| 4 4 |  | 
| 5 | 
            -
             | 
| 6 | 
            -
               | 
| 5 | 
            +
            TestHosts.each_os do |os_name, host_json|
         | 
| 6 | 
            +
              RSpec.describe Kanrisuru::Core::Stat do
         | 
| 7 7 | 
             
                context "with #{os_name}" do
         | 
| 8 | 
            -
                  let(:host_json) { TestHosts.host(os_name) }
         | 
| 9 8 | 
             
                  let(:host) do
         | 
| 10 9 | 
             
                    Kanrisuru::Remote::Host.new(
         | 
| 11 10 | 
             
                      host: host_json['hostname'],
         | 
| @@ -1,21 +1,21 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 3 | 
            +
            require 'spec_helper'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            TestHosts.each_os do |os_name, host_json, spec_dir|
         | 
| 6 | 
            +
              RSpec.describe Kanrisuru::Core::Stream do
         | 
| 5 7 | 
             
                context "with #{os_name}" do
         | 
| 6 8 | 
             
                  before(:all) do
         | 
| 7 | 
            -
                    host_json = TestHosts.host(os_name)
         | 
| 8 9 | 
             
                    host = Kanrisuru::Remote::Host.new(
         | 
| 9 10 | 
             
                      host: host_json['hostname'],
         | 
| 10 11 | 
             
                      username: host_json['username'],
         | 
| 11 12 | 
             
                      keys: [host_json['ssh_key']]
         | 
| 12 13 | 
             
                    )
         | 
| 13 14 |  | 
| 14 | 
            -
                    host.mkdir( | 
| 15 | 
            +
                    host.mkdir(spec_dir, silent: true)
         | 
| 15 16 | 
             
                    host.disconnect
         | 
| 16 17 | 
             
                  end
         | 
| 17 18 |  | 
| 18 | 
            -
                  let(:host_json) { TestHosts.host(os_name) }
         | 
| 19 19 | 
             
                  let(:host) do
         | 
| 20 20 | 
             
                    Kanrisuru::Remote::Host.new(
         | 
| 21 21 | 
             
                      host: host_json['hostname'],
         | 
| @@ -24,21 +24,18 @@ RSpec.describe Kanrisuru::Core::Stream do | |
| 24 24 | 
             
                    )
         | 
| 25 25 | 
             
                  end
         | 
| 26 26 |  | 
| 27 | 
            -
                  let(:spec_dir) { "#{host_json['home']}/.kanrisuru_spec_files" }
         | 
| 28 | 
            -
             | 
| 29 27 | 
             
                  after do
         | 
| 30 28 | 
             
                    host.disconnect
         | 
| 31 29 | 
             
                  end
         | 
| 32 30 |  | 
| 33 31 | 
             
                  after(:all) do
         | 
| 34 | 
            -
                    host_json = TestHosts.host(os_name)
         | 
| 35 32 | 
             
                    host = Kanrisuru::Remote::Host.new(
         | 
| 36 33 | 
             
                      host: host_json['hostname'],
         | 
| 37 34 | 
             
                      username: host_json['username'],
         | 
| 38 35 | 
             
                      keys: [host_json['ssh_key']]
         | 
| 39 36 | 
             
                    )
         | 
| 40 37 |  | 
| 41 | 
            -
                    host.rmdir( | 
| 38 | 
            +
                    host.rmdir(spec_dir)
         | 
| 42 39 | 
             
                    host.disconnect
         | 
| 43 40 | 
             
                  end
         | 
| 44 41 |  | 
| @@ -2,10 +2,9 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            require 'spec_helper'
         | 
| 4 4 |  | 
| 5 | 
            -
             | 
| 6 | 
            -
               | 
| 5 | 
            +
            TestHosts.each_os do |os_name, host_json|
         | 
| 6 | 
            +
              RSpec.describe Kanrisuru::Core::System do
         | 
| 7 7 | 
             
                context "with #{os_name}" do
         | 
| 8 | 
            -
                  let(:host_json) { TestHosts.host(os_name) }
         | 
| 9 8 | 
             
                  let(:host) do
         | 
| 10 9 | 
             
                    Kanrisuru::Remote::Host.new(
         | 
| 11 10 | 
             
                      host: host_json['hostname'],
         | 
| @@ -107,7 +106,6 @@ RSpec.describe Kanrisuru::Core::System do | |
| 107 106 | 
             
                    host.su('root')
         | 
| 108 107 |  | 
| 109 108 | 
             
                    result = host.last(failed_attempts: true)
         | 
| 110 | 
            -
                    puts result.data
         | 
| 111 109 | 
             
                    expect(result).to be_success
         | 
| 112 110 | 
             
                  end
         | 
| 113 111 |  | 
| @@ -2,22 +2,20 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            require 'spec_helper'
         | 
| 4 4 |  | 
| 5 | 
            -
             | 
| 6 | 
            -
               | 
| 5 | 
            +
            TestHosts.each_os do |os_name, host_json, spec_dir|
         | 
| 6 | 
            +
              RSpec.describe Kanrisuru::Core::File do
         | 
| 7 7 | 
             
                context "with #{os_name}" do
         | 
| 8 8 | 
             
                  before(:all) do
         | 
| 9 | 
            -
                    host_json = TestHosts.host(os_name)
         | 
| 10 9 | 
             
                    host = Kanrisuru::Remote::Host.new(
         | 
| 11 10 | 
             
                      host: host_json['hostname'],
         | 
| 12 11 | 
             
                      username: host_json['username'],
         | 
| 13 12 | 
             
                      keys: [host_json['ssh_key']]
         | 
| 14 13 | 
             
                    )
         | 
| 15 14 |  | 
| 16 | 
            -
                    host.mkdir( | 
| 15 | 
            +
                    host.mkdir(spec_dir, silent: true)
         | 
| 17 16 | 
             
                    host.disconnect
         | 
| 18 17 | 
             
                  end
         | 
| 19 18 |  | 
| 20 | 
            -
                  let(:host_json) { TestHosts.host(os_name) }
         | 
| 21 19 | 
             
                  let(:host) do
         | 
| 22 20 | 
             
                    Kanrisuru::Remote::Host.new(
         | 
| 23 21 | 
             
                      host: host_json['hostname'],
         | 
| @@ -26,21 +24,18 @@ RSpec.describe Kanrisuru::Core::File do | |
| 26 24 | 
             
                    )
         | 
| 27 25 | 
             
                  end
         | 
| 28 26 |  | 
| 29 | 
            -
                  let(:spec_dir) { "#{host_json['home']}/.kanrisuru_spec_files" }
         | 
| 30 | 
            -
             | 
| 31 27 | 
             
                  after do
         | 
| 32 28 | 
             
                    host.disconnect
         | 
| 33 29 | 
             
                  end
         | 
| 34 30 |  | 
| 35 31 | 
             
                  after(:all) do
         | 
| 36 | 
            -
                    host_json = TestHosts.host(os_name)
         | 
| 37 32 | 
             
                    host = Kanrisuru::Remote::Host.new(
         | 
| 38 33 | 
             
                      host: host_json['hostname'],
         | 
| 39 34 | 
             
                      username: host_json['username'],
         | 
| 40 35 | 
             
                      keys: [host_json['ssh_key']]
         | 
| 41 36 | 
             
                    )
         | 
| 42 37 |  | 
| 43 | 
            -
                    host.rmdir( | 
| 38 | 
            +
                    host.rmdir(spec_dir)
         | 
| 44 39 | 
             
                    host.disconnect
         | 
| 45 40 | 
             
                  end
         | 
| 46 41 |  | 
| @@ -2,10 +2,9 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            require 'spec_helper'
         | 
| 4 4 |  | 
| 5 | 
            -
             | 
| 6 | 
            -
               | 
| 5 | 
            +
            TestHosts.each_os do |os_name, host_json|
         | 
| 6 | 
            +
              RSpec.describe Kanrisuru::Core::User do
         | 
| 7 7 | 
             
                context "with #{os_name}" do
         | 
| 8 | 
            -
                  let(:host_json) { TestHosts.host(os_name) }
         | 
| 9 8 | 
             
                  let(:host) do
         | 
| 10 9 | 
             
                    Kanrisuru::Remote::Host.new(
         | 
| 11 10 | 
             
                      host: host_json['hostname'],
         | 
| @@ -19,7 +18,6 @@ RSpec.describe Kanrisuru::Core::User do | |
| 19 18 | 
             
                  end
         | 
| 20 19 |  | 
| 21 20 | 
             
                  after(:all) do
         | 
| 22 | 
            -
                    host_json = TestHosts.host(os_name)
         | 
| 23 21 | 
             
                    host = Kanrisuru::Remote::Host.new(
         | 
| 24 22 | 
             
                      host: host_json['hostname'],
         | 
| 25 23 | 
             
                      username: host_json['username'],
         |