class PVE::Cli def cli_storage cli.sub :storage, "Storages", min: 3 do |cli_sm| cli_sm.cmd :list, "List Storages", aliases: ['ls'], &lambda {|node=nil| connect nodes = node ? [Proxmox::Node.find_by_name!( node)] : Proxmox::Node.all nodes.flat_map do |n| n.lxc.map {|c| c.vmid.to_i } end.sort.each {|c| puts c } } cli_sm.cmd :status, "List Storages with status", aliases: [nil], &lambda {|node=nil| connect to = TablizedOutput.new %w[A E S Storage Host Type] nodes = node ? [Proxmox::Node.find_by_name!( node)] : Proxmox::Node.all nodes.each do |n| n.storage.each do |v| to.push [ case v.active when 1 then ColoredString.new 'Y', "32" when 0 then ColoredString.new 'n', "31" else v.active.to_s end, case v.enabled when 1 then ColoredString.new 'Y', "32" when 0 then ColoredString.new 'n', "31" else v.enabled.to_s end, 1 == v.shared ? 's' : 'l', v.storage, v.node.node, v.type ] end end to.print order: [4,5] } cli_sm.sub :content, "Content of Storage", aliases: ['cnt'] do |cli_cnt| cli_cnt.cmd :list, "List Content", aliases: ['ls'], &lambda {|node=nil, storage| connect node = node ? Proxmox::Node.find_by_name!( node) : Proxmox::Node.all.first storage = node.storage.select {|sm| storage == sm.storage }.first storage.content.each {|c| puts c.to_s } } cli_cnt.cmd( :help, '', aliases: ['-h', '--help', nil]) {|*args| help cli_cnt, *args } end cli_sm.cmd( :help, '', aliases: ['-h', '--help']) {|*args| help cli_sm, *args } #cli_sm.provide_help end cli.sub :apl, "Appliances - Downloadable container images", min: 3 do |cli_apl| cli_apl.cmd( :content, "Table of all provided appliances", aliases: [nil], &lambda {|node:, regexp:, system:, applications:| connect appliances node, regexp, system, applications }). opt( :node, '-n=NODE', '--node', 'Ask this node for appliances (any node should list the same)', default: nil). opt( :regexp, '-r=REGEXP', '--regexp', 'Filter by template', default: nil). opt( :system, '-s', '--system', 'Only system templates', default: nil). opt( :applications, '-a', '--applications', 'Only applications (non system) templates', default: nil) cli_apl.cmd( :system, "Table of provided systems", &lambda {|node:, regexp:| connect appliances node, regexp, true, nil }). opt( :node, '-n=NODE', '--node', 'Ask this node for appliances (any node should list the same)', default: nil). opt( :regexp, '-r=REGEXP', '--regexp', 'Filter by template', default: nil) cli_apl.cmd( :applications, "Table of provided applications", &lambda {|node:, regexp:| connect appliances node, regexp, nil, true }). opt( :node, '-n=NODE', '--node', 'Ask this node for appliances (any node should list the same)', default: nil). opt( :regexp, '-r=REGEXP', '--regexp', 'Filter by template', default: nil) cli_apl.cmd( :list, "List provided appliances", aliases: ['ls'], &lambda {|node=nil, regexp:| connect node = node ? Proxmox::Node.find_by_name!( node) : Proxmox::Node.all.first node.aplinfo.each do |apl| puts apl.template end }). opt( :regexp, '-r=REGEXP', '--regexp', 'Filters by name', default: nil) cli_apl.cmd :download, "Download appliance", aliases: ['dl'], min: 2, &lambda {|template, node, storage=nil| storage ||= 'local' connect node = Proxmox::Node.find_by_name! node apl = node.aplinfo.find {|apl| apl.template == template } raise UsageError, "Appliance not found" unless apl task = apl.download storage wait task, text: "Download #{apl.template} on #{node.node} to #{storage}" } cli_apl.cmd( :help, '', aliases: ['-h', '--help']) {|*args| help cli_apl, *args } end end end