1pub mod command;
2pub mod command_handler;
3pub mod config;
4pub mod config_storage;
5pub mod image;
6pub mod launcher;
7#[allow(dead_code)]
8pub mod network;
9pub mod qmp;
10pub mod supervisor;
11pub mod template;
12pub mod traits;
13pub mod util;
14pub mod vm;
15
16use self::{
17 command::{CommandType, Commands, ConfigPortSubcommand, ConfigSubcommand, SnapshotSubcommand},
18 command_handler::CommandHandler,
19};
20use anyhow::Result;
21use clap::Parser;
22
23pub async fn evaluate() -> Result<()> {
24 let handler = CommandHandler::default();
25 let args = Commands::parse();
26
27 match args.command {
28 CommandType::Restart { name } => handler.restart(&name.into()),
29 CommandType::Reset { name } => handler.reset(&name.into()),
30 CommandType::Save { name } => handler.save_state(&name.into()),
31 CommandType::Load { name } => handler.load_state(&name.into()),
32 CommandType::ClearState { name } => handler.clear_state(&name.into()),
33 CommandType::Snapshot(sub) => match sub {
34 SnapshotSubcommand::Save {
35 name,
36 snapshot_name,
37 } => handler.snapshot_save(&name.into(), snapshot_name),
38 SnapshotSubcommand::Load {
39 name,
40 snapshot_name,
41 } => handler.snapshot_load(&name.into(), snapshot_name),
42 SnapshotSubcommand::Delete {
43 name,
44 snapshot_name,
45 } => handler.snapshot_delete(&name.into(), snapshot_name),
46 },
47 CommandType::Config(sub) => match sub {
48 ConfigSubcommand::Set { name, key, value } => {
49 handler.config_set(&name.into(), key, value)
50 }
51 ConfigSubcommand::Copy { from, to } => handler.config_copy(&from.into(), &to.into()),
52 ConfigSubcommand::Show { name } => handler.show_config(&name.into()),
53 ConfigSubcommand::Port(sub) => match sub {
54 ConfigPortSubcommand::Map {
55 name,
56 hostport,
57 guestport,
58 } => handler.port_map(&name.into(), hostport, guestport),
59 ConfigPortSubcommand::Unmap { name, hostport } => {
60 handler.port_unmap(&name.into(), hostport)
61 }
62 },
63 },
64 CommandType::ListDisks { name } => handler.list_disks(&name.into()),
65 CommandType::NC { name, port } => handler.nc(&name.into(), port).await,
66 CommandType::SSH { name, args } => handler.ssh(&name.into(), args),
67 CommandType::Create { append, name, size } => handler.create(&name.into(), size, append),
68 CommandType::Rename { old, new } => handler.rename(&old.into(), &new.into()),
69 CommandType::Delete { name, disk } => handler.delete(&name.into(), disk),
70 CommandType::Supervise { cdrom, name } => {
71 let mut vm: vm::VM = name.into();
72 if let Some(cdrom) = cdrom {
73 vm.set_cdrom(cdrom)
74 }
75 handler.supervise(&vm)
76 }
77 CommandType::Unsupervise { name } => handler.unsupervise(&name.into()),
78 CommandType::Run {
79 headless,
80 detach,
81 cdrom,
82 extra_disk,
83 name,
84 } => {
85 let mut vm: vm::VM = name.into();
86 vm.set_headless(headless);
87 if let Some(cdrom) = cdrom {
88 vm.set_cdrom(cdrom);
89 }
90 if let Some(extra_disk) = extra_disk {
91 vm.set_extra_disk(extra_disk)
92 }
93
94 handler.run(&vm, detach)
95 }
96 CommandType::List { running } => handler.list(running),
97 CommandType::Shutdown { name, nowait } => handler.shutdown(&name.into(), nowait),
98 CommandType::QMP {
99 name,
100 command,
101 arguments,
102 } => handler.qmp(&name.into(), &command, arguments.as_deref()),
103 CommandType::Supervised => handler.supervised(),
104 CommandType::Clone { from, to, config } => {
105 handler.clone_vm(&from.into(), &to.into(), config)
106 }
107 CommandType::Import {
108 format,
109 name,
110 from_file,
111 } => handler.import(&name.into(), from_file, format),
112 CommandType::IsActive { name } => handler.is_active(&name.into()),
113 }
114}