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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 18becda6b3edf4aba2a1146a3f889e618c9c49ad9d476f45197b63bae0930f5e
4
- data.tar.gz: bc2b3f12e06eb9ef9941acf1035a81bdad3be29627fbdec33ee520e374ddb221
3
+ metadata.gz: 366fb7b7ffeb686acc3a60998150f76bd28422038f8df24581b25cc0181819b0
4
+ data.tar.gz: 7cf6a08e8838aae0f74f9b6e0e5a7e44decbc1fabea47f16e6ddf433bd5cd143
5
5
  SHA512:
6
- metadata.gz: 4aa011f0cb9ea2ca0694a095e549a410f572cd96325d3cf4886bc1a9ba80536e8d4f64ea9005bdf9836368c2b8a5c823e8d28cc81da77601958a96cd27132865
7
- data.tar.gz: 3628b92158ebb7288bdd9f231e9db71eb180789df6e36fc7faa69d744b41bcde25535efc90bec9f0b48c1c959a5d9f0811a9aa54850a4a83ab75af6c4016ccb5
6
+ metadata.gz: 0b557b203e667b509053a55c9fb921b92bb3b7895a57e5e89117ad93339cc7ccaf2a69990ed0ecb527b9bf5f0bf2f82367f34e75b121b235bb03f547be932a1e
7
+ data.tar.gz: 2da70d05399e669f1a804d50aac56900f8a2f0300f61450eb43341fd891eff1bbfa5c9fa79b8991ba1f9b296e80d5a521357705d98bc2090555168a61b114d5e
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Proxmox
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/proxmox-sdk.svg)](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
@@ -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
- login(username, password, realm)
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(user, pass, realm)
31
+ def login
17
32
  resp = http.post("/api2/json/access/ticket",
18
- { username: "#{user}@#{realm}", password: pass })
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 = data["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
- raise ApiError, response.body unless response.success?
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Proxmox
4
- VERSION = "0.1.1"
4
+ VERSION = "0.1.2"
5
5
  end
data/lib/proxmox.rb CHANGED
@@ -4,6 +4,7 @@ require "proxmox/version"
4
4
  require "proxmox/client"
5
5
  require "proxmox/resources/cluster"
6
6
  require "proxmox/resources/clusters/acme"
7
+ require "proxmox/resources/clusters/backup"
7
8
  require "proxmox/resources/node"
8
9
 
9
10
  module Proxmox
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.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: 1980-01-02 00:00:00.000000000 Z
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.6.9
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: []