@@ -3,7 +3,11 @@ use crate::{
33 CARGO_PKG_NAME , CARGO_PKG_VERSION
44} ;
55use log:: info;
6- use poem:: { http:: StatusCode , listener:: TcpListener , Route , Server } ;
6+ use poem:: {
7+ http:: StatusCode ,
8+ listener:: { self , TcpListener , UnixListener } ,
9+ Route , Server
10+ } ;
711use poem_openapi:: {
812 auth:: ApiKey ,
913 param:: Query ,
@@ -14,15 +18,18 @@ use poem_openapi::{
1418use serde:: Deserialize ;
1519use std:: {
1620 collections:: HashMap ,
21+ fs:: FileType ,
22+ os:: { self , unix:: fs:: FileTypeExt } ,
23+ path:: Path ,
1724 sync:: { atomic:: Ordering , Arc }
1825} ;
1926use time:: OffsetDateTime ;
27+ use tokio:: fs:: remove_file;
2028
2129#[ derive( Debug , Deserialize , Object ) ]
2230#[ serde( deny_unknown_fields) ]
2331pub ( crate ) struct Config {
24- port : u16 ,
25- listen : String ,
32+ listener : String ,
2633 #[ serde( default ) ]
2734 show_doc : bool ,
2835 admin_key : Option < String >
@@ -196,7 +203,6 @@ pub(crate) async fn init(
196203 blocklist : Arc < BlockList >
197204) -> anyhow:: Result < ( ) > {
198205 if let Some ( config) = config {
199- let address = format ! ( "{}:{}" , config. listen, config. port) ;
200206 let api_data = Api {
201207 blocklist,
202208 doc_enable : config. show_doc ,
@@ -205,7 +211,7 @@ pub(crate) async fn init(
205211 } ;
206212 let api_service =
207213 OpenApiService :: new ( api_data, CARGO_PKG_NAME , CARGO_PKG_VERSION )
208- . server ( & address ) ;
214+ . server ( & config . listener ) ;
209215 let doc = if config. show_doc {
210216 Some ( api_service. redoc ( ) )
211217 } else {
@@ -217,8 +223,26 @@ pub(crate) async fn init(
217223 } else {
218224 server
219225 } ;
220- info ! ( "start api/web server at {address:?}" ) ;
221- Server :: new ( TcpListener :: bind ( address) ) . run ( server) . await ?;
226+ info ! ( "start api/web server at {:?}" , config. listener) ;
227+ if let Some ( listener) = config. listener . strip_prefix ( "unix://" ) {
228+ // Old sockets get left behind, so cleanup
229+ let path = Path :: new ( listener) ;
230+ if path. exists ( ) {
231+ // enusre that the file is really an unix socket and we do not delte something important
232+ let file = std:: fs:: File :: open ( path) . unwrap ( ) ;
233+ if file. metadata ( ) . unwrap ( ) . file_type ( ) . is_socket ( ) {
234+ remove_file ( & path) . await . unwrap ( ) ;
235+ }
236+ }
237+ Server :: new ( UnixListener :: bind ( listener) )
238+ . run ( server)
239+ . await ?;
240+ //todo remove file
241+ } else {
242+ Server :: new ( TcpListener :: bind ( config. listener ) )
243+ . run ( server)
244+ . await ?;
245+ }
222246 }
223247 Ok ( ( ) )
224248}
0 commit comments