proxmox-sdk 0.1.1 → 0.1.2
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/README.md +2 -0
- data/lib/proxmox/client.rb +56 -5
- data/lib/proxmox/resources/clusters/backup.rb +18 -0
- data/lib/proxmox/version.rb +1 -1
- data/lib/proxmox.rb +1 -0
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 366fb7b7ffeb686acc3a60998150f76bd28422038f8df24581b25cc0181819b0
|
4
|
+
data.tar.gz: 7cf6a08e8838aae0f74f9b6e0e5a7e44decbc1fabea47f16e6ddf433bd5cd143
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0b557b203e667b509053a55c9fb921b92bb3b7895a57e5e89117ad93339cc7ccaf2a69990ed0ecb527b9bf5f0bf2f82367f34e75b121b235bb03f547be932a1e
|
7
|
+
data.tar.gz: 2da70d05399e669f1a804d50aac56900f8a2f0300f61450eb43341fd891eff1bbfa5c9fa79b8991ba1f9b296e80d5a521357705d98bc2090555168a61b114d5e
|
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# Proxmox
|
2
2
|
|
3
|
+
[](https://badge.fury.io/rb/proxmox-sdk)
|
4
|
+
|
3
5
|
A lightweight Ruby gem that provides a clean, idiomatic interface to the Proxmox VE REST API. It handles authentication, token management, and all common API endpoints (nodes, virtual machines, storage, containers, etc.) so you can focus on building automation, orchestration, or custom tooling without dealing with raw HTTP calls.
|
4
6
|
|
5
7
|
## Installation
|
data/lib/proxmox/client.rb
CHANGED
@@ -1,27 +1,50 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "faraday"
|
4
|
+
require "json"
|
5
|
+
require "time"
|
4
6
|
|
5
7
|
module Proxmox
|
6
8
|
# Proxmox SDK Http Client
|
7
9
|
class Client
|
10
|
+
# Konstanten für die Gültigkeit des Tokens
|
11
|
+
# Proxmox Tickets sind standardmäßig 2 Stunden (7200 Sekunden) gültig.
|
12
|
+
TOKEN_VALIDITY_SECONDS = 7200
|
13
|
+
# Wir erneuern den Token 5 Minuten (300 Sekunden) vor Ablauf.
|
14
|
+
RENEWAL_BUFFER_SECONDS = 300
|
15
|
+
|
8
16
|
attr_reader :ticket, :csrf_token, :base_url
|
9
17
|
|
10
18
|
def initialize(base_url:, username:, password:, realm: "pam", ignore_ssl: false)
|
11
19
|
@base_url = base_url
|
12
20
|
@verify_ssl = !ignore_ssl
|
13
|
-
|
21
|
+
|
22
|
+
# Anmeldedaten für die automatische Erneuerung speichern
|
23
|
+
@username = username
|
24
|
+
@password = password
|
25
|
+
@realm = realm
|
26
|
+
|
27
|
+
# Initiales Login
|
28
|
+
login
|
14
29
|
end
|
15
30
|
|
16
|
-
def login
|
31
|
+
def login
|
17
32
|
resp = http.post("/api2/json/access/ticket",
|
18
|
-
{ username: "#{
|
33
|
+
{ username: "#{@username}@#{@realm}", password: @password })
|
34
|
+
|
35
|
+
raise "Login failed: #{resp.body}" unless resp.success?
|
36
|
+
|
19
37
|
data = JSON.parse(resp.body)["data"]
|
20
|
-
@ticket
|
38
|
+
@ticket = data["ticket"]
|
21
39
|
@csrf_token = data["CSRFPreventionToken"]
|
40
|
+
# Zeitstempel der Ticketerstellung speichern
|
41
|
+
@ticket_creation_time = Time.now
|
22
42
|
end
|
23
43
|
|
24
44
|
def request(method, path, params = {}, body = nil)
|
45
|
+
# Vor jeder Anfrage die Gültigkeit des Tokens prüfen und ggf. erneuern
|
46
|
+
ensure_token_validity
|
47
|
+
|
25
48
|
response = perform_http_call(method, path, params, body)
|
26
49
|
|
27
50
|
ensure_success!(response)
|
@@ -30,6 +53,23 @@ module Proxmox
|
|
30
53
|
|
31
54
|
private
|
32
55
|
|
56
|
+
# NEUE METHODE: Stellt sicher, dass der Token gültig ist
|
57
|
+
def ensure_token_validity
|
58
|
+
login if token_expired?
|
59
|
+
end
|
60
|
+
|
61
|
+
# NEUE METHODE: Prüft, ob der Token abgelaufen ist oder bald abläuft
|
62
|
+
def token_expired?
|
63
|
+
# Wenn noch kein Ticket erstellt wurde, nicht als abgelaufen betrachten
|
64
|
+
return false if @ticket_creation_time.nil?
|
65
|
+
|
66
|
+
# Berechne die Ablaufzeit (Erstellungszeit + Gültigkeit - Puffer)
|
67
|
+
renewal_time = @ticket_creation_time + TOKEN_VALIDITY_SECONDS - RENEWAL_BUFFER_SECONDS
|
68
|
+
|
69
|
+
# Ist die aktuelle Zeit nach der errechneten Erneuerungszeit?
|
70
|
+
Time.now > renewal_time
|
71
|
+
end
|
72
|
+
|
33
73
|
def perform_http_call(method, path, params, body)
|
34
74
|
http.send(method) do |req|
|
35
75
|
set_url(req, path)
|
@@ -63,10 +103,18 @@ module Proxmox
|
|
63
103
|
end
|
64
104
|
|
65
105
|
def ensure_success!(response)
|
66
|
-
|
106
|
+
# Optional: Wenn ein 401 (Unauthorized) Fehler kommt, könnte man hier auch ein erneutes Login erzwingen.
|
107
|
+
# if response.status == 401
|
108
|
+
# login
|
109
|
+
# # Hier könnte man die Anfrage wiederholen.
|
110
|
+
# end
|
111
|
+
raise "ApiError: #{response.body}" unless response.success?
|
67
112
|
end
|
68
113
|
|
69
114
|
def extract_data(response)
|
115
|
+
# Sicherstellen, dass der Body nicht leer ist, bevor geparst wird
|
116
|
+
return nil if response.body.nil? || response.body.empty?
|
117
|
+
|
70
118
|
JSON.parse(response.body)["data"]
|
71
119
|
end
|
72
120
|
|
@@ -77,4 +125,7 @@ module Proxmox
|
|
77
125
|
end
|
78
126
|
end
|
79
127
|
end
|
128
|
+
|
129
|
+
# Eigene Fehlerklasse (optional, aber guter Stil)
|
130
|
+
class ApiError < StandardError; end
|
80
131
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Proxmox
|
4
|
+
module Resources
|
5
|
+
module Clusters
|
6
|
+
# Proxmox Cluster Acme class
|
7
|
+
class Backup
|
8
|
+
def initialize(client)
|
9
|
+
@client = client
|
10
|
+
end
|
11
|
+
|
12
|
+
def all
|
13
|
+
@client.request(:get, "/cluster/backup")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/proxmox/version.rb
CHANGED
data/lib/proxmox.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: proxmox-sdk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Wellnitz
|
8
|
+
autorequire:
|
8
9
|
bindir: exe
|
9
10
|
cert_chain: []
|
10
|
-
date:
|
11
|
+
date: 2025-10-08 00:00:00.000000000 Z
|
11
12
|
dependencies:
|
12
13
|
- !ruby/object:Gem::Dependency
|
13
14
|
name: faraday
|
@@ -38,6 +39,7 @@ files:
|
|
38
39
|
- lib/proxmox/client.rb
|
39
40
|
- lib/proxmox/resources/cluster.rb
|
40
41
|
- lib/proxmox/resources/clusters/acme.rb
|
42
|
+
- lib/proxmox/resources/clusters/backup.rb
|
41
43
|
- lib/proxmox/resources/node.rb
|
42
44
|
- lib/proxmox/version.rb
|
43
45
|
- sig/proxmox.rbs
|
@@ -49,6 +51,7 @@ metadata:
|
|
49
51
|
homepage_uri: https://github.com/alexohneander/proxmox-sdk-ruby
|
50
52
|
source_code_uri: https://github.com/alexohneander/proxmox-sdk-ruby
|
51
53
|
changelog_uri: https://raw.githubusercontent.com/alexohneander/proxmox-sdk-ruby/refs/heads/main/CHANGELOG.md
|
54
|
+
post_install_message:
|
52
55
|
rdoc_options: []
|
53
56
|
require_paths:
|
54
57
|
- lib
|
@@ -63,7 +66,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
63
66
|
- !ruby/object:Gem::Version
|
64
67
|
version: '0'
|
65
68
|
requirements: []
|
66
|
-
rubygems_version: 3.
|
69
|
+
rubygems_version: 3.5.3
|
70
|
+
signing_key:
|
67
71
|
specification_version: 4
|
68
72
|
summary: A gem that provides a client interface for Proxmox
|
69
73
|
test_files: []
|