From 2b21a8da321c0841ac52280d19121260e757b535 Mon Sep 17 00:00:00 2001 From: Zhen Tang Date: Sat, 11 Jan 2025 18:37:46 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9B=86=E6=88=90=E5=A4=96=E9=83=A8=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E6=B5=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Zhen Tang --- Cargo.toml | 4 +- .../Cargo.toml | 2 +- .../build.rs | 0 .../src/main.rs | 14 +- .../datamgr_api.rs} | 57 ++++ src/{portal_route => datamgr_route}/mod.rs | 2 +- src/{portal_route => datamgr_route}/route.rs | 294 +++++++++++++++++- src/lib.rs | 2 +- tests/{portal_test.rs => datamgr_test.rs} | 16 +- 9 files changed, 363 insertions(+), 28 deletions(-) rename examples/{portal_route_example => datamgr_route_example}/Cargo.toml (86%) rename examples/{portal_route_example => datamgr_route_example}/build.rs (100%) rename examples/{portal_route_example => datamgr_route_example}/src/main.rs (61%) rename src/{portal_route/portal_api.rs => datamgr_route/datamgr_api.rs} (49%) rename src/{portal_route => datamgr_route}/mod.rs (40%) rename src/{portal_route => datamgr_route}/route.rs (52%) rename tests/{portal_test.rs => datamgr_test.rs} (86%) diff --git a/Cargo.toml b/Cargo.toml index 875b4d0..814e5c7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,8 +23,8 @@ name = "custom-route-example" path = "examples/custom_route_example/src/main.rs" [[bin]] -name = "portal_route_example" -path = "examples/portal_route_example/src/main.rs" +name = "datamgr_route_example" +path = "examples/datamgr_route_example/src/main.rs" [dependencies] #feventbus = "0.3.0" diff --git a/examples/portal_route_example/Cargo.toml b/examples/datamgr_route_example/Cargo.toml similarity index 86% rename from examples/portal_route_example/Cargo.toml rename to examples/datamgr_route_example/Cargo.toml index f64832c..9f3c95c 100644 --- a/examples/portal_route_example/Cargo.toml +++ b/examples/datamgr_route_example/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "portal_route_example" +name = "datamgr_route_example" version = "0.1.0" edition = "2021" diff --git a/examples/portal_route_example/build.rs b/examples/datamgr_route_example/build.rs similarity index 100% rename from examples/portal_route_example/build.rs rename to examples/datamgr_route_example/build.rs diff --git a/examples/portal_route_example/src/main.rs b/examples/datamgr_route_example/src/main.rs similarity index 61% rename from examples/portal_route_example/src/main.rs rename to examples/datamgr_route_example/src/main.rs index a5fd7a7..97835ce 100644 --- a/examples/portal_route_example/src/main.rs +++ b/examples/datamgr_route_example/src/main.rs @@ -1,5 +1,5 @@ -use fleet_apiserver::portal_route::portal_api; -use fleet_apiserver::portal_route::route; +use fleet_apiserver::datamgr_route::datamgr_api; +use fleet_apiserver::datamgr_route::route; use fleet_apiserver::cores::plugin::PluginManager; use env_logger::{Builder, Target}; use std::ffi::CString; @@ -25,16 +25,16 @@ async fn main() { let plugin_manager = Arc::new(PluginManager::new()); - let data_plugin_manager = portal_api::NewPluginManager(); - let plugin_file_path = CString::new("/home/trickster/Downloads/ripple-remastered/plugins/release").unwrap(); - portal_api::LoadPluginsFromDirectory(data_plugin_manager, plugin_file_path.as_ptr()); + let data_plugin_manager = datamgr_api::NewPluginManager(); + let plugin_file_path = CString::new("/root/project/fleet-datamgr/plugins/release").unwrap(); + datamgr_api::LoadPluginsFromDirectory(data_plugin_manager, plugin_file_path.as_ptr()); route::init_plugin(plugin_manager.clone(), data_plugin_manager); if let Err(e) = fleet_apiserver::start_server(DATABASE_URL, ADDRESS, plugin_manager).await { eprintln!("Failed to start server: {}", e); } - portal_api::UnloadAllPlugins(data_plugin_manager); - portal_api::DeletePluginManager(data_plugin_manager); + datamgr_api::UnloadAllPlugins(data_plugin_manager); + datamgr_api::DeletePluginManager(data_plugin_manager); } } diff --git a/src/portal_route/portal_api.rs b/src/datamgr_route/datamgr_api.rs similarity index 49% rename from src/portal_route/portal_api.rs rename to src/datamgr_route/datamgr_api.rs index eafbe7e..e1705b2 100644 --- a/src/portal_route/portal_api.rs +++ b/src/datamgr_route/datamgr_api.rs @@ -60,3 +60,60 @@ unsafe extern "C" { indexCount: *mut ::std::os::raw::c_int, ) -> *mut *const ::std::os::raw::c_char; } +unsafe extern "C" { + pub fn ReceiveNormalData( + pluginManager: *mut ::std::os::raw::c_void, + key: *const ::std::os::raw::c_char, + dataBuffer: *const ::std::os::raw::c_char, + count: ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int; +} +unsafe extern "C" { + pub fn SetSyncAndRecycleStrategy( + pluginManager: *mut ::std::os::raw::c_void, + key: *const ::std::os::raw::c_char, + syncStrategy: *const ::std::os::raw::c_char, + recycleTime: *const ::std::os::raw::c_char, + recycleCascadeKeys: *const ::std::os::raw::c_char, + ) -> ::std::os::raw::c_int; +} +unsafe extern "C" { + pub fn SubmitUserRequest( + pluginManager: *mut ::std::os::raw::c_void, + key: *const ::std::os::raw::c_char, + userRequestBuffer: *const ::std::os::raw::c_char, + count: ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int; +} +unsafe extern "C" { + pub fn FindDataLocation( + pluginManager: *mut ::std::os::raw::c_void, + key: *const ::std::os::raw::c_char, + dataLocationBuffer: *const ::std::os::raw::c_char, + count: ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int; +} +unsafe extern "C" { + pub fn ReadData( + pluginManager: *mut ::std::os::raw::c_void, + key: *const ::std::os::raw::c_char, + dataBuffer: *const ::std::os::raw::c_char, + count: ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int; +} +unsafe extern "C" { + pub fn RegisterTerminal( + pluginManager: *mut ::std::os::raw::c_void, + userToken: *const ::std::os::raw::c_char, + userDataBuffer: *const ::std::os::raw::c_char, + count: ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int; +} +unsafe extern "C" { + pub fn GetTerminalInfo( + pluginManager: *mut ::std::os::raw::c_void, + userToken: *const ::std::os::raw::c_char, + userDataBuffer: *mut ::std::os::raw::c_char, + count: ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int; +} \ No newline at end of file diff --git a/src/portal_route/mod.rs b/src/datamgr_route/mod.rs similarity index 40% rename from src/portal_route/mod.rs rename to src/datamgr_route/mod.rs index 1ead564..36f05a1 100644 --- a/src/portal_route/mod.rs +++ b/src/datamgr_route/mod.rs @@ -1,2 +1,2 @@ -pub mod portal_api; +pub mod datamgr_api; pub mod route; \ No newline at end of file diff --git a/src/portal_route/route.rs b/src/datamgr_route/route.rs similarity index 52% rename from src/portal_route/route.rs rename to src/datamgr_route/route.rs index 093383f..c6cc326 100644 --- a/src/portal_route/route.rs +++ b/src/datamgr_route/route.rs @@ -1,4 +1,4 @@ -use crate::portal_route::portal_api; +use crate::datamgr_route::datamgr_api; use std::ffi::CString; use std::ffi::CStr; use std::os::raw::c_char; @@ -79,7 +79,7 @@ impl DataApiRouteProvider { Err(_) => return HttpResponse::BadRequest().body("Invalid file description"), }; unsafe { - let ret = portal_api::UploadFile( + let ret = datamgr_api::UploadFile( DATA_PLUGIN_MANAGER, file_name.as_ptr(), file_content.as_ptr() as *const i8, @@ -115,12 +115,12 @@ impl DataApiRouteProvider { }; unsafe { - let ret = portal_api::UploadStatus( + let ret = datamgr_api::UploadStatus( DATA_PLUGIN_MANAGER, status.as_ptr() ); if ret == 1 { - HttpResponse::Ok().bodu("Upload status success") + HttpResponse::Ok().body("Upload status success") } else { HttpResponse::InternalServerError().finish() } @@ -148,7 +148,7 @@ impl DataApiRouteProvider { }; unsafe { - let ret = portal_api::UploadInstruction( + let ret = datamgr_api::UploadInstruction( DATA_PLUGIN_MANAGER, instruction.as_ptr() ); @@ -183,7 +183,7 @@ impl DataApiRouteProvider { unsafe { let mut file_length: i32 = 0; - let ret = portal_api::DownloadFile( + let ret = datamgr_api::DownloadFile( DATA_PLUGIN_MANAGER, file_name.as_ptr(), &mut file_length @@ -201,7 +201,7 @@ impl DataApiRouteProvider { fn list_file_handler(request: HttpRequest, body: Bytes) -> HttpResponse { unsafe { let mut index_count: i32 = 0; - let ret = portal_api::ListFiles(DATA_PLUGIN_MANAGER, &mut index_count); + let ret = datamgr_api::ListFiles(DATA_PLUGIN_MANAGER, &mut index_count); let c_array = ret as *const *const c_char; let mut vec = Vec::new(); for i in 0..index_count { @@ -245,7 +245,7 @@ impl DataApiRouteProvider { unsafe { let mut index_count: i32 = 0; - let ret = portal_api::QueryFile( + let ret = datamgr_api::QueryFile( DATA_PLUGIN_MANAGER, file_name.as_ptr(), &mut index_count @@ -282,6 +282,249 @@ impl DataApiRouteProvider { .body(json_res) } } + + fn receive_normal_data_handler(request: HttpRequest, body: Bytes) -> HttpResponse { + unsafe { + println!("receive_normal_data_handler"); + let header_key = request + .headers() + .get("x-data-key") + .unwrap() + .to_str() + .unwrap_or_default() + .to_string(); + let key = CString::new(header_key).unwrap(); + let size_str = request + .headers() + .get("x-data-size") + .unwrap() + .to_str() + .unwrap_or_default() + .to_string(); + let size = size_str.parse::().unwrap(); + let mut buffer = body.clone().to_vec(); + let c_buffer = buffer.as_mut_ptr() as *mut c_char; + let ret = datamgr_api::ReceiveNormalData( + DATA_PLUGIN_MANAGER, + key.as_ptr(), + c_buffer, + size, + ); + HttpResponse::Ok() + .append_header(("x-data-size", ret)) + .finish() + } + } + + fn set_sync_and_recycle_strategy_handler(request: HttpRequest, body: Bytes) -> HttpResponse { + unsafe { + println!("set_sync_and_recycle_strategy_handler"); + let header_key = request + .headers() + .get("x-data-key") + .unwrap() + .to_str() + .unwrap_or_default() + .to_string(); + let key = CString::new(header_key).unwrap(); + let header_sync_strategy = request + .headers() + .get("x-data-sync-strategy") + .unwrap() + .to_str() + .unwrap_or_default() + .to_string(); + let sync_strategy = CString::new(header_sync_strategy).unwrap(); + let header_recycle_time = request + .headers() + .get("x-data-recycle-time") + .unwrap() + .to_str() + .unwrap_or_default() + .to_string(); + let recycle_time = CString::new(header_recycle_time).unwrap(); + let header_recycle_cascade_keys = request + .headers() + .get("x-data-recycle-cascade-keys") + .unwrap() + .to_str() + .unwrap_or_default() + .to_string(); + let recycle_cascade_keys = CString::new(header_recycle_cascade_keys).unwrap(); + + let ret = datamgr_api::SetSyncAndRecycleStrategy( + DATA_PLUGIN_MANAGER, + key.as_ptr(), + sync_strategy.as_ptr(), + recycle_time.as_ptr(), + recycle_cascade_keys.as_ptr(), + ); + if ret == 1 { + // HttpResponse::Ok().finish() + } else { + // HttpResponse::InternalServerError().finish() + } + HttpResponse::Ok().finish() + } + } + + fn submit_user_request_handler(request: HttpRequest, body: Bytes) -> HttpResponse { + unsafe { + println!("submit_user_request_handler"); + let header_key = request + .headers() + .get("x-data-key") + .unwrap() + .to_str() + .unwrap_or_default() + .to_string(); + let key = CString::new(header_key).unwrap(); + let size_str = request + .headers() + .get("x-data-size") + .unwrap() + .to_str() + .unwrap_or_default() + .to_string(); + let size = size_str.parse::().unwrap(); + let mut buffer = body.clone().to_vec(); + let c_buffer = buffer.as_mut_ptr() as *mut c_char; + let ret = datamgr_api::SubmitUserRequest( + DATA_PLUGIN_MANAGER, + key.as_ptr(), + c_buffer, + size, + ); + HttpResponse::Ok() + .append_header(("x-data-size", ret)) + .finish() + } + } + + fn find_data_location_handler(request: HttpRequest, body: Bytes) -> HttpResponse { + unsafe { + println!("find_data_location_handler"); + let header_key = request + .headers() + .get("x-data-key") + .unwrap() + .to_str() + .unwrap_or_default() + .to_string(); + let key = CString::new(header_key).unwrap(); + let size = 1024; + let mut buffer = body.clone().to_vec(); + let c_buffer = buffer.as_mut_ptr() as *mut c_char; + let ret = datamgr_api::FindDataLocation( + DATA_PLUGIN_MANAGER, + key.as_ptr(), + c_buffer, + size, + ); + HttpResponse::Ok() + .append_header(("x-data-location", buffer[0..ret as usize].to_vec().clone())) + .finish() + } + } + + fn read_data_handler(request: HttpRequest, body: Bytes) -> HttpResponse { + unsafe { + println!("read_data_handler"); + let header_key = request + .headers() + .get("x-data-key") + .unwrap() + .to_str() + .unwrap_or_default() + .to_string(); + let key = CString::new(header_key).unwrap(); + let size_str = request + .headers() + .get("x-data-size") + .unwrap() + .to_str() + .unwrap_or_default() + .to_string(); + let size = size_str.parse::().unwrap(); + let mut buffer: Vec = vec![0; size as usize]; + let c_buffer = buffer.as_mut_ptr() as *mut c_char; + let ret = datamgr_api::ReadData( + DATA_PLUGIN_MANAGER, + key.as_ptr(), + c_buffer, + size, + ); + HttpResponse::Ok() + .append_header(("x-data-size", ret)) + .body(buffer[0..ret as usize].to_vec().clone()) + } + } + + fn register_terminal_handler(request: HttpRequest, body: Bytes) -> HttpResponse { + unsafe { + println!("register_terminal_handler"); + let header_user_token = request + .headers() + .get("x-data-user-token") + .unwrap() + .to_str() + .unwrap_or_default() + .to_string(); + let user_token = CString::new(header_user_token).unwrap(); + let size_str = request + .headers() + .get("x-data-user-data-size") + .unwrap() + .to_str() + .unwrap_or_default() + .to_string(); + let size = size_str.parse::().unwrap(); + let mut buffer = body.clone().to_vec(); + let c_buffer = buffer.as_mut_ptr() as *mut c_char; + let ret = datamgr_api::RegisterTerminal( + DATA_PLUGIN_MANAGER, + user_token.as_ptr(), + c_buffer, + size, + ); + HttpResponse::Ok() + .append_header(("x-data-user-data-size", ret)) + .finish() + } + } + + fn get_terminal_info_handler(request: HttpRequest, body: Bytes) -> HttpResponse { + unsafe { + println!("get_terminal_info_handler"); + let header_user_token = request + .headers() + .get("x-data-user-token") + .unwrap() + .to_str() + .unwrap_or_default() + .to_string(); + let user_token = CString::new(header_user_token).unwrap(); + let size_str = request + .headers() + .get("x-data-user-data-size") + .unwrap() + .to_str() + .unwrap_or_default() + .to_string(); + let size = size_str.parse::().unwrap(); + let mut buffer: Vec = vec![0; size as usize]; + let c_buffer = buffer.as_mut_ptr() as *mut c_char; + let ret = datamgr_api::GetTerminalInfo( + DATA_PLUGIN_MANAGER, + user_token.as_ptr(), + c_buffer, + size, + ); + HttpResponse::Ok() + .append_header(("x-data-user-data-size", ret)) + .body(buffer[0..ret as usize].to_vec().clone()) + } + } } impl CustomRouteProvider for DataApiRouteProvider { @@ -317,6 +560,41 @@ impl CustomRouteProvider for DataApiRouteProvider { path: "/data/self/fileinfo".to_string(), handler: Self::query_file_handler, }), + Box::new(SimpleRoute { + method: Method::POST, + path: "/data/v1/normal".to_string(), + handler: Self::receive_normal_data_handler, + }), + Box::new(SimpleRoute { + method: Method::POST, + path: "/data/v1/strategy".to_string(), + handler: Self::set_sync_and_recycle_strategy_handler, + }), + Box::new(SimpleRoute { + method: Method::POST, + path: "/data/v1/request".to_string(), + handler: Self::submit_user_request_handler, + }), + Box::new(SimpleRoute { + method: Method::HEAD, + path: "/data/v1/intelligence".to_string(), + handler: Self::find_data_location_handler, + }), + Box::new(SimpleRoute { + method: Method::GET, + path: "/data/v1/intelligence".to_string(), + handler: Self::read_data_handler, + }), + Box::new(SimpleRoute { + method: Method::POST, + path: "/data/v1/terminal".to_string(), + handler: Self::register_terminal_handler, + }), + Box::new(SimpleRoute { + method: Method::GET, + path: "/data/v1/terminal".to_string(), + handler: Self::get_terminal_info_handler, + }), ] } } diff --git a/src/lib.rs b/src/lib.rs index 9483d29..c7cdad9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -9,7 +9,7 @@ pub mod cores; pub mod schema; pub mod db; pub mod custom_route; -pub mod portal_route; +pub mod datamgr_route; pub use cores::{prepare_app_state, start_server}; pub use cores::events::APIServerEventClient; diff --git a/tests/portal_test.rs b/tests/datamgr_test.rs similarity index 86% rename from tests/portal_test.rs rename to tests/datamgr_test.rs index 8fe189c..17f9e7f 100644 --- a/tests/portal_test.rs +++ b/tests/datamgr_test.rs @@ -6,8 +6,8 @@ use std::sync::Arc; use std::sync::Mutex; use std::thread; use serde_json::Value; -use fleet_apiserver::portal_route::portal_api; -use fleet_apiserver::portal_route::route; +use fleet_apiserver::datamgr_route::datamgr_api; +use fleet_apiserver::datamgr_route::route; use fleet_apiserver::cores::plugin::PluginManager; const DATABASE_URL: &str = "sqlite://./test-database.sqlite"; @@ -23,27 +23,27 @@ extern "C" {} #[tokio::test] -async fn test_portal() -> Result<(), Box> { +async fn test_datamgr() -> Result<(), Box> { unsafe { let plugin_manager = Arc::new(PluginManager::new()); - let data_plugin_manager = Arc::new(Mutex::new(SafePtr(portal_api::NewPluginManager()))); + let data_plugin_manager = Arc::new(Mutex::new(SafePtr(datamgr_api::NewPluginManager()))); // portal-plugin.so 及 storage-plugin.so 的位置 - let plugin_file_path = std::ffi::CString::new("/home/trickster/Downloads/ripple-remastered/plugins/release").unwrap(); + let plugin_file_path = std::ffi::CString::new("/root/project/fleet-datamgr/plugins/release").unwrap(); let plugin_manager = plugin_manager.clone(); let data_plugin_manager = Arc::clone(&data_plugin_manager); let server_handle = thread::spawn(move || { let rt = Runtime::new().unwrap(); rt.block_on(async { - portal_api::LoadPluginsFromDirectory(data_plugin_manager.lock().unwrap().0, plugin_file_path.as_ptr()); + datamgr_api::LoadPluginsFromDirectory(data_plugin_manager.lock().unwrap().0, plugin_file_path.as_ptr()); route::init_plugin(plugin_manager.clone(), data_plugin_manager.lock().unwrap().0); if let Err(e) = fleet_apiserver::start_server(DATABASE_URL, ADDRESS, plugin_manager).await { eprintln!("Failed to start server: {}", e); } - portal_api::UnloadAllPlugins(data_plugin_manager.lock().unwrap().0); - portal_api::DeletePluginManager(data_plugin_manager.lock().unwrap().0); + datamgr_api::UnloadAllPlugins(data_plugin_manager.lock().unwrap().0); + datamgr_api::DeletePluginManager(data_plugin_manager.lock().unwrap().0); }); }); -- Gitee