Просмотр исходного кода

Merge pull request #86 from dlhxzb/listern-for-unix-signal

Feat: listen for unix signal
RustDesk лет назад: 3
Родитель
Сommit
d7b2060a5b
7 измененных файлов с 100 добавлено и 46 удалено
  1. 1 4
      libs/hbb_common/build.rs
  2. 1 1
      libs/hbb_common/src/fs.rs
  3. 44 1
      src/common.rs
  4. 1 1
      src/peer.rs
  5. 16 9
      src/relay_server.rs
  6. 36 29
      src/rendezvous_server.rs
  7. 1 1
      src/version.rs

+ 1 - 4
libs/hbb_common/build.rs

@@ -5,10 +5,7 @@ fn main() {
5
         .out_dir("src/protos")
5
         .out_dir("src/protos")
6
         .inputs(&["protos/rendezvous.proto", "protos/message.proto"])
6
         .inputs(&["protos/rendezvous.proto", "protos/message.proto"])
7
         .include("protos")
7
         .include("protos")
8
-        .customize(
9
-            protobuf_codegen::Customize::default()
10
-            .tokio_bytes(true)
11
-        )
8
+        .customize(protobuf_codegen::Customize::default().tokio_bytes(true))
12
         .run()
9
         .run()
13
         .expect("Codegen failed.");
10
         .expect("Codegen failed.");
14
 }
11
 }

+ 1 - 1
libs/hbb_common/src/fs.rs

@@ -847,4 +847,4 @@ pub fn is_write_need_confirmation(
847
     } else {
847
     } else {
848
         Ok(DigestCheckResult::NoSuchFile)
848
         Ok(DigestCheckResult::NoSuchFile)
849
     }
849
     }
850
-}
850
+}

+ 44 - 1
src/common.rs

@@ -1,5 +1,8 @@
1
 use clap::App;
1
 use clap::App;
2
-use hbb_common::{anyhow::Context, log, ResultType};
2
+use hbb_common::{
3
+    anyhow::{Context, Result},
4
+    log, ResultType,
5
+};
3
 use ini::Ini;
6
 use ini::Ini;
4
 use sodiumoxide::crypto::sign;
7
 use sodiumoxide::crypto::sign;
5
 use std::{
8
 use std::{
@@ -138,3 +141,43 @@ pub fn gen_sk(wait: u64) -> (String, Option<sign::SecretKey>) {
138
     }
141
     }
139
     ("".to_owned(), None)
142
     ("".to_owned(), None)
140
 }
143
 }
144
+
145
+#[cfg(unix)]
146
+pub async fn listen_signal() -> Result<()> {
147
+    use hbb_common::tokio;
148
+    use hbb_common::tokio::signal::unix::{signal, SignalKind};
149
+
150
+    tokio::spawn(async {
151
+        let mut s = signal(SignalKind::hangup())?;
152
+        let hangup = s.recv();
153
+        let mut s = signal(SignalKind::terminate())?;
154
+        let terminate = s.recv();
155
+        let mut s = signal(SignalKind::interrupt())?;
156
+        let interrupt = s.recv();
157
+        let mut s = signal(SignalKind::quit())?;
158
+        let quit = s.recv();
159
+
160
+        tokio::select! {
161
+            _ = hangup => {
162
+                log::info!("signal hangup");
163
+            }
164
+            _ = terminate => {
165
+                log::info!("signal terminate");
166
+            }
167
+            _ = interrupt => {
168
+                log::info!("signal interrupt");
169
+            }
170
+            _ = quit => {
171
+                log::info!("signal quit");
172
+            }
173
+        }
174
+        Ok(())
175
+    })
176
+    .await?
177
+}
178
+
179
+#[cfg(not(unix))]
180
+pub async fn listen_signal() -> Result<()> {
181
+    let () = std::future::pending().await;
182
+    unreachable!();
183
+}

+ 1 - 1
src/peer.rs

@@ -1,10 +1,10 @@
1
 use crate::common::*;
1
 use crate::common::*;
2
 use crate::database;
2
 use crate::database;
3
 use hbb_common::{
3
 use hbb_common::{
4
+    bytes::Bytes,
4
     log,
5
     log,
5
     rendezvous_proto::*,
6
     rendezvous_proto::*,
6
     tokio::sync::{Mutex, RwLock},
7
     tokio::sync::{Mutex, RwLock},
7
-    bytes::Bytes,
8
     ResultType,
8
     ResultType,
9
 };
9
 };
10
 use serde_derive::{Deserialize, Serialize};
10
 use serde_derive::{Deserialize, Serialize};

+ 16 - 9
src/relay_server.rs

@@ -81,15 +81,22 @@ pub async fn start(port: &str, key: &str) -> ResultType<()> {
81
     log::info!("Listening on tcp {}", addr);
81
     log::info!("Listening on tcp {}", addr);
82
     let addr2 = format!("0.0.0.0:{}", port.parse::<u16>().unwrap() + 2);
82
     let addr2 = format!("0.0.0.0:{}", port.parse::<u16>().unwrap() + 2);
83
     log::info!("Listening on websocket {}", addr2);
83
     log::info!("Listening on websocket {}", addr2);
84
-    loop {
85
-        log::info!("Start");
86
-        io_loop(
87
-            new_listener(&addr, false).await?,
88
-            new_listener(&addr2, false).await?,
89
-            &key,
90
-        )
91
-        .await;
92
-    }
84
+    let main_task = async move {
85
+        loop {
86
+            log::info!("Start");
87
+            io_loop(
88
+                new_listener(&addr, false).await?,
89
+                new_listener(&addr2, false).await?,
90
+                &key,
91
+            )
92
+            .await;
93
+        }
94
+    };
95
+    let listen_signal = crate::common::listen_signal();
96
+    tokio::select!(
97
+        res = main_task => res,
98
+        res = listen_signal => res,
99
+    )
93
 }
100
 }
94
 
101
 
95
 fn check_params() {
102
 fn check_params() {

+ 36 - 29
src/rendezvous_server.rs

@@ -170,37 +170,44 @@ impl RendezvousServer {
170
                 allow_err!(test_hbbs(test_addr).await);
170
                 allow_err!(test_hbbs(test_addr).await);
171
             });
171
             });
172
         };
172
         };
173
-        loop {
174
-            log::info!("Start");
175
-            match rs
176
-                .io_loop(
177
-                    &mut rx,
178
-                    &mut listener,
179
-                    &mut listener2,
180
-                    &mut listener3,
181
-                    &mut socket,
182
-                    &key,
183
-                )
184
-                .await
185
-            {
186
-                LoopFailure::UdpSocket => {
187
-                    drop(socket);
188
-                    socket = FramedSocket::new_with_buf_size(&addr, rmem).await?;
189
-                }
190
-                LoopFailure::Listener => {
191
-                    drop(listener);
192
-                    listener = new_listener(&addr, false).await?;
193
-                }
194
-                LoopFailure::Listener2 => {
195
-                    drop(listener2);
196
-                    listener2 = new_listener(&addr2, false).await?;
197
-                }
198
-                LoopFailure::Listener3 => {
199
-                    drop(listener3);
200
-                    listener3 = new_listener(&addr3, false).await?;
173
+        let main_task = async move {
174
+            loop {
175
+                log::info!("Start");
176
+                match rs
177
+                    .io_loop(
178
+                        &mut rx,
179
+                        &mut listener,
180
+                        &mut listener2,
181
+                        &mut listener3,
182
+                        &mut socket,
183
+                        &key,
184
+                    )
185
+                    .await
186
+                {
187
+                    LoopFailure::UdpSocket => {
188
+                        drop(socket);
189
+                        socket = FramedSocket::new_with_buf_size(&addr, rmem).await?;
190
+                    }
191
+                    LoopFailure::Listener => {
192
+                        drop(listener);
193
+                        listener = new_listener(&addr, false).await?;
194
+                    }
195
+                    LoopFailure::Listener2 => {
196
+                        drop(listener2);
197
+                        listener2 = new_listener(&addr2, false).await?;
198
+                    }
199
+                    LoopFailure::Listener3 => {
200
+                        drop(listener3);
201
+                        listener3 = new_listener(&addr3, false).await?;
202
+                    }
201
                 }
203
                 }
202
             }
204
             }
203
-        }
205
+        };
206
+        let listen_signal = listen_signal();
207
+        tokio::select!(
208
+            res = main_task => res,
209
+            res = listen_signal => res,
210
+        )
204
     }
211
     }
205
 
212
 
206
     async fn io_loop(
213
     async fn io_loop(

+ 1 - 1
src/version.rs

@@ -1,2 +1,2 @@
1
 pub const VERSION: &str = "1.1.6";
1
 pub const VERSION: &str = "1.1.6";
2
-pub const BUILD_DATE: &str = "2023-01-06 11:03";
2
+pub const BUILD_DATE: &str = "2023-01-06 11:03";