scanner: make plugin interface ffi-safe with handle-based registry

Signed-off-by: NotAShelf <raf@notashelf.dev>
Change-Id: I8e4790db3cc29f84f4e0d7d8eff36c2c6a6a6964
This commit is contained in:
raf 2026-02-18 22:49:12 +03:00
commit f4961c7f95
Signed by: NotAShelf
GPG key ID: 29D95B64378DB4BF
9 changed files with 93 additions and 44 deletions

View file

@ -1,4 +1,3 @@
#![allow(improper_ctypes)]
use pscand_core::helpers::PowerHelper;
use pscand_core::scanner::{MetricValue, Scanner};
use std::collections::HashMap;
@ -6,9 +5,9 @@ use std::time::Duration;
struct PowerScanner;
#[unsafe(no_mangle)]
pub extern "C" fn pscand_scanner() -> Box<dyn Scanner> {
Box::new(PowerScanner)
#[no_mangle]
pub extern "C" fn pscand_scanner() -> *mut std::os::raw::c_void {
Box::into_raw(Box::new(PowerScanner)) as *mut std::os::raw::c_void
}
impl Default for PowerScanner {
@ -52,7 +51,7 @@ impl Scanner for PowerScanner {
);
metrics.insert(
"battery_status".to_string(),
MetricValue::from_str(&battery.status),
MetricValue::from_string(&battery.status),
);
}
@ -61,7 +60,7 @@ impl Scanner for PowerScanner {
if let Some(status) = info.get("status") {
metrics.insert(
format!("supply_{}_status", name),
MetricValue::from_str(status),
MetricValue::from_string(status),
);
}
if let Some(online) = info.get("online") {
@ -82,7 +81,10 @@ impl Scanner for PowerScanner {
}
if let Ok(state) = PowerHelper::suspend_state() {
metrics.insert("suspend_state".to_string(), MetricValue::from_str(&state));
metrics.insert(
"suspend_state".to_string(),
MetricValue::from_string(&state),
);
}
Ok(metrics)

View file

@ -5,9 +5,9 @@ use std::time::Duration;
struct ProcScanner;
#[unsafe(no_mangle)]
pub extern "C" fn pscand_scanner() -> Box<dyn Scanner> {
Box::new(ProcScanner)
#[no_mangle]
pub extern "C" fn pscand_scanner() -> *mut std::os::raw::c_void {
Box::into_raw(Box::new(ProcScanner)) as *mut std::os::raw::c_void
}
impl Default for ProcScanner {
@ -72,7 +72,7 @@ impl Scanner for ProcScanner {
}
metrics.insert(
"zombie_processes".to_string(),
MetricValue::from_str(zombie_info.join(",")),
MetricValue::from_string(zombie_info.join(",")),
);
}
}
@ -81,7 +81,7 @@ impl Scanner for ProcScanner {
for (i, proc) in top_mem.iter().enumerate() {
metrics.insert(
format!("top_mem_{}_name", i + 1),
MetricValue::from_str(&proc.name),
MetricValue::from_string(&proc.name),
);
metrics.insert(
format!("top_mem_{}_mb", i + 1),

View file

@ -1,4 +1,3 @@
#![allow(improper_ctypes)]
use pscand_core::helpers::SensorHelper;
use pscand_core::scanner::{MetricValue, Scanner};
use pscand_core::Result;
@ -7,9 +6,9 @@ use std::time::Duration;
struct SensorScanner;
#[unsafe(no_mangle)]
pub extern "C" fn pscand_scanner() -> Box<dyn Scanner> {
Box::new(SensorScanner)
#[no_mangle]
pub extern "C" fn pscand_scanner() -> *mut std::os::raw::c_void {
Box::into_raw(Box::new(SensorScanner)) as *mut std::os::raw::c_void
}
impl Default for SensorScanner {

View file

@ -1,23 +1,17 @@
#![allow(improper_ctypes)]
use pscand_core::helpers::{ResourceHelper, SystemHelper};
use pscand_core::scanner::{MetricValue, Scanner};
use pscand_core::Result;
use std::collections::HashMap;
use std::time::Duration;
#[derive(Default)]
struct SystemScanner {
_prev_cpu: Option<HashMap<String, f64>>,
}
impl Default for SystemScanner {
fn default() -> Self {
Self { _prev_cpu: None }
}
}
#[unsafe(no_mangle)]
pub extern "C" fn pscand_scanner() -> Box<dyn Scanner> {
Box::new(SystemScanner::default())
#[no_mangle]
pub extern "C" fn pscand_scanner() -> *mut std::os::raw::c_void {
Box::into_raw(Box::new(SystemScanner::default())) as *mut std::os::raw::c_void
}
impl Scanner for SystemScanner {