# HG changeset patch # User 清水 隆博 # Date 1608445057 -32400 # Node ID 1ed532a9affd5796298586b36fa4ffde51b5304d # Parent 29d2a49008e2560ae2336df27ee4debbb583402c# Parent 2fb3f3207bbcaf4f3ed82028f3d52e5e0d950bf1 Merge branch 'support-define-gdb' into 'master' Support define gdb See merge request ie-syskan/ie-virsh!3 diff -r 29d2a49008e2 -r 1ed532a9affd src/command.rs --- a/src/command.rs Sat Dec 12 17:36:11 2020 +0900 +++ b/src/command.rs Sun Dec 20 15:17:37 2020 +0900 @@ -3,6 +3,7 @@ use crate::xml; use std::io; +use std::net::TcpListener; const RENTAL_DIR: &str = "/ie-ryukyu/kvm/images/rental"; @@ -33,6 +34,24 @@ } } +pub fn define_gdb(user_detail: &user::UserDetail, vm_name: &str) { + let vm_name = generate_vm_name(&user_detail.user.name, &vm_name); + let port = match get_available_port() { + Ok(port) => port, + Err(e) => { + println!("[error]get_avalable_port {}", e); + return; + } + }; + println!("gdb debug port: {}", port); + let builder = xml::Builder::new(&user_detail, &vm_name) + .debug_tcp_port(port) + .finalize(); + if let Ok(xml_path) = builder.generate() { + virsh::subshell_virsh_command(&xml_path, "define") + } +} + pub fn define_from_template(user_detail: &user::UserDetail, vm_name: &str, template: &str) { let vm_name = generate_vm_name(&user_detail.user.name, &vm_name); println!("{}", vm_name); @@ -120,3 +139,10 @@ } format!("{}-{}", user_name, vm_name) } + +fn get_available_port() -> Result { + match TcpListener::bind("localhost:0") { + Ok(listener) => Ok(listener.local_addr().unwrap().port()), + Err(e) => Err(e), + } +} diff -r 29d2a49008e2 -r 1ed532a9affd src/main.rs --- a/src/main.rs Sat Dec 12 17:36:11 2020 +0900 +++ b/src/main.rs Sun Dec 20 15:17:37 2020 +0900 @@ -34,7 +34,7 @@ /// define the domain in which the gdb port is opened from the template XML file #[derive(Clap)] struct DefineGDB { - _name: String, + name: String, } /// define (but don't start) a domain from an template XML file @@ -144,7 +144,6 @@ }; let userdetail = user::UserDetail::new(&user); - if let Some(template) = arg.template { command::define_from_template(&userdetail, &arg.name, &template); return; @@ -152,6 +151,18 @@ command::define(&userdetail, &arg.name); } + SubCommand::DefineGDB(arg) => { + user::set_root_id(); + let user = user::User { + uid, + gid, + name: user_name, + }; + + let userdetail = user::UserDetail::new(&user); + command::define_gdb(&userdetail, &arg.name); + } + SubCommand::Shutdown(arg) => { user::set_root_id(); command::subshell(&user_name, &arg.name, "shutdown"); @@ -180,7 +191,7 @@ SubCommand::Undefine(arg) => { user::set_root_id(); command::subshell(&user_name, &arg.name, "undefine"); - command::vol_delete(&user_name, &arg.name, "vol-delete"); + //command::vol_delete(&user_name, &arg.name, "vol-delete"); } SubCommand::Domiflist(arg) => { @@ -208,7 +219,5 @@ println!("{}", e); } } - - _ => {} } } diff -r 29d2a49008e2 -r 1ed532a9affd src/xml.rs --- a/src/xml.rs Sat Dec 12 17:36:11 2020 +0900 +++ b/src/xml.rs Sun Dec 20 15:17:37 2020 +0900 @@ -52,7 +52,7 @@ pub struct Builder { vm_name: String, - debug_tcp_port: Option, + debug_tcp_port: Option, backing_file: String, is_backing: bool, xml_dir: String, @@ -64,7 +64,7 @@ qcow2_path: String, xml_path: String, vnc_password: String, - debug_tcp_port: Option, + debug_tcp_port: Option, backing_file: String, is_backing: bool, } @@ -101,8 +101,8 @@ self } - pub fn debug_tcp_port(&mut self, port: Option) -> &mut Builder { - self.debug_tcp_port = port; + pub fn debug_tcp_port(&mut self, port: u16) -> &mut Builder { + self.debug_tcp_port = Some(port); self }