Skip to content

Commit

Permalink
Merge 01e8bb4 into 46680e6
Browse files Browse the repository at this point in the history
  • Loading branch information
petems committed Nov 28, 2015
2 parents 46680e6 + 01e8bb4 commit ba6145b
Show file tree
Hide file tree
Showing 5 changed files with 144 additions and 9 deletions.
1 change: 1 addition & 0 deletions lib/tugboat.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
require 'tugboat/cli'
require 'tugboat/ui'
require "tugboat/config"
require "tugboat/version"
require 'json'
Expand Down
24 changes: 24 additions & 0 deletions lib/tugboat/middleware.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ module Middleware
autoload :InfoImage, "tugboat/middleware/info_image"
autoload :InjectClient, "tugboat/middleware/inject_client"
autoload :InjectConfiguration, "tugboat/middleware/inject_configuration"
autoload :InjectUI, "tugboat/middleware/inject_ui"
autoload :ListDroplets, "tugboat/middleware/list_droplets"
autoload :ListImages, "tugboat/middleware/list_images"
autoload :ListRegions, "tugboat/middleware/list_regions"
Expand All @@ -39,6 +40,7 @@ module Middleware
# This writes a ~/.tugboat file, which can be edited manually.
def self.sequence_authorize
::Middleware::Builder.new do
use InjectUI
use InjectConfiguration
use AskForCredentials
use InjectConfiguration
Expand All @@ -51,6 +53,7 @@ def self.sequence_authorize
# This checks that the credentials in ~/.tugboat are valid
def self.sequence_verify
::Middleware::Builder.new do
use InjectUI
use InjectConfiguration
use CheckConfiguration
use InjectClient
Expand All @@ -61,6 +64,7 @@ def self.sequence_verify
# Display a list of droplets
def self.sequence_list_droplets
::Middleware::Builder.new do
use InjectUI
use InjectConfiguration
use CheckConfiguration
use InjectClient
Expand All @@ -71,6 +75,7 @@ def self.sequence_list_droplets
# Display a list of images
def self.sequence_list_images
::Middleware::Builder.new do
use InjectUI
use InjectConfiguration
use CheckConfiguration
use InjectClient
Expand All @@ -81,6 +86,7 @@ def self.sequence_list_images
# Restart a droplet
def self.sequence_restart_droplet
::Middleware::Builder.new do
use InjectUI
use InjectConfiguration
use CheckConfiguration
use InjectClient
Expand All @@ -92,6 +98,7 @@ def self.sequence_restart_droplet
# Start a droplet
def self.sequence_start_droplet
::Middleware::Builder.new do
use InjectUI
use InjectConfiguration
use CheckConfiguration
use InjectClient
Expand All @@ -104,6 +111,7 @@ def self.sequence_start_droplet
# Shutdown a droplet
def self.sequence_halt_droplet
::Middleware::Builder.new do
use InjectUI
use InjectConfiguration
use CheckConfiguration
use InjectClient
Expand All @@ -116,6 +124,7 @@ def self.sequence_halt_droplet
# Show information about a droplet
def self.sequence_info_droplet
::Middleware::Builder.new do
use InjectUI
use InjectConfiguration
use CheckConfiguration
use InjectClient
Expand All @@ -127,6 +136,7 @@ def self.sequence_info_droplet
# Show information about an image
def self.sequence_info_image
::Middleware::Builder.new do
use InjectUI
use InjectConfiguration
use CheckConfiguration
use InjectClient
Expand All @@ -138,6 +148,7 @@ def self.sequence_info_image
# SSH into a droplet
def self.sequence_ssh_droplet
::Middleware::Builder.new do
use InjectUI
use InjectConfiguration
use CheckConfiguration
use InjectClient
Expand All @@ -150,6 +161,7 @@ def self.sequence_ssh_droplet
# Create a droplet
def self.sequence_create_droplet
::Middleware::Builder.new do
use InjectUI
use InjectConfiguration
use CheckConfiguration
use InjectClient
Expand All @@ -160,6 +172,7 @@ def self.sequence_create_droplet
# Rebuild a droplet
def self.sequence_rebuild_droplet
::Middleware::Builder.new do
use InjectUI
use InjectConfiguration
use CheckConfiguration
use InjectClient
Expand All @@ -173,6 +186,7 @@ def self.sequence_rebuild_droplet
# Destroy a droplet
def self.sequence_destroy_droplet
::Middleware::Builder.new do
use InjectUI
use InjectConfiguration
use CheckConfiguration
use InjectClient
Expand All @@ -185,6 +199,7 @@ def self.sequence_destroy_droplet
# Destroy an image
def self.sequence_destroy_image
::Middleware::Builder.new do
use InjectUI
use InjectConfiguration
use CheckConfiguration
use InjectClient
Expand All @@ -197,6 +212,8 @@ def self.sequence_destroy_image
# Snapshot a droplet
def self.sequence_snapshot_droplet
::Middleware::Builder.new do
use InjectUI
use InjectUI
use InjectConfiguration
use CheckConfiguration
use InjectClient
Expand All @@ -209,6 +226,7 @@ def self.sequence_snapshot_droplet
# Display a list of available SSH keys
def self.sequence_ssh_keys
::Middleware::Builder.new do
use InjectUI
use InjectConfiguration
use CheckConfiguration
use InjectClient
Expand All @@ -219,6 +237,7 @@ def self.sequence_ssh_keys
# Create a droplet
def self.sequence_add_key
::Middleware::Builder.new do
use InjectUI
use InjectConfiguration
use CheckConfiguration
use InjectClient
Expand All @@ -229,6 +248,7 @@ def self.sequence_add_key
# Display a list of regions
def self.sequence_regions
::Middleware::Builder.new do
use InjectUI
use InjectConfiguration
use CheckConfiguration
use InjectClient
Expand All @@ -239,6 +259,7 @@ def self.sequence_regions
# Display a list of droplet sizes
def self.sequence_sizes
::Middleware::Builder.new do
use InjectUI
use InjectConfiguration
use CheckConfiguration
use InjectClient
Expand All @@ -249,6 +270,7 @@ def self.sequence_sizes
# Resize a droplet
def self.sequence_resize_droplet
::Middleware::Builder.new do
use InjectUI
use InjectConfiguration
use CheckConfiguration
use InjectClient
Expand All @@ -260,6 +282,7 @@ def self.sequence_resize_droplet
# Reset root password
def self.sequence_password_reset
::Middleware::Builder.new do
use InjectUI
use InjectConfiguration
use CheckConfiguration
use InjectClient
Expand All @@ -278,6 +301,7 @@ def self.sequence_config
# Wait for a droplet to enter a desired state
def self.sequence_wait
::Middleware::Builder.new do
use InjectUI
use InjectConfiguration
use CheckConfiguration
use InjectClient
Expand Down
13 changes: 4 additions & 9 deletions lib/tugboat/middleware/check_configuration.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,11 @@ module Middleware
class CheckConfiguration < Base
def call(env)
config = env["config"]
ui = env["ui"]

if !config || !config.data || !config.access_token
say "You must run `tugboat authorize` in order to connect to DigitalOcean", :red
exit 1
end

# If the user passes the global `-q/--quiet` flag, redirect
# stdout
if env["user_quiet"]
$stdout = File.new('/dev/null', 'w')
if !config || !config.data || !config.token
ui.say("You must run `tugboat authorize` in order to connect to DigitalOcean", :fail)
ui.fail
end

@app.call(env)
Expand Down
17 changes: 17 additions & 0 deletions lib/tugboat/middleware/inject_ui.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
module Tugboat
module Middleware
class InjectUI < Base
def call(env)
machine = env["machine_readable"] || false
colors = env["colors"] || true

ui = Tugboat::UI.new(machine, colors)

env["ui"] = ui

@app.call(env)
end
end
end
end

98 changes: 98 additions & 0 deletions lib/tugboat/ui.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
module Tugboat
class UI
# Colors for UI output
RED = "\033[31m"
GREEN = "\033[32m"
YELLOW = "\033[33m"
GREY = "\033[38m"
WHITE = "\033[1;38m"
CLEAR = "\033[0m"
PREFIX = " "

def initialize(machine=false, colors=true)
@machine_readable = machine
if @machine_readable == true
@colors = false
else
@colors = colors
end
end

def green(message)
return message if !@colors
return "#{GREEN}#{message}#{CLEAR}"
end

def yellow(message)
return message if !@colors
return "#{YELLOW}#{message}#{CLEAR}"
end

def red(message)
return message if !@colors
return "#{RED}#{message}#{CLEAR}"
end

# Outputs the message
#
# Possible output levels (lowest to highest) are:
# info: info statements that aren't important. gray coloring,
# indented ( )
# output: standard output (things are happening), no coloring,
# basic prefix (==>)
# success: successful actions, greeen, indented ( )
# warn: warnings, yellow, indented ( )
# fail: failures/danger, red, indented ( )
def say(message, level)
# If we've set machine-readable, don't color and
# merge the message into a line with commas instead of
# new lines.
if @machine_readable
message.gsub!("\n", ",") # Newlines to commas
message.gsub!(/\s+/, ' ') # Make spaces/indents single
puts "#{Time.now.utc.to_i},#{message}"
return
end

case level
when :info
puts "#{PREFIX} #{GREY if @colors}#{message}#{CLEAR}"
when :output
puts "===> #{WHITE}#{message}#{CLEAR}"
when :data
puts "#{PREFIX} #{WHITE}#{message}#{CLEAR}"
when :ask
puts "#{message}#{CLEAR}: "
when :success
puts "#{PREFIX} #{GREEN if @colors}#{message}#{CLEAR}"
when :warn
puts "#{PREFIX} #{YELLOW if @colors}#{message}#{CLEAR}"
when :fail
puts "#{PREFIX} #{RED if @colors}#{message}#{CLEAR}"
end
end
end

def fail
exit 1
end

# Asks a message of the user
def ask(message)
if @machine_readable
raise Exception("No input in machine-readable")
end

# Output the message first
say(message, :ask)

input = nil
if opts[:echo]
input = $stdin.gets
else
input = $stdin.noecho(&:gets)
say(:info, "\n", opts)
end
(input || "").chomp
end
end

0 comments on commit ba6145b

Please sign in to comment.