Reorganized files
This commit is contained in:
parent
4fe64981d0
commit
19ec3714a6
23
src/cli.rs
23
src/cli.rs
|
@ -1,23 +0,0 @@
|
||||||
use clap::Parser;
|
|
||||||
|
|
||||||
/// Quickly create http tunnels for development
|
|
||||||
#[derive(Parser, Debug)]
|
|
||||||
#[command(version, about, long_about = None)]
|
|
||||||
pub struct Args {
|
|
||||||
/// Make all tunnels public by default instead of private
|
|
||||||
#[arg(long, group = "access")]
|
|
||||||
public: bool,
|
|
||||||
|
|
||||||
#[arg(long, group = "access")]
|
|
||||||
protected: bool,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Args {
|
|
||||||
pub fn make_public(&self) -> bool {
|
|
||||||
self.public
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn make_protected(&self) -> bool {
|
|
||||||
self.protected
|
|
||||||
}
|
|
||||||
}
|
|
5
src/helper/mod.rs
Normal file
5
src/helper/mod.rs
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
mod animals;
|
||||||
|
mod units;
|
||||||
|
|
||||||
|
pub use animals::get_animal_name;
|
||||||
|
pub use units::Unit;
|
7
src/io/mod.rs
Normal file
7
src/io/mod.rs
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
mod input;
|
||||||
|
mod stats;
|
||||||
|
mod terminal_handle;
|
||||||
|
|
||||||
|
pub use input::Input;
|
||||||
|
pub use stats::{Stats, TrackStats};
|
||||||
|
pub use terminal_handle::TerminalHandle;
|
|
@ -7,23 +7,58 @@ use std::{
|
||||||
use pin_project_lite::pin_project;
|
use pin_project_lite::pin_project;
|
||||||
use russh::{ChannelStream, server::Msg};
|
use russh::{ChannelStream, server::Msg};
|
||||||
|
|
||||||
use crate::stats::Stats;
|
use crate::helper::Unit;
|
||||||
|
|
||||||
|
use std::sync::atomic::{AtomicUsize, Ordering};
|
||||||
|
|
||||||
|
#[derive(Debug, Default)]
|
||||||
|
pub struct Stats {
|
||||||
|
connections: AtomicUsize,
|
||||||
|
rx: AtomicUsize,
|
||||||
|
tx: AtomicUsize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Stats {
|
||||||
|
pub fn add_connection(&self) {
|
||||||
|
self.connections.fetch_add(1, Ordering::Relaxed);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn add_rx_bytes(&self, n: usize) {
|
||||||
|
self.rx.fetch_add(n, Ordering::Relaxed);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn add_tx_bytes(&self, n: usize) {
|
||||||
|
self.tx.fetch_add(n, Ordering::Relaxed);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn connections(&self) -> usize {
|
||||||
|
self.connections.load(Ordering::Relaxed)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn rx(&self) -> Unit {
|
||||||
|
Unit::new(self.rx.load(Ordering::Relaxed), "B")
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn tx(&self) -> Unit {
|
||||||
|
Unit::new(self.tx.load(Ordering::Relaxed), "B")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pin_project! {
|
pin_project! {
|
||||||
pub struct Wrapper {
|
pub struct TrackStats {
|
||||||
#[pin]
|
#[pin]
|
||||||
inner: ChannelStream<Msg>,
|
inner: ChannelStream<Msg>,
|
||||||
stats: Arc<Stats>,
|
stats: Arc<Stats>,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Wrapper {
|
impl TrackStats {
|
||||||
pub fn new(inner: ChannelStream<Msg>, stats: Arc<Stats>) -> Self {
|
pub fn new(inner: ChannelStream<Msg>, stats: Arc<Stats>) -> Self {
|
||||||
Self { inner, stats }
|
Self { inner, stats }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl hyper::rt::Read for Wrapper {
|
impl hyper::rt::Read for TrackStats {
|
||||||
fn poll_read(
|
fn poll_read(
|
||||||
self: Pin<&mut Self>,
|
self: Pin<&mut Self>,
|
||||||
cx: &mut Context<'_>,
|
cx: &mut Context<'_>,
|
||||||
|
@ -47,7 +82,7 @@ impl hyper::rt::Read for Wrapper {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl hyper::rt::Write for Wrapper {
|
impl hyper::rt::Write for TrackStats {
|
||||||
fn poll_write(
|
fn poll_write(
|
||||||
self: Pin<&mut Self>,
|
self: Pin<&mut Self>,
|
||||||
cx: &mut Context<'_>,
|
cx: &mut Context<'_>,
|
23
src/lib.rs
23
src/lib.rs
|
@ -1,22 +1,7 @@
|
||||||
#![feature(let_chains)]
|
#![feature(let_chains)]
|
||||||
mod animals;
|
|
||||||
pub mod auth;
|
|
||||||
mod cli;
|
|
||||||
mod handler;
|
|
||||||
mod helper;
|
mod helper;
|
||||||
mod input;
|
|
||||||
mod io;
|
mod io;
|
||||||
mod ldap;
|
pub mod ldap;
|
||||||
mod server;
|
pub mod ssh;
|
||||||
mod stats;
|
pub mod tunnel;
|
||||||
mod tui;
|
pub mod web;
|
||||||
mod tunnel;
|
|
||||||
mod units;
|
|
||||||
mod web;
|
|
||||||
mod wrapper;
|
|
||||||
|
|
||||||
pub use ldap::Ldap;
|
|
||||||
pub use server::Server;
|
|
||||||
pub use tunnel::Registry;
|
|
||||||
pub use tunnel::Tunnel;
|
|
||||||
pub use web::Service;
|
|
||||||
|
|
|
@ -8,7 +8,12 @@ use rand::rngs::OsRng;
|
||||||
use tokio::net::TcpListener;
|
use tokio::net::TcpListener;
|
||||||
use tracing::{error, info, warn};
|
use tracing::{error, info, warn};
|
||||||
use tracing_subscriber::{EnvFilter, layer::SubscriberExt, util::SubscriberInitExt};
|
use tracing_subscriber::{EnvFilter, layer::SubscriberExt, util::SubscriberInitExt};
|
||||||
use tunnel_rs::{Ldap, Registry, Server, Service, auth::ForwardAuth};
|
use tunnel_rs::{
|
||||||
|
ldap::Ldap,
|
||||||
|
ssh::Server,
|
||||||
|
tunnel::Registry,
|
||||||
|
web::{ForwardAuth, Service},
|
||||||
|
};
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() -> color_eyre::Result<()> {
|
async fn main() -> color_eyre::Result<()> {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use std::{cmp::min, io::Write, iter::once};
|
use std::{cmp::min, io::Write, iter::once};
|
||||||
|
|
||||||
use clap::Parser as _;
|
use clap::Parser;
|
||||||
use ratatui::{Terminal, TerminalOptions, Viewport, layout::Rect, prelude::CrosstermBackend};
|
use ratatui::{Terminal, TerminalOptions, Viewport, layout::Rect, prelude::CrosstermBackend};
|
||||||
use russh::{
|
use russh::{
|
||||||
ChannelId,
|
ChannelId,
|
||||||
|
@ -10,14 +10,33 @@ use russh::{
|
||||||
use tracing::{debug, trace, warn};
|
use tracing::{debug, trace, warn};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
Ldap, cli,
|
io::{Input, TerminalHandle},
|
||||||
input::Input,
|
ldap::{Ldap, LdapError},
|
||||||
io::TerminalHandle,
|
|
||||||
ldap::LdapError,
|
|
||||||
tui::Renderer,
|
|
||||||
tunnel::{Registry, Tunnel, TunnelAccess},
|
tunnel::{Registry, Tunnel, TunnelAccess},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// Quickly create http tunnels for development
|
||||||
|
#[derive(Parser, Debug)]
|
||||||
|
#[command(version, about, long_about = None)]
|
||||||
|
pub struct Args {
|
||||||
|
/// Make all tunnels public by default instead of private
|
||||||
|
#[arg(long, group = "access")]
|
||||||
|
public: bool,
|
||||||
|
|
||||||
|
#[arg(long, group = "access")]
|
||||||
|
protected: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Args {
|
||||||
|
pub fn make_public(&self) -> bool {
|
||||||
|
self.public
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn make_protected(&self) -> bool {
|
||||||
|
self.protected
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, thiserror::Error)]
|
#[derive(Debug, thiserror::Error)]
|
||||||
pub enum HandlerError {
|
pub enum HandlerError {
|
||||||
#[error(transparent)]
|
#[error(transparent)]
|
||||||
|
@ -38,7 +57,7 @@ pub struct Handler {
|
||||||
pty_channel: Option<ChannelId>,
|
pty_channel: Option<ChannelId>,
|
||||||
|
|
||||||
terminal: Option<Terminal<CrosstermBackend<TerminalHandle>>>,
|
terminal: Option<Terminal<CrosstermBackend<TerminalHandle>>>,
|
||||||
renderer: Renderer,
|
renderer: super::Renderer,
|
||||||
selected: Option<usize>,
|
selected: Option<usize>,
|
||||||
|
|
||||||
rename_buffer: Option<String>,
|
rename_buffer: Option<String>,
|
||||||
|
@ -315,7 +334,7 @@ impl russh::server::Handler for Handler {
|
||||||
trace!(?cmd, "exec_request");
|
trace!(?cmd, "exec_request");
|
||||||
|
|
||||||
let cmd = once("<ssh command> --").chain(cmd.split_whitespace());
|
let cmd = once("<ssh command> --").chain(cmd.split_whitespace());
|
||||||
match cli::Args::try_parse_from(cmd) {
|
match Args::try_parse_from(cmd) {
|
||||||
Ok(args) => {
|
Ok(args) => {
|
||||||
debug!("{args:?}");
|
debug!("{args:?}");
|
||||||
if args.make_public() {
|
if args.make_public() {
|
|
@ -1,10 +1,15 @@
|
||||||
|
mod handler;
|
||||||
|
mod renderer;
|
||||||
|
|
||||||
use std::{net::SocketAddr, sync::Arc, time::Duration};
|
use std::{net::SocketAddr, sync::Arc, time::Duration};
|
||||||
|
|
||||||
use russh::{MethodKind, keys::PrivateKey, server::Server as _};
|
use russh::{MethodKind, keys::PrivateKey, server::Server as _};
|
||||||
use tokio::net::ToSocketAddrs;
|
use tokio::net::ToSocketAddrs;
|
||||||
use tracing::{debug, warn};
|
use tracing::{debug, warn};
|
||||||
|
|
||||||
use crate::{Ldap, handler::Handler, tunnel::Registry};
|
use crate::{ldap::Ldap, tunnel::Registry};
|
||||||
|
use handler::Handler;
|
||||||
|
use renderer::Renderer;
|
||||||
|
|
||||||
pub struct Server {
|
pub struct Server {
|
||||||
ldap: Ldap,
|
ldap: Ldap,
|
36
src/stats.rs
36
src/stats.rs
|
@ -1,36 +0,0 @@
|
||||||
use std::sync::atomic::{AtomicUsize, Ordering};
|
|
||||||
|
|
||||||
use crate::units::Unit;
|
|
||||||
|
|
||||||
#[derive(Debug, Default)]
|
|
||||||
pub struct Stats {
|
|
||||||
connections: AtomicUsize,
|
|
||||||
rx: AtomicUsize,
|
|
||||||
tx: AtomicUsize,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Stats {
|
|
||||||
pub fn add_connection(&self) {
|
|
||||||
self.connections.fetch_add(1, Ordering::Relaxed);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn add_rx_bytes(&self, n: usize) {
|
|
||||||
self.rx.fetch_add(n, Ordering::Relaxed);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn add_tx_bytes(&self, n: usize) {
|
|
||||||
self.tx.fetch_add(n, Ordering::Relaxed);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn connections(&self) -> usize {
|
|
||||||
self.connections.load(Ordering::Relaxed)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn rx(&self) -> Unit {
|
|
||||||
Unit::new(self.rx.load(Ordering::Relaxed), "B")
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn tx(&self) -> Unit {
|
|
||||||
Unit::new(self.tx.load(Ordering::Relaxed), "B")
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -8,19 +8,19 @@ use tracing::trace;
|
||||||
use russh::server::Handle;
|
use russh::server::Handle;
|
||||||
use tokio::sync::{RwLock, RwLockReadGuard};
|
use tokio::sync::{RwLock, RwLockReadGuard};
|
||||||
|
|
||||||
use crate::{stats::Stats, wrapper::Wrapper};
|
|
||||||
|
|
||||||
pub use registry::Registry;
|
pub use registry::Registry;
|
||||||
|
|
||||||
|
use crate::io::{Stats, TrackStats};
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub enum TunnelAccess {
|
pub(crate) enum TunnelAccess {
|
||||||
Private(String),
|
Private(String),
|
||||||
Protected,
|
Protected,
|
||||||
Public,
|
Public,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct TunnelInner {
|
pub(crate) struct TunnelInner {
|
||||||
handle: Handle,
|
handle: Handle,
|
||||||
internal_address: String,
|
internal_address: String,
|
||||||
port: u32,
|
port: u32,
|
||||||
|
@ -29,7 +29,7 @@ pub struct TunnelInner {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TunnelInner {
|
impl TunnelInner {
|
||||||
pub async fn open(&self) -> Result<Wrapper, russh::Error> {
|
pub(crate) async fn open(&self) -> Result<TrackStats, russh::Error> {
|
||||||
trace!("Opening tunnel");
|
trace!("Opening tunnel");
|
||||||
self.stats.add_connection();
|
self.stats.add_connection();
|
||||||
let channel = self
|
let channel = self
|
||||||
|
@ -42,20 +42,20 @@ impl TunnelInner {
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
Ok(Wrapper::new(channel.into_stream(), self.stats.clone()))
|
Ok(TrackStats::new(channel.into_stream(), self.stats.clone()))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn is_public(&self) -> bool {
|
pub(crate) async fn is_public(&self) -> bool {
|
||||||
matches!(*self.access.read().await, TunnelAccess::Public)
|
matches!(*self.access.read().await, TunnelAccess::Public)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn get_access(&self) -> RwLockReadGuard<'_, TunnelAccess> {
|
pub(crate) async fn get_access(&self) -> RwLockReadGuard<'_, TunnelAccess> {
|
||||||
self.access.read().await
|
self.access.read().await
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct Tunnel {
|
pub(crate) struct Tunnel {
|
||||||
inner: TunnelInner,
|
inner: TunnelInner,
|
||||||
|
|
||||||
registry: Registry,
|
registry: Registry,
|
||||||
|
|
|
@ -6,19 +6,19 @@ use std::{
|
||||||
use tokio::sync::RwLock;
|
use tokio::sync::RwLock;
|
||||||
use tracing::trace;
|
use tracing::trace;
|
||||||
|
|
||||||
use crate::{Tunnel, animals::get_animal_name};
|
use crate::{helper::get_animal_name, tunnel::Tunnel};
|
||||||
|
|
||||||
use super::TunnelInner;
|
use super::TunnelInner;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct RegistryEntry {
|
pub(crate) struct RegistryEntry {
|
||||||
registry: Registry,
|
registry: Registry,
|
||||||
name: String,
|
name: String,
|
||||||
address: Option<String>,
|
address: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl RegistryEntry {
|
impl RegistryEntry {
|
||||||
pub fn new(registry: Registry) -> Self {
|
pub(crate) fn new(registry: Registry) -> Self {
|
||||||
Self {
|
Self {
|
||||||
registry,
|
registry,
|
||||||
name: Default::default(),
|
name: Default::default(),
|
||||||
|
@ -26,11 +26,11 @@ impl RegistryEntry {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_address(&self) -> Option<&String> {
|
pub(crate) fn get_address(&self) -> Option<&String> {
|
||||||
self.address.as_ref()
|
self.address.as_ref()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_name(&self) -> &str {
|
pub(crate) fn get_name(&self) -> &str {
|
||||||
&self.name
|
&self.name
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -124,7 +124,7 @@ impl Registry {
|
||||||
self.register(tunnel).await;
|
self.register(tunnel).await;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn get(&self, address: &str) -> Option<TunnelInner> {
|
pub(crate) async fn get(&self, address: &str) -> Option<TunnelInner> {
|
||||||
self.tunnels.read().await.get(address).cloned()
|
self.tunnels.read().await.get(address).cloned()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
use crate::Registry;
|
mod auth;
|
||||||
|
mod response;
|
||||||
|
|
||||||
|
use crate::tunnel::Registry;
|
||||||
use std::{ops::Deref, pin::Pin};
|
use std::{ops::Deref, pin::Pin};
|
||||||
|
|
||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
|
@ -11,11 +14,10 @@ use hyper::{
|
||||||
};
|
};
|
||||||
use tracing::{debug, error, trace, warn};
|
use tracing::{debug, error, trace, warn};
|
||||||
|
|
||||||
use crate::{
|
use crate::tunnel::TunnelAccess;
|
||||||
auth::{AuthStatus, ForwardAuth},
|
use auth::AuthStatus;
|
||||||
helper::response,
|
pub use auth::ForwardAuth;
|
||||||
tunnel::TunnelAccess,
|
use response::response;
|
||||||
};
|
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct Service {
|
pub struct Service {
|
Loading…
Reference in New Issue
Block a user