civo_cli 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/Gemfile.lock +5 -5
- data/Rakefile +9 -0
- data/lib/apikey.rb +10 -2
- data/lib/blueprint.rb +3 -2
- data/lib/civo_cli/version.rb +1 -1
- data/lib/civo_cli.rb +4 -0
- data/lib/config.rb +4 -0
- data/lib/domain.rb +34 -0
- data/lib/domain_record.rb +116 -0
- data/lib/firewall.rb +80 -0
- data/lib/instance.rb +229 -48
- data/lib/sub_command_base.rb +9 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8819a307c3a3c33baaaf05fac0530e93965a4cf78575cfa3adaa0713a26586f6
|
4
|
+
data.tar.gz: 2d5be57eb29a3d1fedfc1450485f09d7dd20dfc61a7358bb4c46830d6becaee9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4ac35f3f40d3a524a581ee1439b1c2b8265a4c2a0f3fedec9eb01a2bf626a3488dfe50667b4c97b436f2e859f19f1dfe30a9a44f12fc018e4f43795e60656a74
|
7
|
+
data.tar.gz: 1513d0d52f85712125aaa292759f2462f3eb24b38f57eb81a9d7a3a86da86f0a6c0431dbff153da7adf4ce073c8a9da9c85e0dfc8f05026f4d698ac4742f3d4c
|
data/CHANGELOG.md
CHANGED
@@ -7,4 +7,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
7
7
|
### Rewrote
|
8
8
|
- Written new version in Ruby for ease of maintenance that replaces the old [Go-based CLI](https://github.com/absolutedevops/civo)
|
9
9
|
|
10
|
+
## [0.2.0] - 2019-06-19
|
11
|
+
### API endpoints implemented
|
12
|
+
- Implemented APIkey, Blueprint, Domain, Domainrecord, Firewall, Instance, Network, Quota, Region, Size, Snapshot, SSHKey, Template and Volume endpoints
|
13
|
+
|
10
14
|
[1.0.0]: https://github.com/olivierlacan/keep-a-changelog/compare/v0.3.0...v1.0.0
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
civo_cli (0.
|
4
|
+
civo_cli (0.2.0)
|
5
5
|
civo (>= 1.1.14)
|
6
6
|
colorize
|
7
7
|
json
|
@@ -18,7 +18,7 @@ GEM
|
|
18
18
|
tzinfo (~> 1.1)
|
19
19
|
addressable (2.6.0)
|
20
20
|
public_suffix (>= 2.0.2, < 4.0)
|
21
|
-
civo (1.1.
|
21
|
+
civo (1.1.17)
|
22
22
|
commander
|
23
23
|
flexirest (>= 1.4.6)
|
24
24
|
toml
|
@@ -33,7 +33,7 @@ GEM
|
|
33
33
|
faraday (0.15.4)
|
34
34
|
multipart-post (>= 1.2, < 3)
|
35
35
|
ffi (1.10.0)
|
36
|
-
flexirest (1.7.
|
36
|
+
flexirest (1.7.7)
|
37
37
|
activesupport
|
38
38
|
crack
|
39
39
|
faraday
|
@@ -54,7 +54,7 @@ GEM
|
|
54
54
|
guard-compat (~> 1.1)
|
55
55
|
rspec (>= 2.99.0, < 4.0)
|
56
56
|
hashdiff (0.3.8)
|
57
|
-
highline (2.0.
|
57
|
+
highline (2.0.2)
|
58
58
|
i18n (1.6.0)
|
59
59
|
concurrent-ruby (~> 1.0)
|
60
60
|
json (2.2.0)
|
@@ -66,7 +66,7 @@ GEM
|
|
66
66
|
method_source (0.9.2)
|
67
67
|
minitest (5.11.3)
|
68
68
|
multi_json (1.13.1)
|
69
|
-
multipart-post (2.
|
69
|
+
multipart-post (2.1.1)
|
70
70
|
nenv (0.3.0)
|
71
71
|
notiffany (0.1.1)
|
72
72
|
nenv (~> 0.1)
|
data/Rakefile
CHANGED
data/lib/apikey.rb
CHANGED
@@ -24,8 +24,16 @@ module CivoCLI
|
|
24
24
|
|
25
25
|
desc "remove NAME", "Remove the API Key with a label of 'NAME'"
|
26
26
|
def remove(name)
|
27
|
-
|
28
|
-
|
27
|
+
keys = CivoCLI::Config.get_apikeys
|
28
|
+
if keys.keys.include?(name)
|
29
|
+
CivoCLI::Config.delete_apikey(name)
|
30
|
+
puts "Removed the API Key #{name.colorize(:green)}"
|
31
|
+
else
|
32
|
+
puts "The API Key #{name.colorize(:red)} couldn't be found."
|
33
|
+
exit 1
|
34
|
+
end
|
35
|
+
|
36
|
+
|
29
37
|
end
|
30
38
|
map "delete" => "remove", "rm" => "remove"
|
31
39
|
|
data/lib/blueprint.rb
CHANGED
@@ -42,7 +42,7 @@ module CivoCLI
|
|
42
42
|
params[:dsl_content] = File.read(options["content-file"]) unless options["content-file"].nil?
|
43
43
|
params[:template_id] = options["template-id"] unless options["template-id"].nil?
|
44
44
|
params[:name] = options["name"] unless options["name"].nil?
|
45
|
-
Civo::Blueprint.
|
45
|
+
Civo::Blueprint.update(params)
|
46
46
|
blueprint = Civo::Blueprint.all.detect {|b| b.id == id }
|
47
47
|
puts "Updated blueprint #{blueprint.name.colorize(:green)}"
|
48
48
|
rescue Flexirest::HTTPException => e
|
@@ -60,7 +60,8 @@ module CivoCLI
|
|
60
60
|
params[:dsl_content] = File.read(options["content-file"]) unless options["content-file"].nil?
|
61
61
|
params[:template_id] = options["template-id"] unless options["template-id"].nil?
|
62
62
|
params[:name] = options["name"] unless options["name"].nil?
|
63
|
-
|
63
|
+
result = Civo::Blueprint.create(params)
|
64
|
+
blueprint = Civo::Blueprint.all.detect {|b| b.id == result.id }
|
64
65
|
puts "Created blueprint #{blueprint.name.colorize(:green)} with ID #{blueprint.id.colorize(:green)}"
|
65
66
|
rescue Flexirest::HTTPException => e
|
66
67
|
puts e.result.reason.colorize(:red)
|
data/lib/civo_cli/version.rb
CHANGED
data/lib/civo_cli.rb
CHANGED
@@ -23,6 +23,10 @@ module CivoCLI
|
|
23
23
|
subcommand "domain", CivoCLI::Domain
|
24
24
|
map "domains" => "domain"
|
25
25
|
|
26
|
+
desc "domainrecord", "manage domain name DNS records for a domain"
|
27
|
+
subcommand "domainrecord", CivoCLI::DomainRecord
|
28
|
+
map "domainrecords" => "domainrecord"
|
29
|
+
|
26
30
|
desc "firewall", "manage firewalls"
|
27
31
|
subcommand "firewall", CivoCLI::Firewall
|
28
32
|
map "firewalls" => "firewall"
|
data/lib/config.rb
CHANGED
@@ -38,6 +38,8 @@ module CivoCLI
|
|
38
38
|
|
39
39
|
def self.get_meta(key)
|
40
40
|
current["meta"].transform_keys{ |key| key.to_sym rescue key }[key]
|
41
|
+
rescue
|
42
|
+
nil
|
41
43
|
end
|
42
44
|
|
43
45
|
def self.set_meta(key, value)
|
@@ -47,6 +49,8 @@ module CivoCLI
|
|
47
49
|
|
48
50
|
def self.current
|
49
51
|
@config ||= JSON.parse(File.read(filename))
|
52
|
+
rescue
|
53
|
+
@config = {}
|
50
54
|
end
|
51
55
|
|
52
56
|
def self.reset
|
data/lib/domain.rb
CHANGED
@@ -1,5 +1,39 @@
|
|
1
1
|
module CivoCLI
|
2
2
|
class Domain < Thor
|
3
|
+
desc "list", "list all domain records for a domain"
|
4
|
+
def list
|
5
|
+
CivoCLI::Config.set_api_auth
|
6
|
+
rows = []
|
7
|
+
Civo::DnsDomain.all.items.each do |domain|
|
8
|
+
rows << [domain.id, domain.name]
|
9
|
+
end
|
10
|
+
puts Terminal::Table.new headings: ['ID', 'Name'], rows: rows
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "create DOMAIN", "create a new domain name called DOMAIN"
|
14
|
+
def create(name)
|
15
|
+
CivoCLI::Config.set_api_auth
|
16
|
+
domain = Civo::DnsDomain.create(name: name)
|
17
|
+
puts "Created a domain called #{name.colorize(:green)} with ID #{domain.id.colorize(:green)}"
|
18
|
+
rescue Flexirest::HTTPException => e
|
19
|
+
puts e.result.reason.colorize(:red)
|
20
|
+
exit 1
|
21
|
+
end
|
22
|
+
map "new" => "create"
|
23
|
+
|
24
|
+
desc "remove ID", "remove the domain with ID (or name)"
|
25
|
+
def remove(id)
|
26
|
+
CivoCLI::Config.set_api_auth
|
27
|
+
domain = Civo::DnsDomain.all.items.detect {|key| key.id == id || key.name == id}
|
28
|
+
Civo::DnsDomain.remove(id: domain.id)
|
29
|
+
puts "Removed the domain #{domain.name.colorize(:green)} with ID #{domain.id.colorize(:green)}"
|
30
|
+
rescue Flexirest::HTTPException => e
|
31
|
+
puts e.result.reason.colorize(:red)
|
32
|
+
exit 1
|
33
|
+
end
|
34
|
+
map "delete" => "remove", "rm" => "remove"
|
35
|
+
|
36
|
+
default_task :list
|
3
37
|
|
4
38
|
end
|
5
39
|
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
module CivoCLI
|
2
|
+
class DomainRecord < Thor
|
3
|
+
|
4
|
+
desc "list DOMAIN_ID", "list all entries for DOMAIN_ID (or name)"
|
5
|
+
def list(domain_id)
|
6
|
+
CivoCLI::Config.set_api_auth
|
7
|
+
domain = Civo::DnsDomain.all.items.detect {|key| key.id == domain_id || key.name == domain_id}
|
8
|
+
|
9
|
+
rows = []
|
10
|
+
Civo::DnsRecord.all(domain_id: domain.id).items.each do |record|
|
11
|
+
value = (record.value.length > 20 ? record.value[0, 17] + "..." : record.value)
|
12
|
+
rows << [record.id, record.type.upcase, "#{record.name}.#{domain.name.colorize(:light_black)}", value, record.ttl, record.priority]
|
13
|
+
end
|
14
|
+
puts Terminal::Table.new headings: ['ID', 'Type', 'Name', 'Value', 'TTL', 'Priority'], rows: rows
|
15
|
+
end
|
16
|
+
|
17
|
+
desc "show RECORD_ID", "show full information for record RECORD_ID (or full DNS name)"
|
18
|
+
def show(record_id)
|
19
|
+
CivoCLI::Config.set_api_auth
|
20
|
+
Civo::DnsDomain.all.items.each do |domain|
|
21
|
+
@domain = domain
|
22
|
+
@record = Civo::DnsRecord.all(domain_id: domain.id).detect {|key| key.id == record_id || (key.domain_id == domain.id && key.name == record_id.gsub(/\.#{domain.name}$/, '')) }
|
23
|
+
break if @record
|
24
|
+
end
|
25
|
+
puts " ID: #{@record.id}"
|
26
|
+
puts " Type: #{@record.type.upcase}"
|
27
|
+
puts " Name: #{@record.name}.#{@domain.name.colorize(:light_black)}"
|
28
|
+
puts " TTL: #{@record.ttl}"
|
29
|
+
puts " Priority: #{@record.priority}"
|
30
|
+
puts ""
|
31
|
+
puts "-" * 29 + "VALUE" + "-" * 29
|
32
|
+
puts @record.value
|
33
|
+
rescue Flexirest::HTTPException => e
|
34
|
+
puts e.result.reason.colorize(:red)
|
35
|
+
exit 1
|
36
|
+
end
|
37
|
+
|
38
|
+
option :priority, type: :string, desc: "The priority for MX records", aliases: ["-p"], banner: "PRIORITY"
|
39
|
+
option :ttl, type: :string, desc: "The Time-To-Live for this record", aliases: ["-t"], banner: "TTL"
|
40
|
+
desc "create RECORD TYPE VALUE", "create a new domain record called RECORD TYPE(a/alias, cname/canonical, mx/mail, txt/text) VALUE"
|
41
|
+
def create(name, type, value)
|
42
|
+
CivoCLI::Config.set_api_auth
|
43
|
+
domain, part = find_domain(name)
|
44
|
+
if domain
|
45
|
+
type = case(type.downcase)
|
46
|
+
when "cname", "canonical"
|
47
|
+
"cname"
|
48
|
+
when "mx", "mail"
|
49
|
+
"mx"
|
50
|
+
when "txt", "text"
|
51
|
+
"txt"
|
52
|
+
else
|
53
|
+
"a"
|
54
|
+
end.upcase
|
55
|
+
out = "Created #{type.colorize(:green)} record #{part.colorize(:green)} for #{domain.name.colorize(:green)}"
|
56
|
+
if options[:ttl] && options[:ttl] != ""
|
57
|
+
out += " with a TTL of #{options[:ttl].colorize(:green)} seconds"
|
58
|
+
if options[:priority] && options[:priority] != ""
|
59
|
+
out += " and"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
if options[:priority] && options[:priority] != ""
|
63
|
+
out += " with a priority of #{options[:priority].colorize(:green)}"
|
64
|
+
end
|
65
|
+
options[:ttl] ||= 600
|
66
|
+
options[:priority] ||= 0
|
67
|
+
|
68
|
+
record = Civo::DnsRecord.create(type: type, domain_id: domain.id, name: part, value: value, priority: options[:priority], ttl: options[:ttl])
|
69
|
+
puts record.inspect
|
70
|
+
puts "#{out} with ID #{record.id.colorize(:green)}"
|
71
|
+
else
|
72
|
+
puts "Unable to find the domain name for #{name}".colorize(:red)
|
73
|
+
end
|
74
|
+
rescue Flexirest::HTTPException => e
|
75
|
+
puts e.inspect
|
76
|
+
puts e.result.reason.colorize(:red)
|
77
|
+
exit 1
|
78
|
+
end
|
79
|
+
map "new" => "create"
|
80
|
+
|
81
|
+
desc "remove ID", "remove the domain record with ID"
|
82
|
+
def remove(id)
|
83
|
+
CivoCLI::Config.set_api_auth
|
84
|
+
Civo::DnsDomain.all.items.each do |d|
|
85
|
+
Civo::DnsRecord.all(domain_id: d.id).items.each do |r|
|
86
|
+
if r.id == id
|
87
|
+
Civo::DnsRecord.remove(domain_id: d.id, id: r.id)
|
88
|
+
puts "Removed the record #{r.name.colorize(:green)} record with ID #{r.id.colorize(:green)}"
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
rescue Flexirest::HTTPException => e
|
93
|
+
puts e.result&.reason&.colorize(:red)
|
94
|
+
exit 1
|
95
|
+
end
|
96
|
+
map "delete" => "remove", "rm" => "remove"
|
97
|
+
|
98
|
+
default_task :list
|
99
|
+
|
100
|
+
private
|
101
|
+
|
102
|
+
def find_domain(record)
|
103
|
+
domain = nil
|
104
|
+
part = nil
|
105
|
+
Civo::DnsDomain.all.items.each do |d|
|
106
|
+
if record.end_with? d.name
|
107
|
+
domain = d
|
108
|
+
part = record.gsub(".#{d.name}", "")
|
109
|
+
break
|
110
|
+
end
|
111
|
+
end
|
112
|
+
[domain, part]
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
116
|
+
end
|
data/lib/firewall.rb
CHANGED
@@ -1,5 +1,85 @@
|
|
1
1
|
module CivoCLI
|
2
2
|
class Firewall < Thor
|
3
|
+
desc "create firewall_name", "Create a new firewall"
|
4
|
+
def create(firewall_name)
|
5
|
+
CivoCLI::Config.set_api_auth
|
3
6
|
|
7
|
+
Civo::Firewall.create(name: firewall_name)
|
8
|
+
puts "Created firewall #{firewall_name.colorize(:green)}"
|
9
|
+
rescue Flexirest::HTTPException => e
|
10
|
+
puts e.result.reason.colorize(:red)
|
11
|
+
exit 1
|
12
|
+
end
|
13
|
+
|
14
|
+
desc "list", "Lists all firewalls"
|
15
|
+
def list
|
16
|
+
CivoCLI::Config.set_api_auth
|
17
|
+
rows = []
|
18
|
+
Civo::Firewall.all.items.each do |element|
|
19
|
+
rows << [element.id, element.name, element.rules_count, element.instances_count]
|
20
|
+
end
|
21
|
+
puts Terminal::Table.new headings: ['ID', 'Name', 'No. of Rules', 'instances using'], rows: rows
|
22
|
+
rescue Flexirest::HTTPException => e
|
23
|
+
puts e.result.reason.colorize(:red)
|
24
|
+
exit 1
|
25
|
+
end
|
26
|
+
|
27
|
+
desc "remove firewall_ID", "Removes a firewall with Firewall ID provided"
|
28
|
+
def remove(firewall_ID)
|
29
|
+
CivoCLI::Config.set_api_auth
|
30
|
+
Civo::Firewall.remove(id: firewall_ID)
|
31
|
+
puts "Removed firewall #{firewall_ID.colorize(:red)}"
|
32
|
+
rescue Flexirest::HTTPException => e
|
33
|
+
puts e.result.reason.colorize(:red)
|
34
|
+
exit 1
|
35
|
+
end
|
36
|
+
|
37
|
+
desc "new-rule", "Create new rule on firewall firewall_id called rule_name with required arguments"
|
38
|
+
option :firewall_id, required: true
|
39
|
+
option :protocol, default: 'tcp'
|
40
|
+
option :start_port, required: true
|
41
|
+
option :end_port
|
42
|
+
option :cidr, default: '0.0.0.0/0'
|
43
|
+
option :direction, default: 'inbound'
|
44
|
+
option :label
|
45
|
+
def new_rule
|
46
|
+
CivoCLI::Config.set_api_auth
|
47
|
+
|
48
|
+
if !options[:end_port]
|
49
|
+
Civo::FirewallRule.create(firewall_id: options[:firewall_id], start_port: options[:start_port], end_port: options[:start_port], cidr: options[:cidr], direction: options[:direction], label: options[:label])
|
50
|
+
end
|
51
|
+
if options[:end_port]
|
52
|
+
Civo::FirewallRule.create(firewall_id: options[:firewall_id], start_port: options[:start_port], end_port: options[:end_port], cidr: options[:cidr], direction: options[:direction], label: options[:label])
|
53
|
+
end
|
54
|
+
puts "New rule" + (options[:label].nil? ? "" : " #{options[:label].colorize(:green)}") + " created"
|
55
|
+
rescue Flexirest::HTTPException => e
|
56
|
+
puts e.result.reason.colorize(:red)
|
57
|
+
exit 1
|
58
|
+
end
|
59
|
+
|
60
|
+
desc "list-rules firewall_id", "Lists all active rules for firewall ID provided"
|
61
|
+
def list_rules(firewall_id)
|
62
|
+
CivoCLI::Config.set_api_auth
|
63
|
+
rules = Civo::FirewallRule.all(firewall_id: firewall_id)
|
64
|
+
rows = []
|
65
|
+
rules.each do |rule|
|
66
|
+
rows << [rule.id, rule.protocol, rule.start_port, rule.end_port, rule.direction, rule.cidr.items.join(", "), rule.label]
|
67
|
+
end
|
68
|
+
puts Terminal::Table.new title: "Firewall rules for #{firewall_id}", headings: ['ID', 'Protocol', 'Start Port', 'End Port', 'Direction', 'CIDR', 'Label'], rows: rows
|
69
|
+
rescue Flexirest::HTTPException => e
|
70
|
+
puts e.result.reason.colorize(:red)
|
71
|
+
exit 1
|
72
|
+
end
|
73
|
+
|
74
|
+
desc "delete-rule firewall_id rule_id", "Deletes rule with rule_id from firewall with firewall_id"
|
75
|
+
def delete_rule(firewall_id, rule_id)
|
76
|
+
CivoCLI::Config.set_api_auth
|
77
|
+
|
78
|
+
Civo::FirewallRule.remove(firewall_id: firewall_id, id: rule_id)
|
79
|
+
puts "Removed Firewall rule #{rule_id.colorize(:red)}"
|
80
|
+
rescue Flexirest::HTTPException => e
|
81
|
+
puts e.result.reason.colorize(:red)
|
82
|
+
exit 1
|
83
|
+
end
|
4
84
|
end
|
5
85
|
end
|
data/lib/instance.rb
CHANGED
@@ -13,103 +13,284 @@ module CivoCLI
|
|
13
13
|
end
|
14
14
|
|
15
15
|
if CivoCLI::Config.get_meta("admin")
|
16
|
-
desc "", ""
|
16
|
+
desc "high-cpu", "list high CPU using instances"
|
17
17
|
def high_cpu
|
18
18
|
# {ENV["CIVO_API_VERSION"] || "1"}/instances/high_cpu"
|
19
|
+
CivoCLI::Config.set_api_auth
|
20
|
+
instance = detect_instance_id(id)
|
21
|
+
|
22
|
+
Civo::Instance.high_cpu
|
19
23
|
end
|
20
24
|
end
|
21
25
|
|
22
|
-
desc "", ""
|
23
|
-
def
|
26
|
+
desc "show ID/HOSTNAME", "show an instance by ID or hostname"
|
27
|
+
def show(id)
|
24
28
|
# {ENV["CIVO_API_VERSION"] || "1"}/instances/:id", requires: [:id]
|
29
|
+
CivoCLI::Config.set_api_auth
|
30
|
+
rows = []
|
31
|
+
instance = detect_instance_id(id)
|
32
|
+
|
33
|
+
sizes = Civo::Size.all(all: true).items
|
34
|
+
ssh_keys = Civo::SshKey.all.items
|
35
|
+
networks = Civo::Network.all.items
|
36
|
+
firewalls = Civo::Firewall.all.items
|
37
|
+
|
38
|
+
size = sizes.detect {|s| s.name == instance.size}
|
39
|
+
if size
|
40
|
+
@size_name = size.description
|
41
|
+
end
|
42
|
+
@network = networks.detect {|n| n.id == instance.network_id}
|
43
|
+
@firewall = firewalls.detect {|fw| fw.id == instance.firewall_id}
|
44
|
+
|
45
|
+
puts " ID : #{instance.id}"
|
46
|
+
puts " Hostname : #{instance.hostname}"
|
47
|
+
if instance.reverse_dns
|
48
|
+
puts " Reverse DNS : #{instance.reverse_dns}"
|
49
|
+
end
|
50
|
+
puts " Tags : #{instance.tags.join(", ")}"
|
51
|
+
puts " Size : #{@size_name}"
|
52
|
+
case instance.status
|
53
|
+
when "ACTIVE"
|
54
|
+
puts " Status : #{instance.status.colorize(:green)}"
|
55
|
+
when /ING$/
|
56
|
+
puts " Status : #{instance.status.colorize(:orange)}"
|
57
|
+
else
|
58
|
+
puts " Status : #{instance.status.colorize(:red)}"
|
59
|
+
end
|
60
|
+
puts " Private IP : #{instance.private_ip}"
|
61
|
+
puts " Public IP : #{[instance.pseudo_ip, instance.public_ip].join(" => ")}"
|
62
|
+
puts " Network : #{@network.label} (#{@network.cidr})"
|
63
|
+
puts " Firewall : #{@firewall&.name} (rules: #{@firewall&.rules_count})"
|
64
|
+
puts " Region : #{instance.region}"
|
65
|
+
puts " Initial User : #{instance.initial_user}"
|
66
|
+
puts " Initial Password : #{instance.initial_password}"
|
67
|
+
if instance.ssh_key.present?
|
68
|
+
key = ssh_keys.detect { |k| k.id == instance.ssh_key }
|
69
|
+
puts " SSH Key : #{key.name} (#{key.fingerprint})"
|
70
|
+
end
|
71
|
+
puts " OpenStack ID : #{instance.openstack_server_id}"
|
72
|
+
puts " Template ID : #{instance.template_id}"
|
73
|
+
puts " Snapshot ID : #{instance.snapshot_id}"
|
74
|
+
puts ""
|
75
|
+
puts "-" * 29 + " NOTES " + "-" * 29
|
76
|
+
puts ""
|
77
|
+
puts instance.notes
|
78
|
+
rescue Flexirest::HTTPException => e
|
79
|
+
puts e.result.reason.colorize(:red)
|
80
|
+
exit 1
|
25
81
|
end
|
26
82
|
|
27
|
-
desc "", ""
|
28
|
-
|
83
|
+
desc "create --hostname=host_name --size=instance_size [--template=template_id ] [--snapshot=snapshot_id]", "create a new instance with specified hostname, instance size, template/snapshot ID. Optional: region, public_ip (true or false), initial user"
|
84
|
+
option :hostname, required: true
|
85
|
+
option :size, required: true
|
86
|
+
option :region, default: 'lon1'
|
87
|
+
option :public_ip, default: 'create'
|
88
|
+
option :initial_user, default: "civo"
|
89
|
+
option :template
|
90
|
+
option :snapshot
|
91
|
+
option :ssh_key_id
|
92
|
+
option :tags
|
93
|
+
def create(*args)
|
29
94
|
# {ENV["CIVO_API_VERSION"] || "1"}/instances", requires: [:hostname, :size, :region],
|
30
95
|
# defaults: {public_ip: true, initial_user: "civo"}
|
96
|
+
CivoCLI::Config.set_api_auth
|
97
|
+
if options[:template] && options[:snapshot] || !options[:template] && !options[:snapshot]
|
98
|
+
puts "Please provide either template OR snapshot ID".colorize(:red)
|
99
|
+
exit 1
|
100
|
+
end
|
101
|
+
if options[:template]
|
102
|
+
Civo::Instance.create(hostname: options[:hostname], size: options[:size], template: options[:template], initial_user: options[:initial_user], region: options[:region], ssh_key_id: options[:ssh_key_id], tags: options[:tags])
|
103
|
+
end
|
104
|
+
|
105
|
+
if options[:snapshot]
|
106
|
+
Civo::Instance.create(hostname: options[:hostname], size: options[:size], snapshot_id: options[:snapshot], initial_user: options[:initial_user], region: options[:region], ssh_key_id: options[:ssh_key_id], tags: options[:tags])
|
107
|
+
end
|
108
|
+
puts "Created instance #{options[:hostname].colorize(:green)}"
|
109
|
+
rescue Flexirest::HTTPException => e
|
110
|
+
puts e.result.reason.colorize(:red)
|
111
|
+
exit 1
|
31
112
|
end
|
32
113
|
|
33
|
-
desc "", ""
|
34
|
-
def tags
|
114
|
+
desc "tags ID 'tag1 tag2 tag3...'", "retag instance by ID (input no tags to clear all tags)"
|
115
|
+
def tags(id, newtags = nil)
|
116
|
+
CivoCLI::Config.set_api_auth
|
117
|
+
instance = detect_instance_id(id)
|
35
118
|
|
119
|
+
Civo::Instance.tags(id: instance.id, tags: newtags)
|
120
|
+
puts "Updated tags on #{instance.hostname.colorize(:green)}. Use 'civo instance show #{instance.hostname}' to see the current tags.'"
|
121
|
+
rescue Flexirest::HTTPException => e
|
122
|
+
puts e.result.reason.colorize(:red)
|
123
|
+
exit 1
|
36
124
|
end
|
37
125
|
|
38
|
-
desc "", ""
|
39
|
-
|
126
|
+
desc "update ID/HOSTNAME [--name=new_hostname] [--notes='txt']", "update details of instance. Use --hostname=new_name, --notes='notes' to specify update"
|
127
|
+
option :name
|
128
|
+
option :notes
|
129
|
+
def update(id)
|
130
|
+
CivoCLI::Config.set_api_auth
|
131
|
+
instance = detect_instance_id(id)
|
40
132
|
|
133
|
+
if options[:name]
|
134
|
+
Civo::Instance.update(id: instance.id, hostname: options[:name])
|
135
|
+
puts "Instance #{instance.id} now named #{options[:name].colorize(:green)}"
|
136
|
+
end
|
137
|
+
if options[:notes]
|
138
|
+
Civo::Instance.update(id: instance.id, notes: options[:notes])
|
139
|
+
puts "Instance #{instance.id} notes are now: #{options[:notes].colorize(:green)}"
|
140
|
+
end
|
141
|
+
rescue Flexirest::HTTPException => e
|
142
|
+
puts e.result.reason.colorize(:red)
|
143
|
+
exit 1
|
41
144
|
end
|
42
145
|
|
43
|
-
desc "", ""
|
44
|
-
def remove
|
146
|
+
desc "remove ID/HOSTNAME", "removes an instance with ID/hostname entered (use with caution!)"
|
147
|
+
def remove(id)
|
45
148
|
# {ENV["CIVO_API_VERSION"] || "1"}/instances/:id", requires: [:id], send_delete_body: true
|
149
|
+
CivoCLI::Config.set_api_auth
|
150
|
+
instance = detect_instance_id(id)
|
151
|
+
|
152
|
+
puts "Removing instance #{instance.hostname.colorize(:red)}"
|
153
|
+
instance.remove
|
154
|
+
rescue Flexirest::HTTPException => e
|
155
|
+
puts e.result.reason.colorize(:red)
|
156
|
+
exit 1
|
46
157
|
end
|
47
158
|
|
48
|
-
desc "", ""
|
49
|
-
def reboot
|
159
|
+
desc "reboot ID/HOSTNAME", "reboots instance with ID/hostname entered"
|
160
|
+
def reboot(id)
|
50
161
|
# {ENV["CIVO_API_VERSION"] || "1"}/instances/:id/reboots", requires: [:id]
|
51
|
-
|
162
|
+
CivoCLI::Config.set_api_auth
|
52
163
|
|
53
|
-
|
54
|
-
|
55
|
-
|
164
|
+
instance = detect_instance_id(id)
|
165
|
+
puts "Rebooting #{instance.hostname.colorize(:red)}. Use 'civo instance show #{instance.hostname}' to see the current status."
|
166
|
+
instance.reboot
|
167
|
+
rescue Flexirest::HTTPException => e
|
168
|
+
puts e.result.reason.colorize(:red)
|
169
|
+
exit 1
|
56
170
|
end
|
171
|
+
map "hard-reboot" => "reboot"
|
57
172
|
|
58
|
-
desc "", ""
|
59
|
-
def soft_reboot
|
173
|
+
desc "soft-reboot ID/HOSTNAME", "soft-reboots instance with ID entered"
|
174
|
+
def soft_reboot(id)
|
60
175
|
# {ENV["CIVO_API_VERSION"] || "1"}/instances/:id/soft_reboots", requires: [:id]
|
61
|
-
|
176
|
+
CivoCLI::Config.set_api_auth
|
62
177
|
|
63
|
-
|
64
|
-
|
65
|
-
|
178
|
+
instance = detect_instance_id(id)
|
179
|
+
puts "Soft-rebooting #{instance.hostname.colorize(:red)}. Use 'civo instance show #{instance.hostname}' to see the current status."
|
180
|
+
instance.soft_reboot
|
181
|
+
rescue Flexirest::HTTPException => e
|
182
|
+
puts e.result.reason.colorize(:red)
|
183
|
+
exit 1
|
66
184
|
end
|
67
185
|
|
68
|
-
desc "", ""
|
69
|
-
def
|
70
|
-
# {ENV["CIVO_API_VERSION"] || "1"}/instances/:id/
|
186
|
+
desc "console ID/HOSTNAME", "outputs a URL for a web-based console for instance with ID provided"
|
187
|
+
def console(id)
|
188
|
+
# {ENV["CIVO_API_VERSION"] || "1"}/instances/:id/console", requires: [:id]
|
189
|
+
CivoCLI::Config.set_api_auth
|
190
|
+
instance = detect_instance_id(id)
|
191
|
+
puts "Access #{instance.hostname.colorize(:green)} at #{instance.console.url}"
|
192
|
+
rescue Flexirest::HTTPException => e
|
193
|
+
puts e.result.reason.colorize(:red)
|
194
|
+
exit 1
|
71
195
|
end
|
72
196
|
|
73
|
-
desc "", ""
|
74
|
-
def stop
|
197
|
+
desc "stop ID/HOSTNAME", "shuts down the instance with ID provided"
|
198
|
+
def stop(id)
|
75
199
|
# {ENV["CIVO_API_VERSION"] || "1"}/instances/:id/stop", requires: [:id]
|
200
|
+
CivoCLI::Config.set_api_auth
|
201
|
+
instance = detect_instance_id(id)
|
202
|
+
puts "Stopping #{instance.hostname.colorize(:red)}. Use 'civo instance show #{instance.hostname}' to see the current status."
|
203
|
+
Civo::Instance.stop(id: instance.id)
|
204
|
+
rescue Flexirest::HTTPException => e
|
205
|
+
puts e.result.reason.colorize(:red)
|
206
|
+
exit 1
|
76
207
|
end
|
77
208
|
|
78
|
-
desc "", ""
|
79
|
-
def start
|
209
|
+
desc "start ID/HOSTNAME", "starts a stopped instance with ID provided"
|
210
|
+
def start(id)
|
80
211
|
# {ENV["CIVO_API_VERSION"] || "1"}/instances/:id/start", requires: [:id]
|
212
|
+
CivoCLI::Config.set_api_auth
|
213
|
+
|
214
|
+
instance = detect_instance_id(id)
|
215
|
+
puts "Starting #{instance.hostname.colorize(:green)}. Use 'civo instance show #{instance.hostname}' to see the current status."
|
216
|
+
instance.start
|
217
|
+
rescue Flexirest::HTTPException => e
|
218
|
+
puts e.result.reason.colorize(:red)
|
219
|
+
exit 1
|
81
220
|
end
|
82
221
|
|
83
|
-
desc "", ""
|
84
|
-
def upgrade
|
222
|
+
desc "upgrade ID new-size", "Upgrade instance with ID to size provided (see civo sizes for size names)"
|
223
|
+
def upgrade(id, new_size)
|
85
224
|
# {ENV["CIVO_API_VERSION"] || "1"}/instances/:id/resize", requires: [:size, :id]
|
86
|
-
|
225
|
+
CivoCLI::Config.set_api_auth
|
226
|
+
|
227
|
+
instance = detect_instance_id(id)
|
87
228
|
|
88
|
-
|
89
|
-
|
90
|
-
|
229
|
+
Civo::Instance.upgrade(id: instance.id, size: new_size)
|
230
|
+
puts "Resizing #{instance.hostname.colorize(:green)} to #{new_size.colorize(:red)}. Use 'civo instance show #{instance.hostname}' to see the current status."
|
231
|
+
rescue Flexirest::HTTPException => e
|
232
|
+
puts e.result.reason.colorize(:red)
|
233
|
+
exit 1
|
91
234
|
end
|
92
235
|
|
93
|
-
desc "", ""
|
94
|
-
def move_ip
|
236
|
+
desc "move-ip targetID IP_Address", "move a public IP_Address to target instance"
|
237
|
+
def move_ip(id, ip_address)
|
95
238
|
# {ENV["CIVO_API_VERSION"] || "1"}/instances/:id/ip/:ip", requires: [:ip, :id]
|
96
|
-
|
239
|
+
CivoCLI::Config.set_api_auth
|
97
240
|
|
98
|
-
|
99
|
-
def rescue
|
100
|
-
# {ENV["CIVO_API_VERSION"] || "1"}/instances/:id/rescue", requires: [:id]
|
101
|
-
end
|
241
|
+
instance = detect_instance_id(id)
|
102
242
|
|
103
|
-
|
104
|
-
|
105
|
-
|
243
|
+
Civo::Instance.move_ip(id: instance.id, ip: ip_address)
|
244
|
+
puts "Moved public IP #{ip_address} to instance #{instance.hostname}"
|
245
|
+
rescue Flexirest::HTTPException => e
|
246
|
+
puts e.result.reason.colorize(:red)
|
247
|
+
exit 1
|
106
248
|
end
|
107
249
|
|
108
|
-
desc "", ""
|
109
|
-
def
|
250
|
+
# desc "", ""
|
251
|
+
# def rescue
|
252
|
+
# # {ENV["CIVO_API_VERSION"] || "1"}/instances/:id/rescue", requires: [:id]
|
253
|
+
# end
|
254
|
+
|
255
|
+
# desc "", ""
|
256
|
+
# def unrescue
|
257
|
+
# # {ENV["CIVO_API_VERSION"] || "1"}/instances/:id/unrescue", requires: [:id]
|
258
|
+
# end
|
259
|
+
|
260
|
+
desc "firewall ID/HOSTNAME firewall_id", "set instance with ID/HOSTNAME to use firewall with firewall_id"
|
261
|
+
def firewall(id, firewall_id)
|
110
262
|
# {ENV["CIVO_API_VERSION"] || "1"}/instances/:id/firewall", requires: [:firewall_id, :id]
|
263
|
+
CivoCLI::Config.set_api_auth
|
264
|
+
|
265
|
+
instance = detect_instance_id(id)
|
266
|
+
|
267
|
+
Civo::Instance.firewall(id: instance.id, firewall_id: firewall_id)
|
268
|
+
puts "Set #{instance.hostname.colorize(:green)} to use firewall '#{firewall_id.colorize(:yellow)}'"
|
269
|
+
rescue Flexirest::HTTPException => e
|
270
|
+
puts e.result.reason.colorize(:red)
|
271
|
+
exit 1
|
111
272
|
end
|
112
273
|
|
113
274
|
default_task :list
|
275
|
+
|
276
|
+
private
|
277
|
+
|
278
|
+
def detect_instance_id(id)
|
279
|
+
result = []
|
280
|
+
Civo::Instance.all.items.each do |instance|
|
281
|
+
result << instance
|
282
|
+
end
|
283
|
+
result.select! { |instance| instance.hostname.include?(id) }
|
284
|
+
|
285
|
+
if result.count.zero?
|
286
|
+
puts "No instances found for '#{id}'. Please check your query."
|
287
|
+
exit 1
|
288
|
+
elsif result.count > 1
|
289
|
+
puts "Multiple possible instances found for '#{id}'. Please try with a more specific query."
|
290
|
+
exit 1
|
291
|
+
else
|
292
|
+
result[0]
|
293
|
+
end
|
294
|
+
end
|
114
295
|
end
|
115
296
|
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
class SubCommandBase < Thor
|
2
|
+
def self.banner(command, namespace = nil, subcommand = false)
|
3
|
+
"#{basename} #{subcommand_prefix} #{command.usage}"
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.subcommand_prefix
|
7
|
+
self.name.gsub(%r{.*::}, '').gsub(%r{^[A-Z]}) { |match| match[0].downcase }.gsub(%r{[A-Z]}) { |match| "-#{match[0].downcase}" }
|
8
|
+
end
|
9
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: civo_cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andy Jeffries
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2019-
|
12
|
+
date: 2019-06-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -208,6 +208,7 @@ files:
|
|
208
208
|
- lib/civo_cli/version.rb
|
209
209
|
- lib/config.rb
|
210
210
|
- lib/domain.rb
|
211
|
+
- lib/domain_record.rb
|
211
212
|
- lib/firewall.rb
|
212
213
|
- lib/instance.rb
|
213
214
|
- lib/network.rb
|
@@ -216,6 +217,7 @@ files:
|
|
216
217
|
- lib/size.rb
|
217
218
|
- lib/snapshot.rb
|
218
219
|
- lib/sshkey.rb
|
220
|
+
- lib/sub_command_base.rb
|
219
221
|
- lib/template.rb
|
220
222
|
- lib/volume.rb
|
221
223
|
homepage: https://www.civo.com/api
|