diff --git a/lib/pve/cli.rb b/lib/pve/cli.rb index 5df303d..2bbeb87 100644 --- a/lib/pve/cli.rb +++ b/lib/pve/cli.rb @@ -55,6 +55,17 @@ class PVE::Cli exit 1 unless interactive? and r end + def task_log task, logn, limit = 1024 + log = task.log start: logn, limit: limit + log = [] if [{n: 1, t: 'no content'}] == log + unless log.empty? + STDERR.printf "\r\e[J" + log.each {|l| puts l[:t] } + logn = log.last[:n] + end + logn + end + def wait task, secs: nil, text: nil secs ||= 0.1 spinners, spin, logn = "▖▘▝▗", 0, 0 @@ -62,23 +73,19 @@ class PVE::Cli host = task.host&.name loop do s = task.status - if s[:exitstatus] + logn = self.task_log task, logn + if s.finished? + loop do + r = self.task_log task, logn + break if 0 == logn - r + logn = r + end STDERR.printf "\r[%s] %s %s %s\e[J\n", - host || s[:id], - case s[:exitstatus] - when "OK" then "\e[32;1m✓\e[0m" - else "\e[31;1m✗\e[0m" - end, + host || s.id, + s.successfull? ? "\e[32;1m✓\e[0m" : "\e[31;1m✗\e[0m", text && "#{text}:", - s[:status] == 'stopped' ? :finished : s[:status] - return task - end - log = task.log start: logn - log = [] if [{n: 1, t: 'no content'}] == log - unless log.empty? - STDERR.printf "\r\e[J" - log.each {|l| puts l[:t] } - logn = log.last[:n] + s.stopped? ? :finished : s.status + return s end STDERR.printf "\r[%s] \e[33;1m%s\e[0m %s...\e[J", host || s[:id], @@ -99,9 +106,7 @@ class PVE::Cli return end task = host.start - unless fire - wait task, text: "Starting" - end + wait task, text: "Starting" unless fire end def stop host, timeout: nil, fire: nil, secs: nil @@ -120,9 +125,13 @@ class PVE::Cli options[:start] = fire && start task = klass.create template, **options return if fire - wait task, text: "Creating" - host = task.host.refresh! - start host, timeout: timeout, secs: secs if start + status = wait task, text: "Creating" + if status.successfull? + host = task.host.refresh! + start host, timeout: timeout, secs: secs if start + elsif not interactive? + exit 1 + end end def destroy ct, timeout: nil, fire: nil, secs: nil diff --git a/lib/pve/cli/task.rb b/lib/pve/cli/task.rb index 59c7b05..b1c420d 100644 --- a/lib/pve/cli/task.rb +++ b/lib/pve/cli/task.rb @@ -16,7 +16,7 @@ def cli_task n.tasks.each do |t| next unless t.upid == upid puts t.upid - t.log.each {|l| puts l[:l] } + t.log( start: 0, limit: 1024).each {|l| puts l[:t] } return end end diff --git a/lib/pve/proxmox.rb b/lib/pve/proxmox.rb index c453d82..63e5be3 100644 --- a/lib/pve/proxmox.rb +++ b/lib/pve/proxmox.rb @@ -123,6 +123,10 @@ module Proxmox n.send :__update__, data end private :__new__ + + def fetch predata + __new__( predata).refresh! + end end def respond_to? method @@ -147,8 +151,10 @@ module Proxmox initialize self end + private :__update__ def refresh! + p self: self, refresh: @rest_prefix __update__ rest_get( @rest_prefix) end end @@ -176,9 +182,13 @@ module Proxmox def === t @name =~ t or @vmid.to_s =~ t or @sid =~ t end + + def rest_prefix + @rest_prefix ||= "/nodes/#{@node}" + end def initialize - @rest_prefix = "/nodes/#{@node}" + rest_prefix @sid = "nd:#{@node}" @name = @node end @@ -211,21 +221,51 @@ module Proxmox end class Task < Base - def initialize + class Status < Base + def rest_prefix + @rest_prefix ||= '/nodes/%s/tasks/%s/status' % [@node.node, @upid] + end + + def refresh! + d = rest_get @rest_prefix + d[:starttime] &&= Time.at d[:starttime] + d = {exitstatus: nil}.merge d + __update__ d.merge( node: @node, t: 'status', upid: @upid, task: @task) + end + + def initialize + rest_prefix + @sid = upid + end + + def inspect + h = instance_variables - %i[@node @task @sid @rest_prefix @upid @t] + h.map! {|k| "#{k[1..-1]}=#{instance_variable_get(k).inspect}" } + "#<#{self.class.name}|#{@upid} node=#{@node.node} #{h.join ' '}>" + end + + def running?() 'running' == @status end + def finished?() 'stopped' == @status end + alias stopped? finished? + def successfull?() stopped? ? 'OK' == @exitstatus : nil end + def failed?() stopped? ? 'OK' != @exitstatus : nil end + end + + def rest_prefix @rest_prefix = "/nodes/#{@node.node}/tasks/#{upid}" + end + + def initialize + rest_prefix @sid = upid end def inspect - "#<#{self.class.name} #{upid}>" + "#<#{self.class.name} #{@upid}>" end - #def finished? - # rest_get( "/nodes/#{node}/tasks/") - #end - def status - rest_get( "#{@rest_prefix}/status") + Status.fetch node: @node, task: self, upid: @upid end def log start: nil, limit: nil @@ -235,8 +275,7 @@ module Proxmox class Hosted < Base def refresh! - node, t = @node, @t - __update__ rest_get( "#{@rest_prefix}/status/current").merge( node: node, t: t) + __update__ rest_get( "#{@rest_prefix}/status/current").merge( node: @node, t: @t) end def === t @@ -392,8 +431,12 @@ module Proxmox end end + def rest_prefix + @rest_prefix ||= "/nodes/%s/qemu/%d" % [@node.node, @vmid] + end + def initialize - @rest_prefix = "/nodes/%s/qemu/%d" % [@node.node, @vmid] + rest_prefix @sid = "qm:#{@vmid}" end @@ -507,8 +550,12 @@ module Proxmox end end + def rest_prefix + @rest_prefix ||= "/nodes/%s/lxc/%d" % [@node.node, @vmid] + end + def initialize - @rest_prefix = "/nodes/%s/lxc/%d" % [@node.node, @vmid] + rest_prefix @sid = "ct:#{@vmid}" end @@ -526,8 +573,12 @@ module Proxmox end class HA < Base + def rest_prefix + @rest_prefix ||= "/cluster/ha/resources/#{virt.sid}" + end + def initialize - @rest_prefix = "/cluster/ha/resources/#{virt.sid}" + rest_prefix end class <