tugboat 2.2.2 → 2.2.3
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/.rubocop.yml +520 -0
- data/CHANGELOG.md +9 -0
- data/Gemfile +0 -6
- data/README.md +34 -2
- data/Rakefile +6 -1
- data/bin/tugboat +2 -2
- data/features/cassettes/config/Array_of_SSH_Keys_in_Config.yml +1 -1
- data/features/cassettes/config/Single_SSH_key_as_number_in_config.yml +1 -1
- data/features/step_definitions/steps.rb +1 -1
- data/features/support/env.rb +7 -3
- data/lib/tugboat.rb +2 -2
- data/lib/tugboat/cli.rb +394 -444
- data/lib/tugboat/config.rb +43 -61
- data/lib/tugboat/middleware.rb +33 -33
- data/lib/tugboat/middleware/add_key.rb +12 -13
- data/lib/tugboat/middleware/ask_for_credentials.rb +12 -13
- data/lib/tugboat/middleware/base.rb +25 -20
- data/lib/tugboat/middleware/check_configuration.rb +3 -6
- data/lib/tugboat/middleware/check_credentials.rb +0 -1
- data/lib/tugboat/middleware/check_droplet_active.rb +2 -4
- data/lib/tugboat/middleware/check_droplet_inactive.rb +2 -4
- data/lib/tugboat/middleware/config.rb +3 -5
- data/lib/tugboat/middleware/confirm_action.rb +4 -6
- data/lib/tugboat/middleware/create_droplet.rb +27 -44
- data/lib/tugboat/middleware/custom_logger.rb +52 -54
- data/lib/tugboat/middleware/destroy_droplet.rb +5 -6
- data/lib/tugboat/middleware/destroy_image.rb +5 -6
- data/lib/tugboat/middleware/find_droplet.rb +43 -47
- data/lib/tugboat/middleware/find_image.rb +23 -29
- data/lib/tugboat/middleware/halt_droplet.rb +9 -10
- data/lib/tugboat/middleware/info_droplet.rb +30 -33
- data/lib/tugboat/middleware/info_image.rb +1 -1
- data/lib/tugboat/middleware/inject_client.rb +8 -10
- data/lib/tugboat/middleware/inject_configuration.rb +1 -2
- data/lib/tugboat/middleware/list_droplets.rb +9 -10
- data/lib/tugboat/middleware/list_images.rb +9 -9
- data/lib/tugboat/middleware/list_regions.rb +1 -1
- data/lib/tugboat/middleware/list_sizes.rb +1 -1
- data/lib/tugboat/middleware/list_ssh_keys.rb +1 -3
- data/lib/tugboat/middleware/password_reset.rb +6 -7
- data/lib/tugboat/middleware/rebuild_droplet.rb +7 -7
- data/lib/tugboat/middleware/resize_droplet.rb +6 -7
- data/lib/tugboat/middleware/restart_droplet.rb +4 -11
- data/lib/tugboat/middleware/snapshot_droplet.rb +7 -8
- data/lib/tugboat/middleware/ssh_droplet.rb +30 -31
- data/lib/tugboat/middleware/start_droplet.rb +5 -5
- data/lib/tugboat/middleware/wait_for_state.rb +2 -3
- data/lib/tugboat/version.rb +1 -1
- data/spec/cli/add_key_spec.rb +25 -28
- data/spec/cli/authorize_cli_spec.rb +57 -60
- data/spec/cli/config_cli_spec.rb +8 -11
- data/spec/cli/create_cli_spec.rb +40 -46
- data/spec/cli/debug_cli_spec.rb +29 -29
- data/spec/cli/destroy_cli_spec.rb +58 -60
- data/spec/cli/destroy_image_cli_spec.rb +42 -45
- data/spec/cli/droplets_cli_spec.rb +62 -64
- data/spec/cli/env_variable_spec.rb +14 -15
- data/spec/cli/halt_cli_spec.rb +65 -69
- data/spec/cli/help_cli_spec.rb +8 -8
- data/spec/cli/images_cli_spec.rb +28 -30
- data/spec/cli/info_cli_spec.rb +144 -147
- data/spec/cli/info_image_cli_spec.rb +57 -60
- data/spec/cli/keys_cli_spec.rb +8 -10
- data/spec/cli/password_reset_cli_spec.rb +56 -56
- data/spec/cli/rebuild_cli_spec.rb +194 -198
- data/spec/cli/regions_cli_spec.rb +8 -8
- data/spec/cli/resize_cli_spec.rb +54 -56
- data/spec/cli/restart_cli_spec.rb +53 -57
- data/spec/cli/sizes_cli_spec.rb +7 -8
- data/spec/cli/snapshot_cli_spec.rb +50 -53
- data/spec/cli/ssh_cli_spec.rb +41 -42
- data/spec/cli/start_cli_spec.rb +48 -52
- data/spec/cli/verify_cli_spec.rb +22 -25
- data/spec/cli/version_cli_spec.rb +6 -8
- data/spec/cli/wait_cli_spec.rb +50 -52
- data/spec/config_spec.rb +56 -57
- data/spec/middleware/base_spec.rb +5 -6
- data/spec/middleware/check_configuration_spec.rb +5 -7
- data/spec/middleware/check_credentials_spec.rb +9 -10
- data/spec/middleware/check_droplet_active_spec.rb +5 -7
- data/spec/middleware/check_droplet_inactive_spec.rb +5 -7
- data/spec/middleware/find_droplet_spec.rb +4 -5
- data/spec/middleware/find_image_spec.rb +4 -5
- data/spec/middleware/inject_client_spec.rb +9 -12
- data/spec/middleware/inject_configuration_spec.rb +4 -7
- data/spec/middleware/ssh_droplet_spec.rb +70 -73
- data/spec/shared/environment.rb +18 -20
- data/spec/spec_helper.rb +4 -4
- data/tugboat.gemspec +10 -6
- metadata +88 -17
    
        data/lib/tugboat/config.rb
    CHANGED
    
    | @@ -9,25 +9,25 @@ module Tugboat | |
| 9 9 | 
             
                attr_reader :data
         | 
| 10 10 | 
             
                attr_reader :path
         | 
| 11 11 |  | 
| 12 | 
            -
                FILE_NAME = '.tugboat'
         | 
| 13 | 
            -
                DEFAULT_SSH_KEY_PATH = '.ssh/id_rsa'
         | 
| 14 | 
            -
                DEFAULT_SSH_PORT = '22'
         | 
| 15 | 
            -
                DEFAULT_REGION = 'nyc2'
         | 
| 16 | 
            -
                DEFAULT_IMAGE = 'ubuntu-14-04-x64'
         | 
| 17 | 
            -
                DEFAULT_SIZE = '512mb'
         | 
| 18 | 
            -
                DEFAULT_SSH_KEY = ''
         | 
| 19 | 
            -
                DEFAULT_IP6 = 'false'
         | 
| 20 | 
            -
                DEFAULT_PRIVATE_NETWORKING = 'false'
         | 
| 21 | 
            -
                DEFAULT_BACKUPS_ENABLED = 'false'
         | 
| 12 | 
            +
                FILE_NAME = '.tugboat'.freeze
         | 
| 13 | 
            +
                DEFAULT_SSH_KEY_PATH = '.ssh/id_rsa'.freeze
         | 
| 14 | 
            +
                DEFAULT_SSH_PORT = '22'.freeze
         | 
| 15 | 
            +
                DEFAULT_REGION = 'nyc2'.freeze
         | 
| 16 | 
            +
                DEFAULT_IMAGE = 'ubuntu-14-04-x64'.freeze
         | 
| 17 | 
            +
                DEFAULT_SIZE = '512mb'.freeze
         | 
| 18 | 
            +
                DEFAULT_SSH_KEY = ''.freeze
         | 
| 19 | 
            +
                DEFAULT_IP6 = 'false'.freeze
         | 
| 20 | 
            +
                DEFAULT_PRIVATE_NETWORKING = 'false'.freeze
         | 
| 21 | 
            +
                DEFAULT_BACKUPS_ENABLED = 'false'.freeze
         | 
| 22 22 | 
             
                DEFAULT_USER_DATA = nil
         | 
| 23 23 |  | 
| 24 24 | 
             
                # Load config file from current directory, if not exit load from user's home directory
         | 
| 25 25 | 
             
                def initialize
         | 
| 26 | 
            -
                  @path = File.join(File.expand_path( | 
| 27 | 
            -
                  unless File. | 
| 28 | 
            -
                    @path = ( | 
| 26 | 
            +
                  @path = File.join(File.expand_path('.'), FILE_NAME)
         | 
| 27 | 
            +
                  unless File.exist?(@path)
         | 
| 28 | 
            +
                    @path = (ENV['TUGBOAT_CONFIG_PATH'] || File.join(File.expand_path('~'), FILE_NAME))
         | 
| 29 29 | 
             
                  end
         | 
| 30 | 
            -
                  @data =  | 
| 30 | 
            +
                  @data = load_config_file
         | 
| 31 31 | 
             
                end
         | 
| 32 32 |  | 
| 33 33 | 
             
                # If we can't load the config file, self.data is nil, which we can
         | 
| @@ -97,80 +97,62 @@ module Tugboat | |
| 97 97 |  | 
| 98 98 | 
             
                # Re-runs initialize
         | 
| 99 99 | 
             
                def reset!
         | 
| 100 | 
            -
                   | 
| 100 | 
            +
                  send(:initialize)
         | 
| 101 101 | 
             
                end
         | 
| 102 102 |  | 
| 103 103 | 
             
                # Re-loads the config
         | 
| 104 104 | 
             
                def reload!
         | 
| 105 | 
            -
                  @data =  | 
| 105 | 
            +
                  @data = load_config_file
         | 
| 106 106 | 
             
                end
         | 
| 107 107 |  | 
| 108 108 | 
             
                # Writes a config file
         | 
| 109 109 | 
             
                def create_config_file(access_token, ssh_key_path, ssh_user, ssh_port, region, image, size, ssh_key, private_networking, backups_enabled, ip6)
         | 
| 110 110 | 
             
                  # Default SSH Key path
         | 
| 111 | 
            -
                  if ssh_key_path.empty?
         | 
| 112 | 
            -
                    ssh_key_path = File.join("~", DEFAULT_SSH_KEY_PATH)
         | 
| 113 | 
            -
                  end
         | 
| 111 | 
            +
                  ssh_key_path = File.join('~', DEFAULT_SSH_KEY_PATH) if ssh_key_path.empty?
         | 
| 114 112 |  | 
| 115 | 
            -
                  if ssh_user.empty?
         | 
| 116 | 
            -
                    ssh_user = 'root'
         | 
| 117 | 
            -
                  end
         | 
| 113 | 
            +
                  ssh_user = 'root' if ssh_user.empty?
         | 
| 118 114 |  | 
| 119 | 
            -
                  if ssh_port.empty?
         | 
| 120 | 
            -
                    ssh_port = DEFAULT_SSH_PORT
         | 
| 121 | 
            -
                  end
         | 
| 115 | 
            +
                  ssh_port = DEFAULT_SSH_PORT if ssh_port.empty?
         | 
| 122 116 |  | 
| 123 | 
            -
                  if region.empty?
         | 
| 124 | 
            -
                    region = DEFAULT_REGION
         | 
| 125 | 
            -
                  end
         | 
| 117 | 
            +
                  region = DEFAULT_REGION if region.empty?
         | 
| 126 118 |  | 
| 127 | 
            -
                  if image.empty?
         | 
| 128 | 
            -
                    image = DEFAULT_IMAGE
         | 
| 129 | 
            -
                  end
         | 
| 119 | 
            +
                  image = DEFAULT_IMAGE if image.empty?
         | 
| 130 120 |  | 
| 131 | 
            -
                  if size.empty?
         | 
| 132 | 
            -
                    size = DEFAULT_SIZE
         | 
| 133 | 
            -
                  end
         | 
| 121 | 
            +
                  size = DEFAULT_SIZE if size.empty?
         | 
| 134 122 |  | 
| 135 | 
            -
                  if ssh_key.empty?
         | 
| 136 | 
            -
                    default_ssh_key = DEFAULT_SSH_KEY
         | 
| 137 | 
            -
                  end
         | 
| 123 | 
            +
                  default_ssh_key = DEFAULT_SSH_KEY if ssh_key.empty?
         | 
| 138 124 |  | 
| 139 125 | 
             
                  if private_networking.empty?
         | 
| 140 126 | 
             
                    private_networking = DEFAULT_PRIVATE_NETWORKING
         | 
| 141 127 | 
             
                  end
         | 
| 142 128 |  | 
| 143 | 
            -
                  if backups_enabled.empty?
         | 
| 144 | 
            -
                    backups_enabled = DEFAULT_BACKUPS_ENABLED
         | 
| 145 | 
            -
                  end
         | 
| 129 | 
            +
                  backups_enabled = DEFAULT_BACKUPS_ENABLED if backups_enabled.empty?
         | 
| 146 130 |  | 
| 147 | 
            -
                  if ip6.empty?
         | 
| 148 | 
            -
                    ip6 = DEFAULT_IP6
         | 
| 149 | 
            -
                  end
         | 
| 131 | 
            +
                  ip6 = DEFAULT_IP6 if ip6.empty?
         | 
| 150 132 |  | 
| 151 133 | 
             
                  require 'yaml'
         | 
| 152 | 
            -
                  File.open(@path, File::RDWR|File::TRUNC|File::CREAT,  | 
| 134 | 
            +
                  File.open(@path, File::RDWR | File::TRUNC | File::CREAT, 0o600) do |file|
         | 
| 153 135 | 
             
                    data = {
         | 
| 154 | 
            -
             | 
| 155 | 
            -
             | 
| 156 | 
            -
             | 
| 157 | 
            -
             | 
| 158 | 
            -
             | 
| 159 | 
            -
             | 
| 160 | 
            -
             | 
| 161 | 
            -
             | 
| 162 | 
            -
             | 
| 163 | 
            -
             | 
| 164 | 
            -
             | 
| 165 | 
            -
             | 
| 166 | 
            -
             | 
| 167 | 
            -
             | 
| 168 | 
            -
             | 
| 169 | 
            -
             | 
| 136 | 
            +
                      'authentication' => {
         | 
| 137 | 
            +
                        'access_token' => access_token
         | 
| 138 | 
            +
                      },
         | 
| 139 | 
            +
                      'ssh' => {
         | 
| 140 | 
            +
                        'ssh_user' => ssh_user,
         | 
| 141 | 
            +
                        'ssh_key_path' => ssh_key_path,
         | 
| 142 | 
            +
                        'ssh_port' => ssh_port
         | 
| 143 | 
            +
                      },
         | 
| 144 | 
            +
                      'defaults' => {
         | 
| 145 | 
            +
                        'region' => region,
         | 
| 146 | 
            +
                        'image' => image,
         | 
| 147 | 
            +
                        'size' => size,
         | 
| 148 | 
            +
                        'ssh_key' => ssh_key,
         | 
| 149 | 
            +
                        'private_networking' => private_networking,
         | 
| 150 | 
            +
                        'backups_enabled' => backups_enabled,
         | 
| 151 | 
            +
                        'ip6' => ip6
         | 
| 152 | 
            +
                      }
         | 
| 170 153 | 
             
                    }
         | 
| 171 154 | 
             
                    file.write data.to_yaml
         | 
| 172 155 | 
             
                  end
         | 
| 173 156 | 
             
                end
         | 
| 174 | 
            -
             | 
| 175 157 | 
             
              end
         | 
| 176 158 | 
             
            end
         | 
    
        data/lib/tugboat/middleware.rb
    CHANGED
    
    | @@ -1,39 +1,39 @@ | |
| 1 | 
            -
            require  | 
| 1 | 
            +
            require 'middleware'
         | 
| 2 2 |  | 
| 3 3 | 
             
            module Tugboat
         | 
| 4 4 | 
             
              module Middleware
         | 
| 5 | 
            -
                autoload :AddKey,  | 
| 6 | 
            -
                autoload :AskForCredentials,  | 
| 7 | 
            -
                autoload :Base,  | 
| 8 | 
            -
                autoload :CheckConfiguration,  | 
| 9 | 
            -
                autoload :CheckCredentials,  | 
| 10 | 
            -
                autoload :CheckDropletActive,  | 
| 11 | 
            -
                autoload :CheckDropletInactive,  | 
| 12 | 
            -
                autoload :Config,  | 
| 13 | 
            -
                autoload :ConfirmAction,  | 
| 14 | 
            -
                autoload :CreateDroplet,  | 
| 15 | 
            -
                autoload :RebuildDroplet,  | 
| 16 | 
            -
                autoload :DestroyDroplet,  | 
| 17 | 
            -
                autoload :DestroyImage,  | 
| 18 | 
            -
                autoload :FindDroplet,  | 
| 19 | 
            -
                autoload :FindImage,  | 
| 20 | 
            -
                autoload :HaltDroplet,  | 
| 21 | 
            -
                autoload :InfoDroplet,  | 
| 22 | 
            -
                autoload :InfoImage,  | 
| 23 | 
            -
                autoload :InjectClient,  | 
| 24 | 
            -
                autoload :InjectConfiguration,  | 
| 25 | 
            -
                autoload :ListDroplets,  | 
| 26 | 
            -
                autoload :ListImages,  | 
| 27 | 
            -
                autoload :ListRegions,  | 
| 28 | 
            -
                autoload :ListSizes,  | 
| 29 | 
            -
                autoload :ListSSHKeys,  | 
| 30 | 
            -
                autoload :PasswordReset,  | 
| 31 | 
            -
                autoload :ResizeDroplet,  | 
| 32 | 
            -
                autoload :RestartDroplet,  | 
| 33 | 
            -
                autoload :SnapshotDroplet,  | 
| 34 | 
            -
                autoload :SSHDroplet,  | 
| 35 | 
            -
                autoload :StartDroplet,  | 
| 36 | 
            -
                autoload :WaitForState,  | 
| 5 | 
            +
                autoload :AddKey, 'tugboat/middleware/add_key'
         | 
| 6 | 
            +
                autoload :AskForCredentials, 'tugboat/middleware/ask_for_credentials'
         | 
| 7 | 
            +
                autoload :Base, 'tugboat/middleware/base'
         | 
| 8 | 
            +
                autoload :CheckConfiguration, 'tugboat/middleware/check_configuration'
         | 
| 9 | 
            +
                autoload :CheckCredentials, 'tugboat/middleware/check_credentials'
         | 
| 10 | 
            +
                autoload :CheckDropletActive, 'tugboat/middleware/check_droplet_active'
         | 
| 11 | 
            +
                autoload :CheckDropletInactive, 'tugboat/middleware/check_droplet_inactive'
         | 
| 12 | 
            +
                autoload :Config, 'tugboat/middleware/config'
         | 
| 13 | 
            +
                autoload :ConfirmAction, 'tugboat/middleware/confirm_action'
         | 
| 14 | 
            +
                autoload :CreateDroplet, 'tugboat/middleware/create_droplet'
         | 
| 15 | 
            +
                autoload :RebuildDroplet, 'tugboat/middleware/rebuild_droplet'
         | 
| 16 | 
            +
                autoload :DestroyDroplet, 'tugboat/middleware/destroy_droplet'
         | 
| 17 | 
            +
                autoload :DestroyImage, 'tugboat/middleware/destroy_image'
         | 
| 18 | 
            +
                autoload :FindDroplet, 'tugboat/middleware/find_droplet'
         | 
| 19 | 
            +
                autoload :FindImage, 'tugboat/middleware/find_image'
         | 
| 20 | 
            +
                autoload :HaltDroplet, 'tugboat/middleware/halt_droplet'
         | 
| 21 | 
            +
                autoload :InfoDroplet, 'tugboat/middleware/info_droplet'
         | 
| 22 | 
            +
                autoload :InfoImage, 'tugboat/middleware/info_image'
         | 
| 23 | 
            +
                autoload :InjectClient, 'tugboat/middleware/inject_client'
         | 
| 24 | 
            +
                autoload :InjectConfiguration, 'tugboat/middleware/inject_configuration'
         | 
| 25 | 
            +
                autoload :ListDroplets, 'tugboat/middleware/list_droplets'
         | 
| 26 | 
            +
                autoload :ListImages, 'tugboat/middleware/list_images'
         | 
| 27 | 
            +
                autoload :ListRegions, 'tugboat/middleware/list_regions'
         | 
| 28 | 
            +
                autoload :ListSizes, 'tugboat/middleware/list_sizes'
         | 
| 29 | 
            +
                autoload :ListSSHKeys, 'tugboat/middleware/list_ssh_keys'
         | 
| 30 | 
            +
                autoload :PasswordReset, 'tugboat/middleware/password_reset'
         | 
| 31 | 
            +
                autoload :ResizeDroplet, 'tugboat/middleware/resize_droplet'
         | 
| 32 | 
            +
                autoload :RestartDroplet, 'tugboat/middleware/restart_droplet'
         | 
| 33 | 
            +
                autoload :SnapshotDroplet, 'tugboat/middleware/snapshot_droplet'
         | 
| 34 | 
            +
                autoload :SSHDroplet, 'tugboat/middleware/ssh_droplet'
         | 
| 35 | 
            +
                autoload :StartDroplet, 'tugboat/middleware/start_droplet'
         | 
| 36 | 
            +
                autoload :WaitForState, 'tugboat/middleware/wait_for_state'
         | 
| 37 37 |  | 
| 38 38 | 
             
                # Start the authorization flow.
         | 
| 39 39 | 
             
                # This writes a ~/.tugboat file, which can be edited manually.
         | 
| @@ -4,40 +4,40 @@ module Tugboat | |
| 4 4 | 
             
                  def call(env)
         | 
| 5 5 | 
             
                    ocean = env['barge']
         | 
| 6 6 |  | 
| 7 | 
            -
                    if env[ | 
| 8 | 
            -
                      pub_key_string = env[ | 
| 7 | 
            +
                    if env['add_key_pub_key']
         | 
| 8 | 
            +
                      pub_key_string = env['add_key_pub_key']
         | 
| 9 9 | 
             
                    else
         | 
| 10 | 
            -
                      if env[ | 
| 11 | 
            -
                        pub_key_string = File.read(env[ | 
| 10 | 
            +
                      if env['add_key_file_path']
         | 
| 11 | 
            +
                        pub_key_string = File.read(env['add_key_file_path'])
         | 
| 12 12 | 
             
                      else
         | 
| 13 13 | 
             
                        possible_keys = Dir.glob("#{ENV['HOME']}/.ssh/*.pub")
         | 
| 14 14 |  | 
| 15 15 | 
             
                        # Only show hinted keys if the user has any
         | 
| 16 | 
            -
                         | 
| 16 | 
            +
                        unless possible_keys.empty?
         | 
| 17 17 | 
             
                          say "Possible public key paths from #{ENV['HOME']}/.ssh:"
         | 
| 18 18 | 
             
                          say
         | 
| 19 19 | 
             
                          possible_keys.each do |key_file|
         | 
| 20 | 
            -
                            say  | 
| 20 | 
            +
                            say key_file.to_s
         | 
| 21 21 | 
             
                          end
         | 
| 22 22 | 
             
                          say
         | 
| 23 23 | 
             
                        end
         | 
| 24 24 |  | 
| 25 | 
            -
                        ssh_key_file = ask  | 
| 26 | 
            -
                        pub_key_string = File.read( | 
| 25 | 
            +
                        ssh_key_file = ask 'Enter the path to your SSH key:'
         | 
| 26 | 
            +
                        pub_key_string = File.read(ssh_key_file.to_s)
         | 
| 27 27 | 
             
                      end
         | 
| 28 28 | 
             
                    end
         | 
| 29 29 |  | 
| 30 | 
            -
                    say "Queueing upload of SSH key '#{env[ | 
| 30 | 
            +
                    say "Queueing upload of SSH key '#{env['add_key_name']}'...", nil, false
         | 
| 31 31 |  | 
| 32 | 
            -
                    response = ocean.key.create : | 
| 33 | 
            -
             | 
| 32 | 
            +
                    response = ocean.key.create name: env['add_key_name'],
         | 
| 33 | 
            +
                                                public_key: pub_key_string
         | 
| 34 34 |  | 
| 35 35 | 
             
                    unless response.success?
         | 
| 36 36 | 
             
                      say "Failed to create key: #{response.message}", :red
         | 
| 37 37 | 
             
                      exit 1
         | 
| 38 38 | 
             
                    end
         | 
| 39 39 |  | 
| 40 | 
            -
                    say  | 
| 40 | 
            +
                    say 'SSH Key uploaded', :green
         | 
| 41 41 | 
             
                    say
         | 
| 42 42 | 
             
                    say "Name: #{response.ssh_key.name}"
         | 
| 43 43 | 
             
                    say "ID: #{response.ssh_key.id}"
         | 
| @@ -47,4 +47,3 @@ module Tugboat | |
| 47 47 | 
             
                end
         | 
| 48 48 | 
             
              end
         | 
| 49 49 | 
             
            end
         | 
| 50 | 
            -
             | 
| @@ -3,24 +3,24 @@ module Tugboat | |
| 3 3 | 
             
                # Ask for user credentials from the command line, then write them out.
         | 
| 4 4 | 
             
                class AskForCredentials < Base
         | 
| 5 5 | 
             
                  def call(env)
         | 
| 6 | 
            -
                    say  | 
| 6 | 
            +
                    say 'Note: You can get your Access Token from https://cloud.digitalocean.com/settings/tokens/new', :yellow
         | 
| 7 7 | 
             
                    say
         | 
| 8 | 
            -
                    access_token = ask  | 
| 8 | 
            +
                    access_token = ask 'Enter your access token:'
         | 
| 9 9 | 
             
                    access_token.strip!
         | 
| 10 | 
            -
                    ssh_key_path = ask  | 
| 11 | 
            -
                    ssh_user = ask  | 
| 12 | 
            -
                    ssh_port = ask  | 
| 10 | 
            +
                    ssh_key_path = ask 'Enter your SSH key path (optional, defaults to ~/.ssh/id_rsa):'
         | 
| 11 | 
            +
                    ssh_user = ask 'Enter your SSH user (optional, defaults to root):'
         | 
| 12 | 
            +
                    ssh_port = ask 'Enter your SSH port number (optional, defaults to 22):'
         | 
| 13 13 | 
             
                    say
         | 
| 14 14 | 
             
                    say "To retrieve region, image, size and key ID's, you can use the corresponding tugboat command, such as `tugboat images`."
         | 
| 15 | 
            -
                    say  | 
| 15 | 
            +
                    say 'Defaults can be changed at any time in your ~/.tugboat configuration file.'
         | 
| 16 16 | 
             
                    say
         | 
| 17 | 
            -
                    region   = ask  | 
| 18 | 
            -
                    image    = ask  | 
| 19 | 
            -
                    size     = ask  | 
| 17 | 
            +
                    region   = ask 'Enter your default region (optional, defaults to nyc1):'
         | 
| 18 | 
            +
                    image    = ask 'Enter your default image ID or image slug (optional, defaults to ubuntu-14-04-x64):'
         | 
| 19 | 
            +
                    size     = ask 'Enter your default size (optional, defaults to 512mb)):'
         | 
| 20 20 | 
             
                    ssh_key  = ask "Enter your default ssh key IDs (optional, defaults to none, array of IDs of ssh keys eg. ['1234']):"
         | 
| 21 | 
            -
                    private_networking = ask  | 
| 22 | 
            -
                    backups_enabled = ask  | 
| 23 | 
            -
                    ip6 | 
| 21 | 
            +
                    private_networking = ask 'Enter your default for private networking (optional, defaults to false):'
         | 
| 22 | 
            +
                    backups_enabled = ask 'Enter your default for enabling backups (optional, defaults to false):'
         | 
| 23 | 
            +
                    ip6 = ask 'Enter your default for IPv6 (optional, defaults to false):'
         | 
| 24 24 |  | 
| 25 25 | 
             
                    # Write the config file.
         | 
| 26 26 | 
             
                    env['config'].create_config_file(access_token, ssh_key_path, ssh_user, ssh_port, region, image, size, ssh_key, private_networking, backups_enabled, ip6)
         | 
| @@ -31,4 +31,3 @@ module Tugboat | |
| 31 31 | 
             
                end
         | 
| 32 32 | 
             
              end
         | 
| 33 33 | 
             
            end
         | 
| 34 | 
            -
             | 
| @@ -3,10 +3,10 @@ module Tugboat | |
| 3 3 | 
             
                # A base middleware class to initalize.
         | 
| 4 4 | 
             
                class Base
         | 
| 5 5 | 
             
                  # Some colors for making things pretty.
         | 
| 6 | 
            -
                  CLEAR      = "\e[0m"
         | 
| 7 | 
            -
                  RED        = "\e[31m"
         | 
| 8 | 
            -
                  GREEN      = "\e[32m"
         | 
| 9 | 
            -
                  YELLOW     = "\e[33m"
         | 
| 6 | 
            +
                  CLEAR      = "\e[0m".freeze
         | 
| 7 | 
            +
                  RED        = "\e[31m".freeze
         | 
| 8 | 
            +
                  GREEN      = "\e[32m".freeze
         | 
| 9 | 
            +
                  YELLOW     = "\e[33m".freeze
         | 
| 10 10 |  | 
| 11 11 | 
             
                  # We want access to all of the fun thor cli helper methods,
         | 
| 12 12 | 
             
                  # like say, yes?, ask, etc.
         | 
| @@ -15,7 +15,7 @@ module Tugboat | |
| 15 15 | 
             
                  def initialize(app)
         | 
| 16 16 | 
             
                    @app = app
         | 
| 17 17 | 
             
                    # This resets the color to "clear" on the user's terminal.
         | 
| 18 | 
            -
                    say  | 
| 18 | 
            +
                    say '', :clear, false
         | 
| 19 19 | 
             
                  end
         | 
| 20 20 |  | 
| 21 21 | 
             
                  def check_response_success(task_string, response)
         | 
| @@ -29,11 +29,11 @@ module Tugboat | |
| 29 29 | 
             
                    @app.call(env)
         | 
| 30 30 | 
             
                  end
         | 
| 31 31 |  | 
| 32 | 
            -
                  def verify_credentials(ocean, say_success=false)
         | 
| 32 | 
            +
                  def verify_credentials(ocean, say_success = false)
         | 
| 33 33 | 
             
                    begin
         | 
| 34 | 
            -
                      response = ocean.droplet.all( | 
| 34 | 
            +
                      response = ocean.droplet.all(per_page: '1', page: '1')
         | 
| 35 35 | 
             
                    rescue Faraday::ClientError => e
         | 
| 36 | 
            -
                      say  | 
| 36 | 
            +
                      say 'Authentication with DigitalOcean failed at an early stage'
         | 
| 37 37 | 
             
                      say "Error was: #{e}"
         | 
| 38 38 | 
             
                      exit 1
         | 
| 39 39 | 
             
                    end
         | 
| @@ -43,25 +43,25 @@ module Tugboat | |
| 43 43 | 
             
                      exit 1
         | 
| 44 44 | 
             
                    end
         | 
| 45 45 |  | 
| 46 | 
            -
                    say  | 
| 46 | 
            +
                    say 'Authentication with DigitalOcean was successful.', :green if say_success
         | 
| 47 47 | 
             
                  end
         | 
| 48 48 |  | 
| 49 | 
            -
                  def wait_for_state(droplet_id, desired_state,ocean)
         | 
| 49 | 
            +
                  def wait_for_state(droplet_id, desired_state, ocean)
         | 
| 50 50 | 
             
                    start_time = Time.now
         | 
| 51 51 |  | 
| 52 52 | 
             
                    response = ocean.droplet.show droplet_id
         | 
| 53 53 |  | 
| 54 | 
            -
                    say  | 
| 54 | 
            +
                    say '.', nil, false
         | 
| 55 55 |  | 
| 56 | 
            -
                     | 
| 56 | 
            +
                    unless response.success?
         | 
| 57 57 | 
             
                      say "Failed to get status of Droplet: #{response.message}", :red
         | 
| 58 58 | 
             
                      exit 1
         | 
| 59 59 | 
             
                    end
         | 
| 60 60 |  | 
| 61 | 
            -
                    while response.droplet.status != desired_state | 
| 61 | 
            +
                    while response.droplet.status != desired_state
         | 
| 62 62 | 
             
                      sleep 2
         | 
| 63 63 | 
             
                      response = ocean.droplet.show droplet_id
         | 
| 64 | 
            -
                      say  | 
| 64 | 
            +
                      say '.', nil, false
         | 
| 65 65 | 
             
                    end
         | 
| 66 66 |  | 
| 67 67 | 
             
                    total_time = (Time.now - start_time).to_i
         | 
| @@ -69,15 +69,22 @@ module Tugboat | |
| 69 69 | 
             
                    say "done#{CLEAR} (#{total_time}s)", :green
         | 
| 70 70 | 
             
                  end
         | 
| 71 71 |  | 
| 72 | 
            +
                  def restart_droplet(hard_restart, ocean, droplet_id = '', droplet_name = '')
         | 
| 73 | 
            +
                    if hard_restart
         | 
| 74 | 
            +
                      say "Queuing hard restart for #{droplet_id} #{droplet_name}...", nil, false
         | 
| 75 | 
            +
                      ocean.droplet.power_cycle droplet_id
         | 
| 76 | 
            +
                    else
         | 
| 77 | 
            +
                      say "Queuing restart for #{droplet_id} #{droplet_name}...", nil, false
         | 
| 78 | 
            +
                      ocean.droplet.reboot droplet_id
         | 
| 79 | 
            +
                    end
         | 
| 80 | 
            +
                  end
         | 
| 81 | 
            +
             | 
| 72 82 | 
             
                  # Get all pages of droplets
         | 
| 73 83 | 
             
                  def get_droplet_list(ocean)
         | 
| 74 | 
            -
             | 
| 75 84 | 
             
                    verify_credentials(ocean)
         | 
| 76 85 |  | 
| 77 86 | 
             
                    page = ocean.droplet.all(per_page: 200, page: 1)
         | 
| 78 | 
            -
                     | 
| 79 | 
            -
                      return page.droplets
         | 
| 80 | 
            -
                    end
         | 
| 87 | 
            +
                    return page.droplets unless page.paginated?
         | 
| 81 88 |  | 
| 82 89 | 
             
                    Enumerator.new do |enum|
         | 
| 83 90 | 
             
                      page.droplets.each { |drop| enum.yield drop }
         | 
| @@ -88,7 +95,5 @@ module Tugboat | |
| 88 95 | 
             
                    end
         | 
| 89 96 | 
             
                  end
         | 
| 90 97 | 
             
                end
         | 
| 91 | 
            -
             | 
| 92 98 | 
             
              end
         | 
| 93 99 | 
             
            end
         | 
| 94 | 
            -
             | 
| @@ -3,22 +3,19 @@ module Tugboat | |
| 3 3 | 
             
                # Check if the client has set-up configuration yet.
         | 
| 4 4 | 
             
                class CheckConfiguration < Base
         | 
| 5 5 | 
             
                  def call(env)
         | 
| 6 | 
            -
                    config = env[ | 
| 6 | 
            +
                    config = env['config']
         | 
| 7 7 |  | 
| 8 8 | 
             
                    if !config || !config.data || !config.access_token
         | 
| 9 | 
            -
                      say  | 
| 9 | 
            +
                      say 'You must run `tugboat authorize` in order to connect to DigitalOcean', :red
         | 
| 10 10 | 
             
                      exit 1
         | 
| 11 11 | 
             
                    end
         | 
| 12 12 |  | 
| 13 13 | 
             
                    # If the user passes the global `-q/--quiet` flag, redirect
         | 
| 14 14 | 
             
                    # stdout
         | 
| 15 | 
            -
                    if env[ | 
| 16 | 
            -
                      $stdout = File.new('/dev/null', 'w')
         | 
| 17 | 
            -
                    end
         | 
| 15 | 
            +
                    $stdout = File.new('/dev/null', 'w') if env['user_quiet']
         | 
| 18 16 |  | 
| 19 17 | 
             
                    @app.call(env)
         | 
| 20 18 | 
             
                  end
         | 
| 21 19 | 
             
                end
         | 
| 22 20 | 
             
              end
         | 
| 23 21 | 
             
            end
         | 
| 24 | 
            -
             |