2023-07-12 15:28:50 +00:00
// Code to handle the nebula worker
// This is an inert version of the nebula worker that does nothing, used when linking to nebula is diabled.
// This is useful if you wish to run your own nebula binary, for example on platforms where CGo does not work.
2023-07-12 16:01:33 +00:00
use crate ::config ::{ load_cdata , NebulaConfig , TFClientConfig } ;
2023-07-12 15:28:50 +00:00
use crate ::daemon ::ThreadMessageSender ;
2023-11-23 20:23:52 +00:00
use crate ::dirs ::nebula_yml ;
2023-07-12 16:01:33 +00:00
use log ::{ debug , error , info } ;
use std ::error ::Error ;
use std ::fs ;
2023-07-12 15:28:50 +00:00
use std ::sync ::mpsc ::Receiver ;
pub enum NebulaWorkerMessage {
Shutdown ,
ConfigUpdated ,
WakeUp ,
}
2023-07-12 16:01:33 +00:00
fn insert_private_key ( instance : & str ) -> Result < ( ) , Box < dyn Error > > {
if ! nebula_yml ( instance ) . exists ( ) {
return Ok ( ( ) ) ; // cant insert private key into a file that does not exist - BUT. we can gracefully handle nebula crashing - we cannot gracefully handle this fn failing
}
let cdata = load_cdata ( instance ) ? ;
let key = cdata . dh_privkey . ok_or ( " Missing private key " ) ? ;
2023-11-23 20:23:52 +00:00
let config_str = fs ::read_to_string ( nebula_yml ( instance ) ) ? ;
2023-07-12 16:01:33 +00:00
let mut config : NebulaConfig = serde_yaml ::from_str ( & config_str ) ? ;
config . pki . key = Some ( String ::from_utf8 ( key ) ? ) ;
debug! ( " inserted private key into config: {:?} " , config ) ;
let config_str = serde_yaml ::to_string ( & config ) ? ;
2023-11-23 20:23:52 +00:00
fs ::write ( nebula_yml ( instance ) , config_str ) ? ;
2023-07-12 16:01:33 +00:00
Ok ( ( ) )
}
2023-11-23 20:23:52 +00:00
pub fn nebulaworker_main (
_config : TFClientConfig ,
instance : String ,
_transmitter : ThreadMessageSender ,
rx : Receiver < NebulaWorkerMessage > ,
) {
2023-07-12 15:53:05 +00:00
loop {
match rx . recv ( ) {
Ok ( msg ) = > match msg {
NebulaWorkerMessage ::WakeUp = > {
continue ;
2023-11-23 20:23:52 +00:00
}
2023-07-12 15:53:05 +00:00
NebulaWorkerMessage ::Shutdown = > {
break ;
2023-11-23 20:23:52 +00:00
}
2023-07-12 16:01:33 +00:00
NebulaWorkerMessage ::ConfigUpdated = > {
info! ( " our configuration has been updated - reloading " ) ;
debug! ( " fixing config... " ) ;
match insert_private_key ( & instance ) {
Ok ( _ ) = > {
debug! ( " config fixed (private-key embedded) " ) ;
}
Err ( e ) = > {
error! ( " unable to fix config: {} " , e ) ;
error! ( " nebula thread exiting with error " ) ;
return ;
}
}
2023-07-12 15:53:05 +00:00
}
2023-07-12 15:53:52 +00:00
} ,
Err ( e ) = > {
error! ( " {} " , e ) ;
break ;
2023-07-12 15:53:05 +00:00
}
}
}
}