Mercurial > hg > Members > anatofuz > ie-virsh
annotate src/command.rs @ 39:f667f3a4bbee
backing file cmd
author | AnaTofuZ <anatofuz@gmail.com> |
---|---|
date | Sun, 22 Nov 2020 15:47:37 +0900 |
parents | 6f1b90844b7f |
children | d3055f6c6fb7 |
rev | line source |
---|---|
26 | 1 use super::user; |
12 | 2 use super::virsh; |
19 | 3 use super::xml; |
12 | 4 |
32 | 5 use std::io; |
28 | 6 |
24 | 7 pub fn list(user_name: &str) { |
12 | 8 let (ldump_msg, vm_list_strs) = virsh::get_vm_list(user_name); |
9 println!("{}", ldump_msg.info_msg); | |
10 println!("{}", ldump_msg.border_line); | |
11 for vm_info in vm_list_strs { | |
12 println!("{}", vm_info); | |
13 } | |
14 } | |
13 | 15 |
32 | 16 pub fn templates() -> Result<(), io::Error> { |
17 let templates_list = virsh::get_template_list()?; | |
28 | 18 |
32 | 19 for name in templates_list { |
20 println!("{}", name); | |
28 | 21 } |
22 | |
23 Ok(()) | |
24 } | |
25 | |
36 | 26 pub fn define(user: &user::User, vm_name: &str) { |
26 | 27 let vm_name = generate_vm_name(&user.name, &vm_name); |
39 | 28 let builder = xml::Builder::new(&user.name, &vm_name).finalize(); |
29 if let Ok(xml_path) = builder.generate() { | |
30 virsh::command_require_vm_name(&xml_path, "define") | |
31 } | |
32 } | |
33 | |
34 pub fn define_from_template(user: &user::User, vm_name: &str, template: &str) { | |
35 let vm_name = generate_vm_name(&user.name, &vm_name); | |
36 let template_path = match virsh::get_template_path(template) { | |
37 Some(path) => path, | |
38 None => { | |
39 println!("not found {}", template); | |
40 return; | |
41 } | |
42 }; | |
43 let builder = xml::Builder::new(&user.name, &vm_name) | |
44 .backing(&template_path) | |
45 .finalize(); | |
46 if let Ok(xml_path) = builder.generate() { | |
47 virsh::command_require_vm_name(&xml_path, "define") | |
21 | 48 } |
19 | 49 } |
50 | |
36 | 51 pub fn start(user_name: &str, vm_name: &str) { |
39 | 52 virsh::command_require_vm_name(&get_vm_name(user_name, vm_name), "start"); |
17
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
53 } |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
54 |
38 | 55 pub fn common(user_name: &str, vm_name: &str, command: &str) { |
37 | 56 exec_cmd_from_name_or_id(user_name, vm_name, command) |
16 | 57 } |
58 | |
36 | 59 pub fn dumpvncpasswd(_user_name: &str, _vm_name: &str) {} |
26 | 60 |
24 | 61 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
|
62 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
|
63 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
|
64 if let Some(vm_name) = vm_name_or_none { |
39 | 65 return virsh::command_require_vm_name(&vm_name, command); |
17
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
66 } |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
67 } |
39 | 68 virsh::command_require_vm_name(&get_vm_name(user_name, name_or_id), command); |
17
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
69 } |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
70 |
24 | 71 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
|
72 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
|
73 for vm in vm_list_strs { |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
74 let mut splitted = vm.split_whitespace(); |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
75 let vm_id = splitted.next().unwrap(); |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
76 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
|
77 let vm_name = splitted.next().unwrap(); |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
78 return Some(String::from(vm_name)); |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
79 } |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
80 } |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
81 None |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
82 } |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
83 |
24 | 84 fn get_vm_name(user_name: &str, vm_name: &str) -> String { |
13 | 85 let vm_name = match vm_name.parse::<u8>() { |
15 | 86 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
|
87 Err(_) => vm_name.to_string(), |
13 | 88 }; |
89 | |
16 | 90 if vm_name.starts_with(user_name) { |
91 return vm_name; | |
92 } | |
93 format!("{}-{}", user_name, vm_name) | |
13 | 94 } |
20 | 95 |
26 | 96 fn generate_vm_name(user_name: &str, vm_name: &str) -> String { |
20 | 97 if vm_name.starts_with(user_name) { |
98 return vm_name.to_string(); | |
99 } | |
100 format!("{}-{}", user_name, vm_name) | |
23 | 101 } |