49 lines
1.8 KiB
Ruby
49 lines
1.8 KiB
Ruby
class PVE::Cli
|
|
def cli_qm
|
|
cli.sub :qm, "Virtual Machines", aliases: %w[v vm qemu], &lambda {|qm|
|
|
qm.cmd :list, "List VM-IDs", aliases: ['ls'], &lambda {|node=nil|
|
|
connect
|
|
nodes = Proxmox::Node.all
|
|
nodes = nodes.select {|n| node == n.name } if node
|
|
nodes.flat_map do |n|
|
|
n.qemu.map {|c| c.vmid.to_i }
|
|
end.sort.each {|c| puts c }
|
|
}
|
|
|
|
qm.cmd( :status, "Lists CTs with status", aliases: [nil], &lambda {|target=nil, sort: 'n', node: nil|
|
|
connect
|
|
node &&= /\A#{node}\z/
|
|
to = TablizedOutput.new %w[Status HA ID Name Host Uptime CPU/% Mem/MiB Mem/% Disk/MiB Disk/%]
|
|
push =
|
|
if target
|
|
target = /\A#{target}\z/
|
|
lambda {|n| to.virt n if n === target }
|
|
else
|
|
lambda {|n| to.virt n }
|
|
end
|
|
nodes = node ? Proxmox::Node.find_by_name( name) : Proxmox::Node.all
|
|
nodes.
|
|
map {|n| Thread.new( n, &:qemu) }.
|
|
each {|n| n.value.each &push }
|
|
to.print order: sort.each_char.map {|c| (2*c.ord[5]-1) * (' sainhucmd'.index( c.downcase)) }
|
|
}).
|
|
opt( :sort, '-s', '--sort=COLUMNS', "Sort by COLUMNs eg hn for host and name ([s]tatus, h[a], [i]d, [n]ame (default), [h]ost, [u]ptime, [c]pu, [m]em, [d]isk)").
|
|
opt( :node, '-n', '--node=NODE', "List only hosted by this NODE")
|
|
|
|
qm.cmd :exec, "Executes Command in VM via qemu-guest-agent", min: 4, &lambda {|name_or_id, *command|
|
|
connect
|
|
STDERR.puts "! #{$?.exitstatus}" unless Proxmox::Qemu.find!( name_or_id).exec *command
|
|
}
|
|
|
|
qm.cmd( :resize, 'Resize a disk', &lambda {|name_or_id, disk, size|
|
|
connect
|
|
qm = Proxmox::Qemu.find! name_or_id
|
|
task = qm.resize disk, size
|
|
wait task, text: "Resizing #{qm.sid} #{disk} to #{size}"
|
|
})
|
|
|
|
qm.cmd 'help', '', aliases: ['-h', '--help'], &lambda {|*args| help qm, *args }
|
|
}
|
|
end
|
|
end
|