miab 0.3.1 → 0.3.2
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
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/lib/miab.rb +126 -6
- metadata +2 -2
- metadata.gz.sig +0 -0
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: ced57340f07efffc93c646a147121deb9a1fbb8d037aaa37ba2eb3203fc69573
         | 
| 4 | 
            +
              data.tar.gz: 3ff78cd963d512efa0528cbee9456b8efed970a943698db326bf3ff95717a60d
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 0ee3e715313c423032f22db63c8f9e8a21bd33877960abdcea64ba22b2ab44d5cd5de5519c485895af819d0590f79e0082d584d4cadf3ee88532ccbd605ab129
         | 
| 7 | 
            +
              data.tar.gz: a8aae9b45ea47714cc4ca79562d5c904ee1592b8daa73989191ae22500a8185af3c7bd611e618610d04fa037a3622d738e6b27e8bed3c2138ecf8aee7543b838
         | 
    
        checksums.yaml.gz.sig
    CHANGED
    
    | Binary file | 
    
        data.tar.gz.sig
    CHANGED
    
    | Binary file | 
    
        data/lib/miab.rb
    CHANGED
    
    | @@ -4,19 +4,45 @@ | |
| 4 4 |  | 
| 5 5 | 
             
            # Desc: Message in a bottle (MIAB) is designed to execute remote commands 
         | 
| 6 6 | 
             
            #       through SSH for system maintenance purposes.
         | 
| 7 | 
            +
            #
         | 
| 8 | 
            +
            #       Note: Intended for a Debian based distro
         | 
| 7 9 |  | 
| 8 10 | 
             
            require 'net/ssh'
         | 
| 9 11 | 
             
            require 'c32'
         | 
| 10 12 | 
             
            require 'resolv'
         | 
| 11 13 |  | 
| 12 14 |  | 
| 15 | 
            +
            # available commands:
         | 
| 16 | 
            +
            #
         | 
| 17 | 
            +
            # * date - returns the system date and time
         | 
| 18 | 
            +
            # * directory_exists? - returns true if the directory exists
         | 
| 19 | 
            +
            # * disk_space - returns the available disk space
         | 
| 20 | 
            +
            # * echo - returns whatever string is passed in
         | 
| 21 | 
            +
            # * file_exists? - returns true if the file exists
         | 
| 22 | 
            +
            # * file_write - writes contents to a file
         | 
| 23 | 
            +
            # * installable? - returns true if the package name exists in apt-cache search
         | 
| 24 | 
            +
            # * installed? - returns true if a package is already installed
         | 
| 25 | 
            +
            # * internet? - returns true if a ping request to an external IP address succeeds
         | 
| 26 | 
            +
            # * memory - returns the amount of free RAM available etc
         | 
| 27 | 
            +
            # * ping - returns the latency of a ping request to the node
         | 
| 28 | 
            +
            # * pwd - returns the working directory
         | 
| 29 | 
            +
            # * temperature - returns the temperature of the CPU
         | 
| 30 | 
            +
             | 
| 31 | 
            +
            # usage: puts Miab.new("temperature", domain: 'home', target: 'angelo', 
         | 
| 32 | 
            +
            #                       user: 'pi', password: 'secret').cast
         | 
| 33 | 
            +
            # nearest SSH equivalent `ssh pi@angelo.home exec \
         | 
| 34 | 
            +
            #                                 "cat /sys/class/thermal/thermal_zone0/temp"`
         | 
| 35 | 
            +
             | 
| 13 36 | 
             
            class Miab
         | 
| 14 37 | 
             
              using ColouredText
         | 
| 15 38 |  | 
| 16 39 | 
             
              class Session
         | 
| 17 40 |  | 
| 18 | 
            -
                def initialize( host, ssh=nil, debug: false)
         | 
| 19 | 
            -
                   | 
| 41 | 
            +
                def initialize( host, ssh=nil, debug: false, dns: '1.1.1.1')
         | 
| 42 | 
            +
                  
         | 
| 43 | 
            +
                  @ssh, @host, @debug, @dns = ssh, host, debug, dns
         | 
| 44 | 
            +
                  
         | 
| 45 | 
            +
                  puts 'Session dns: ' + dns.inspect if @debug
         | 
| 20 46 | 
             
                  @results = {}
         | 
| 21 47 | 
             
                end
         | 
| 22 48 |  | 
| @@ -37,6 +63,18 @@ class Miab | |
| 37 63 | 
             
                  @results[:date] = r.chomp
         | 
| 38 64 |  | 
| 39 65 | 
             
                end
         | 
| 66 | 
            +
                
         | 
| 67 | 
            +
                def directory_exists?(file)
         | 
| 68 | 
            +
                  
         | 
| 69 | 
            +
                  instructions = "test -d #{file}; echo $?"
         | 
| 70 | 
            +
                  r = @ssh ? @ssh.exec!(instructions) : `#{instructions}`
         | 
| 71 | 
            +
                  puts 'r: ' + r.inspect if @debug
         | 
| 72 | 
            +
                  
         | 
| 73 | 
            +
                  @results[:directory_exists?] = r.chomp == '0'
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                end
         | 
| 76 | 
            +
                
         | 
| 77 | 
            +
                alias dir_exists? directory_exists?
         | 
| 40 78 |  | 
| 41 79 | 
             
                # query the available disk space etc.
         | 
| 42 80 | 
             
                #
         | 
| @@ -72,6 +110,85 @@ class Miab | |
| 72 110 | 
             
                end
         | 
| 73 111 |  | 
| 74 112 | 
             
                alias df disk_space
         | 
| 113 | 
            +
                
         | 
| 114 | 
            +
                # return the string supplied
         | 
| 115 | 
            +
                #
         | 
| 116 | 
            +
                def echo(s)
         | 
| 117 | 
            +
             | 
| 118 | 
            +
                  instructions = 'echo ' + s
         | 
| 119 | 
            +
                  r = @ssh ? @ssh.exec!(instructions) : `#{instructions}`
         | 
| 120 | 
            +
                  puts 'r: ' + r.inspect if @debug
         | 
| 121 | 
            +
                  @results[:echo] = r.chomp
         | 
| 122 | 
            +
             | 
| 123 | 
            +
                end
         | 
| 124 | 
            +
                
         | 
| 125 | 
            +
                def file_exists?(file)
         | 
| 126 | 
            +
                  
         | 
| 127 | 
            +
                  instructions = "test -f #{file}; echo $?"
         | 
| 128 | 
            +
                  r = @ssh ? @ssh.exec!(instructions) : `#{instructions}`
         | 
| 129 | 
            +
                  puts 'r: ' + r.inspect if @debug
         | 
| 130 | 
            +
                  
         | 
| 131 | 
            +
                  @results[:file_exists?] = r == 0 
         | 
| 132 | 
            +
             | 
| 133 | 
            +
                end     
         | 
| 134 | 
            +
                
         | 
| 135 | 
            +
                # e.g. file_write 'desc.txt', 'Controls the door entry system.'
         | 
| 136 | 
            +
                #
         | 
| 137 | 
            +
                def file_write(file, content)
         | 
| 138 | 
            +
                  
         | 
| 139 | 
            +
                  instructions = "echo #{content.inspect} >> #{file}"
         | 
| 140 | 
            +
                  r = @ssh ? @ssh.exec!(instructions) : `#{instructions}`
         | 
| 141 | 
            +
                  puts 'r: ' + r.inspect if @debug
         | 
| 142 | 
            +
                  
         | 
| 143 | 
            +
                  @results[:file_write] = r
         | 
| 144 | 
            +
             | 
| 145 | 
            +
                end        
         | 
| 146 | 
            +
                
         | 
| 147 | 
            +
                # return the string supplied
         | 
| 148 | 
            +
                #
         | 
| 149 | 
            +
                def install(package)
         | 
| 150 | 
            +
             | 
| 151 | 
            +
                  return @results[:install] = 'no route to internet' unless internet?
         | 
| 152 | 
            +
                  return @results[:install] = 'already installed' if installed? package
         | 
| 153 | 
            +
                  
         | 
| 154 | 
            +
                  instructions = "apt-get update && apt-get install  #{package} -y"
         | 
| 155 | 
            +
                  r = @ssh ? @ssh.exec!(instructions) : `#{instructions}`
         | 
| 156 | 
            +
                  puts 'r: ' + r.inspect if @debug
         | 
| 157 | 
            +
                  @results[:install] = r.chomp
         | 
| 158 | 
            +
             | 
| 159 | 
            +
                end    
         | 
| 160 | 
            +
                
         | 
| 161 | 
            +
                def installable?(package)
         | 
| 162 | 
            +
                  
         | 
| 163 | 
            +
                  instructions = "apt-cache search --names-only ^#{package}$"
         | 
| 164 | 
            +
                  results = @ssh ? @ssh.exec!(instructions) : `#{instructions}`
         | 
| 165 | 
            +
                  puts 'results: ' + results.inspect if @debug
         | 
| 166 | 
            +
                  
         | 
| 167 | 
            +
                  @results[:installable?] = !results.empty? 
         | 
| 168 | 
            +
             | 
| 169 | 
            +
                end    
         | 
| 170 | 
            +
                
         | 
| 171 | 
            +
                def installed?(package)
         | 
| 172 | 
            +
                  
         | 
| 173 | 
            +
                  instructions = 'dpkg --get-selections | grep -i ' + package
         | 
| 174 | 
            +
                  results = @ssh ? @ssh.exec!(instructions) : `#{instructions}`
         | 
| 175 | 
            +
                  puts 'results: ' + results.inspect if @debug
         | 
| 176 | 
            +
                  
         | 
| 177 | 
            +
                  return @results[:installed?] = nil if results.empty?
         | 
| 178 | 
            +
                  r = results.lines.grep /^#{package}/
         | 
| 179 | 
            +
                  
         | 
| 180 | 
            +
                  @results[:installed?] = r.any?
         | 
| 181 | 
            +
                end
         | 
| 182 | 
            +
             | 
| 183 | 
            +
                def internet?()
         | 
| 184 | 
            +
                  
         | 
| 185 | 
            +
                  instructions = "ping #{@dns} -W 1 -c 1"
         | 
| 186 | 
            +
                  r = @ssh ? @ssh.exec!(instructions) : `#{instructions}`
         | 
| 187 | 
            +
                  puts 'r: ' + r.inspect if @debug
         | 
| 188 | 
            +
                  
         | 
| 189 | 
            +
                  @results[:internet?] = r.lines[1][/icmp_seq/] ? true : false
         | 
| 190 | 
            +
             | 
| 191 | 
            +
                end    
         | 
| 75 192 |  | 
| 76 193 | 
             
                # find out available memory etc
         | 
| 77 194 | 
             
                #
         | 
| @@ -152,11 +269,13 @@ class Miab | |
| 152 269 | 
             
              end
         | 
| 153 270 |  | 
| 154 271 | 
             
              def initialize(scroll, domain: nil, target: nil, pwlist: {}, password: nil, 
         | 
| 155 | 
            -
                user: nil, debug: false)
         | 
| 272 | 
            +
                user: nil, debug: false, dns: '208.67.222.222')
         | 
| 156 273 |  | 
| 157 274 | 
             
                @results = {}
         | 
| 158 275 |  | 
| 159 | 
            -
                @scroll, @debug = scroll, debug
         | 
| 276 | 
            +
                @scroll, @debug, @dns = scroll, debug, dns
         | 
| 277 | 
            +
                
         | 
| 278 | 
            +
                puts '@dns: ' + @dns.inspect if @debug
         | 
| 160 279 |  | 
| 161 280 | 
             
                @nodes = if target then
         | 
| 162 281 |  | 
| @@ -181,6 +300,7 @@ class Miab | |
| 181 300 | 
             
                if @nodes.any? then
         | 
| 182 301 |  | 
| 183 302 | 
             
                  threads = []
         | 
| 303 | 
            +
                  dns = @dns
         | 
| 184 304 |  | 
| 185 305 | 
             
                  @nodes.each do |raw_host, password|
         | 
| 186 306 |  | 
| @@ -191,7 +311,7 @@ class Miab | |
| 191 311 | 
             
                      begin
         | 
| 192 312 | 
             
                        puts ('host: ' + host.inspect).debug if @debug
         | 
| 193 313 | 
             
                        ssh = Net::SSH.start( host, user, password: password)
         | 
| 194 | 
            -
                        @results[host] = Session.new(host, ssh, debug: @debug).exec @scroll
         | 
| 314 | 
            +
                        @results[host] = Session.new(host, ssh, dns: dns, debug: @debug).exec @scroll
         | 
| 195 315 | 
             
                        ssh.close
         | 
| 196 316 | 
             
                        puts (host + ' result: ' + @results[host].inspect).debug if @debug
         | 
| 197 317 | 
             
                      rescue
         | 
| @@ -207,7 +327,7 @@ class Miab | |
| 207 327 |  | 
| 208 328 | 
             
                  if @scroll then
         | 
| 209 329 | 
             
                    host = `hostname`.chomp
         | 
| 210 | 
            -
                    @results[host] = Session.new(host, debug: @debug).exec(@scroll)
         | 
| 330 | 
            +
                    @results[host] = Session.new(host, dns: @dns, debug: @debug).exec(@scroll)
         | 
| 211 331 | 
             
                  end
         | 
| 212 332 |  | 
| 213 333 | 
             
                end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: miab
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.3. | 
| 4 | 
            +
              version: 0.3.2
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - James Robertson
         | 
| @@ -35,7 +35,7 @@ cert_chain: | |
| 35 35 | 
             
              9irKsAp/hZt3dTbQOtnSlc9XREZZdegwOgu1FEqBqviNIn9R28OR237HExiWXwmw
         | 
| 36 36 | 
             
              HDTFIjk8XBqTunABuFUgr4qx
         | 
| 37 37 | 
             
              -----END CERTIFICATE-----
         | 
| 38 | 
            -
            date: 2019- | 
| 38 | 
            +
            date: 2019-11-26 00:00:00.000000000 Z
         | 
| 39 39 | 
             
            dependencies:
         | 
| 40 40 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 41 41 | 
             
              name: net-ssh
         | 
    
        metadata.gz.sig
    CHANGED
    
    | Binary file |