88//! of RustyVault.
99
1010use std:: {
11- collections:: HashMap ,
1211 ops:: { Deref , DerefMut } ,
13- sync:: { Arc , Mutex , RwLock } ,
12+ sync:: { Arc , RwLock } ,
1413} ;
1514
1615use as_any:: Downcast ;
@@ -30,7 +29,9 @@ use crate::{
3029 pki:: PkiModule ,
3130 policy:: PolicyModule ,
3231 } ,
33- mount:: MountTable ,
32+ mount:: {
33+ MountTable , MountsMonitor , MountsRouter , CORE_MOUNT_CONFIG_PATH , LOGICAL_BARRIER_PREFIX , SYSTEM_BARRIER_PREFIX ,
34+ } ,
3435 router:: Router ,
3536 shamir:: { ShamirSecret , SHAMIR_OVERHEAD } ,
3637 storage:: {
@@ -70,48 +71,79 @@ pub struct Core {
7071 pub physical : Arc < dyn PhysicalBackend > ,
7172 pub barrier : Arc < dyn SecurityBarrier > ,
7273 pub system_view : Option < Arc < BarrierView > > ,
73- pub mounts : Arc < MountTable > ,
74- pub router : Arc < Router > ,
7574 pub handlers : RwLock < Vec < Arc < dyn Handler > > > ,
7675 pub auth_handlers : Arc < RwLock < Vec < Arc < dyn AuthHandler > > > > ,
77- pub logical_backends : Mutex < HashMap < String , Arc < LogicalBackendNewFunc > > > ,
76+ pub router : Arc < Router > ,
77+ pub mounts_router : Arc < MountsRouter > ,
7878 pub module_manager : ModuleManager ,
7979 pub sealed : bool ,
8080 pub unseal_key_shares : Vec < Vec < u8 > > ,
8181 pub hmac_key : Vec < u8 > ,
8282 pub mount_entry_hmac_level : MountEntryHMACLevel ,
83+ pub mounts_monitor : Option < MountsMonitor > ,
84+ pub mounts_monitor_interval : u64 ,
8385}
8486
8587impl Default for Core {
8688 fn default ( ) -> Self {
8789 let backend: Arc < dyn PhysicalBackend > = Arc :: new ( physical:: mock:: MockBackend :: new ( ) ) ;
88- let barrier = barrier_aes_gcm:: AESGCMBarrier :: new ( Arc :: clone ( & backend) ) ;
90+ let barrier = Arc :: new ( barrier_aes_gcm:: AESGCMBarrier :: new ( Arc :: clone ( & backend) ) ) ;
91+ let barrier_cloned = Arc :: clone ( & barrier) ;
8992 let router = Arc :: new ( Router :: new ( ) ) ;
9093
9194 Core {
9295 self_ref : None ,
9396 physical : backend,
94- barrier : Arc :: new ( barrier ) ,
97+ barrier : barrier_cloned ,
9598 system_view : None ,
96- mounts : Arc :: new ( MountTable :: new ( ) ) ,
9799 router : Arc :: clone ( & router) ,
100+ mounts_router : Arc :: new ( MountsRouter :: new (
101+ Arc :: new ( MountTable :: new ( CORE_MOUNT_CONFIG_PATH ) ) ,
102+ Arc :: clone ( & router) ,
103+ barrier,
104+ LOGICAL_BARRIER_PREFIX ,
105+ "" ,
106+ ) ) ,
98107 handlers : RwLock :: new ( vec ! [ router] ) ,
99108 auth_handlers : Arc :: new ( RwLock :: new ( Vec :: new ( ) ) ) ,
100- logical_backends : Mutex :: new ( HashMap :: new ( ) ) ,
101109 module_manager : ModuleManager :: new ( ) ,
102110 sealed : true ,
103111 unseal_key_shares : Vec :: new ( ) ,
104112 hmac_key : Vec :: new ( ) ,
105113 mount_entry_hmac_level : MountEntryHMACLevel :: None ,
114+ mounts_monitor : None ,
115+ mounts_monitor_interval : 5 ,
106116 }
107117 }
108118}
109119
110120#[ maybe_async:: maybe_async]
111121impl Core {
122+ pub fn new ( backend : Arc < dyn PhysicalBackend > ) -> Self {
123+ let barrier = Arc :: new ( barrier_aes_gcm:: AESGCMBarrier :: new ( Arc :: clone ( & backend) ) ) ;
124+ let barrier_cloned = Arc :: clone ( & barrier) ;
125+ let router = Arc :: new ( Router :: new ( ) ) ;
126+
127+ Core {
128+ physical : backend,
129+ barrier : barrier_cloned,
130+ router : Arc :: clone ( & router) ,
131+ mounts_router : Arc :: new ( MountsRouter :: new (
132+ Arc :: new ( MountTable :: new ( CORE_MOUNT_CONFIG_PATH ) ) ,
133+ Arc :: clone ( & router) ,
134+ barrier,
135+ LOGICAL_BARRIER_PREFIX ,
136+ "" ,
137+ ) ) ,
138+ handlers : RwLock :: new ( vec ! [ router] ) ,
139+ ..Default :: default ( )
140+ }
141+ }
142+
112143 pub fn config ( & mut self , core : Arc < RwLock < Core > > , config : Option < & Config > ) -> Result < ( ) , RvError > {
113144 if let Some ( conf) = config {
114145 self . mount_entry_hmac_level = conf. mount_entry_hmac_level ;
146+ self . mounts_monitor_interval = conf. mounts_monitor_interval ;
115147 }
116148
117149 self . module_manager . set_default_modules ( Arc :: clone ( & core) ) ?;
@@ -141,6 +173,8 @@ impl Core {
141173 let cert_module = CertModule :: new ( self ) ;
142174 self . module_manager . add_module ( Arc :: new ( RwLock :: new ( Box :: new ( cert_module) ) ) ) ?;
143175
176+ self . mounts_monitor = Some ( MountsMonitor :: new ( core, self . mounts_monitor_interval ) ) ;
177+
144178 let handlers = { self . handlers . read ( ) ?. clone ( ) } ;
145179 for handler in handlers. iter ( ) {
146180 match handler. post_config ( self , config) {
@@ -246,27 +280,15 @@ impl Core {
246280 }
247281
248282 pub fn get_logical_backend ( & self , logical_type : & str ) -> Result < Arc < LogicalBackendNewFunc > , RvError > {
249- let logical_backends = self . logical_backends . lock ( ) . unwrap ( ) ;
250- if let Some ( backend) = logical_backends. get ( logical_type) {
251- Ok ( backend. clone ( ) )
252- } else {
253- Err ( RvError :: ErrCoreLogicalBackendNoExist )
254- }
283+ self . mounts_router . get_backend ( logical_type)
255284 }
256285
257286 pub fn add_logical_backend ( & self , logical_type : & str , backend : Arc < LogicalBackendNewFunc > ) -> Result < ( ) , RvError > {
258- let mut logical_backends = self . logical_backends . lock ( ) . unwrap ( ) ;
259- if logical_backends. contains_key ( logical_type) {
260- return Err ( RvError :: ErrCoreLogicalBackendExist ) ;
261- }
262- logical_backends. insert ( logical_type. to_string ( ) , backend) ;
263- Ok ( ( ) )
287+ self . mounts_router . add_backend ( logical_type, backend)
264288 }
265289
266290 pub fn delete_logical_backend ( & self , logical_type : & str ) -> Result < ( ) , RvError > {
267- let mut logical_backends = self . logical_backends . lock ( ) . unwrap ( ) ;
268- logical_backends. remove ( logical_type) ;
269- Ok ( ( ) )
291+ self . mounts_router . delete_backend ( logical_type)
270292 }
271293
272294 pub fn add_handler ( & self , handler : Arc < dyn Handler > ) -> Result < ( ) , RvError > {
@@ -397,16 +419,27 @@ impl Core {
397419
398420 // Perform initial setup
399421 self . hmac_key = self . barrier . derive_hmac_key ( ) ?;
400- self . mounts . load_or_default ( self . barrier . as_storage ( ) , Some ( & self . hmac_key ) , self . mount_entry_hmac_level ) ?;
422+ self . mounts_router . load_or_default (
423+ self . barrier . as_storage ( ) ,
424+ Some ( & self . hmac_key ) ,
425+ self . mount_entry_hmac_level ,
426+ ) ?;
401427
402- self . setup_mounts ( ) ?;
428+ self . mounts_router . setup ( self . self_ref . as_ref ( ) . unwrap ( ) ) ?;
429+
430+ self . system_view = Some ( Arc :: new ( BarrierView :: new ( self . barrier . clone ( ) , SYSTEM_BARRIER_PREFIX ) ) ) ;
403431
404432 self . module_manager . init ( self ) ?;
405433
434+ self . mounts_monitor . as_ref ( ) . unwrap ( ) . add_mounts_router ( self . mounts_router . clone ( ) ) ;
435+ self . mounts_monitor . as_mut ( ) . unwrap ( ) . start ( ) ;
436+
406437 Ok ( ( ) )
407438 }
408439
409440 fn pre_seal ( & mut self ) -> Result < ( ) , RvError > {
441+ self . mounts_monitor . as_ref ( ) . unwrap ( ) . remove_mounts_router ( self . mounts_router . clone ( ) ) ;
442+ self . mounts_monitor . as_mut ( ) . unwrap ( ) . stop ( ) ;
410443 self . module_manager . cleanup ( self ) ?;
411444 self . unload_mounts ( ) ?;
412445 Ok ( ( ) )
0 commit comments