class DockerFish

Bri's TODO list

TODO: Add Export image
TODO: Fix multiple container start
TODO: Add Pull of image from Repository
TODO: Download progress bar for images
TODO: Refactor code duplication / case statement
TODO: Websocket attach with Eventmachine / Readline

Attributes

baseurl[RW]
hostname[W]
image[W]

Public Class Methods

new(splash) click to toggle source
# File lib/dockerfish.rb, line 39
def initialize(splash)
  @baseurl = "http://localhost:2375"
  @containerjson = "container.json"
  if splash == true; banner; end
end

Public Instance Methods

apicall(action) click to toggle source
# File lib/dockerfish.rb, line 133
def apicall(action)
  
  case action
  when action = "images"
    response = apiget("#{@url}")
    begin
      j = JSON.parse(response.body)
    rescue JSON::ParserError
      puts "Could not read JSON data"
    end
    puts "\e[1;30mList of Docker Images\e[0m\ "
    puts "\e[1;30m=====================\e[0m\ "
    puts ""
    0.upto(j.length - 1) {|n|
      j[n].each {|s|
        case s[0]
        when "Created"
          ftime = Time.at(s[1]).to_s
          ctime = ftime[0..18]
          created = "#{s[0]}: #{ctime} "
        when "Id"
          parentid = "#{s[0]}: #{s[1]} "
          imageid = parentid[0..21]
        when "RepoTags"
          repotags = "#{s[0]}: #{s[1]} ".gsub("RepoTags", "Image")
        when "Size"
          num = s[1].to_i.to_filesize
          size = "#{s[0]}: #{num} "
        when "VirtualSize"
          num = s[1].to_i.to_filesize
          virtualsize = "#{s[0]}: #{num} "
        end
        print "#{created} #{imageid} #{repotags} #{size} #{virtualsize}"
      }
      print "\n"
    }
  when action = "containers"
    response = apiget("#{@url}")
    begin
      j = JSON.parse(response.body)
    rescue JSON::ParserError
      puts "Could not read JSON data"
    end
    puts "\e[1;30mList of Docker Containers\e[0m\ "
    puts "\e[1;30m=========================\e[0m\ "
    puts ""
    #puts j.length
    0.upto(j.length - 1) {|n|
      j[n].each {|s|
       case s[0]
       when "Command"
         cmd = "#{s[0]}: #{s[1]}".strip
       when "Id"
         id = "#{s[0]}: #{s[1]} "
         cointainerid = id[0..15].gsub("Id", "ContainerId").strip
       when "Image"
         image = "#{s[0]}: #{s[1]}"
       when "Names"
         names = "#{s[0]}: #{s[1]}".strip
       when "Status"
         status = "#{s[0]}: #{s[1]}"
       when "Created"
         ftime = Time.at(s[1]).to_s
         ctime = ftime[0..18]
         created = "#{s[0]}: #{ctime} ".strip
       end
       print "#{names} #{cointainerid} #{image} #{cmd} #{status}".gsub("   Command:", "Command:")
       #pp s
      }
      print "\n"
    }
    #pp j
  when action = "start"
    response = apipost("#{@url}")
    if response.code == "204"
      puts "\e[1;30mStart Successfull\e[0m\ "
    elsif response.code == "304"
      puts "\e[1;30mContainer already started\e[0m\ "
    elsif response.code == "404"
      puts "\e[1;30mNo such container\e[0m\ "
    elsif response.code == "500"
      puts "\e[1;30mServer error\e[0m\ "
    end
  when action = "pause"
    response = apipost("#{@url}")
    if response.code == "204"
      puts "\e[1;30mPaused Successfull\e[0m\ "
    elsif response.code == "404"
      puts "\e[1;30mNo such container\e[0m\ "
    elsif response.code == "500"
      puts "\e[1;30mServer error\e[0m\ "
    end
  when action = "unpause"
    response = apipost("#{@url}")
    if response.code == "204"
      puts "\e[1;30mResumed Successfull\e[0m\ "
    elsif response.code == "404"
      puts "\e[1;30mNo such container\e[0m\ "
    elsif response.code == "500"
      puts "\e[1;30mServer error\e[0m\ "
    end
  when action = "rename"
    response = apipost("#{@url}")
    if response.code == "204"
      puts "\e[1;30mRenamed Successfully\e[0m\ "
    elsif response.code == "404"
      puts "\e[1;30mNo such container\e[0m\ "
    elsif response.code == "409"
      puts "\e[1;30mName conflict with another container\e[0m\ "
    elsif response.code == "500"
      puts "\e[1;30mServer error\e[0m\ "
    end
  when action = "stop"
    response = apipost("#{@url}")
    if response.code == "204"
      puts "\e[1;30mStopped Successfully\e[0m\ "
    elsif response.code == "304"
      puts "\e[1;30mContainer already stopped\e[0m\ "
    elsif response.code == "404"
      puts "\e[1;30mNo such container\e[0m\ "
    elsif response.code == "500"
      puts "\e[1;30mServer error\e[0m\ "
    end
  when action = "inspect"
    response = apiget("#{@url}")
    begin
      j = JSON.parse(response.body)
    rescue JSON::ParserError
      puts "Could not read JSON data"
    end
    pp j
  when action = "remove"
    response = apidelete("#{@url}")
    if response.code == "204"
      puts "\e[1;30mRemoved Successfully\e[0m\ "
    elsif response.code == "400"
      puts "\e[1;30mBad parameter\e[0m\ "
    elsif response.code == "404"
      puts "\e[1;30mNo such container\e[0m\ "
    elsif response.code == "500"
      puts "\e[1;30mServer error\e[0m\ "
    end
  when action = "imageremove"
    response = apidelete("#{@url}")
    if response.code == "200"
      puts "\e[1;30mRemoved Successfully\e[0m\ "
    elsif response.code == "404"
      puts "\e[1;30mNo such image\e[0m\ "
    elsif response.code == "409"
      puts "\e[1;30mConflict removing image\e[0m\ "
    elsif response.code == "500"
      puts "\e[1;30mServer error\e[0m\ "
    end
  when action = "imagecommit"
    response = apipost("#{@url}")
    if response.code == "201"
      puts "\e[1;30mImage Commit Successfull\e[0m\ "
    elsif response.code == "404"
      puts "\e[1;30mNo such container\e[0m\ "
    elsif response.code == "500"
      puts "\e[1;30mServer error\e[0m\ "
    end
  when action = "create"
    body = String.new
    File.open("#{Dir.home}/.dockerfish/#{@containerjson}", 'r') {|n|
      n.each_line {|l|
        body << l
      }
    }
    body.gsub!("##hostname##", @hostname)
    body.gsub!("##image##", @image)
    puts body
    if !defined? @name; @name = @hostname; end
    response = apipost("#{@url}?name=#{@name}", body)
    if response.code == "201"
      puts "\e[1;30mContainer Creation Successfull\e[0m\ "
      j = JSON.parse(response.body)
      n = 0
      0.upto(j.length - 1) {|n|
        j[n].each {|s|
          puts "#{s[0]}: #{s[1]}"
        }
        print "\n"
      }
    elsif response.code == "404"
      puts "\e[1;30mNo such container\e[0m\ "
    elsif response.code == "406"
      puts "\e[1;30mImposible to attach\e[0m\ "
    elsif response.code == "500"
      puts "\e[1;30mServer error\e[0m\ "
    end
  when action = "imagehistory"
    response = apiget("#{@url}")
    begin
      j = JSON.parse(response.body)
    rescue JSON::ParserError
      puts "Could not read JSON data"
    end
    puts "\e[1;30mImage history\e[0m\ "
    puts "\e[1;30m=================\e[0m\ "
    puts ""
    #puts j.length
    0.upto(j.length - 1) {|n|
      j[n].each {|s|
       case s[0]
       when "Id"
         id = "#{s[0]}: #{s[1]} "
         cointainerid = id[0..15].strip
       when "Created"
         ftime = Time.at(s[1]).to_s
         ctime = ftime[0..18]
         created = "#{s[0]}: #{ctime} ".strip
       when "CreatedBy"
         createdby = "#{s[0]}: #{s[1]}"
       end
       print "#{id} #{created} #{createdby}"
       #pp s
      }
      print "\n"
    }
    if response.code == "404"
      puts "\e[1;30mNo such image\e[0m\ "
    elsif response.code == "500"
      puts "\e[1;30mServer error\e[0m\ "
    end
  when action = "containerprocs"
    response = apiget("#{@url}")
    begin
      j = JSON.parse(response.body)
    rescue JSON::ParserError
      puts "Could not read JSON data"
    end
    pp j
  when action = "search"
    response = apiget("#{@url}")
    begin
      j = JSON.parse(response.body)
    rescue JSON::ParserError
      puts "Could not read JSON data"
    end
    puts "\e[1;30mSearch Results\e[0m\ "
    puts "\e[1;30m==============\e[0m\ "
    puts ""
    #puts j.length
    0.upto(j.length - 1) {|n|
      j[n].each {|s|
       case s[0]
       when "description"
         description = "#{s[0]}: #{s[1]} "
       when "is_offical"
         offical = "#{s[0]}: #{s[1]} "
       when "is_automated"
         automated = "#{s[0]}: #{s[1]}"
       when "name"
         name = "Image: \e[1;36m\ [\"#{s[1]}\"] \e[0m\ "
       when "star_count"
         starcount = "Star rating: #{s[1]}"
       end
       print "#{name} #{starcount}".lstrip
       #pp s
      }
      print "\n"
    }
    if response.code == "500"
      puts "\e[1;30mServer error\e[0m\ "
    end
  when action = "menu"
    while buf = Readline.readline("\e[1;32m\DockerFish>\e[0m\ ", true)
      begin
        puts "\n"
        puts "\e[1;38m|Our items in the boat yard|\e[0m\ \n"
        puts "\e[1;38m\\==========================/\e[0m\ "
        puts "\n"
        puts "\e[1;36m1)\e[0m\ List Images"
        puts "\e[1;36m2)\e[0m\ List Containers"
        puts "\e[1;36m3)\e[0m\ Start/Restart Container"
        puts "\e[1;36m4)\e[0m\ Stop Container"
        puts "\e[1;36m5)\e[0m\ Rename Container"
        puts "\e[1;36m6)\e[0m\ Create Container from Image"
        puts "\e[1;36m7)\e[0m\ Remove Container"
        puts "\e[1;36m8)\e[0m\ Inspect Container"
        puts "\e[1;36m9)\e[0m\ View Image History"
        puts "\e[1;36m10)\e[0m\ Search for Images"
        puts "\e[1;36m11)\e[0m\ List Container processes"
        puts "\e[1;36m12)\e[0m\ Remove Image"
        puts "\e[1;36m13)\e[0m\ Pause container"
        puts "\e[1;36m14)\e[0m\ Resume container"
        puts "\e[1;36m15)\e[0m\ Create a new image from a container's changes"
        puts ""
        puts "m: This menu"
        puts "b: Bookmarks"
        puts "q: Exit Dockerfish\n"
        puts "\n"
        case buf
        when "1"
          chooser("/images/json?all=0")
          #puts "#{@url}"
          apicall("images")
        when "2"
          chooser("/containers/json?all=1")
          #puts "#{@url}"
          apicall("containers")
        when "3"
          while buf2 = Readline.readline("\e[1;33m\Enter Container to Start>\e[0m\ ", true)
            puts "\e[1;30mStarting Container #{buf2}\e[0m\ "
            chooser("/containers/#{buf2}/restart")
            #puts "#{@url}"
            apicall("start")
            break
          end
        when "4"
          while buf2 = Readline.readline("\e[1;33m\Enter Container to Stop>\e[0m\ ", true)
            puts "\e[1;30mStopping Container #{buf2}\e[0m\ "
            chooser("/containers/#{buf2}/stop")
            #puts "#{@url}"
            apicall("stop")
            break
          end
        when "5"
          while buf2 = Readline.readline("\e[1;33m\Enter Container To Rename>\e[0m\ ", true)
            while buf3 = Readline.readline("\e[1;33m\Enter new name>\e[0m\ ", true)
              chooser("/containers/#{buf2}/rename?name=#{buf3}")
              break
            end
            #puts "#{@url}"
            apicall("rename")
            break
          end
        when "6"
          while buf2 = Readline.readline("\e[1;33m\Enter Image to use>\e[0m\ ", true)
            @image = buf2
            while buf3 = Readline.readline("\e[1;33m\Enter Container name(s)>\e[0m\ ", true)
              chooser("/containers/create")
              @hostname = buf3
              apicall("create")
              break
            end
            break
          end
        when "7"
          while buf2 = Readline.readline("\e[1;33m\Enter Container to Remove>\e[0m\ ", true)
            chooser("/containers/#{buf2}")
            #puts "#{@url}"
            apicall("remove")
            break                
          end
        when "8"
          while buf2 = Readline.readline("\e[1;33m\Enter Container to Inspect>\e[0m\ ", true)
            chooser("/containers/#{buf2}/json")
            #puts "#{@url}"
            apicall("inspect")
            break
          end
        when "9"
          while buf2 = Readline.readline("\e[1;33m\View history of image>\e[0m\ ", true)
            chooser("/images/#{buf2}/history")
            #puts "#{@url}"
            apicall("imagehistory")
            break
          end
        when "10"
          while buf2 = Readline.readline("\e[1;33m\Search for images>\e[0m\ ", true)
            chooser("/images/search?term=#{buf2}")
            #puts "#{@url}"
            apicall("search")
            break
          end
        when "11"
          while buf2 = Readline.readline("\e[1;33m\Enter Container to query>\e[0m\ ", true)
            chooser("/containers/#{buf2}/top")
            #puts "#{@url}"
            apicall("containerprocs")
            break
          end
        when "12"
          while buf2 = Readline.readline("\e[1;33m\Enter Image to remove>\e[0m\ ", true)
            chooser("/images/#{buf2}")
            #puts "#{@url}"
            apicall("imageremove")
            break
          end
        when "13"
          while buf2 = Readline.readline("\e[1;33m\Pause Container name / id>\e[0m\ ", true)
            chooser("/containers/#{buf2}/pause")
            #puts "#{@url}"
            apicall("pause")
            break
          end
        when "14"
          while buf2 = Readline.readline("\e[1;33m\Resume Container name / id>\e[0m\ ", true)
            chooser("/containers/#{buf2}/unpause")
            #puts "#{@url}"
            apicall("pause")
            break
          end
        when "15"
          while buf2 = Readline.readline("\e[1;33m\Enter Container to Image>\e[0m\ ", true)
            while buf3 = Readline.readline("\e[1;33m\Enter your commit comment important>\e[0m\ ", true)
              commentenc = URI.encode(buf3)
              break
            end
            while buf4 = Readline.readline("\e[1;33m\Enter your Repository name>\e[0m\ ", true)
              chooser("/commit?container=#{buf2}&comment=#{commentenc}&repo=#{buf4}")
              break
            end
            #puts "#{@url}"
            apicall("imagecommit")
            break
          end
        when "m"
          apicall("menu")
        #when "b"
        #  ret = bookmarks("#{BOOKMARKSFILE}")
        #  @baseurl = ret
        #  instance_variable_set("@url", ret)
        when "q"
          exit
        when "f"
          banner
        end
      rescue NoMethodError
      end
    end
  end
end
apidelete(url) click to toggle source
# File lib/dockerfish.rb, line 106
def apidelete(url)
  uri = URI.parse("#{url}")
  http = Net::HTTP.new(uri.host, uri.port)
  begin
    response = http.request(Net::HTTP::Delete.new(uri.request_uri))
  rescue
    puts "Error posting data"
  end
end
apiget(url) click to toggle source
# File lib/dockerfish.rb, line 80
def apiget(url)
  uri = URI.parse("#{url}")
  #puts "Request URI: #{url}"
  http = Net::HTTP.new(uri.host, uri.port)
  begin
    response = http.request(Net::HTTP::Get.new(uri.request_uri))
    puts response.body
  rescue
    puts "Error retrieving data"
  end
end
apipost(url, body="") click to toggle source
# File lib/dockerfish.rb, line 92
def apipost(url, body="")
  uri = URI.parse("#{url}")
  #puts "Request URI: #{url}"
  http = Net::HTTP.new(uri.host, uri.port)
  request = Net::HTTP::Post.new(uri.request_uri)
  request.set_content_type("application/json")
  begin
    request.body = body unless body.empty?
    response = http.request(request)
  rescue
    puts "Error posting data"
  end
end
banner() click to toggle source
chooser(opts) click to toggle source
# File lib/dockerfish.rb, line 129
def chooser(opts)
  @url = "#{@baseurl}#{opts}"
end
version() click to toggle source
# File lib/dockerfish.rb, line 116
def version
  @url = "#{@baseurl}/version"
  uri = URI.parse("#{@url}")
  begin
    response = apiget("#{@url}")
    puts "Server Info:\n\n"
    j = JSON.parse(response.body)
    pp j
  rescue JSON::ParserError, NoMethodError
    puts "Could not read JSON data"
  end
end