Mercurial > hg > Members > anatofuz > ie-virsh
annotate src/command.rs @ 28:1c3b6b6ee0b1
add show template
author | AnaTofuZ <anatofuz@gmail.com> |
---|---|
date | Sat, 21 Nov 2020 16:37:58 +0900 |
parents | afec42bdd5ab |
children | f4b655fae2a3 |
rev | line source |
---|---|
26 | 1 use super::user; |
12 | 2 use super::virsh; |
19 | 3 use super::xml; |
12 | 4 |
28 | 5 use std::{fs, io}; |
6 | |
7 const TEMPLATE_DIR: &str = "/ie-ryukyu/kvm/images/templates/"; | |
8 const TEMPLATE_SUFFIX: &str = "template-"; | |
9 const TEMPLATE_FILE_EXTENSION: &str = ".qcow2"; | |
10 | |
24 | 11 pub fn list(user_name: &str) { |
12 | 12 let (ldump_msg, vm_list_strs) = virsh::get_vm_list(user_name); |
13 println!("{}", ldump_msg.info_msg); | |
14 println!("{}", ldump_msg.border_line); | |
15 for vm_info in vm_list_strs { | |
16 println!("{}", vm_info); | |
17 } | |
18 } | |
13 | 19 |
28 | 20 pub fn templates() -> io::Result<()> { |
21 let mut entries = fs::read_dir(TEMPLATE_DIR)? | |
22 .map(|res| res.map(|e| e.path())) | |
23 .collect::<Result<Vec<_>, io::Error>>()?; | |
24 | |
25 entries.sort(); | |
26 | |
27 for entry in entries { | |
28 let template_vm = entry | |
29 .display() | |
30 .to_string() | |
31 .replace(TEMPLATE_DIR, "") | |
32 .replace(TEMPLATE_SUFFIX, "") | |
33 .replace(TEMPLATE_FILE_EXTENSION, ""); | |
34 println!("{}", template_vm); | |
35 } | |
36 | |
37 Ok(()) | |
38 } | |
39 | |
26 | 40 pub fn define(user: &user::User, vm_name: String) { |
41 let vm_name = generate_vm_name(&user.name, &vm_name); | |
42 let vm_arg = xml::GenerateVMArg::new(&user.name, &vm_name, false); | |
43 if let Ok(xml_path) = vm_arg.generate() { | |
44 virsh::command_require_vm_name(xml_path, "define") | |
21 | 45 } |
19 | 46 } |
47 | |
24 | 48 pub fn start(user_name: &str, vm_name: String) { |
17
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
49 virsh::command_require_vm_name(get_vm_name(user_name, &vm_name), "start"); |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
50 } |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
51 |
24 | 52 pub fn shutdown(user_name: &str, vm_name: String) { |
17
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
53 exec_cmd_from_name_or_id(user_name, &vm_name, "shutdown") |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
54 } |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
55 |
24 | 56 pub fn destroy(user_name: &str, vm_name: String) { |
17
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
57 exec_cmd_from_name_or_id(user_name, &vm_name, "destroy") |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
58 } |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
59 |
24 | 60 pub fn console(user_name: &str, vm_name: String) { |
17
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
61 exec_cmd_from_name_or_id(user_name, &vm_name, "console") |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
62 } |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
63 |
24 | 64 pub fn vncdisplay(user_name: &str, vm_name: String) { |
17
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
65 exec_cmd_from_name_or_id(user_name, &vm_name, "vncdisplay") |
16 | 66 } |
67 | |
24 | 68 pub fn ttyconsole(user_name: &str, vm_name: String) { |
18 | 69 exec_cmd_from_name_or_id(user_name, &vm_name, "ttyconsole") |
70 } | |
71 | |
24 | 72 pub fn dumpxml(user_name: &str, vm_name: String) { |
18 | 73 exec_cmd_from_name_or_id(user_name, &vm_name, "dumpxml") |
74 } | |
75 | |
24 | 76 pub fn undefine(user_name: &str, vm_name: String) { |
18 | 77 exec_cmd_from_name_or_id(user_name, &vm_name, "undefine") |
78 } | |
79 | |
24 | 80 pub fn domiflist(user_name: &str, vm_name: String) { |
19 | 81 exec_cmd_from_name_or_id(user_name, &vm_name, "domiflist") |
82 } | |
83 | |
24 | 84 pub fn dominfo(user_name: &str, vm_name: String) { |
19 | 85 exec_cmd_from_name_or_id(user_name, &vm_name, "dominfo") |
86 } | |
18 | 87 |
26 | 88 pub fn dumpvncpasswd(user_name: &str, vm_name: String) {} |
89 | |
24 | 90 fn exec_cmd_from_name_or_id(user_name: &str, name_or_id: &str, command: &str) { |
17
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
91 if name_or_id.parse::<u8>().is_ok() { |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
92 let vm_name_or_none = get_vm_name_from_id(user_name, &name_or_id); |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
93 if let Some(vm_name) = vm_name_or_none { |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
94 return virsh::command_require_vm_name(vm_name, command); |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
95 } |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
96 } |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
97 virsh::command_require_vm_name(get_vm_name(user_name, name_or_id), command); |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
98 } |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
99 |
24 | 100 fn get_vm_name_from_id(user_name: &str, arg_id: &str) -> Option<String> { |
17
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
101 let (_, vm_list_strs) = virsh::get_vm_list(user_name); |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
102 for vm in vm_list_strs { |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
103 let mut splitted = vm.split_whitespace(); |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
104 let vm_id = splitted.next().unwrap(); |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
105 if (vm_id != "-") && (vm_id == arg_id) { |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
106 let vm_name = splitted.next().unwrap(); |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
107 return Some(String::from(vm_name)); |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
108 } |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
109 } |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
110 None |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
111 } |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
112 |
24 | 113 fn get_vm_name(user_name: &str, vm_name: &str) -> String { |
13 | 114 let vm_name = match vm_name.parse::<u8>() { |
15 | 115 Ok(_) => format!("{}-{}", user_name, vm_name), |
17
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
116 Err(_) => vm_name.to_string(), |
13 | 117 }; |
118 | |
16 | 119 if vm_name.starts_with(user_name) { |
120 return vm_name; | |
121 } | |
122 format!("{}-{}", user_name, vm_name) | |
13 | 123 } |
20 | 124 |
26 | 125 fn generate_vm_name(user_name: &str, vm_name: &str) -> String { |
20 | 126 if vm_name.starts_with(user_name) { |
127 return vm_name.to_string(); | |
128 } | |
129 format!("{}-{}", user_name, vm_name) | |
23 | 130 } |