annotate src/virsh.rs @ 45:91aea67d88fb

fix path
author AnaTofuZ <anatofuz@gmail.com>
date Sun, 22 Nov 2020 18:06:30 +0900
parents 98138c3f00f0
children d6ef7ea91ff4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
13
56e9763abeef define start cmd
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
1 use std::io::{self, Write};
12
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 use std::process::Command;
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3
43
AnaTofuZ <anatofuz@gmail.com>
parents: 42
diff changeset
4 use std::env;
32
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
5 use std::fs;
39
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
6 use std::path::Path;
32
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
7
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
8 const TEMPLATE_DIR: &str = "/ie-ryukyu/kvm/images/templates/";
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
9 const TEMPLATE_SUFFIX: &str = "template-";
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
10 const TEMPLATE_FILE_EXTENSION: &str = ".qcow2";
39
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
11 const QCOW2: &str = "qcow2";
32
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
12
12
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 pub struct ListDumpMsg {
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 pub info_msg: String,
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 pub border_line: String,
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 }
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17
32
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
18 pub fn get_template_list() -> Result<Vec<String>, io::Error> {
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
19 let mut entries = fs::read_dir(TEMPLATE_DIR)?
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
20 .map(|res| {
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
21 res.map(|e| {
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
22 e.path()
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
23 .display()
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
24 .to_string()
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
25 .replace(TEMPLATE_DIR, "")
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
26 .replace(TEMPLATE_SUFFIX, "")
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
27 .replace(TEMPLATE_FILE_EXTENSION, "")
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
28 })
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
29 })
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
30 .collect::<Result<Vec<_>, io::Error>>()?;
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
31
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
32 entries.sort();
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
33 Ok(entries)
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
34 }
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
35
24
e8ba0f63c227 remove static variable
AnaTofuZ <anatofuz@gmail.com>
parents: 16
diff changeset
36 pub fn get_vm_list(user_name: &str) -> (ListDumpMsg, Vec<String>) {
12
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 let output = Command::new("virsh")
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 .arg("list")
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 .arg("--all")
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 .output()
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 .expect("failed to virsh");
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 let virsh_list = String::from_utf8_lossy(&output.stdout);
15
e6dc51066703 cargo clippy
AnaTofuZ <anatofuz@gmail.com>
parents: 13
diff changeset
43 let mut virsh_list = virsh_list.split('\n');
12
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 let info_msg = virsh_list.next().unwrap();
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 let border_line = virsh_list.next().unwrap();
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 let ldump_msg = ListDumpMsg {
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 info_msg: String::from(info_msg),
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 border_line: String::from(border_line),
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 };
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51
15
e6dc51066703 cargo clippy
AnaTofuZ <anatofuz@gmail.com>
parents: 13
diff changeset
52 (
12
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 ldump_msg,
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 virsh_list
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 .filter(|&x| x.contains(user_name))
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 .map(|x| x.to_string())
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 .collect(),
15
e6dc51066703 cargo clippy
AnaTofuZ <anatofuz@gmail.com>
parents: 13
diff changeset
58 )
12
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 }
13
56e9763abeef define start cmd
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
60
39
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
61 pub fn command_require_vm_name(vm_name: &str, operation: &str) {
13
56e9763abeef define start cmd
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
62 let output = Command::new("virsh")
16
AnaTofuZ <anatofuz@gmail.com>
parents: 15
diff changeset
63 .arg(operation)
13
56e9763abeef define start cmd
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
64 .arg(vm_name)
56e9763abeef define start cmd
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
65 .output()
16
AnaTofuZ <anatofuz@gmail.com>
parents: 15
diff changeset
66 .unwrap_or_else(|_| panic!("failed to {}", operation));
13
56e9763abeef define start cmd
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
67
56e9763abeef define start cmd
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
68 io::stdout().write_all(&output.stdout).unwrap();
56e9763abeef define start cmd
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
69 io::stderr().write_all(&output.stderr).unwrap();
56e9763abeef define start cmd
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
70 }
39
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
71
43
AnaTofuZ <anatofuz@gmail.com>
parents: 42
diff changeset
72 pub fn generate_qemu_from_template(vm_path_string: &str, vm_name: &str, template_path: &str) {
AnaTofuZ <anatofuz@gmail.com>
parents: 42
diff changeset
73 let vm_path = Path::new(&vm_path_string);
AnaTofuZ <anatofuz@gmail.com>
parents: 42
diff changeset
74 let ok = env::set_current_dir(&vm_path);
AnaTofuZ <anatofuz@gmail.com>
parents: 42
diff changeset
75 if ok.is_err() {
AnaTofuZ <anatofuz@gmail.com>
parents: 42
diff changeset
76 println!("failed cd at {}", &vm_path_string);
AnaTofuZ <anatofuz@gmail.com>
parents: 42
diff changeset
77 return;
AnaTofuZ <anatofuz@gmail.com>
parents: 42
diff changeset
78 }
39
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
79 let output = Command::new("qemu-img")
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
80 .arg("create")
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
81 .arg("-F")
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
82 .arg(QCOW2)
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
83 .arg("-b")
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
84 .arg(template_path)
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
85 .arg("-f")
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
86 .arg(QCOW2)
45
91aea67d88fb fix path
AnaTofuZ <anatofuz@gmail.com>
parents: 43
diff changeset
87 .arg(format!("{}.qcow2", vm_name))
39
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
88 .output()
43
AnaTofuZ <anatofuz@gmail.com>
parents: 42
diff changeset
89 .unwrap_or_else(|_| panic!("failed to generate {}", &vm_name));
39
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
90 io::stdout().write_all(&output.stdout).unwrap();
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
91 io::stderr().write_all(&output.stderr).unwrap();
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
92 }
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
93
41
AnaTofuZ <anatofuz@gmail.com>
parents: 40
diff changeset
94 pub fn get_backing_path(template_name: &str) -> Option<String> {
39
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
95 let template_path = format!(
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
96 "{}{}{}{}",
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
97 TEMPLATE_DIR, TEMPLATE_SUFFIX, &template_name, TEMPLATE_FILE_EXTENSION
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
98 );
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
99 if Path::new(&template_path).exists() {
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
100 return Some(template_path);
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
101 }
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
102 None
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
103 }