contabo-client 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/contabo-client.rb +161 -0
  3. metadata +101 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 76edf509af86a0f1eb3eb55343914bc6958a05d2469ed3dfe15960af944e60e6
4
+ data.tar.gz: bd0ea6fa53420c462fe369cf2e4ec514d065be11cd27fc041ff782a5de0c7e82
5
+ SHA512:
6
+ metadata.gz: e093abe11583a1406502b4a53211541d88602e84f77b73e2f1aec37d299e6c000c02b401d783832e6ebf3fd803f7e167af8b51b29edbdafd12b5e26833e41720
7
+ data.tar.gz: 4fb459ecaded476bfe90f3f34bc6d29de995a76e342fad489b5a5048237000936d5b0e492c6bf4fa03a4600e7ffbac0e50d047c7e97d2d26e65d9b39bf9251bc
@@ -0,0 +1,161 @@
1
+ require 'net/http'
2
+ require 'json'
3
+ require 'uri'
4
+ require 'securerandom'
5
+
6
+ class ContaboClient
7
+ def initialize(client_id:, client_secret:, api_user:, api_password:)
8
+ @client_id = client_id
9
+ @client_secret = client_secret
10
+ @api_user = api_user
11
+ @api_password = api_password
12
+ @auth_url = 'https://auth.contabo.com/auth/realms/contabo/protocol/openid-connect/token'
13
+ @api_url = 'https://api.contabo.com/v1/compute/instances'
14
+ end
15
+
16
+ def get_access_token
17
+ uri = URI(@auth_url)
18
+ response = Net::HTTP.post_form(uri, {
19
+ 'client_id' => @client_id,
20
+ 'client_secret' => @client_secret,
21
+ 'username' => @api_user,
22
+ 'password' => @api_password,
23
+ 'grant_type' => 'password'
24
+ })
25
+ JSON.parse(response.body)['access_token']
26
+ end
27
+
28
+ def create_secret(password, type = 'password')
29
+ uri = URI('https://api.contabo.com/v1/secrets')
30
+
31
+ request = Net::HTTP::Post.new(uri)
32
+ request['Authorization'] = "Bearer #{access_token}"
33
+ request['Content-Type'] = 'application/json'
34
+ request['x-request-id'] = SecureRandom.uuid
35
+
36
+ body = {
37
+ name: "Ruby's Contabo Client #{SecureRandom.uuid}",
38
+ value: password,
39
+ type: type
40
+ }
41
+
42
+ request.body = body.to_json
43
+
44
+ response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
45
+ http.request(request)
46
+ end
47
+
48
+ data = JSON.parse(response.body)['data'].first
49
+ raise "Failed to create secret. Error: #{response.body}" if data.nil?
50
+ data['secretId']
51
+ end
52
+
53
+ def retrieve_images(page: 1, size: 10)
54
+ uri = URI('https://api.contabo.com/v1/compute/images')
55
+ params = { page: page, size: size }
56
+ uri.query = URI.encode_www_form(params)
57
+
58
+ request = Net::HTTP::Get.new(uri)
59
+ request['Authorization'] = "Bearer #{access_token}"
60
+ request['x-request-id'] = SecureRandom.uuid
61
+
62
+ response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
63
+ http.request(request)
64
+ end
65
+
66
+ JSON.parse(response.body)
67
+ end
68
+
69
+ def get_instances(page: 1, size: 10, order_by: nil, search: nil)
70
+ uri = URI(@api_url)
71
+ params = { page: page, size: size }
72
+ params[:orderBy] = order_by if order_by
73
+ params[:search] = search if search
74
+ uri.query = URI.encode_www_form(params)
75
+
76
+ request = Net::HTTP::Get.new(uri)
77
+ request['Authorization'] = "Bearer #{access_token}"
78
+ request['x-request-id'] = SecureRandom.uuid
79
+ request['x-request-id'] = SecureRandom.uuid
80
+
81
+ response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
82
+ http.request(request)
83
+ end
84
+
85
+ JSON.parse(response.body)
86
+ end
87
+
88
+ def create_instance(image_id:, product_id:, region: 'EU', ssh_rsa:, root_password:, display_name:, user_data: '')
89
+ uri = URI(@api_url)
90
+ request = Net::HTTP::Post.new(uri)
91
+ request['Authorization'] = "Bearer #{access_token}"
92
+ request['Content-Type'] = 'application/json'
93
+ request['x-request-id'] = SecureRandom.uuid
94
+
95
+ root_password_secret_id = create_secret(root_password)
96
+ root_ssh_secret_id = create_secret(ssh_rsa, 'ssh')
97
+
98
+ body = {
99
+ imageId: image_id,
100
+ productId: product_id,
101
+ region: region,
102
+ sshKeys: [root_ssh_secret_id],
103
+ rootPassword: root_password_secret_id,
104
+ defaultUser: "root",
105
+ displayName: display_name,
106
+ userData: user_data
107
+ }.compact
108
+
109
+ request.body = body.to_json
110
+
111
+ response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
112
+ http.request(request)
113
+ end
114
+
115
+ JSON.parse(response.body)
116
+ end
117
+
118
+ def reinstall_instance(instance_id:, image_id:, root_password:, cloud_init: nil, user_data: '')
119
+ uri = URI("https://api.contabo.com/v1/compute/instances/#{instance_id}")
120
+ request = Net::HTTP::Put.new(uri)
121
+ request['Authorization'] = "Bearer #{access_token}"
122
+ request['Content-Type'] = 'application/json'
123
+ request['x-request-id'] = SecureRandom.uuid
124
+ root_password_secret_id = create_secret(root_password)
125
+
126
+ body = {
127
+ imageId: image_id,
128
+ rootPassword: root_password_secret_id,
129
+ defaultUser: "root",
130
+ userData: user_data
131
+ }.compact
132
+
133
+ request.body = body.to_json
134
+
135
+ response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
136
+ http.request(request)
137
+ end
138
+
139
+ JSON.parse(response.body)
140
+ end
141
+
142
+ def access_token
143
+ @access_token ||= get_access_token
144
+ end
145
+
146
+ def cancel_instance(instance_id:)
147
+ uri = URI("#{@api_url}/#{instance_id}/cancel")
148
+ request = Net::HTTP::Post.new(uri)
149
+ request['Authorization'] = "Bearer #{access_token}"
150
+ request['x-request-id'] = SecureRandom.uuid
151
+
152
+ response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
153
+ http.request(request)
154
+ end
155
+
156
+ JSON.parse(response.body)
157
+ rescue StandardError => e
158
+ puts "Error canceling instance: #{e.message}"
159
+ nil
160
+ end
161
+ end
metadata ADDED
@@ -0,0 +1,101 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: contabo-client
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Leandro Daniel Sardi
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-09-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: net-http
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.2.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.2.2
27
+ - !ruby/object:Gem::Dependency
28
+ name: uri
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.11.2
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.11.2
41
+ - !ruby/object:Gem::Dependency
42
+ name: json
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 2.6.3
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 2.6.3
55
+ - !ruby/object:Gem::Dependency
56
+ name: securerandom
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.3.1
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.3.1
69
+ description: A Ruby library for managing Contabo instances programmatically. Easily
70
+ create, cancel, and reinstall Contabo instances directly from your Ruby applications.
71
+ email: leandro@massprospecting.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - lib/contabo-client.rb
77
+ homepage: https://rubygems.org/gems/contabo-client
78
+ licenses:
79
+ - MIT
80
+ metadata: {}
81
+ post_install_message:
82
+ rdoc_options: []
83
+ require_paths:
84
+ - lib
85
+ required_ruby_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ required_rubygems_version: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ requirements: []
96
+ rubygems_version: 3.3.7
97
+ signing_key:
98
+ specification_version: 4
99
+ summary: A Ruby library for managing Contabo instances programmatically. Easily create,
100
+ cancel, and reinstall Contabo instances directly from your Ruby applications.
101
+ test_files: []