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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
26
AnaTofuZ <anatofuz@gmail.com>
parents: 25
diff changeset
1 use super::user;
12
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 use super::virsh;
19
d37203a877d9 add xml parse/writer
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
3 use super::xml;
12
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4
28
1c3b6b6ee0b1 add show template
AnaTofuZ <anatofuz@gmail.com>
parents: 26
diff changeset
5 use std::{fs, io};
1c3b6b6ee0b1 add show template
AnaTofuZ <anatofuz@gmail.com>
parents: 26
diff changeset
6
1c3b6b6ee0b1 add show template
AnaTofuZ <anatofuz@gmail.com>
parents: 26
diff changeset
7 const TEMPLATE_DIR: &str = "/ie-ryukyu/kvm/images/templates/";
1c3b6b6ee0b1 add show template
AnaTofuZ <anatofuz@gmail.com>
parents: 26
diff changeset
8 const TEMPLATE_SUFFIX: &str = "template-";
1c3b6b6ee0b1 add show template
AnaTofuZ <anatofuz@gmail.com>
parents: 26
diff changeset
9 const TEMPLATE_FILE_EXTENSION: &str = ".qcow2";
1c3b6b6ee0b1 add show template
AnaTofuZ <anatofuz@gmail.com>
parents: 26
diff changeset
10
24
e8ba0f63c227 remove static variable
AnaTofuZ <anatofuz@gmail.com>
parents: 22
diff changeset
11 pub fn list(user_name: &str) {
12
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 let (ldump_msg, vm_list_strs) = virsh::get_vm_list(user_name);
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 println!("{}", ldump_msg.info_msg);
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 println!("{}", ldump_msg.border_line);
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 for vm_info in vm_list_strs {
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 println!("{}", vm_info);
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 }
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 }
13
56e9763abeef define start cmd
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
19
28
1c3b6b6ee0b1 add show template
AnaTofuZ <anatofuz@gmail.com>
parents: 26
diff changeset
20 pub fn templates() -> io::Result<()> {
1c3b6b6ee0b1 add show template
AnaTofuZ <anatofuz@gmail.com>
parents: 26
diff changeset
21 let mut entries = fs::read_dir(TEMPLATE_DIR)?
1c3b6b6ee0b1 add show template
AnaTofuZ <anatofuz@gmail.com>
parents: 26
diff changeset
22 .map(|res| res.map(|e| e.path()))
1c3b6b6ee0b1 add show template
AnaTofuZ <anatofuz@gmail.com>
parents: 26
diff changeset
23 .collect::<Result<Vec<_>, io::Error>>()?;
1c3b6b6ee0b1 add show template
AnaTofuZ <anatofuz@gmail.com>
parents: 26
diff changeset
24
1c3b6b6ee0b1 add show template
AnaTofuZ <anatofuz@gmail.com>
parents: 26
diff changeset
25 entries.sort();
1c3b6b6ee0b1 add show template
AnaTofuZ <anatofuz@gmail.com>
parents: 26
diff changeset
26
1c3b6b6ee0b1 add show template
AnaTofuZ <anatofuz@gmail.com>
parents: 26
diff changeset
27 for entry in entries {
1c3b6b6ee0b1 add show template
AnaTofuZ <anatofuz@gmail.com>
parents: 26
diff changeset
28 let template_vm = entry
1c3b6b6ee0b1 add show template
AnaTofuZ <anatofuz@gmail.com>
parents: 26
diff changeset
29 .display()
1c3b6b6ee0b1 add show template
AnaTofuZ <anatofuz@gmail.com>
parents: 26
diff changeset
30 .to_string()
1c3b6b6ee0b1 add show template
AnaTofuZ <anatofuz@gmail.com>
parents: 26
diff changeset
31 .replace(TEMPLATE_DIR, "")
1c3b6b6ee0b1 add show template
AnaTofuZ <anatofuz@gmail.com>
parents: 26
diff changeset
32 .replace(TEMPLATE_SUFFIX, "")
1c3b6b6ee0b1 add show template
AnaTofuZ <anatofuz@gmail.com>
parents: 26
diff changeset
33 .replace(TEMPLATE_FILE_EXTENSION, "");
1c3b6b6ee0b1 add show template
AnaTofuZ <anatofuz@gmail.com>
parents: 26
diff changeset
34 println!("{}", template_vm);
1c3b6b6ee0b1 add show template
AnaTofuZ <anatofuz@gmail.com>
parents: 26
diff changeset
35 }
1c3b6b6ee0b1 add show template
AnaTofuZ <anatofuz@gmail.com>
parents: 26
diff changeset
36
1c3b6b6ee0b1 add show template
AnaTofuZ <anatofuz@gmail.com>
parents: 26
diff changeset
37 Ok(())
1c3b6b6ee0b1 add show template
AnaTofuZ <anatofuz@gmail.com>
parents: 26
diff changeset
38 }
1c3b6b6ee0b1 add show template
AnaTofuZ <anatofuz@gmail.com>
parents: 26
diff changeset
39
26
AnaTofuZ <anatofuz@gmail.com>
parents: 25
diff changeset
40 pub fn define(user: &user::User, vm_name: String) {
AnaTofuZ <anatofuz@gmail.com>
parents: 25
diff changeset
41 let vm_name = generate_vm_name(&user.name, &vm_name);
AnaTofuZ <anatofuz@gmail.com>
parents: 25
diff changeset
42 let vm_arg = xml::GenerateVMArg::new(&user.name, &vm_name, false);
AnaTofuZ <anatofuz@gmail.com>
parents: 25
diff changeset
43 if let Ok(xml_path) = vm_arg.generate() {
AnaTofuZ <anatofuz@gmail.com>
parents: 25
diff changeset
44 virsh::command_require_vm_name(xml_path, "define")
21
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
45 }
19
d37203a877d9 add xml parse/writer
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
46 }
d37203a877d9 add xml parse/writer
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
47
24
e8ba0f63c227 remove static variable
AnaTofuZ <anatofuz@gmail.com>
parents: 22
diff changeset
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
e8ba0f63c227 remove static variable
AnaTofuZ <anatofuz@gmail.com>
parents: 22
diff changeset
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
e8ba0f63c227 remove static variable
AnaTofuZ <anatofuz@gmail.com>
parents: 22
diff changeset
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
e8ba0f63c227 remove static variable
AnaTofuZ <anatofuz@gmail.com>
parents: 22
diff changeset
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
e8ba0f63c227 remove static variable
AnaTofuZ <anatofuz@gmail.com>
parents: 22
diff changeset
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
AnaTofuZ <anatofuz@gmail.com>
parents: 15
diff changeset
66 }
AnaTofuZ <anatofuz@gmail.com>
parents: 15
diff changeset
67
24
e8ba0f63c227 remove static variable
AnaTofuZ <anatofuz@gmail.com>
parents: 22
diff changeset
68 pub fn ttyconsole(user_name: &str, vm_name: String) {
18
9b24d6767a2f define other command
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
69 exec_cmd_from_name_or_id(user_name, &vm_name, "ttyconsole")
9b24d6767a2f define other command
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
70 }
9b24d6767a2f define other command
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
71
24
e8ba0f63c227 remove static variable
AnaTofuZ <anatofuz@gmail.com>
parents: 22
diff changeset
72 pub fn dumpxml(user_name: &str, vm_name: String) {
18
9b24d6767a2f define other command
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
73 exec_cmd_from_name_or_id(user_name, &vm_name, "dumpxml")
9b24d6767a2f define other command
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
74 }
9b24d6767a2f define other command
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
75
24
e8ba0f63c227 remove static variable
AnaTofuZ <anatofuz@gmail.com>
parents: 22
diff changeset
76 pub fn undefine(user_name: &str, vm_name: String) {
18
9b24d6767a2f define other command
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
77 exec_cmd_from_name_or_id(user_name, &vm_name, "undefine")
9b24d6767a2f define other command
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
78 }
9b24d6767a2f define other command
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
79
24
e8ba0f63c227 remove static variable
AnaTofuZ <anatofuz@gmail.com>
parents: 22
diff changeset
80 pub fn domiflist(user_name: &str, vm_name: String) {
19
d37203a877d9 add xml parse/writer
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
81 exec_cmd_from_name_or_id(user_name, &vm_name, "domiflist")
d37203a877d9 add xml parse/writer
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
82 }
d37203a877d9 add xml parse/writer
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
83
24
e8ba0f63c227 remove static variable
AnaTofuZ <anatofuz@gmail.com>
parents: 22
diff changeset
84 pub fn dominfo(user_name: &str, vm_name: String) {
19
d37203a877d9 add xml parse/writer
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
85 exec_cmd_from_name_or_id(user_name, &vm_name, "dominfo")
d37203a877d9 add xml parse/writer
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
86 }
18
9b24d6767a2f define other command
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
87
26
AnaTofuZ <anatofuz@gmail.com>
parents: 25
diff changeset
88 pub fn dumpvncpasswd(user_name: &str, vm_name: String) {}
AnaTofuZ <anatofuz@gmail.com>
parents: 25
diff changeset
89
24
e8ba0f63c227 remove static variable
AnaTofuZ <anatofuz@gmail.com>
parents: 22
diff changeset
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
e8ba0f63c227 remove static variable
AnaTofuZ <anatofuz@gmail.com>
parents: 22
diff changeset
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
e8ba0f63c227 remove static variable
AnaTofuZ <anatofuz@gmail.com>
parents: 22
diff changeset
113 fn get_vm_name(user_name: &str, vm_name: &str) -> String {
13
56e9763abeef define start cmd
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
114 let vm_name = match vm_name.parse::<u8>() {
15
e6dc51066703 cargo clippy
AnaTofuZ <anatofuz@gmail.com>
parents: 13
diff changeset
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
56e9763abeef define start cmd
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
117 };
56e9763abeef define start cmd
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
118
16
AnaTofuZ <anatofuz@gmail.com>
parents: 15
diff changeset
119 if vm_name.starts_with(user_name) {
AnaTofuZ <anatofuz@gmail.com>
parents: 15
diff changeset
120 return vm_name;
AnaTofuZ <anatofuz@gmail.com>
parents: 15
diff changeset
121 }
AnaTofuZ <anatofuz@gmail.com>
parents: 15
diff changeset
122 format!("{}-{}", user_name, vm_name)
13
56e9763abeef define start cmd
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
123 }
20
da4858f4658d impl define cmd
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
124
26
AnaTofuZ <anatofuz@gmail.com>
parents: 25
diff changeset
125 fn generate_vm_name(user_name: &str, vm_name: &str) -> String {
20
da4858f4658d impl define cmd
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
126 if vm_name.starts_with(user_name) {
da4858f4658d impl define cmd
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
127 return vm_name.to_string();
da4858f4658d impl define cmd
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
128 }
da4858f4658d impl define cmd
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 19
diff changeset
129 format!("{}-{}", user_name, vm_name)
23
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
130 }