Created comprehensive VPN setup tooling for Peaceful Spirit L2TP/IPsec connection and enhanced agent documentation framework. VPN Configuration (PST-NW-VPN): - Setup-PST-L2TP-VPN.ps1: Automated L2TP/IPsec setup with split-tunnel and DNS - Connect-PST-VPN.ps1: Connection helper with PPP adapter detection, DNS (192.168.0.2), and route config (192.168.0.0/24) - Connect-PST-VPN-Standalone.ps1: Self-contained connection script for remote deployment - Fix-PST-VPN-Auth.ps1: Authentication troubleshooting for CHAP/MSChapv2 - Diagnose-VPN-Interface.ps1: Comprehensive VPN interface and routing diagnostic - Quick-Test-VPN.ps1: Fast connectivity verification (DNS/router/routes) - Add-PST-VPN-Route-Manual.ps1: Manual route configuration helper - vpn-connect.bat, vpn-disconnect.bat: Simple batch file shortcuts - OpenVPN config files (Windows-compatible, abandoned for L2TP) Key VPN Implementation Details: - L2TP creates PPP adapter with connection name as interface description - UniFi auto-configures DNS (192.168.0.2) but requires manual route to 192.168.0.0/24 - Split-tunnel enabled (only remote traffic through VPN) - All-user connection for pre-login auto-connect via scheduled task - Authentication: CHAP + MSChapv2 for UniFi compatibility Agent Documentation: - AGENT_QUICK_REFERENCE.md: Quick reference for all specialized agents - documentation-squire.md: Documentation and task management specialist agent - Updated all agent markdown files with standardized formatting Project Organization: - Moved conversation logs to dedicated directories (guru-connect-conversation-logs, guru-rmm-conversation-logs) - Cleaned up old session JSONL files from projects/msp-tools/ - Added guru-connect infrastructure (agent, dashboard, proto, scripts, .gitea workflows) - Added guru-rmm server components and deployment configs Technical Notes: - VPN IP pool: 192.168.4.x (client gets 192.168.4.6) - Remote network: 192.168.0.0/24 (router at 192.168.0.10) - PSK: rrClvnmUeXEFo90Ol+z7tfsAZHeSK6w7 - Credentials: pst-admin / 24Hearts$ Files: 15 VPN scripts, 2 agent docs, conversation log reorganization, guru-connect/guru-rmm infrastructure additions Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
92 lines
2.2 KiB
Rust
92 lines
2.2 KiB
Rust
//! Input injection module
|
|
//!
|
|
//! Handles mouse and keyboard input simulation using Windows SendInput API.
|
|
|
|
mod mouse;
|
|
mod keyboard;
|
|
|
|
pub use mouse::MouseController;
|
|
pub use keyboard::KeyboardController;
|
|
|
|
use anyhow::Result;
|
|
|
|
/// Combined input controller for mouse and keyboard
|
|
pub struct InputController {
|
|
mouse: MouseController,
|
|
keyboard: KeyboardController,
|
|
}
|
|
|
|
impl InputController {
|
|
/// Create a new input controller
|
|
pub fn new() -> Result<Self> {
|
|
Ok(Self {
|
|
mouse: MouseController::new()?,
|
|
keyboard: KeyboardController::new()?,
|
|
})
|
|
}
|
|
|
|
/// Get mouse controller
|
|
pub fn mouse(&mut self) -> &mut MouseController {
|
|
&mut self.mouse
|
|
}
|
|
|
|
/// Get keyboard controller
|
|
pub fn keyboard(&mut self) -> &mut KeyboardController {
|
|
&mut self.keyboard
|
|
}
|
|
|
|
/// Move mouse to absolute position
|
|
pub fn mouse_move(&mut self, x: i32, y: i32) -> Result<()> {
|
|
self.mouse.move_to(x, y)
|
|
}
|
|
|
|
/// Click mouse button
|
|
pub fn mouse_click(&mut self, button: MouseButton, down: bool) -> Result<()> {
|
|
if down {
|
|
self.mouse.button_down(button)
|
|
} else {
|
|
self.mouse.button_up(button)
|
|
}
|
|
}
|
|
|
|
/// Scroll mouse wheel
|
|
pub fn mouse_scroll(&mut self, delta_x: i32, delta_y: i32) -> Result<()> {
|
|
self.mouse.scroll(delta_x, delta_y)
|
|
}
|
|
|
|
/// Press or release a key
|
|
pub fn key_event(&mut self, vk_code: u16, down: bool) -> Result<()> {
|
|
if down {
|
|
self.keyboard.key_down(vk_code)
|
|
} else {
|
|
self.keyboard.key_up(vk_code)
|
|
}
|
|
}
|
|
|
|
/// Type a unicode character
|
|
pub fn type_unicode(&mut self, ch: char) -> Result<()> {
|
|
self.keyboard.type_char(ch)
|
|
}
|
|
|
|
/// Send Ctrl+Alt+Delete (requires special handling on Windows)
|
|
pub fn send_ctrl_alt_del(&mut self) -> Result<()> {
|
|
self.keyboard.send_sas()
|
|
}
|
|
}
|
|
|
|
/// Mouse button types
|
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
|
pub enum MouseButton {
|
|
Left,
|
|
Right,
|
|
Middle,
|
|
X1,
|
|
X2,
|
|
}
|
|
|
|
impl Default for InputController {
|
|
fn default() -> Self {
|
|
Self::new().expect("Failed to create input controller")
|
|
}
|
|
}
|