vpsb 1.0.0

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.
Files changed (93) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +21 -0
  3. data/Gemfile +20 -0
  4. data/Gemfile.lock +175 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +62 -0
  7. data/Rakefile +2 -0
  8. data/bin/vpsb +10 -0
  9. data/lib/vpsb/ask_support.rb +27 -0
  10. data/lib/vpsb/base_ask_resource.rb +40 -0
  11. data/lib/vpsb/base_resource.rb +13 -0
  12. data/lib/vpsb/base_task.rb +32 -0
  13. data/lib/vpsb/commands/base.rb +68 -0
  14. data/lib/vpsb/commands/build.rb +61 -0
  15. data/lib/vpsb/commands/cook.rb +27 -0
  16. data/lib/vpsb/commands/deploy.rb +25 -0
  17. data/lib/vpsb/commands/help_messages.rb +23 -0
  18. data/lib/vpsb/commands/init.rb +52 -0
  19. data/lib/vpsb/commands/setup.rb +23 -0
  20. data/lib/vpsb/core.rb +41 -0
  21. data/lib/vpsb/helpers/file_replace.rb +20 -0
  22. data/lib/vpsb/helpers/ssh.rb +117 -0
  23. data/lib/vpsb/resources/app_bags_json.rb +38 -0
  24. data/lib/vpsb/resources/app_env_variables.rb +24 -0
  25. data/lib/vpsb/resources/app_host.rb +12 -0
  26. data/lib/vpsb/resources/app_name.rb +11 -0
  27. data/lib/vpsb/resources/app_nginx_use_ssl.rb +12 -0
  28. data/lib/vpsb/resources/base_path.rb +10 -0
  29. data/lib/vpsb/resources/db_postgres_json.rb +62 -0
  30. data/lib/vpsb/resources/db_postgres_pass.rb +11 -0
  31. data/lib/vpsb/resources/db_postgres_version.rb +21 -0
  32. data/lib/vpsb/resources/db_postgresql_bags_json.rb +20 -0
  33. data/lib/vpsb/resources/deploy_bags_json.rb +36 -0
  34. data/lib/vpsb/resources/deploy_config.rb +32 -0
  35. data/lib/vpsb/resources/deploy_keychain.rb +19 -0
  36. data/lib/vpsb/resources/deploy_pass.rb +11 -0
  37. data/lib/vpsb/resources/deploy_ssh_keys.rb +20 -0
  38. data/lib/vpsb/resources/deploy_to_known_hosts.rb +13 -0
  39. data/lib/vpsb/resources/do_api_key.rb +14 -0
  40. data/lib/vpsb/resources/do_client_id.rb +8 -0
  41. data/lib/vpsb/resources/do_droplet_ssh_key.rb +15 -0
  42. data/lib/vpsb/resources/do_host.rb +8 -0
  43. data/lib/vpsb/resources/do_host_ip.rb +8 -0
  44. data/lib/vpsb/resources/do_image.rb +16 -0
  45. data/lib/vpsb/resources/do_region.rb +16 -0
  46. data/lib/vpsb/resources/do_size.rb +16 -0
  47. data/lib/vpsb/resources/do_ssh_path.rb +15 -0
  48. data/lib/vpsb/resources/do_ssh_pub_path.rb +15 -0
  49. data/lib/vpsb/resources/es_cluster_name.rb +9 -0
  50. data/lib/vpsb/resources/es_json.rb +50 -0
  51. data/lib/vpsb/resources/es_memlock.rb +18 -0
  52. data/lib/vpsb/resources/es_node_name.rb +8 -0
  53. data/lib/vpsb/resources/es_nofile.rb +18 -0
  54. data/lib/vpsb/resources/es_version.rb +21 -0
  55. data/lib/vpsb/resources/has_do_account.rb +19 -0
  56. data/lib/vpsb/resources/hostname.rb +12 -0
  57. data/lib/vpsb/resources/knife_rb_path.rb +10 -0
  58. data/lib/vpsb/resources/local_ssh_path.rb +15 -0
  59. data/lib/vpsb/resources/local_ssh_pub.rb +13 -0
  60. data/lib/vpsb/resources/monit_role_json.rb +33 -0
  61. data/lib/vpsb/resources/newrelic_lic.rb +8 -0
  62. data/lib/vpsb/resources/node_json.rb +31 -0
  63. data/lib/vpsb/resources/packages_bags_json.rb +20 -0
  64. data/lib/vpsb/resources/packages_list.rb +18 -0
  65. data/lib/vpsb/resources/rails_app_path.rb +11 -0
  66. data/lib/vpsb/resources/read_do_api_access.rb +21 -0
  67. data/lib/vpsb/resources/ruby_version.rb +21 -0
  68. data/lib/vpsb/resources/server_app_path.rb +11 -0
  69. data/lib/vpsb/resources/ssh_helper.rb +10 -0
  70. data/lib/vpsb/resources/unicorn_worker_processes.rb +18 -0
  71. data/lib/vpsb/resources/unicorn_worker_timeout.rb +18 -0
  72. data/lib/vpsb/resources/web_role_json.rb +92 -0
  73. data/lib/vpsb/resources.rb +4 -0
  74. data/lib/vpsb/shell_support.rb +7 -0
  75. data/lib/vpsb/tasks/apps_bags.rb +33 -0
  76. data/lib/vpsb/tasks/create_droplet.rb +51 -0
  77. data/lib/vpsb/tasks/db_postgres_bags.rb +32 -0
  78. data/lib/vpsb/tasks/db_postgres_role.rb +32 -0
  79. data/lib/vpsb/tasks/deploy_bags.rb +32 -0
  80. data/lib/vpsb/tasks/deploy_config.rb +19 -0
  81. data/lib/vpsb/tasks/do_api_access.rb +52 -0
  82. data/lib/vpsb/tasks/droplet_ssh_keys.rb +22 -0
  83. data/lib/vpsb/tasks/droplet_ssh_update_config.rb +20 -0
  84. data/lib/vpsb/tasks/es_role.rb +32 -0
  85. data/lib/vpsb/tasks/monit_role.rb +32 -0
  86. data/lib/vpsb/tasks/node.rb +32 -0
  87. data/lib/vpsb/tasks/packages_bags.rb +32 -0
  88. data/lib/vpsb/tasks/web_role.rb +32 -0
  89. data/lib/vpsb/version.rb +3 -0
  90. data/lib/vpsb.rb +16 -0
  91. data/spec/spec_helper.rb +22 -0
  92. data/vpsb.gemspec +30 -0
  93. metadata +263 -0
@@ -0,0 +1,23 @@
1
+ module Vpsb
2
+ module Commands
3
+ class Setup
4
+ include AskSupport
5
+ attr_reader :core
6
+
7
+ def initialize(core)
8
+ @core = core
9
+ end
10
+
11
+ def execute(params)
12
+ unless File.exist?(core.get(:knife_rb_path))
13
+ return puts "You did not run init script, because i cannot find knife.rb file in bootstrap server app. ;)"
14
+ end
15
+
16
+ Vpsb::Tasks::DoApiAccess.new(core).call
17
+ Vpsb::Tasks::DropletSshKeys.new(core).call
18
+ Vpsb::Tasks::CreateDroplet.new(core).call
19
+ Vpsb::Tasks::DropletSshUpdateConfig.new(core).call
20
+ end
21
+ end
22
+ end
23
+ end
data/lib/vpsb/core.rb ADDED
@@ -0,0 +1,41 @@
1
+ module Vpsb
2
+ class Core
3
+ class MissingResourceError < StandardError; end
4
+ def get(name, opts={})
5
+ name = name.to_sym
6
+ return data[name] = resources[name].call(self) if opts[:force]
7
+ data[name] ||= get_resource(name, opts).call(self)
8
+ end
9
+
10
+ def present?(name)
11
+ !blank?(name)
12
+ end
13
+
14
+ def blank?(name)
15
+ data[name].nil?
16
+ end
17
+
18
+ def resources
19
+ @resources ||= {}
20
+ end
21
+
22
+ def data
23
+ @data ||= {}
24
+ end
25
+
26
+ def register_resources(*resource_list)
27
+ resource_list.each{ |r| register_resource(r) }
28
+ end
29
+
30
+ def register_resource(resource)
31
+ resources[resource.name] = resource
32
+ end
33
+
34
+ private
35
+
36
+ def get_resource(name, opts)
37
+ raise MissingResourceError.new("Resource '#{name}', not found") unless resources[name]
38
+ resources[name]
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,20 @@
1
+ require 'fileutils'
2
+ require 'etc'
3
+
4
+ module Vpsb
5
+ module Helpers
6
+ class FileReplace
7
+ def self.replace_json(path, hash)
8
+ replace_text(path, hash.to_json)
9
+ end
10
+
11
+ def self.replace_text(path, text)
12
+ file_path = File.join(Dir.pwd, path)
13
+ FileUtils.rm(file_path) if File.exist?(file_path)
14
+ File.open(file_path,"w") do |f|
15
+ f.write(text)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,117 @@
1
+ require 'fileutils'
2
+ require 'etc'
3
+
4
+ module Vpsb
5
+ module Helpers
6
+ class Ssh
7
+ include AskSupport
8
+
9
+ def generate_ssh(path)
10
+ return if path == local_ssh_path && local_ssh_pub
11
+ puts 'Start generating new keys'
12
+ system("ssh-keygen -t rsa -f #{path}/id_rsa")
13
+ end
14
+
15
+ def ask_for_ssh_path
16
+ Dir.mkdir(local_ssh_path) unless Dir.exist?(local_ssh_path)
17
+
18
+ return local_ssh_path unless local_ssh_pub # no ssh keys yet
19
+ return local_ssh_path if ask_to_confirm('You have local ssh keys. Do you want to use it? If no, new keys will be generated')
20
+
21
+ begin
22
+ ssh_folder = Dir.home + '/.ssh/' + ask { puts "In what folder keep your keys?" }
23
+ can_continue = true
24
+
25
+ if Dir.exist?(ssh_folder)
26
+ if ask_to_confirm("Folder #{ssh_folder} already taken. Overwrite?")
27
+ FileUtils.rm_rf ssh_folder
28
+ else
29
+ can_continue = false
30
+ end
31
+ end
32
+ end until can_continue
33
+
34
+ Dir.mkdir ssh_folder
35
+ ssh_folder
36
+ end
37
+
38
+ def add_host_to_config(host, ssh_path, user)
39
+ make_ssh_config_copy
40
+ original_config = file(config_path)
41
+
42
+ unless start_place = original_config =~ /Host #{host} ##{user}/
43
+ File.open(config_path, 'a') { |f| f << host_config(host, ssh_path, user) }
44
+ return remove_config_copy
45
+ end
46
+
47
+ return unless ask_to_confirm("Host #{host} already defined in your ssh config file. Update?")
48
+
49
+ next_host_start_place = original_config[start_place + 1, original_config.size] =~ /Host /
50
+ new_config = [
51
+ original_config[0, start_place - 1], "\n\n",
52
+ host_config(host, ssh_path, user), "\n",
53
+ (next_host_start_place.nil? ? '' : original_config[next_host_start_place + start_place, original_config.size])
54
+ ].join(' ')
55
+
56
+ begin
57
+ File.open(config_path, 'w+') { |f| f.write(new_config) }
58
+ rescue => e
59
+ puts "Error occured when updaing ssh config. Message: #{e.message}"; restore_config_copy; puts "Original configuration restored"
60
+ end
61
+
62
+ remove_config_copy
63
+ end
64
+
65
+ def local_ssh_path
66
+ "#{Dir.home}/.ssh"
67
+ end
68
+
69
+ def local_ssh_pub
70
+ pub_key(local_ssh_path)
71
+ end
72
+
73
+ def pub_key(path)
74
+ path = path[-1] == '/' ? "#{path}id_rsa.pub" : "#{path}/id_rsa.pub"
75
+ file(path)
76
+ end
77
+
78
+ private
79
+
80
+ def config_path
81
+ "#{local_ssh_path}/config"
82
+ end
83
+
84
+ def config_copy_path
85
+ config_path + '_copy'
86
+ end
87
+
88
+ def file(path)
89
+ File.open(path, 'r') { |f| f.read } rescue nil
90
+ end
91
+
92
+ def host_config(host, ssh_path, user)
93
+ <<-EOS
94
+ Host #{host} ##{user}
95
+ HostName #{host}
96
+ IdentityFile #{ssh_path}
97
+ # User #{user}
98
+ EOS
99
+ end
100
+
101
+ def make_ssh_config_copy
102
+ system("touch #{config_path}") unless Dir.exist?(config_path)
103
+ FileUtils.cp config_path, config_copy_path
104
+ end
105
+
106
+ def remove_config_copy
107
+ if File.exist?(config_copy_path)
108
+ FileUtils.rm config_copy_path
109
+ end
110
+ end
111
+
112
+ def restore_config_copy
113
+ FileUtils.cp config_copy_path, config_path
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,38 @@
1
+ module Vpsb
2
+ module Resources
3
+ class AppBagsJson < BaseResource
4
+ res :app_bags_json
5
+
6
+ def call(data)
7
+ template(data)
8
+ end
9
+
10
+ private
11
+
12
+ def template(data)
13
+ {
14
+ id: "webapps",
15
+ apps_base_dir: "/opt/www",
16
+ apps: [
17
+ {
18
+ name: data.get(:app_name),
19
+ type: "rails",
20
+ default_env: "production",
21
+ host: data.get(:app_host),
22
+ try_files: "/caches/$uri.html",
23
+ nginx: {
24
+ default: true,
25
+ nginx_use_ssl: false
26
+ },
27
+ unicorn: {
28
+ unicorn_workers: data.get(:unicorn_worker_processes),
29
+ unicorn_timeout: data.get(:unicorn_worker_timeout)
30
+ },
31
+ app_env_variables: data.get(:app_env_variables)
32
+ }
33
+ ]
34
+ }
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,24 @@
1
+ module Vpsb
2
+ module Resources
3
+ class AppEnvVariables < BaseAskResource
4
+ res :app_env_variables
5
+ question 'What are aplication env variables (default: RAILS_ENV=production)?'
6
+ private
7
+
8
+ def finalize(answer)
9
+ return { 'RAILS_ENV' => 'production' } if answer.empty?
10
+ answer.split(';').inject({}) do |h, i|
11
+ res = i.to_s.split('=')
12
+ key = res.shift.to_s.strip
13
+ next if key.empty?
14
+ h[key] = res.join('=').to_s.strip
15
+ h
16
+ end
17
+ end
18
+
19
+ def validate
20
+ Proc.new { true }
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,12 @@
1
+ module Vpsb
2
+ module Resources
3
+ class AppHost < BaseAskResource
4
+ res :app_host
5
+ # question 'What is aplication host name (example: google.pl)?'
6
+
7
+ def call(core)
8
+ core.get(:do_host_ip)
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,11 @@
1
+ module Vpsb
2
+ module Resources
3
+ class AppName < BaseAskResource
4
+ res :app_name
5
+ # question 'What is aplication name (example: railsapp)?'
6
+ def call(core)
7
+ 'rails'
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ module Vpsb
2
+ module Resources
3
+ class AppNginxUseSsl < BaseAskResource
4
+ res :app_nginx_use_ssl
5
+ question 'Application use https protocol y[es]/n[o]?'
6
+ private
7
+ def finalize(answer)
8
+ answer[0].to_s.downcase == 'y'
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,10 @@
1
+ module Vpsb
2
+ module Resources
3
+ class BasePath < BaseResource
4
+ res :base_path
5
+ def call(data)
6
+ Dir.pwd
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,62 @@
1
+ module Vpsb
2
+ module Resources
3
+ class DbPostgresJson < BaseResource
4
+ res :db_postgres_json
5
+
6
+ def call(data)
7
+ template(data)
8
+ end
9
+
10
+ private
11
+
12
+ def template(data)
13
+ version = data.get(:db_postgres_version)
14
+ {
15
+ name: "db",
16
+ description: "Database Server Role",
17
+ chef_type: "role",
18
+ json_class: "Chef::Role",
19
+ default_attributes: {
20
+ postgresql: {
21
+ version: version,
22
+ enable_pgdg_apt: true,
23
+ dir: "/etc/postgresql/#{version}/main",
24
+ config:{
25
+ data_directory: "/var/lib/postgresql/#{version}/main",
26
+ hba_file: "/etc/postgresql/#{version}/main/pg_hba.conf",
27
+ ident_file: "/etc/postgresql/#{version}/main/pg_ident.conf",
28
+ external_pid_file: "/var/run/postgresql/#{version}-main.pid",
29
+ ssl_cert_file: "/etc/ssl/certs/ssl-cert-snakeoil.pem",
30
+ ssl_key_file:"/etc/ssl/private/ssl-cert-snakeoil.key"
31
+ },
32
+ client: {
33
+ packages: [ "postgresql-client-#{version}" ]
34
+ },
35
+ server:{
36
+ service_name: "postgresql",
37
+ packages: [ "postgresql-common", "postgresql-#{version}", "postgresql-server-dev-#{version}", "libpq-dev"]
38
+ },
39
+ contrib:{
40
+ packages:["postgresql-contrib-#{version}"]
41
+ },
42
+ password: {
43
+ postgres: "postgres"
44
+ },
45
+ pg_hba: [
46
+ { type: "local", db: "all", user: "postgres", addr: "", method: "ident" },
47
+ { type: "local", db: "all", user: "all", addr: "", method: "trust" },
48
+ { type: "host", db: "all", user: "all", addr: "127.0.0.1/32", method: "trust" },
49
+ { type: "host", db: "all", user: "all", addr: "::1/128", method: "trust" },
50
+ { type: "host", db: "all", user: "postgres", addr: "127.0.0.1/32", method: "trust" }
51
+ ]
52
+ }
53
+ },
54
+ run_list: [
55
+ "recipe[postgresql::server]",
56
+ "recipe[postgresql::client]"
57
+ ]
58
+ }
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,11 @@
1
+ require 'securerandom'
2
+
3
+ module Vpsb
4
+ module Resources
5
+ class DbPostgresPass < BaseAskResource
6
+ res :db_postgres_pass
7
+ question 'Postgres sql postgres user password (Default will be generated)?'
8
+ default SecureRandom.hex
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,21 @@
1
+ module Vpsb
2
+ module Resources
3
+ class DbPostgresVersion < BaseAskResource
4
+ res :db_postgres_version
5
+ question 'Postgres version (Default 9.3)?'
6
+ default '9.3'
7
+
8
+ private
9
+
10
+ def validate
11
+ Proc.new do |answer|
12
+ next true if answer.strip.empty?
13
+ parts = answer.split('.')
14
+ next false if parts.length != 2
15
+ next false if (parts[0] + parts[1]).to_i <= 7
16
+ true
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,20 @@
1
+ module Vpsb
2
+ module Resources
3
+ class DbPostgresqlBagsJson < BaseResource
4
+ res :db_postgresql_bags_json
5
+
6
+ def call(data)
7
+ template(data)
8
+ end
9
+
10
+ private
11
+
12
+ def template(data)
13
+ {
14
+ id: "postgresql",
15
+ postgresql: data.get(:db_postgres_pass)
16
+ }
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,36 @@
1
+ module Vpsb
2
+ module Resources
3
+ class DeployBagsJson < BaseResource
4
+ res :deploy_bags_json
5
+
6
+ def call(data)
7
+ template(data)
8
+ end
9
+
10
+ private
11
+
12
+ def template(data)
13
+ {
14
+ id: "deploy",
15
+ username: "deploy",
16
+ ssh_keys: data.get(:deploy_ssh_keys),
17
+ password: data.get(:deploy_pass),
18
+ groups: %w{www-data deploy},
19
+ uid: 1001,
20
+ shell: "/bin/bash",
21
+ home: "/home/deploy",
22
+ comment: "deployment user",
23
+ manage_home: true,
24
+ keychain: { id_dsa: "", "id_dsa.pub" => ""},
25
+ to_known_hosts: [],
26
+ www_dir: "/opt/www",
27
+ env_variables_for_rvm: true,
28
+ global_env_variables:{
29
+ APPS_DIR:"/opt/www",
30
+ RAILS_ENV: "production"
31
+ }
32
+ }
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,32 @@
1
+ module Vpsb
2
+ module Resources
3
+ class DeployConfig < BaseResource
4
+ res :deploy_config
5
+
6
+ def call(data)
7
+ template(data)
8
+ end
9
+
10
+ private
11
+
12
+ def template(data)
13
+ user = '#{user}'
14
+ domain = '#{domain}'
15
+ <<-EOF
16
+ set :stage, :production
17
+ set :rails_env, :production
18
+ fetch(:default_env).merge!(rails_env: :production)
19
+
20
+ domain = '#{data.get(:do_host_ip)}'
21
+ user = 'deploy'
22
+
23
+ role :app, "#{user}@#{domain}"
24
+ role :web, "#{user}@#{domain}"
25
+ role :db, "#{user}@#{domain}", primary: true
26
+
27
+ server domain, user: user, roles: %w{db web app}
28
+ EOF
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,19 @@
1
+ module Vpsb
2
+ module Resources
3
+ class DeployKeychain < BaseAskResource
4
+ res :deploy_keychain
5
+ # TODO ask for ssh_keys from .ssh
6
+ question 'Enter id_dsa and id_dsa.pub for deploy (example: -----BEGIN RSA, ssh-rsa AB...)'
7
+ private
8
+
9
+ def finalize(answer)
10
+
11
+ arr = answer.split(',').join(' ').split(' ').compact.uniq
12
+ {
13
+ id_dsa: arr.shift,
14
+ "id_dsa.pub" => arr.shift
15
+ }
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,11 @@
1
+ require 'securerandom'
2
+
3
+ module Vpsb
4
+ module Resources
5
+ class DeployPass < BaseAskResource
6
+ res :deploy_pass
7
+ question 'Enter password for deploy user (Default will be generated)?'
8
+ default SecureRandom.hex
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,20 @@
1
+ module Vpsb
2
+ module Resources
3
+ class DeploySshKeys < BaseAskResource
4
+ res :deploy_ssh_keys
5
+ # TODO ask for ssh_keys from .ssh
6
+ # question 'Enter ssh_keys(id_rsa.pub) for deploy (example: ssh-rsa AA... , ssh-rsa AB...)'
7
+
8
+ def call(core)
9
+ [core.get(:ssh_helper).pub_key(core.get(:do_ssh_path))]
10
+ end
11
+
12
+ private
13
+
14
+ # def finalize(answer)
15
+ # answer.split(',').join(' ').split(' ').compact.uniq
16
+ # end
17
+
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,13 @@
1
+ module Vpsb
2
+ module Resources
3
+ class DeployToKnownHosts < BaseAskResource
4
+ res :deploy_to_known_hosts
5
+ question 'Enter known hosts (example: bitbucket.org, github.com)?'
6
+ private
7
+
8
+ def finalize(answer)
9
+ answer.split(',').join(' ').split(' ').compact.uniq
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ module Vpsb
2
+ module Resources
3
+ class DoApiKey < BaseResource
4
+ include AskSupport
5
+ res :do_api_key
6
+
7
+ def call(core)
8
+ puts
9
+ ask { puts 'Visit https://cloud.digitalocean.com/api_access and generate API access key. Press Enter when ready to continue' }
10
+ ask_loop { puts 'What is your DigitalOcean api key?' }
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,8 @@
1
+ module Vpsb
2
+ module Resources
3
+ class DoClientId < BaseAskResource
4
+ res :do_client_id
5
+ question 'What is your DigitalOcean client id?'
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,15 @@
1
+ module Vpsb
2
+ module Resources
3
+ class DoDropletSshKey < BaseResource
4
+ include AskSupport
5
+ include ShellSupport
6
+ res :do_droplet_ssh_key
7
+
8
+ def call(core)
9
+ puts "Loading list of available ssh keys"
10
+ in_dir(core.get(:server_app_path), 'knife digital_ocean sshkey list')
11
+ ask_loop { puts 'Which ssh key? Enter its id' }
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,8 @@
1
+ module Vpsb
2
+ module Resources
3
+ class DoHost < BaseAskResource
4
+ res :do_host
5
+ question 'What will be your host name? f.e. my_site.com'
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ module Vpsb
2
+ module Resources
3
+ class DoHostIp < BaseAskResource
4
+ res :do_host_ip
5
+ question 'What will be your host ip address? f.e. 80.240.132.140'
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,16 @@
1
+ module Vpsb
2
+ module Resources
3
+ class DoImage < BaseResource
4
+ include AskSupport
5
+ include ShellSupport
6
+ res :do_image
7
+
8
+ def call(core)
9
+ puts "Loading list of available operating systems"
10
+ in_dir(core.get(:server_app_path), "knife digital_ocean image list -G | grep -i 'Ubuntu'")
11
+ answer = ask { puts 'Which system? Enter its id (default: 3101918)' }.strip
12
+ answer.empty? ? '3101918' : answer
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ module Vpsb
2
+ module Resources
3
+ class DoRegion < BaseResource
4
+ include AskSupport
5
+ include ShellSupport
6
+ res :do_region
7
+
8
+ def call(core)
9
+ puts "Loading list of available regions"
10
+ in_dir(core.get(:server_app_path), "knife digital_ocean region list")
11
+ answer = ask { puts 'Which region? Enter its id (default: 5)' }.strip
12
+ answer.empty? ? '5' : answer
13
+ end
14
+ end
15
+ end
16
+ end