civo 0.0.1 → 0.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a3c07b504454e59540db455a54b970c30c092b62
4
- data.tar.gz: 4765e7ee81da0faa005a2faf98671e793c822346
3
+ metadata.gz: 337b9d93da0b0f0236d6fc643bae10391adddfc1
4
+ data.tar.gz: 977615186c605ccfb5103daeea279c4a04bc83bf
5
5
  SHA512:
6
- metadata.gz: 3613fe12b39e0311d64746e00c691e827d62a787d3666f431d972216b361e9b5ddfeff2d81eedc46b69b789c68516ac70ebc9788b7067b322b1f5dad676c8f82
7
- data.tar.gz: e0cc582093ac2bb7bb388f52f809b16e009ce05578d78ce78220dda82331be09781ab9b694a0fe458d46a97204bd7d843ec9c4240a1810da031c398fa465d544
6
+ metadata.gz: 89d1e11deab114b018e3b7fa6c84c23629dce3165569fdde59248422a39ab8772c390daa33369729f98c2face728a4606c779e43d8f1a325e801bd5a41343bd2
7
+ data.tar.gz: 3e5fb94c5b7b1278b5365a625257d6b3cfb2ddf84e7807ec4ec91b232b90995c2e5da393ce9d80dbad1275b7551f57bfb25756288404bc4b203a8dcad212294b
@@ -0,0 +1,8 @@
1
+ module Civo
2
+ class Account < Base
3
+ get :all, "/v1/accounts"
4
+ post :create, "/v1/accounts", requires: [:name]
5
+ put :reset, "/v1/accounts/:name", requires: [:name]
6
+ delete :remove, "/v1/accounts/:name", requires: [:name]
7
+ end
8
+ end
@@ -0,0 +1,10 @@
1
+ module Civo
2
+ class Base < Flexirest::Base
3
+ before_request do |name, request|
4
+ request.headers["Authorization"] = "bearer #{ENV["CIVO_TOKEN"] || Civo::Token.default}"
5
+ end
6
+ end
7
+ end
8
+
9
+ Flexirest::Base.base_url = ENV["CIVO_URL"] || Civo::Config.api_url
10
+ Flexirest::Logger.logfile = "flexirest.log"
@@ -0,0 +1,13 @@
1
+ module Civo
2
+ class Instance < Base
3
+ verbose!
4
+ get :all, "/v1/instances"
5
+ post :create, "/v1/instances", requires: [:hostname, :size, :region, :ssh_key],
6
+ defaults: {public_ip: true, template: "ubuntu-14.04", initial_user: "civo"}
7
+ delete :remove, "/v1/instances/:id"
8
+
9
+ def ip_addresses
10
+ self._attributes[:ip_addresses].items rescue ""
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,6 @@
1
+ module Civo
2
+ class Quota < Base
3
+ get :current, "/v1/quota"
4
+ put :update, "/v1/quota/:name", requires: [:name]
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ module Civo
2
+ class Region < Base
3
+ get :all, "/v1/regions"
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ module Civo
2
+ class Size < Base
3
+ get :all, "/v1/sizes"
4
+ put :reset, "/v1/sizes"
5
+ end
6
+ end
@@ -0,0 +1,7 @@
1
+ module Civo
2
+ class SshKey < Base
3
+ get :all, "/v1/sshkeys"
4
+ post :create, "/v1/sshkeys", requires: [:name, :public_key]
5
+ delete :remove, "/v1/sshkeys/:name", requires: [:name]
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ module Civo
2
+ class Template < Base
3
+ get :all, "/v1/templates"
4
+ end
5
+ end
@@ -1,4 +1,19 @@
1
- require "civo/engine"
1
+ if defined?(Rails)
2
+ require "civo/engine"
3
+ end
2
4
 
3
5
  module Civo
6
+ autoload :Token, "civo/cli/token"
7
+ autoload :Config, "civo/cli/config"
8
+ autoload :Client, "civo/cli/client"
9
+ unless defined?(Rails)
10
+ autoload :Account, "#{ENGINE_ROOT}/app/models/civo/account"
11
+ autoload :Base, "#{ENGINE_ROOT}/app/models/civo/base"
12
+ autoload :SshKey, "#{ENGINE_ROOT}/app/models/civo/ssh_key"
13
+ autoload :Quota, "#{ENGINE_ROOT}/app/models/civo/quota"
14
+ autoload :Size, "#{ENGINE_ROOT}/app/models/civo/size"
15
+ autoload :Region, "#{ENGINE_ROOT}/app/models/civo/region"
16
+ autoload :Template, "#{ENGINE_ROOT}/app/models/civo/template"
17
+ autoload :Instance, "#{ENGINE_ROOT}/app/models/civo/instance"
18
+ end
4
19
  end
@@ -0,0 +1,57 @@
1
+ module Civo
2
+ class Client
3
+ def self.tabulate(hash, titles, options = {})
4
+ longest_key_length = hash.keys.max_by(&:length).try(:length) || 5
5
+
6
+ default = hash.delete("**DEFAULT**")
7
+ title = "%-#{longest_key_length}s | %s" % [titles[0], titles[1]]
8
+ puts title
9
+ puts "%s-|-%s" % [("-" * longest_key_length), ("-" * (69-longest_key_length))]
10
+ keys = hash.keys
11
+ keys.sort! if options[:sort] == true
12
+ keys.each do |key|
13
+ value = hash[key]
14
+ print "%-#{longest_key_length}s | %s" % [key, value]
15
+ if key == default
16
+ print " (DEFAULT)"
17
+ end
18
+ puts
19
+ end
20
+ end
21
+
22
+ def self.tabulate_flexirest(data, mappings)
23
+ columns = mappings.dup
24
+ columns.each do |k, nice|
25
+ columns[k] = {max_width: (nice.length > 5 ? nice.length : 5), label: nice }
26
+ end
27
+
28
+ data.each do |record|
29
+ columns.each do |k, v|
30
+ length = record.send(k).to_s.length
31
+ if record.send(k).to_s.length > v[:max_width]
32
+ v[:max_width] = length
33
+ end
34
+ end
35
+ end
36
+
37
+ puts (columns.keys.map do |k|
38
+ "%-#{columns[k][:max_width]}s" % columns[k][:label]
39
+ end.to_a.join(" | "))
40
+ puts (columns.keys.map do |k|
41
+ "-" * columns[k][:max_width]
42
+ end.to_a.join("-+-"))
43
+
44
+ data.each do |record|
45
+ row = []
46
+ columns.each do |k, v|
47
+ value = record.send(k)
48
+ if value.is_a? Array
49
+ value = value.join(", ")
50
+ end
51
+ row << "%-#{columns[k][:max_width]}s" % value
52
+ end
53
+ puts (row.join(" | "))
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,58 @@
1
+ command "accounts" do |c|
2
+ c.description = "List known accounts (CIVO-INTERNAL-USE ONLY)"
3
+ c.action do |args, options|
4
+ begin
5
+ accounts = Civo::Account.all
6
+ Civo::Client.tabulate_flexirest accounts, {username: "Account", api_key: "API Key"}
7
+ rescue Flexirest::HTTPUnauthorisedClientException, Flexirest::HTTPForbiddenClientException
8
+ puts "Access denied to your default token, ensure it's set correctly with 'civo tokens'"
9
+ end
10
+ end
11
+ end
12
+
13
+ command "accounts:create" do |c|
14
+ c.description = "Create an account (CIVO-INTERNAL-USE ONLY)"
15
+ c.example "Creates an account called 'testuser'", 'civo accounts:create testuser'
16
+ c.action do |args, options|
17
+ begin
18
+ account = Civo::Account.create(name: args.first)
19
+ puts "Account '#{args.first}' created. The API key is '#{account.api_key}'"
20
+ rescue Flexirest::HTTPUnauthorisedClientException, Flexirest::HTTPForbiddenClientException
21
+ puts "Access denied to your default token, ensure it's set correctly with 'civo tokens'"
22
+ end
23
+ end
24
+ end
25
+
26
+ command "accounts:reset" do |c|
27
+ c.description = "Reset the API Key for an account (CIVO-INTERNAL-USE ONLY)"
28
+ c.example "Resets the account called 'testuser' with a new API key", 'civo accounts:reset testuser'
29
+ c.action do |args, options|
30
+ begin
31
+ account = Civo::Account.reset(name: args.first)
32
+ puts "Account '#{args.first}' reset, the new API key is '#{account.api_key}'"
33
+ rescue Flexirest::HTTPUnauthorisedClientException, Flexirest::HTTPForbiddenClientException
34
+ puts "Access denied to your default token, ensure it's set correctly with 'civo tokens'"
35
+ end
36
+ end
37
+ end
38
+
39
+ command "accounts:remove" do |c|
40
+ c.description = "Remove an account (and all instances, networks, etc) (CIVO-INTERNAL-USE ONLY)"
41
+ c.example "Removes an account called 'testuser'", 'civo accounts:remove testuser'
42
+ c.action do |args, options|
43
+ begin
44
+ account = Civo::Account.remove(name: args.first)
45
+ if account.result == "ok"
46
+ puts "Account '#{args.first}' has been removed."
47
+ else
48
+ puts "Failed to delete that account: #{account.inspect}"
49
+ end
50
+ rescue Flexirest::HTTPUnauthorisedClientException, Flexirest::HTTPForbiddenClientException
51
+ puts "Access denied to your default token, ensure it's set correctly with 'civo tokens'"
52
+ rescue Flexirest::HTTPNotFoundClientException => e
53
+ puts "Couldn't find that account to remove, maybe it's already been removed?"
54
+ rescue Flexirest::HTTPServerException => e
55
+ puts "Unable to remove #{e.result.reason}"
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,87 @@
1
+ command "instances" do |c|
2
+ c.description = "List known instances"
3
+ c.action do |args, options|
4
+ begin
5
+ instances = Civo::Instance.all
6
+ Civo::Client.tabulate_flexirest instances, {id: "ID", hostname: "Hostname", size: "Size", ip_addresses: "IP Addresses", status: "Status"}
7
+ rescue Flexirest::HTTPServerException => e
8
+ puts "An error occurred: #{e.result.reason}"
9
+ exit 3
10
+ rescue Flexirest::ResponseParseException => e
11
+ puts "An error occurred: #{e.inspect}"
12
+ exit 4
13
+ rescue Flexirest::HTTPUnauthorisedClientException, Flexirest::HTTPForbiddenClientException
14
+ puts "Access denied to your default token, ensure it's set correctly with 'civo tokens'"
15
+ end
16
+ end
17
+ end
18
+
19
+ command "instances:create" do |c|
20
+ c.description = "Create an instance"
21
+ c.option "--size STRING", String, "The size from 'civo sizes'"
22
+ c.option "--region STRING", String, "The region from 'civo regions'"
23
+ c.option "--ssh-key STRING", String, "The SSH key name from 'civo sshkeys'"
24
+ c.option "--[no-]public-ip", "Should a public IP address be allocated"
25
+ c.option "--template STRING", String, "The template from 'civo templates'"
26
+ c.option "--initial-user STRING", String, "The default user to create (defaults to 'civo')"
27
+ c.example "Creates an instance called 'test1.example.com'", 'civo instances:create test1.example.com --size g1.small --region svg1 --ssh-key default'
28
+ c.action do |args, options|
29
+ begin
30
+ params = {}
31
+ params[:size] = options.size if options.size
32
+ params[:region] = options.region if options.region
33
+ params[:ssh_key] = options.ssh_key if options.ssh_key
34
+ params[:public_ip] = options.public_ip if options.public_ip
35
+ params[:template] = options.template if options.template
36
+ params[:initial_user] = options.initial_user if options.initial_user
37
+ params[:hostname] = args.first
38
+ instance = Civo::Instance.create(params)
39
+ puts "Instance '#{args.first}' created. The ID is '#{instance.id}' and its status is #{instance.status}"
40
+ rescue Flexirest::HTTPServerException => e
41
+ puts "An error occurred: #{e.result.reason}"
42
+ exit 3
43
+ rescue Flexirest::HTTPUnauthorisedClientException, Flexirest::HTTPForbiddenClientException
44
+ puts "Access denied to your default token, ensure it's set correctly with 'civo tokens'"
45
+ end
46
+ end
47
+ end
48
+
49
+ command "instances:reset" do |c|
50
+ c.description = "Reset the API Key for an account"
51
+ c.example "Resets the account called 'testuser' with a new API key", 'civo instances:reset testuser'
52
+ c.action do |args, options|
53
+ begin
54
+ account = Civo::Instance.reset(name: args.first)
55
+ puts "Account '#{args.first}' reset, the new API key is '#{account.api_key}'"
56
+ rescue Flexirest::HTTPUnauthorisedClientException, Flexirest::HTTPForbiddenClientException
57
+ puts "Access denied to your default token, ensure it's set correctly with 'civo tokens'"
58
+ end
59
+ end
60
+ end
61
+
62
+ command "instances:remove" do |c|
63
+ c.description = "Remove an account (and all instances, networks, etc)"
64
+ c.example "Removes an account called 'testuser'", 'civo instances:remove testuser'
65
+ c.action do |args, options|
66
+ begin
67
+ if args.first[/(\w{8}(-\w{4}){3}-\w{12}?)/]
68
+ id = args.first
69
+ else
70
+ instance = Civo::Instance.all.detect {|i| i.hostname == args.first}
71
+ id = instance.id
72
+ end
73
+ account = Civo::Instance.remove(id: id)
74
+ if account.result == "ok"
75
+ puts "Account '#{args.first}' has been removed."
76
+ else
77
+ puts "Failed to delete that account: #{account.inspect}"
78
+ end
79
+ rescue Flexirest::HTTPUnauthorisedClientException, Flexirest::HTTPForbiddenClientException
80
+ puts "Access denied to your default token, ensure it's set correctly with 'civo tokens'"
81
+ rescue Flexirest::HTTPNotFoundClientException => e
82
+ puts "Couldn't find that account to remove, maybe it's already been removed?"
83
+ rescue Flexirest::HTTPServerException => e
84
+ puts "Unable to remove #{e.result.reason}"
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,82 @@
1
+ command "quota" do |c|
2
+ c.option "--account STRING", String, "The account to get the quota for"
3
+
4
+ c.description = "List the quota for the current account"
5
+ c.action do |args, options|
6
+ begin
7
+ if options.account
8
+ quota = Civo::Quota.current(username: options.account)
9
+ else
10
+ quota = Civo::Quota.current
11
+ end
12
+ data = {
13
+ "Number of instances" => "#{quota.instance_count_limit} (used #{quota.instance_count_usage})",
14
+ "Total CPU cores" => "#{quota.cpu_core_limit} (used #{quota.cpu_core_usage})",
15
+ "Total RAM" => "#{quota.ram_mb_limit}MB (used #{quota.ram_mb_usage}MB)",
16
+ "Total disk space" => "#{quota.disk_gb_limit}GB (used #{quota.disk_gb_usage}GB)",
17
+ "Disk volumes" => "#{quota.disk_volume_count_limit} (used #{quota.disk_volume_count_usage})",
18
+ "Disk snapshots" => "#{quota.disk_snapshot_count_limit} (used #{quota.disk_snapshot_count_usage})",
19
+ "Public IP addresses" => "#{quota.public_ip_address_limit} (used #{quota.public_ip_address_usage})",
20
+ "Private subnets" => "#{quota.subnet_count_limit} (used #{quota.subnet_count_usage})",
21
+ "Private networks" => "#{quota.network_count_limit} (used #{quota.network_count_usage})",
22
+ "Security groups" => "#{quota.security_group_limit} (used #{quota.security_group_usage})",
23
+ "Security group rules" => "#{quota.security_group_rule_limit} (used #{quota.security_group_rule_usage})",
24
+ "Number of ports (network connections)" => "#{quota.port_count_limit} (used #{quota.port_count_usage})"
25
+ }
26
+
27
+ Civo::Client.tabulate data, ["Title", "Limit"]
28
+
29
+ if Civo::Config.admin?
30
+ puts
31
+ puts "To set these quota values use:"
32
+ puts "civo quota:set --instance-count #{quota.instance_count_limit} --cpu-core #{quota.cpu_core_limit} --ram-mb #{quota.ram_mb_limit} --disk-gb #{quota.disk_gb_limit} \\"
33
+ puts " --disk-volume-count #{quota.disk_volume_count_limit} --disk-snapshot-count #{quota.disk_snapshot_count_limit} --public-ip-address #{quota.public_ip_address_limit} \\"
34
+ puts " --subnet-count #{quota.subnet_count_limit} --network-count #{quota.network_count_limit} --security-group #{quota.security_group_limit} --security-group-rule #{quota.security_group_rule_limit} \\"
35
+ puts " --port-count #{quota.port_count_limit} #{"--account #{options.account}" if options.account}"
36
+ end
37
+ rescue Flexirest::HTTPUnauthorisedClientException, Flexirest::HTTPForbiddenClientException
38
+ puts "Access denied to your default token, ensure it's set correctly with 'civo tokens'"
39
+ end
40
+ end
41
+ end
42
+
43
+ command "quota:set" do |c|
44
+ c.description = "Update the quotas for the current account (CIVO-INTERNAL-USE ONLY)"
45
+ c.option "--account STRING", String, "The account to update the quota for"
46
+ c.option "--instance-count INTEGER", Integer, "The limit to the number of instances available"
47
+ c.option "--cpu-core INTEGER", Integer, "The limit to the number of CPU cores available"
48
+ c.option "--ram-mb INTEGER", Integer, "The limit to the amount of RAM (in MB) available"
49
+ c.option "--disk-gb INTEGER", Integer, "The limit to the of disk space (in GB) available"
50
+ c.option "--disk-volume-count INTEGER", Integer, "The limit to the number of disk volumes available"
51
+ c.option "--disk-snapshot-count INTEGER", Integer, "The limit to the number of disk snapshots available"
52
+ c.option "--public-ip-address INTEGER", Integer, "The limit to the number of public IP addresses available"
53
+ c.option "--subnet-count INTEGER", Integer, "The limit to the number of subnets available"
54
+ c.option "--network-count INTEGER", Integer, "The limit to the number of networks available"
55
+ c.option "--security-group INTEGER", Integer, "The limit to the number of security groups available"
56
+ c.option "--security-group-rule INTEGER", Integer, "The limit to the number of security group rules available"
57
+ c.option "--port-count INTEGER", Integer, "The limit to the number of ports (network connections) available"
58
+
59
+ c.action do |args, options|
60
+ begin
61
+ params = {}
62
+ params[:name] = options.account if options.account
63
+ params[:instance_count_limit] = options.instance_count if options.instance_count
64
+ params[:cpu_core_limit] = options.cpu_core if options.cpu_core
65
+ params[:ram_mb_limit] = options.ram_mb if options.ram_mb
66
+ params[:disk_gb_limit] = options.disk_gb if options.disk_gb
67
+ params[:disk_volume_count_limit] = options.disk_volume_count if options.disk_volume_count
68
+ params[:disk_snapshot_count_limit] = options.disk_snapshot_count if options.disk_snapshot_count
69
+ params[:public_ip_address_limit] = options.public_ip_address if options.public_ip_address
70
+ params[:subnet_count_limit] = options.subnet_count if options.subnet_count
71
+ params[:network_count_limit] = options.network_count if options.network_count
72
+ params[:security_group_limit] = options.security_group if options.security_group
73
+ params[:security_group_rule_limit] = options.security_group_rule if options.security_group_rule
74
+ params[:port_count_limit] = options.port_count if options.port_count
75
+ puts params.inspect
76
+ Civo::Quota.update(params)
77
+ puts "Quota updated"
78
+ rescue Flexirest::HTTPUnauthorisedClientException, Flexirest::HTTPForbiddenClientException
79
+ puts "Access denied to your default token, ensure it's set correctly with 'civo tokens'"
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,15 @@
1
+ command "regions" do |c|
2
+ c.description = "List available regions"
3
+ c.action do |args, options|
4
+ begin
5
+ regions = Civo::Region.all
6
+ puts "Region name"
7
+ puts "-" * 72
8
+ regions.each do |region|
9
+ puts region.name
10
+ end
11
+ rescue Flexirest::HTTPUnauthorisedClientException, Flexirest::HTTPForbiddenClientException
12
+ puts "Access denied to your default token, ensure it's set correctly with 'civo tokens'"
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,23 @@
1
+ command "sizes" do |c|
2
+ c.description = "List available instance sizes"
3
+ c.action do |args, options|
4
+ begin
5
+ sizes = Civo::Size.all
6
+ Civo::Client.tabulate_flexirest sizes, {Name: "Size", Description: "Description"}
7
+ rescue Flexirest::HTTPUnauthorisedClientException, Flexirest::HTTPForbiddenClientException
8
+ puts "Access denied to your default token, ensure it's set correctly with 'civo tokens'"
9
+ end
10
+ end
11
+ end
12
+
13
+ command "sizes:reset" do |c|
14
+ c.description = "Reset available instance sizes"
15
+ c.action do |args, options|
16
+ begin
17
+ Civo::Size.reset
18
+ puts "Standard sizes reset in Openstack"
19
+ rescue Flexirest::HTTPUnauthorisedClientException, Flexirest::HTTPForbiddenClientException
20
+ puts "Access denied to your default token, ensure it's set correctly with 'civo tokens'"
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,46 @@
1
+ command "sshkeys" do |c|
2
+ c.description = "List the SSH public keys you've uploaded"
3
+ c.action do |args, options|
4
+ begin
5
+ sshkeys = Civo::SshKey.all
6
+ Civo::Client.tabulate_flexirest sshkeys, {name: "Name", label: "SSH Key Label"}
7
+ rescue Flexirest::HTTPUnauthorisedClientException, Flexirest::HTTPForbiddenClientException
8
+ puts "Access denied to your default token, ensure it's set correctly with 'civo tokens'"
9
+ end
10
+ end
11
+ end
12
+
13
+ command "sshkeys:upload" do |c|
14
+ c.description = "Upload an SSH public key for installing in to new instances"
15
+ c.example "Uploads an SSH public key, calling it 'default' from file '~/.ssh/id_rsa.pub'", 'civo sshkeys:upload default ~/.ssh/id_rsa.pub'
16
+ c.action do |args, options|
17
+ pub_key = File.read(args[1])
18
+ begin
19
+ Civo::SshKey.create(name: args.first, public_key: pub_key)
20
+ puts "SSH key '#{args.first}' uploaded."
21
+ rescue Flexirest::HTTPUnauthorisedClientException, Flexirest::HTTPForbiddenClientException
22
+ puts "Access denied to your default token, ensure it's set correctly with 'civo tokens'"
23
+ end
24
+ end
25
+ end
26
+
27
+ command "sshkeys:remove" do |c|
28
+ c.description = "Remove an SSH public key from the list you've uploaded"
29
+ c.example "Removes an SSH public key called 'testuser'", 'civo sshkeys:remove testuser'
30
+ c.action do |args, options|
31
+ begin
32
+ key = Civo::SshKey.remove(name: args.first)
33
+ if key.result == "ok"
34
+ puts "SSH public key '#{args.first}' has been removed."
35
+ else
36
+ puts "Failed to delete that SSH key: #{key.inspect}"
37
+ end
38
+ rescue Flexirest::HTTPUnauthorisedClientException, Flexirest::HTTPForbiddenClientException
39
+ puts "Access denied to your default token, ensure it's set correctly with 'civo tokens'"
40
+ rescue Flexirest::HTTPNotFoundClientException => e
41
+ puts "Couldn't find that account to remove, maybe it's already been removed?"
42
+ rescue Flexirest::HTTPServerException => e
43
+ puts "Unable to remove #{e.result.reason}"
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,11 @@
1
+ command "templates" do |c|
2
+ c.description = "List available instance templates"
3
+ c.action do |args, options|
4
+ begin
5
+ templates = Civo::Template.all
6
+ Civo::Client.tabulate_flexirest templates, {id: "Template", short_description: "Description"}
7
+ rescue Flexirest::HTTPUnauthorisedClientException, Flexirest::HTTPForbiddenClientException
8
+ puts "Access denied to your default token, ensure it's set correctly with 'civo tokens'"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,35 @@
1
+ command "tokens" do |c|
2
+ c.description = "List the tokens you have saved"
3
+ c.action do |args, options|
4
+ tokens = Civo::Token.read_all
5
+ if tokens.keys.size > 0
6
+ Civo::Client.tabulate tokens, ["Name", "API Key"]
7
+ else
8
+ puts "No tokens found, please set one using tokens:save"
9
+ end
10
+ end
11
+ end
12
+
13
+ command "tokens:save" do |c|
14
+ c.description = "Save an API token supplied by Civo.com"
15
+ c.example "Saves a token called 'master' with API key 'key_goes_here'", 'civo tokens:save master key_goes_here'
16
+ c.action do |args, options|
17
+ Civo::Token.save(args[0], args[1])
18
+ end
19
+ end
20
+
21
+ command "tokens:default" do |c|
22
+ c.description = "Set the default token from the list you have saved"
23
+ c.example "Sets the default token to 'master'", 'civo tokens:default master'
24
+ c.action do |args, options|
25
+ Civo::Token.set_default(args[0])
26
+ end
27
+ end
28
+
29
+ command "tokens:remove" do |c|
30
+ c.description = "Remove a token from the list you have saved"
31
+ c.example "Removes the token 'master'", 'civo tokens:remove master'
32
+ c.action do |args, options|
33
+ Civo::Token.remove(args[0])
34
+ end
35
+ end
@@ -0,0 +1,53 @@
1
+ module Civo
2
+ class Config
3
+ FILENAME = "#{ENV["HOME"]}/.civorc"
4
+
5
+ def self.header_line
6
+ "# This file is managed by 'civo'\n"
7
+ end
8
+
9
+ def self.ensure_file_exists!
10
+ unless File.exists?(FILENAME)
11
+ update({meta: {version: "1", url: "https://api.civo.com"}}).save
12
+ FileUtils.chmod(0600, FILENAME)
13
+ end
14
+
15
+ unless File.exists?(FILENAME)
16
+ puts "#{FILENAME} doesn't exist and couldn't be created"
17
+ exit 1
18
+ end
19
+
20
+ unless ("%o" % File.stat(FILENAME).mode).to_s[/600$/]
21
+ puts "The permissions on #{FILENAME} aren't 0600 (#{ ("%o" % File.stat(FILENAME).mode).to_s}), they must be for security reasons"
22
+ exit 2
23
+ end
24
+ end
25
+
26
+ def self.parse
27
+ ensure_file_exists!
28
+
29
+ @config = TOML.load_file(FILENAME)
30
+ end
31
+
32
+ def self.api_url
33
+ parse["meta"]["url"]
34
+ end
35
+
36
+ def self.admin?
37
+ parse["meta"]["admin"] == "true"
38
+ end
39
+
40
+ def self.update(config)
41
+ @config = config
42
+ self
43
+ end
44
+
45
+ def self.save
46
+ File.open(FILENAME, "w") do |f|
47
+ f << header_line
48
+ f << TOML::Generator.new(@config).body
49
+ end
50
+ end
51
+
52
+ end
53
+ end
@@ -0,0 +1,53 @@
1
+ module Civo
2
+ class Token
3
+
4
+ def self.read_all
5
+ config = Civo::Config.parse
6
+ config["tokens"] || {}
7
+ end
8
+
9
+ def self.write_all(tokens)
10
+ config = Civo::Config.parse
11
+ config["tokens"] = tokens
12
+ Civo::Config.update(config).save
13
+ end
14
+
15
+ def self.save(name, key)
16
+ tokens = read_all
17
+ tokens[name] = key
18
+ if tokens["**DEFAULT**"] == nil
19
+ tokens["**DEFAULT**"] = name
20
+ end
21
+ write_all(tokens)
22
+ end
23
+
24
+ def self.set_default(name)
25
+ puts "Setting default token to be #{name}"
26
+ tokens = read_all
27
+ tokens["**DEFAULT**"] = name
28
+ write_all(tokens)
29
+ end
30
+
31
+ def self.remove(name)
32
+ tokens = read_all
33
+ tokens.delete(name)
34
+ if tokens["**DEFAULT**"] == name
35
+ tokens["**DEFAULT**"] = tokens.keys.first
36
+ if tokens["**DEFAULT**"] == "**DEFAULT**"
37
+ tokens.delete("**DEFAULT**")
38
+ end
39
+ end
40
+ write_all(tokens)
41
+ end
42
+
43
+ def self.default
44
+ tokens = read_all
45
+ token = tokens[tokens["**DEFAULT**"]]
46
+ if token.nil?
47
+ puts "No default token has been set. Use 'civo tokens:save --name NAME --token TOKEN' to set one"
48
+ exit 2
49
+ end
50
+ token
51
+ end
52
+ end
53
+ end
@@ -1,3 +1,3 @@
1
1
  module Civo
2
- VERSION = "0.0.1"
2
+ VERSION = "0.1.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: civo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andy Jeffries
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-20 00:00:00.000000000 Z
11
+ date: 2015-11-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -26,6 +26,20 @@ dependencies:
26
26
  version: 4.2.4
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: flexirest
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 1.2.2
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 1.2.2
41
+ - !ruby/object:Gem::Dependency
42
+ name: toml
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
45
  - - ">="
@@ -60,11 +74,28 @@ extensions: []
60
74
  extra_rdoc_files: []
61
75
  files:
62
76
  - MIT-LICENSE
63
- - README.rdoc
64
77
  - Rakefile
78
+ - app/models/civo/account.rb
79
+ - app/models/civo/base.rb
80
+ - app/models/civo/instance.rb
81
+ - app/models/civo/quota.rb
82
+ - app/models/civo/region.rb
83
+ - app/models/civo/size.rb
84
+ - app/models/civo/ssh_key.rb
85
+ - app/models/civo/template.rb
65
86
  - config/routes.rb
66
87
  - lib/civo.rb
67
- - lib/civo/commands/instance.rb
88
+ - lib/civo/cli/client.rb
89
+ - lib/civo/cli/commands/accounts.rb
90
+ - lib/civo/cli/commands/instances.rb
91
+ - lib/civo/cli/commands/quota.rb
92
+ - lib/civo/cli/commands/regions.rb
93
+ - lib/civo/cli/commands/sizes.rb
94
+ - lib/civo/cli/commands/sshkeys.rb
95
+ - lib/civo/cli/commands/templates.rb
96
+ - lib/civo/cli/commands/tokens.rb
97
+ - lib/civo/cli/config.rb
98
+ - lib/civo/cli/token.rb
68
99
  - lib/civo/engine.rb
69
100
  - lib/civo/version.rb
70
101
  - lib/tasks/civo_tasks.rake
@@ -1,3 +0,0 @@
1
- = Civo
2
-
3
- This project rocks and uses MIT-LICENSE.
File without changes