Rename test module, kinda get connection working.

This commit is contained in:
Michael Mikovsky
2025-11-08 10:30:21 -07:00
parent b6b665dfad
commit 8f33945633
19 changed files with 669 additions and 143 deletions
+167
View File
@@ -0,0 +1,167 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "bincode"
version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740"
dependencies = [
"bincode_derive",
"serde",
"unty",
]
[[package]]
name = "bincode_derive"
version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bf95709a440f45e986983918d0e8a1f30a9b1df04918fc828670606804ac3c09"
dependencies = [
"virtue",
]
[[package]]
name = "cfg-if"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
[[package]]
name = "crossbeam-channel"
version = "0.5.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2"
dependencies = [
"crossbeam-utils",
]
[[package]]
name = "crossbeam-utils"
version = "0.8.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
[[package]]
name = "libloading"
version = "0.8.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55"
dependencies = [
"cfg-if",
"windows-link",
]
[[package]]
name = "log"
version = "0.4.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432"
[[package]]
name = "proc-macro2"
version = "1.0.103"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
version = "1.0.42"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f"
dependencies = [
"proc-macro2",
]
[[package]]
name = "serde"
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
dependencies = [
"serde_core",
]
[[package]]
name = "serde_core"
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "syn"
version = "2.0.109"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2f17c7e013e88258aa9543dcbe81aca68a667a9ac37cd69c9fbc07858bfe0e2f"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "unicode-ident"
version = "1.0.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5"
[[package]]
name = "unshell-cli"
version = "0.1.0"
dependencies = [
"unshell-test-module",
]
[[package]]
name = "unshell-modules"
version = "0.1.0"
dependencies = [
"libloading",
"log",
]
[[package]]
name = "unshell-test-module"
version = "0.1.0"
dependencies = [
"bincode",
"crossbeam-channel",
"log",
"unshell-modules",
]
[[package]]
name = "unty"
version = "0.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae"
[[package]]
name = "virtue"
version = "0.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1"
[[package]]
name = "windows-link"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
+7
View File
@@ -0,0 +1,7 @@
[package]
name = "unshell-cli"
version = "0.1.0"
edition = "2024"
[dependencies]
unshell-test-module = {path = "../unshell-test-module"}#, default-features = false, features = ["server-component"]}
+6
View File
@@ -0,0 +1,6 @@
RUSTFLAGS="-Zlocation-detail=none -Zfmt-debug=none" cargo +nightly run \
-Z build-std=std,panic_abort \
-Z build-std-features="optimize_for_size" \
--profile release $@
# upx ./target/release/libunshell_module_test.so
+40
View File
@@ -0,0 +1,40 @@
use std::io::{Write, stdin, stdout};
use unshell_test_module::Announcement;
// use unshell_test_module::ListenerRuntime;
// fn print_continue_prompt(str: &str) {
// printl
// }
fn main() {
let mut serverruntime = unshell_test_module::ListenerRuntime::new();
loop {
print!("> ");
stdout().flush().expect("Failed to flush stdout");
let mut input = String::new();
stdin().read_line(&mut input).expect("Failed to read line");
let args = input.trim().split(" ").collect::<Vec<&str>>();
match args[0] {
"" => {}
"test" => {
if let Some(arg) = args.get(1) {
println!("Test with argument: {}", arg);
serverruntime
.send(&Announcement::TestAnnouncement(arg.to_string()))
.unwrap();
} else {
println!("Test without argument");
}
}
_ => {
println!("Invalid Command: '{}'", args[0]);
}
}
// println!("{:?}", args);
}
}
-47
View File
@@ -1,47 +0,0 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "cfg-if"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
[[package]]
name = "libloading"
version = "0.8.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55"
dependencies = [
"cfg-if",
"windows-link",
]
[[package]]
name = "log"
version = "0.4.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432"
[[package]]
name = "unshell-module-test"
version = "0.1.0"
dependencies = [
"log",
"unshell-modules",
]
[[package]]
name = "unshell-modules"
version = "0.1.0"
dependencies = [
"libloading",
"log",
]
[[package]]
name = "windows-link"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
-74
View File
@@ -1,74 +0,0 @@
#![no_main]
#[macro_use]
extern crate log;
use std::{
sync::{Arc, Mutex},
thread::{self, JoinHandle},
time::Duration,
};
// pub use unshell_logger::setup_logger;
pub use unshell_modules::setup_logger;
use unshell_modules::{Manager, ModuleRuntime, module_interface};
extern "C" fn test1() {
warn!("Test1 called");
}
extern "C" fn test2() {
warn!("Test2 called");
}
extern "C" fn test3() {
warn!("Test3 called");
}
module_interface! {
Interface {
fn test1();
fn test2();
fn test3();
}
}
#[unsafe(no_mangle)]
pub fn interface() -> Interface {
Interface::from_raw(test1, test2, test3)
}
struct RuntimeTest {
thread_handle: JoinHandle<()>,
}
impl RuntimeTest {
pub fn new(manager: Arc<Mutex<Manager>>) -> RuntimeTest {
Self {
thread_handle: thread::spawn(move || {
thread::sleep(Duration::from_secs(2));
let manager_lock = manager.lock().unwrap();
manager_lock.test1234(111.1111);
drop(manager_lock);
}),
}
}
}
impl ModuleRuntime for RuntimeTest {
// fn init(&mut self) {}
fn is_running(&self) -> bool {
!self.thread_handle.is_finished()
}
fn kill(self: Box<Self>) {
if !self.thread_handle.is_finished() {
let _ = self.thread_handle.join();
}
// drop(self);
}
}
#[unsafe(no_mangle)]
pub fn init(manager: Arc<Mutex<Manager>>) -> Box<dyn ModuleRuntime> {
Box::new(RuntimeTest::new(manager))
}
+2 -5
View File
@@ -38,17 +38,14 @@ impl Manager {
let runtime = init(this.clone());
info!("Initialized {}", i);
runtimes.push(runtime);
}
Self::join(&mut runtimes);
}
// /// Helper function to retrieve ManagerInterface type, for interfacing with ModuleManager accross FFI boundry.
// pub fn get_interface(&self) -> ManagerInterface {
// ManagerInterface::from_raw(Self::get_manager)
// }
/// Iterateratively loop through all runtimes, until all are finished executing
pub fn join(runtimes: &mut Vec<Box<dyn ModuleRuntime>>) {
// let mut len = runtimes.len().clone();
@@ -324,7 +324,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5"
[[package]]
name = "unshell-module-load"
name = "unshell-modules"
version = "0.1.0"
dependencies = [
"libloading",
"log",
]
[[package]]
name = "unshell-payload"
version = "0.1.0"
dependencies = [
"env_logger 0.11.8",
@@ -334,14 +342,6 @@ dependencies = [
"unshell-modules",
]
[[package]]
name = "unshell-modules"
version = "0.1.0"
dependencies = [
"libloading",
"log",
]
[[package]]
name = "utf8parse"
version = "0.2.2"
@@ -1,7 +1,7 @@
# cargo-features = ["trim-paths"]
[package]
name = "unshell-module-load"
name = "unshell-payload"
version = "0.1.0"
edition = "2024"
@@ -3,8 +3,6 @@ use unshell_modules::{Manager, Module, ModuleError, module_interface};
#[macro_use]
extern crate log;
// use unshell_modules::{Module, ModuleError, module_interface};
module_interface! {
Interface {
fn test1();
@@ -17,7 +15,7 @@ fn main() {
// Init the logger (This uses like 600MB of storage)
pretty_env_logger::init();
info!("Initalized");
info!("Initialized");
match || -> Result<(), ModuleError> {
let args = std::env::args();
+160
View File
@@ -0,0 +1,160 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "bincode"
version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740"
dependencies = [
"bincode_derive",
"serde",
"unty",
]
[[package]]
name = "bincode_derive"
version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bf95709a440f45e986983918d0e8a1f30a9b1df04918fc828670606804ac3c09"
dependencies = [
"virtue",
]
[[package]]
name = "cfg-if"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
[[package]]
name = "crossbeam-channel"
version = "0.5.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2"
dependencies = [
"crossbeam-utils",
]
[[package]]
name = "crossbeam-utils"
version = "0.8.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
[[package]]
name = "libloading"
version = "0.8.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55"
dependencies = [
"cfg-if",
"windows-link",
]
[[package]]
name = "log"
version = "0.4.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432"
[[package]]
name = "proc-macro2"
version = "1.0.103"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
version = "1.0.42"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f"
dependencies = [
"proc-macro2",
]
[[package]]
name = "serde"
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
dependencies = [
"serde_core",
]
[[package]]
name = "serde_core"
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "syn"
version = "2.0.109"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2f17c7e013e88258aa9543dcbe81aca68a667a9ac37cd69c9fbc07858bfe0e2f"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "unicode-ident"
version = "1.0.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5"
[[package]]
name = "unshell-modules"
version = "0.1.0"
dependencies = [
"libloading",
"log",
]
[[package]]
name = "unshell-test-module"
version = "0.1.0"
dependencies = [
"bincode",
"crossbeam-channel",
"log",
"unshell-modules",
]
[[package]]
name = "unty"
version = "0.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae"
[[package]]
name = "virtue"
version = "0.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1"
[[package]]
name = "windows-link"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
@@ -1,5 +1,7 @@
cargo-features = ["trim-paths"]
[package]
name = "unshell-module-test"
name = "unshell-test-module"
version = "0.1.0"
edition = "2024"
@@ -7,6 +9,12 @@ edition = "2024"
[lib]
crate-type = ["cdylib"]
[features]
default = ["client-component", "server-component"]
client-component = []
server-component = []
# server = []
[profile.release]
strip = true # Strip symbols from the binary
# strip = "debuginfo"
@@ -15,10 +23,13 @@ lto = true
codegen-units = 1
panic = "abort"
debug = false
trim-paths = "all"
# crate-type = ["cdylib"]
[dependencies]
bincode = "2.0.1"
crossbeam-channel = "0.5.15"
log = "0.4.28"
# unshell-logger = {path = "../unshell-logger"}
unshell-modules = {path = "../unshell-modules"}
# log = "0.4.28"
@@ -1,6 +1,6 @@
RUSTFLAGS="-Zlocation-detail=none -Zfmt-debug=none" cargo +nightly build \
-Z build-std=std,panic_abort \
-Z build-std-features="optimize_for_size" \
--release
--profile release $@
# upx ./target/release/libunshell_module_test.so
@@ -0,0 +1,79 @@
use std::{
io::Read,
net::TcpStream,
sync::{
Arc, Mutex,
atomic::{AtomicBool, Ordering},
},
thread::{self, JoinHandle},
};
use unshell_modules::{Manager, ModuleRuntime};
use crate::Announcement;
pub struct RuntimeTest {
thread_handle: JoinHandle<()>,
join_signal: Arc<AtomicBool>,
}
impl RuntimeTest {
pub fn new(_manager: Arc<Mutex<Manager>>) -> RuntimeTest {
let join_signal = Arc::new(AtomicBool::new(false));
let join_clone = join_signal.clone();
Self {
thread_handle: thread::spawn(move || {
info!("Connecting to server...");
let mut stream = TcpStream::connect("localhost:1234").unwrap();
info!("Connectied");
// let reader = BufReader::new(stream.try_clone().unwrap());
// let mut writer = BufWriter::new(stream.try_clone().unwrap());
// let (a, b) = crossbeam_channel::unbounded();
// a.
// if join_receiver.len() == 0 {
// join_receiver.recv().unwrap();
// }
while !join_clone.load(Ordering::Relaxed) {
let mut size_buf = [0u8; 4];
stream.read_exact(&mut size_buf).unwrap();
let size = u32::from_be_bytes(size_buf);
let mut buf = vec![0u8; size as usize];
stream.read_exact(&mut buf).unwrap();
let a = Announcement::decode(&buf).unwrap();
match a {
Announcement::TestAnnouncement(s) => {
info!("Received test announcement: {}", s)
}
}
}
}),
join_signal,
}
}
}
impl ModuleRuntime for RuntimeTest {
// fn init(&mut self) {}
fn is_running(&self) -> bool {
// println!("Checking if running");
!self.thread_handle.is_finished()
}
fn kill(self: Box<Self>) {
if !self.thread_handle.is_finished() {
self.join_signal.store(true, Ordering::Relaxed);
let _ = self.thread_handle.join();
}
// drop(self);
}
}
+38
View File
@@ -0,0 +1,38 @@
mod client_runtime;
use std::sync::{Arc, Mutex};
pub use unshell_modules::setup_logger;
use unshell_modules::{Manager, ModuleRuntime, module_interface};
use crate::client::client_runtime::RuntimeTest;
pub extern "C" fn test1() {
warn!("Test1 called");
}
pub extern "C" fn test2() {
warn!("Test2 called");
}
pub extern "C" fn test3() {
warn!("Test3 called");
}
module_interface! {
Interface {
fn test1();
fn test2();
fn test3();
}
}
#[unsafe(no_mangle)]
pub fn interface() -> Interface {
Interface::from_raw(test1, test2, test3)
}
#[unsafe(no_mangle)]
pub fn init(manager: Arc<Mutex<Manager>>) -> Box<dyn ModuleRuntime> {
info!("Initializing client module");
Box::new(RuntimeTest::new(manager))
}
+36
View File
@@ -0,0 +1,36 @@
#![no_main]
#[macro_use]
extern crate log;
use bincode::{Decode, Encode};
#[cfg(feature = "client-component")]
mod client;
#[cfg(feature = "client-component")]
pub use client::*;
#[cfg(feature = "server-component")]
mod server;
#[cfg(feature = "server-component")]
pub use server::ListenerRuntime;
#[derive(Debug, Encode, Decode)]
pub enum Announcement {
TestAnnouncement(String),
}
const BINCODE_CONFIG: bincode::config::Configuration = bincode::config::standard();
impl Announcement {
pub fn encode(&self) -> Vec<u8> {
bincode::encode_to_vec(self, BINCODE_CONFIG).unwrap()
}
pub fn decode(bytes: &[u8]) -> Option<Self> {
if let Ok((decoded, _)) = bincode::decode_from_slice(&bytes[..], BINCODE_CONFIG) {
Some(decoded)
} else {
None
}
}
}
+3
View File
@@ -0,0 +1,3 @@
mod server_runtime;
pub use server_runtime::ListenerRuntime;
@@ -0,0 +1,105 @@
use std::{
io::Write,
net::{TcpListener, TcpStream},
sync::{Arc, Mutex},
thread::{self, JoinHandle},
};
use unshell_modules::ModuleRuntime;
use crate::Announcement;
pub struct ListenerRuntime {
thread_handle: JoinHandle<()>,
// listener: TcpListener,
streams: Arc<Mutex<Vec<TcpStream>>>,
// reader: BufReader<TcpListener>,
// writer: BufWriter<TcpListener>,
}
impl ListenerRuntime {
pub fn new() -> ListenerRuntime {
info!("Starting listener runtime on 127.0.0.1:1234");
let listener = TcpListener::bind("127.0.0.1:1234").unwrap();
let streams = Arc::new(Mutex::new(Vec::new()));
let streams_clone = streams.clone();
let thread_handle = thread::spawn(move || {
let streams = streams_clone.clone();
for stream in listener.incoming() {
let stream = stream.unwrap();
println!("New connection from {}", stream.peer_addr().unwrap());
streams.lock().unwrap().push(stream);
// thread::spawn(move || {
// let _ = handle_connection(&mut stream);
// info!("Connection from {} closed", stream.peer_addr().unwrap());
// });
}
});
// let reader = BufReader::new(stream.try_clone().unwrap());
// let writer = BufWriter::new(stream.try_clone().unwrap());
Self {
thread_handle,
streams,
// stream,
// reader,
// writer,
// thread_handle: thread::spawn(move || {
// for stream in listener.incoming() {
// let mut stream = stream.unwrap();
// thread::spawn(move || {
// let _ = handle_connection(&mut stream);
// info!("Connection from {} closed", stream.peer_addr().unwrap());
// });
// }
// // thread::sleep(Duration::from_secs(2));
// // let manager_lock = manager.lock().unwrap();
// // manager_lock.test1234(111.1111);
// // drop(manager_lock);
// }),
}
}
pub fn send(&mut self, announcement: &Announcement) -> Result<(), std::io::Error> {
let bytes = announcement.encode();
let mut streams = self.streams.lock().unwrap();
for stream in streams.iter_mut() {
stream.write_all(&u32::to_be_bytes(bytes.len() as u32))?;
stream.write_all(&bytes)?;
stream.flush()?;
}
println!("Announcement {:?} sent", announcement);
Ok(())
// self.stream
// .write_all(&u32::to_be_bytes(bytes.len() as u32))?;
// self.stream.write_all(&bytes)?;
// self.stream.flush()?;
}
}
impl ModuleRuntime for ListenerRuntime {
// fn init(&mut self) {}
fn is_running(&self) -> bool {
true
}
fn kill(self: Box<Self>) {
if !self.thread_handle.is_finished() {
let _ = self.thread_handle.join();
}
// drop(self);
}
}