# HG changeset patch # User AnaTofuZ # Date 1606002492 -32400 # Node ID ba66504b52569bba565e2b4a7d64ac312222373f # Parent ae7ba39dfcbe597fa2d7181fbb1ca5444200888a emit backingfile at xml diff -r ae7ba39dfcbe -r ba66504b5256 src/command.rs --- a/src/command.rs Sat Nov 21 17:14:56 2020 +0900 +++ b/src/command.rs Sun Nov 22 08:48:12 2020 +0900 @@ -25,7 +25,7 @@ pub fn define(user: &user::User, vm_name: String) { let vm_name = generate_vm_name(&user.name, &vm_name); - let vm_arg = xml::GenerateVMArg::new(&user.name, &vm_name, false); + let vm_arg = xml::GenerateVMArg::new(&user.name, &vm_name, None, None); if let Ok(xml_path) = vm_arg.generate() { virsh::command_require_vm_name(xml_path, "define") } diff -r ae7ba39dfcbe -r ba66504b5256 src/xml.rs --- a/src/xml.rs Sat Nov 21 17:14:56 2020 +0900 +++ b/src/xml.rs Sun Nov 22 08:48:12 2020 +0900 @@ -36,8 +36,8 @@ qcow2_path: String, xml_path: String, vnc_password: String, - is_debug: bool, - tcp_port: u64, + debug_tcp_port: Option, + backing_file: Option, } pub fn dump_vnc_passwd(user: user::UserDetail, _vm_name: &str) -> Result { @@ -60,7 +60,12 @@ } impl GenerateVMArg { - pub fn new(user_name: &str, vm_name: &str, is_debug: bool) -> GenerateVMArg { + pub fn new( + user_name: &str, + vm_name: &str, + debug_tcp_port: Option, + backing_file: Option, + ) -> GenerateVMArg { let year = user_name.chars().skip(1).take(2).collect::(); let affilication = if year.parse::().is_ok() { // /etc/libvirt/qemu/e19/e195729 @@ -91,8 +96,8 @@ qcow2_path, xml_path, vnc_password: pw, - is_debug, - tcp_port: 90, + debug_tcp_port, + backing_file, } } @@ -117,7 +122,7 @@ } Ok(Event::Start(ref e)) - if (e.name() == ROOT_START_TAG.as_bytes() && self.is_debug) => + if (e.name() == ROOT_START_TAG.as_bytes() && self.debug_tcp_port.is_some()) => { let mut elem = e.clone(); elem.push_attribute(DOMAIN_XMLNS_QEMU); @@ -137,7 +142,7 @@ } let mut qemu_elem = BytesStart::borrowed_name(QEMU_ARG_TAG.as_bytes()); - let gdb_port: &str = &format!("tcp::{}", self.tcp_port); + let gdb_port: &str = &format!("tcp::{}", self.debug_tcp_port.unwrap()); qemu_elem.push_attribute(("value", gdb_port)); writer.write_event(Event::Empty(qemu_elem)).unwrap(); @@ -155,6 +160,27 @@ writer.write_event(Event::Empty(elem)).ok(); } + Ok(Event::End(ref e)) if ((e.name() == b"disk") && self.backing_file.is_some()) => { + let mut backing_store_start = BytesStart::borrowed_name(b"backingStore"); + backing_store_start.push_attribute(("type", "file")); + backing_store_start.push_attribute(("index", "3")); + writer + .write_event(Event::Empty(backing_store_start)) + .unwrap(); + + let mut format_elem = BytesStart::borrowed_name(b"format"); + format_elem.push_attribute(("type", "qcow2")); + writer.write_event(Event::Empty(format_elem)).unwrap(); + + let mut backing_sorce = BytesStart::borrowed_name(b"sorce"); + let backing_file: &str = &self.backing_file.clone().unwrap(); + backing_sorce.push_attribute(("file", backing_file)); + writer.write_event(Event::Empty(backing_sorce)).unwrap(); + + let backing_store_end = BytesEnd::borrowed(b"backingStore"); + writer.write_event(Event::End(backing_store_end)).unwrap(); + } + Ok(Event::Empty(ref e)) if (e.name() == b"source") => { let mut elem = e.clone(); let is_qcow_file = elem