changeset 68:f9e8680648c9

impl define-gdb
author AnaTofuZ <anatofuz@gmail.com>
date Sun, 20 Dec 2020 15:12:53 +0900
parents 29d2a49008e2
children 2fb3f3207bbc
files src/command.rs src/main.rs src/xml.rs
diffstat 3 files changed, 43 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/command.rs	Sat Dec 12 17:36:11 2020 +0900
+++ b/src/command.rs	Sun Dec 20 15:12:53 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,23 @@
     }
 }
 
+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;
+        }
+    };
+    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 +138,10 @@
     }
     format!("{}-{}", user_name, vm_name)
 }
+
+fn get_available_port() -> Result<u16, std::io::Error> {
+    match TcpListener::bind("localhost:0") {
+        Ok(listener) => Ok(listener.local_addr().unwrap().port()),
+        Err(e) => Err(e),
+    }
+}
--- a/src/main.rs	Sat Dec 12 17:36:11 2020 +0900
+++ b/src/main.rs	Sun Dec 20 15:12:53 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);
             }
         }
-
-        _ => {}
     }
 }
--- a/src/xml.rs	Sat Dec 12 17:36:11 2020 +0900
+++ b/src/xml.rs	Sun Dec 20 15:12:53 2020 +0900
@@ -52,7 +52,7 @@
 
 pub struct Builder {
     vm_name: String,
-    debug_tcp_port: Option<u64>,
+    debug_tcp_port: Option<u16>,
     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<u64>,
+    debug_tcp_port: Option<u16>,
     backing_file: String,
     is_backing: bool,
 }
@@ -101,8 +101,8 @@
         self
     }
 
-    pub fn debug_tcp_port(&mut self, port: Option<u64>) -> &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
     }