pve 0.1.2 → 0.2.3

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.
data/lib/pve/helper.rb CHANGED
@@ -1,15 +1,36 @@
1
+ module IPAddress::ToSWithNetmaskForNetworks
2
+ refine IPAddress::IPv6 do
3
+ def to_s
4
+ 128 == prefix ? super() : to_string
5
+ end
6
+ end
7
+ refine IPAddress::IPv4 do
8
+ def to_s
9
+ 32 == prefix ? super() : to_string
10
+ end
11
+ end
12
+ end
13
+
14
+
1
15
  class Measured
16
+ class V
17
+ attr_reader :value, :length
18
+
19
+ def initialize( value, length = nil) @value, @length = value, length || value.length end
20
+ def inspect() "#<Measured::V #{@value.inspect} (#{@length})>" end
21
+ alias :to_s :value
22
+ alias :to_str :value
23
+ end
24
+
2
25
  class <<self
3
26
  def bytes1 v
4
27
  v = v.to_f
5
- return "%d B" % v if 512 > v
28
+ return units '%d ' % v , :B if 512 > v
6
29
  %w[KiB MiBy GiByt TiByte ExiByte PetiByte].each_with_index do |m|
7
30
  v /= 1024
8
- #return "%.1f %s" % [v, m] if 10 > v
9
- #return "%d %s" % [v, m] if 512 > v
10
- return "%.1f %s" % [v, m] if 512 > v
31
+ return units '%.1f ' % v, m if 512 > v
11
32
  end
12
- "%d PetiByte" % v
33
+ units '%d ' % v, :PetiByte
13
34
  end
14
35
 
15
36
  def bytes2 v
@@ -26,21 +47,28 @@ class Measured
26
47
  end
27
48
  alias bytes bytes2
28
49
 
50
+ def units val, unit
51
+ v = "#{val}\e[1;30m#{unit}\e[0m"
52
+ V.new v, v.length - 11
53
+ end
54
+
29
55
  def seconds i
30
56
  i = i.to_i
31
- return '·' if 0 == i
32
- return "%d s" % i if 90 > i
57
+ return V.new "\e[1;30m·\e[0m", 1 if 0 == i
58
+ return units '%d ' % i, :s if 90 > i
33
59
  i /= 60
34
- return "%d mi" % i if 90 > i
60
+ return units '%d ' % i, :mi if 90 > i
35
61
  i /= 60
36
- return "%d hou" % i if 36 > i
62
+ return units '%d ' % i, :hou if 36 > i
37
63
  i /= 24
38
- return "%d days" % i if 14 > i
64
+ return units '%d ' % i, :days if 14 > i
39
65
  j = i / 7
40
- return "%d weeks" % j if 25 > j
41
- i /= 365
42
- return "%.1f years" if 550 > i
43
- "%dy" % i
66
+ return units '%d ' % j, :weeks if 8 > j
67
+ j = i / 30
68
+ return units '%d ' % j, :months if 11 > j
69
+ i /= 365.0
70
+ return units '%.2f ' % i, :years if 550 > i
71
+ units '%d ' % i, :years
44
72
  end
45
73
  end
46
74
  end
@@ -58,10 +86,8 @@ class ColoredString
58
86
 
59
87
  def length() @string.length end
60
88
  alias size length
61
- #def to_str() self end
62
89
  def to_s() "\e[#{@color_codes}m#{@string}\e[0m" end
63
90
  alias to_str to_s
64
- #alias inspect to_str
65
91
 
66
92
  include Comparable
67
93
  def <=>(o) @string <=> o.string end
@@ -70,9 +96,10 @@ end
70
96
 
71
97
 
72
98
  class TablizedOutput
73
- def initialize header, stdout: nil
99
+ def initialize header, stdout: nil, format: nil
74
100
  @header = header.map &:to_s
75
101
  @columnc = header.size
102
+ @format = format || ['>']*@columnc
76
103
  @maxs = header.map &:length
77
104
  @stdout ||= STDOUT
78
105
  @lines = []
@@ -86,7 +113,7 @@ class TablizedOutput
86
113
  class V < B
87
114
  attr_reader :v, :s
88
115
  def initialize( v, s=nil) @v, @s = v, s || "#{v}" end
89
- def to_s() @s end
116
+ def to_s() @s.to_s end
90
117
  def length() @s.length end
91
118
  def inspect() "#<TO:V #{@v.inspect} #{@s.inspect}>" end
92
119
  end
@@ -98,10 +125,10 @@ class TablizedOutput
98
125
  def inspect() "#<TO:Percentage #{@v}%>" end
99
126
 
100
127
  def to_s
101
- y = w - (v*w).round
128
+ y = (v*w).round
102
129
  x = (100*v).round
103
130
  r = "%*s" % [w, 0==x ? '·' : x]
104
- "\e[0m#{r[0...y]}\e[1;4;#{0.75>v ? 32 : 31}m#{r[y..-1]}\e[0m"
131
+ "\e[1;4;#{0.75>v ? 32 : 31}m#{r[0...y]}\e[0m#{r[y..-1]}"
105
132
  end
106
133
  end
107
134
 
@@ -122,7 +149,6 @@ class TablizedOutput
122
149
  end
123
150
 
124
151
  def print order: nil
125
- format = "#{(["\e[%%sm%% %ds\e[0m"] * @columnc).join( ' ') % @maxs}\n"
126
152
  ls = @lines
127
153
  if order
128
154
  eval <<-EOC, binding, __FILE__, 1+__LINE__
@@ -132,9 +158,22 @@ class TablizedOutput
132
158
  }
133
159
  EOC
134
160
  end
135
- #ls = ls.sort_by {|e| p e; order.map &e.method(:[]) } if order
136
- @stdout.printf format, *@header.flat_map {|s|['',s]}
137
- ls.each {|l| @stdout.printf format, *l.flat_map {|s| s.is_a?(ColoredString) ? [s.color_codes, s.string] : ["", s.to_s] } }
161
+ @stdout.puts \
162
+ @header.each_with_index.map {|s, i|
163
+ "#{' ' * (@maxs[i] - s.length)}#{s}"
164
+ }.join( ' ')
165
+ ls.each_with_index do |l|
166
+ @stdout.puts \
167
+ l.each_with_index.map {|s, i|
168
+ pad = ' ' * (@maxs[i] - s.length)
169
+ case @format[i]
170
+ when '<'
171
+ "#{s}#{pad}"
172
+ else
173
+ "#{pad}#{s}"
174
+ end
175
+ }.join( ' ')
176
+ end
138
177
  end
139
178
 
140
179
  def virt v
data/lib/pve/proxmox.rb CHANGED
@@ -123,10 +123,14 @@ module Proxmox
123
123
  n.send :__update__, data
124
124
  end
125
125
  private :__new__
126
+
127
+ def fetch predata
128
+ __new__( predata).refresh!
129
+ end
126
130
  end
127
131
 
128
- def respond_to? method
129
- super or instance_variable_defined?( "@#{method}")
132
+ def respond_to? method, also_private = false
133
+ instance_variable_defined?( "@#{method}") or super(method, also_private)
130
134
  end
131
135
 
132
136
  def method_missing method, *args, &exe
@@ -147,6 +151,7 @@ module Proxmox
147
151
  initialize
148
152
  self
149
153
  end
154
+ private :__update__
150
155
 
151
156
  def refresh!
152
157
  __update__ rest_get( @rest_prefix)
@@ -176,9 +181,13 @@ module Proxmox
176
181
  def === t
177
182
  @name =~ t or @vmid.to_s =~ t or @sid =~ t
178
183
  end
184
+
185
+ def rest_prefix
186
+ @rest_prefix ||= "/nodes/#{@node}"
187
+ end
179
188
 
180
189
  def initialize
181
- @rest_prefix = "/nodes/#{@node}"
190
+ rest_prefix
182
191
  @sid = "nd:#{@node}"
183
192
  @name = @node
184
193
  end
@@ -191,6 +200,20 @@ module Proxmox
191
200
  rest_get( "#{@rest_prefix}/lxc").map {|d| LXC.send :__new__, d.merge( node: self, t: 'ct') }
192
201
  end
193
202
 
203
+ def aplinfo
204
+ return [] if offline?
205
+ rest_get( "#{@rest_prefix}/aplinfo").map do |d|
206
+ AplInfo.send :__new__, d.merge( node: self, t: 'apl')
207
+ end
208
+ end
209
+
210
+ def storage
211
+ return [] if offline?
212
+ rest_get( "#{@rest_prefix}/storage").map do |d|
213
+ Storage.send :__new__, d.merge( node: self, t: 'sm')
214
+ end
215
+ end
216
+
194
217
  def qemu
195
218
  return [] if offline?
196
219
  rest_get( "#{@rest_prefix}/qemu").map {|d| Qemu.send :__new__, d.merge( node: self, t: 'qm') }
@@ -211,21 +234,51 @@ module Proxmox
211
234
  end
212
235
 
213
236
  class Task < Base
214
- def initialize
237
+ class Status < Base
238
+ def rest_prefix
239
+ @rest_prefix ||= '/nodes/%s/tasks/%s/status' % [@node.node, @upid]
240
+ end
241
+
242
+ def refresh!
243
+ d = rest_get @rest_prefix
244
+ d[:starttime] &&= Time.at d[:starttime]
245
+ d = {exitstatus: nil}.merge d
246
+ __update__ d.merge( node: @node, t: 'status', upid: @upid, task: @task)
247
+ end
248
+
249
+ def initialize
250
+ rest_prefix
251
+ @sid = upid
252
+ end
253
+
254
+ def inspect
255
+ h = instance_variables - %i[@node @task @sid @rest_prefix @upid @t]
256
+ h.map! {|k| "#{k[1..-1]}=#{instance_variable_get(k).inspect}" }
257
+ "#<#{self.class.name}|#{@upid} node=#{@node.node} #{h.join ' '}>"
258
+ end
259
+
260
+ def running?() 'running' == @status end
261
+ def finished?() 'stopped' == @status end
262
+ alias stopped? finished?
263
+ def successfull?() stopped? ? 'OK' == @exitstatus : nil end
264
+ def failed?() stopped? ? 'OK' != @exitstatus : nil end
265
+ end
266
+
267
+ def rest_prefix
215
268
  @rest_prefix = "/nodes/#{@node.node}/tasks/#{upid}"
269
+ end
270
+
271
+ def initialize
272
+ rest_prefix
216
273
  @sid = upid
217
274
  end
218
275
 
219
276
  def inspect
220
- "#<#{self.class.name} #{upid}>"
277
+ "#<#{self.class.name} #{@upid}>"
221
278
  end
222
279
 
223
- #def finished?
224
- # rest_get( "/nodes/#{node}/tasks/")
225
- #end
226
-
227
280
  def status
228
- rest_get( "#{@rest_prefix}/status")
281
+ Status.fetch node: @node, task: self, upid: @upid
229
282
  end
230
283
 
231
284
  def log start: nil, limit: nil
@@ -235,8 +288,7 @@ module Proxmox
235
288
 
236
289
  class Hosted < Base
237
290
  def refresh!
238
- node, t = @node, @t
239
- __update__ rest_get( "#{@rest_prefix}/status/current").merge( node: node, t: t)
291
+ __update__ rest_get( "#{@rest_prefix}/status/current").merge( node: @node, t: @t)
240
292
  end
241
293
 
242
294
  def === t
@@ -331,6 +383,11 @@ module Proxmox
331
383
  r.delete :delete if r[:delete].empty?
332
384
  rest_put "#{@rest_prefix}/config", r
333
385
  end
386
+
387
+ def resize disk, size
388
+ upid = rest_put "#{@rest_prefix}/resize", disk: disk, size: size
389
+ Task.send :__new__, node: @node, host: self, upid: upid
390
+ end
334
391
  end
335
392
 
336
393
  class Qemu < Hosted
@@ -341,19 +398,15 @@ module Proxmox
341
398
 
342
399
  def find_by_vmid vmid
343
400
  vmid = vmid.to_s
344
- Node.all.each do |n|
345
- n.qemu.each do |l|
346
- return l if l.vmid == vmid
347
- end
401
+ all.each do |l|
402
+ return l if l.vmid == vmid
348
403
  end
349
404
  nil
350
405
  end
351
406
 
352
407
  def find_by_name name
353
- Node.all.each do |n|
354
- n.qemu.each do |l|
355
- return l if l.name == name
356
- end
408
+ all.each do |l|
409
+ return l if l.name == name
357
410
  end
358
411
  nil
359
412
  end
@@ -387,8 +440,12 @@ module Proxmox
387
440
  end
388
441
  end
389
442
 
443
+ def rest_prefix
444
+ @rest_prefix ||= "/nodes/%s/qemu/%d" % [@node.node, @vmid]
445
+ end
446
+
390
447
  def initialize
391
- @rest_prefix = "/nodes/%s/qemu/%d" % [@node.node, @vmid]
448
+ rest_prefix
392
449
  @sid = "qm:#{@vmid}"
393
450
  end
394
451
 
@@ -399,6 +456,11 @@ module Proxmox
399
456
  def exec *args
400
457
  node.exec 'qm', 'guest', 'exec', vmid, '--', *args
401
458
  end
459
+
460
+ def resize disk, size
461
+ upid = rest_put "#{@rest_prefix}/resize", disk: disk, size: size
462
+ Task.send :__new__, node: @node, host: self, upid: upid
463
+ end
402
464
  end
403
465
 
404
466
  class LXC < Hosted
@@ -490,14 +552,19 @@ module Proxmox
490
552
  swap: tmplt.swap,
491
553
  unprivileged: tmplt.unprivileged,
492
554
  }.delete_if {|k,v| v.nil? }
493
- @temp = LXC.send :__new__, node: node, vmid: options[:vmid], name: name, hostname: options[:hostname]
555
+
556
+ temp = LXC.send :__new__, node: node, vmid: options[:vmid], name: name, hostname: options[:hostname]
494
557
  upid = rest_post( "/nodes/%s/lxc" % node.node, **options)
495
- Task.send :__new__, node: node, host: @temp, upid: upid
558
+ Task.send :__new__, node: node, host: temp, upid: upid
496
559
  end
497
560
  end
498
561
 
562
+ def rest_prefix
563
+ @rest_prefix ||= "/nodes/%s/lxc/%d" % [@node.node, @vmid]
564
+ end
565
+
499
566
  def initialize
500
- @rest_prefix = "/nodes/%s/lxc/%d" % [@node.node, @vmid]
567
+ rest_prefix
501
568
  @sid = "ct:#{@vmid}"
502
569
  end
503
570
 
@@ -515,8 +582,12 @@ module Proxmox
515
582
  end
516
583
 
517
584
  class HA < Base
585
+ def rest_prefix
586
+ @rest_prefix ||= "/cluster/ha/resources/#{virt.sid}"
587
+ end
588
+
518
589
  def initialize
519
- @rest_prefix = "/cluster/ha/resources/#{virt.sid}"
590
+ rest_prefix
520
591
  end
521
592
 
522
593
  class <<self
@@ -576,20 +647,51 @@ module Proxmox
576
647
  self
577
648
  end
578
649
 
579
- def started?
580
- 'started' == self.state
650
+ def started?() 'started' == self.state end
651
+ def stopped?() 'stopped' == self.state end
652
+ def error?() 'error' == self.state end
653
+ def active?() ! ! digest end
654
+ end
655
+
656
+ class Storage < Base
657
+ def rest_prefix
658
+ @rest_prefix ||= "/nodes/#{@node.node}/storage/#{@storage}"
581
659
  end
582
660
 
583
- def stopped?
584
- 'stopped' == self.state
661
+ def content
662
+ rest_get( "#{@rest_prefix}/content").map do |c|
663
+ Content.send :__new__, c.merge( node: @node, storage: self, t: 'smc')
664
+ end
585
665
  end
586
666
 
587
- def error?
588
- 'error' == self.state
667
+ def initialize() rest_prefix end
668
+
669
+ def to_s() "#{@node.node}:#{@storage}" end
670
+
671
+ class Content < Base
672
+ def rest_prefix
673
+ @rest_prefix ||= "/nodes/#{@node.node}/storage/#{@storage}/content/#{@content}"
674
+ end
675
+
676
+ def initialize() rest_prefix end
677
+ def to_s() "#{node.node} #{volid}" end
678
+ end
679
+ end
680
+
681
+ class AplInfo < Base
682
+ def rest_prefix
683
+ @rest_prefix ||= "/nodes/#{@node.node}/aplinfo"
589
684
  end
590
685
 
591
- def active?
592
- ! ! digest
686
+ def initialize() rest_prefix end
687
+ def name() @template end
688
+ def system?() 'system' == @section end
689
+ def debian?() %r[\Adebian-] =~ @os end
690
+ def lxc?() 'lxc' == @type end
691
+
692
+ def download storage
693
+ upid = rest_post "#{@rest_prefix}", template: @template, storage: storage.to_s
694
+ Task.send :__new__, node: @node, host: self, upid: upid
593
695
  end
594
696
  end
595
697
  end
data/lib/pve/templates.rb CHANGED
@@ -27,14 +27,27 @@ module PVE::CTTemplate
27
27
  File.read( options[:'ssh-public-keys-file'] || '/root/.ssh/authorized_keys')
28
28
  end
29
29
 
30
+ def _ipv4 ip, gw
31
+ return [ip, nil] if %w[dhcp].include? ip
32
+ ip = IPAddress::IPv4.new ip
33
+ [ip.to_string, gw || ip.hosts.last.to_s]
34
+ end
35
+
36
+ def _ipv6 ip, gw
37
+ return [ip, nil] if %w[dhcp auto].include? ip
38
+ ip = IPAddress::IPv6.new ip
39
+ [ip.to_string, gw || ip.hosts.last.to_s]
40
+ end
41
+
30
42
  def net0()
31
43
  if options.ipv4 || options.ipv6
32
- ipv4 = IPAddress::IPv4.new options.ipv4
44
+ ipv4, gw4 = _ipv4( options.ipv4, options.gateway4)
45
+ ipv6, gw6 = _ipv6( options.ipv6, options.gateway6)
33
46
  {
34
47
  name: 'eth0',
35
48
  bridge: 'vmbr1',
36
- ip: ipv4.to_string,
37
- gw: options.gateway || ipv4.hosts.last.to_s
49
+ ip: ipv4, ip6: ipv6,
50
+ gw: gw4, gw6: gw6,
38
51
  }
39
52
  end
40
53
  end
@@ -44,6 +57,10 @@ module PVE::CTTemplate
44
57
  end
45
58
 
46
59
  class Default < Base
60
+ def self.help
61
+ nil
62
+ end
63
+
47
64
  def self.requirements
48
65
  {
49
66
  node: [:string, false, "Create CT on this node."],
@@ -62,7 +79,7 @@ module PVE::CTTemplate
62
79
  :'ssh-public-keys-file' => [:string, false, "Read SSH-Public-Keys from file."],
63
80
  ipv4: [:string, false, "IPv4-Address with net-size."],
64
81
  gateway4: [:string, false, "IPv4-Address of gateway."],
65
- ipv6: [:string, false, "IPv6-Address with net-size."],
82
+ ipv6: [:string, false, "IPv6-Address with net-size or auto."],
66
83
  gateway6: [:string, false, "IPv6-Address of gateway."],
67
84
  storage: [:string, false, "Device will be create on this Storage (default: local"],
68
85
  }
@@ -70,12 +87,24 @@ module PVE::CTTemplate
70
87
  end
71
88
 
72
89
  class Datacenter < Base
90
+ def self.help
91
+ <<-EOF.gsub /^ {6}/, ''
92
+ Datacenter provides an interface for special network-settings.
93
+ Networks in Datacenters are often based on this behaviour:
94
+ A Network has an ID like 99.
95
+ This defines the VLANs: 2099 for Layer2/3099 for Layer3.
96
+ The IPv4-Range would be 10.99.0.0/16, but container will be put static in 10.99.255.0/24.
97
+ IPv6 uses RADV, so we do not need to know the IPv6-Range => auto.
98
+ VMID can be generated by Network-ID, too: smallest unused VMID in 100*ID.
99
+ EOF
100
+ end
101
+
73
102
  def self.requirements
74
103
  {
75
104
  node: [:string, false, "Create CT on this node."],
76
105
  name: [:string, true, "Set (uniq) name"],
77
106
  arch: [:enum, false, "Architecture", %w[amd64 i386 arm64 armhf]],
78
- vmid: [:numeric, true, "VM-ID. Proxmox internal number (100...)"],
107
+ vmid: [:numeric, false, "VM-ID. Proxmox internal number (100...)"],
79
108
  ostype: [:string, true, "OS-Type (OS or distribution)"],
80
109
  cmode: [:enum, false, "Console-mode", %w[shell console tty]],
81
110
  cores: [:numeric, false, "Count of cores"],
@@ -87,11 +116,12 @@ module PVE::CTTemplate
87
116
  :'ssh-public-keys' => [:string, false, "SSH-Public-Keys, which should be added to root-user in CT."],
88
117
  :'ssh-public-keys-file' => [:string, false, "Read SSH-Public-Keys from file."],
89
118
  :'network-id' => [:numeric, true, "Put Container to this VLAN and use a random IPv4-Address for this CT."],
90
- ipv4: [:string, false, "IPv4-Address with net-size."],
119
+ ipv4: [:string, false, "IPv4-Address with net-size or dhcp."],
91
120
  gateway4: [:string, false, "IPv4-Address of gateway."],
92
- ipv6: [:string, false, "IPv6-Address with net-size."],
121
+ ipv6: [:string, false, "IPv6-Address with net-size or auto|dhcp."],
93
122
  gateway6: [:string, false, "IPv6-Address of gateway."],
94
123
  storage: [:string, false, "Device will be create on this Storage (default: root)"],
124
+ ostemplate: [:string, false, "OS-Template eg. local:vztmpl/superlinux-1.2-amd64.tar.xz"],
95
125
  }
96
126
  end
97
127
 
@@ -111,15 +141,27 @@ module PVE::CTTemplate
111
141
  end
112
142
 
113
143
  def net0
144
+ ipv4, gw4 =
145
+ if options.ipv4
146
+ _ipv4( options.ipv4, options.gateway4)
147
+ else
148
+ self.ipv4_gw
149
+ end
150
+ ipv6, gw6 =
151
+ if options.ipv6
152
+ _ipv6( options.ipv6, options.gateway6)
153
+ else
154
+ ['auto', nil]
155
+ end
114
156
  {
115
157
  name: 'eth0',
116
158
  bridge: 'vmbr1',
117
159
  tag: 2000+network_id,
118
160
  mtu: 9166,
119
161
  firewall: 1,
120
- ip: ipv4.to_string,
121
- gw: ipv4.hosts.last.to_s,
122
- }
162
+ ip: ipv4, gw: gw4,
163
+ ip6: ipv6, gw6: gw6,
164
+ }.delete_if {|k,v| v.nil? }
123
165
  end
124
166
 
125
167
  def vmid
@@ -130,14 +172,13 @@ module PVE::CTTemplate
130
172
  IPAddress::IPv4.new "10.#{network_id}.255.0/24"
131
173
  end
132
174
 
133
- def ipv4
134
- return options.ipv4 if options.ipv4
135
- return @ipv4 if @ipv4
175
+ def ipv4_gw
176
+ return @ipv4_gw if @ipv4_gw
136
177
  ipv4s = network.hosts
137
178
  @virts.each do |v|
138
179
  v.config[:network].each {|n| ipv4s.delete n[:ip] if n[:ip] }
139
180
  end
140
- @ipv4 = ipv4s.first
181
+ @ipv4_gw = [ipv4s.first.to_string, network.last.to_s]
141
182
  end
142
183
 
143
184
  def ostemplate
@@ -145,7 +186,8 @@ module PVE::CTTemplate
145
186
  options.ostemplate ||
146
187
  case ostype
147
188
  when 'debian'
148
- 'local:vztmpl/debian-10-standard_10.5-1_amd64.tar.gz'
189
+ # TODO: how to determine which template?
190
+ 'local:vztmpl/debian-11-standard_11.0-1_amd64.tar.gz'
149
191
  else
150
192
  raise ArgumentError, "OS-Template for ostype #{ostype} not found or ostemplate not provided."
151
193
  end
data/lib/pve/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module PVE
2
- VERSION = '0.1.2'
2
+ VERSION = '0.2.3'
3
3
  end
data/pve.gemspec CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.metadata["source_code_uri"] = spec.homepage
20
20
  spec.metadata["changelog_uri"] = spec.homepage
21
21
 
22
- spec.add_dependency 'dencli', '~> 0.3.1'
22
+ spec.add_dependency 'dencli', '~> 0.5.3'
23
23
  spec.add_dependency 'rest-client', '~> 2.1'
24
24
  spec.add_dependency 'ipaddress', '~> 0.8.3'
25
25
  spec.add_dependency 'activesupport', '>= 2'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pve
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Denis Knauf
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-04-21 00:00:00.000000000 Z
11
+ date: 2021-12-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dencli
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.3.1
19
+ version: 0.5.3
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.3.1
26
+ version: 0.5.3
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rest-client
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -104,8 +104,9 @@ extra_rdoc_files: []
104
104
  files:
105
105
  - ".gitignore"
106
106
  - Gemfile
107
- - Gemfile.lock
107
+ - LICENSE.txt
108
108
  - README.adoc
109
+ - Rakefile
109
110
  - bin/pvecli
110
111
  - lib/pve.rb
111
112
  - lib/pve/cli.rb
@@ -114,10 +115,10 @@ files:
114
115
  - lib/pve/cli/ha.rb
115
116
  - lib/pve/cli/node.rb
116
117
  - lib/pve/cli/qm.rb
118
+ - lib/pve/cli/storage.rb
117
119
  - lib/pve/cli/task.rb
118
120
  - lib/pve/helper.rb
119
121
  - lib/pve/proxmox.rb
120
- - lib/pve/qm.rb
121
122
  - lib/pve/templates.rb
122
123
  - lib/pve/version.rb
123
124
  - pve.gemspec