@@ -3,7 +3,7 @@ use std::process::Stdio;
33
44use anyhow:: Result ;
55use chirpstack_api:: gw;
6- use log:: info;
6+ use log:: { error , info} ;
77use once_cell:: sync:: OnceCell ;
88use tokio:: io:: AsyncWriteExt ;
99use tokio:: process:: Command ;
@@ -74,9 +74,53 @@ pub async fn exec(pl: &gw::GatewayCommandExecRequest) -> Result<gw::GatewayComma
7474 } )
7575}
7676
77+ pub async fn exec_callback ( cmd_args : & [ String ] ) {
78+ tokio:: spawn ( {
79+ let cmd_args = cmd_args. to_vec ( ) ;
80+
81+ async move {
82+ if cmd_args. is_empty ( ) {
83+ return ;
84+ }
85+
86+ info ! ( "Executing callback, callback: {:?}" , cmd_args) ;
87+
88+ let mut cmd = Command :: new ( & cmd_args[ 0 ] ) ;
89+ if cmd_args. len ( ) > 1 {
90+ cmd. args ( & cmd_args[ 1 ..] ) ;
91+ }
92+
93+ if let Err ( e) = cmd. output ( ) . await {
94+ error ! (
95+ "Execute callback error, callback: {:?}, error: {}" ,
96+ cmd_args, e
97+ ) ;
98+ }
99+ }
100+ } ) ;
101+ }
102+
77103#[ cfg( test) ]
78104mod test {
79105 use super :: * ;
106+ use std:: { env, fs} ;
107+
108+ #[ tokio:: test]
109+ async fn test_exec_callback ( ) {
110+ let temp_file = env:: temp_dir ( ) . join ( "test.txt" ) ;
111+ fs:: write ( & temp_file, vec ! [ ] ) . unwrap ( ) ;
112+ assert ! ( fs:: exists( & temp_file) . unwrap( ) ) ;
113+
114+ exec_callback ( & [
115+ "rm" . into ( ) ,
116+ temp_file. clone ( ) . into_os_string ( ) . into_string ( ) . unwrap ( ) ,
117+ ] )
118+ . await ;
119+
120+ tokio:: time:: sleep ( tokio:: time:: Duration :: from_millis ( 100 ) ) . await ;
121+
122+ assert_eq ! ( false , fs:: exists( & temp_file) . unwrap( ) ) ;
123+ }
80124
81125 #[ tokio:: test]
82126 async fn test_commands ( ) {
0 commit comments