-
Notifications
You must be signed in to change notification settings - Fork 15
/
proxmox.rb
133 lines (114 loc) · 3.46 KB
/
proxmox.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
require "proxmox/version"
require 'rest_client'
require 'json'
module Proxmox
class Proxmox
attr_reader :status
def initialize(pve_cluster, node, username, password, realm)
@pve_cluster = pve_cluster
@node = node
@username = username
@password = password
@realm = realm
@status = "error"
@site = RestClient::Resource.new(@pve_cluster)
@auth_params = create_ticket
end
def create_ticket
post_param = { :username=>@username, :realm=>@realm, :password=>@password }
@site['access/ticket'].post post_param do |response, request, result, &block|
if response.code == 200
extract_ticket response
else
@status = "error"
end
end
end
def extract_ticket(response)
data = JSON.parse(response.body)
ticket = data['data']['ticket']
csrf_prevention_token = data['data']['CSRFPreventionToken']
unless ticket.nil?
token = 'PVEAuthCookie=' + ticket.gsub!(/:/,'%3A').gsub!(/=/,'%3D')
end
@status = "connected"
{
:CSRFPreventionToken => csrf_prevention_token,
:cookie => token
}
end
def task_status(upid)
data = http_action_get "nodes/#{@node}/tasks/#{URI::encode upid}/status"
status = data['status']
exitstatus = data['exitstatus']
if exitstatus
"#{status}:#{exitstatus}"
else
"#{status}"
end
end
def templates
data = http_action_get "nodes/#{@node}/storage/local/content"
template_list = Hash.new
data.each do |ve|
name = ve['volid'].gsub(/^local:vztmpl\/(.*).tar.gz$/, '\1')
template_list[name] = ve
end
template_list
end
def openvz_get
data = http_action_get "nodes/#{@node}/openvz"
ve_list = Hash.new
data.each do |ve|
ve_list[ve['vmid']] = ve
end
ve_list
end
def openvz_post(ostemplate, vmid, config = {})
config['vmid'] = vmid
config['ostemplate'] = "local%3Avztmpl%2F#{ostemplate}.tar.gz"
vm_definition = config.to_a.map { |v| v.join '=' }.join '&'
http_action_post("nodes/#{@node}/openvz", vm_definition)
end
def openvz_delete(vmid)
http_action_delete "nodes/#{@node}/openvz/#{vmid}"
end
def openvz_vm_status(vmid)
http_action_get "nodes/#{@node}/openvz/#{vmid}/status/current"
end
def openvz_vm_start(vmid)
http_action_post "nodes/#{@node}/openvz/#{vmid}/status/start"
end
def openvz_vm_stop(vmid)
http_action_post "nodes/#{@node}/openvz/#{vmid}/status/stop"
end
def openvz_vm_shutdown(vmid)
http_action_post "nodes/#{@node}/openvz/#{vmid}/status/shutdown"
end
def openvz_vm_config(vmid)
http_action_get "nodes/#{@node}/openvz/#{vmid}/config"
end
def check_response(response)
if (response.code == 200) then
JSON.parse(response.body)['data']
else
"NOK: error code = " + response.code.to_s
end
end
def http_action_post(url, data = "")
@site[url].post data, @auth_params do |response, request, result, &block|
check_response response
end
end
def http_action_get(url)
@site[url].get @auth_params do |response, request, result, &block|
check_response response
end
end
def http_action_delete(url)
@site[url].delete @auth_params do |response, request, result, &block|
check_response response
end
end
end
end