aboutsummaryrefslogtreecommitdiffstats
path: root/src/cmd
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd')
-rw-r--r--src/cmd/play.rs20
-rw-r--r--src/cmd/record.rs55
-rw-r--r--src/cmd/server.rs94
-rw-r--r--src/cmd/stream.rs127
-rw-r--r--src/cmd/watch.rs83
5 files changed, 79 insertions, 300 deletions
diff --git a/src/cmd/play.rs b/src/cmd/play.rs
index 22bd220..7eae765 100644
--- a/src/cmd/play.rs
+++ b/src/cmd/play.rs
@@ -1,10 +1,9 @@
use crate::prelude::*;
use std::io::Write as _;
-#[derive(serde::Deserialize, Debug)]
+#[derive(serde::Deserialize, Debug, Default)]
pub struct Config {
- #[serde(default = "crate::config::default_ttyrec_filename")]
- filename: String,
+ ttyrec: crate::config::Ttyrec,
}
impl crate::config::Config for Config {
@@ -12,14 +11,11 @@ impl crate::config::Config for Config {
&mut self,
matches: &clap::ArgMatches<'a>,
) -> Result<()> {
- if matches.is_present("filename") {
- self.filename = matches.value_of("filename").unwrap().to_string();
- }
- Ok(())
+ self.ttyrec.merge_args(matches)
}
fn run(&self) -> Result<()> {
- let fut = PlaySession::new(&self.filename);
+ let fut = PlaySession::new(&self.ttyrec.filename);
tokio::run(fut.map_err(|e| {
eprintln!("{}", e);
}));
@@ -27,14 +23,6 @@ impl crate::config::Config for Config {
}
}
-impl Default for Config {
- fn default() -> Self {
- Self {
- filename: crate::config::default_ttyrec_filename(),
- }
- }
-}
-
pub fn cmd<'a, 'b>(app: clap::App<'a, 'b>) -> clap::App<'a, 'b> {
app.about("Play recorded terminal sessions").arg(
clap::Arg::with_name("filename")
diff --git a/src/cmd/record.rs b/src/cmd/record.rs
index cf291b9..3e19ed8 100644
--- a/src/cmd/record.rs
+++ b/src/cmd/record.rs
@@ -1,19 +1,10 @@
use crate::prelude::*;
use tokio::io::AsyncWrite as _;
-#[derive(serde::Deserialize, Debug)]
+#[derive(serde::Deserialize, Debug, Default)]
pub struct Config {
- #[serde(default = "crate::config::default_ttyrec_filename")]
- filename: String,
-
- #[serde(default = "crate::config::default_connection_buffer_size")]
- buffer_size: usize,
-
- #[serde(skip, default = "crate::config::default_command")]
- command: String,
-
- #[serde(skip, default = "crate::config::default_args")]
- args: Vec<String>,
+ command: crate::config::Command,
+ ttyrec: crate::config::Ttyrec,
}
impl crate::config::Config for Config {
@@ -21,34 +12,17 @@ impl crate::config::Config for Config {
&mut self,
matches: &clap::ArgMatches<'a>,
) -> Result<()> {
- if matches.is_present("filename") {
- self.filename = matches.value_of("filename").unwrap().to_string();
- }
- if matches.is_present("buffer-size") {
- let buffer_size = matches.value_of("buffer-size").unwrap();
- self.buffer_size = buffer_size.parse().context(
- crate::error::ParseBufferSize { input: buffer_size },
- )?;
- }
- if matches.is_present("command") {
- self.command = matches.value_of("command").unwrap().to_string();
- }
- if matches.is_present("args") {
- self.args = matches
- .values_of("args")
- .unwrap()
- .map(std::string::ToString::to_string)
- .collect();
- }
+ self.command.merge_args(matches)?;
+ self.ttyrec.merge_args(matches)?;
Ok(())
}
fn run(&self) -> Result<()> {
let fut = RecordSession::new(
- &self.filename,
- self.buffer_size,
- &self.command,
- &self.args,
+ &self.ttyrec.filename,
+ self.command.buffer_size,
+ &self.command.command,
+ &self.command.args,
);
tokio::run(fut.map_err(|e| {
eprintln!("{}", e);
@@ -57,17 +31,6 @@ impl crate::config::Config for Config {
}
}
-impl Default for Config {
- fn default() -> Self {
- Self {
- filename: crate::config::default_ttyrec_filename(),
- buffer_size: crate::config::default_connection_buffer_size(),
- command: crate::config::default_command(),
- args: crate::config::default_args(),
- }
- }
-}
-
pub fn cmd<'a, 'b>(app: clap::App<'a, 'b>) -> clap::App<'a, 'b> {
app.about("Record a terminal session to a file")
.arg(
diff --git a/src/cmd/server.rs b/src/cmd/server.rs
index 858c6b8..ea238ba 100644
--- a/src/cmd/server.rs
+++ b/src/cmd/server.rs
@@ -1,32 +1,9 @@
use crate::prelude::*;
-use std::convert::TryFrom as _;
use std::io::Read as _;
-#[derive(serde::Deserialize, Debug)]
+#[derive(serde::Deserialize, Debug, Default)]
pub struct Config {
- #[serde(
- deserialize_with = "crate::config::listen_address",
- default = "crate::config::default_listen_address"
- )]
- listen_address: std::net::SocketAddr,
-
- #[serde(default = "crate::config::default_connection_buffer_size")]
- buffer_size: usize,
-
- #[serde(
- deserialize_with = "crate::config::read_timeout",
- default = "crate::config::default_read_timeout"
- )]
- read_timeout: std::time::Duration,
-
- tls_identity_file: Option<String>,
-
- #[serde(
- deserialize_with = "crate::config::allowed_login_methods",
- default = "crate::config::default_allowed_login_methods"
- )]
- allowed_login_methods:
- std::collections::HashSet<crate::protocol::AuthType>,
+ server: crate::config::Server,
}
impl crate::config::Config for Config {
@@ -34,59 +11,25 @@ impl crate::config::Config for Config {
&mut self,
matches: &clap::ArgMatches<'a>,
) -> Result<()> {
- if matches.is_present("address") {
- self.listen_address = matches
- .value_of("address")
- .unwrap()
- .parse()
- .context(crate::error::ParseAddr)?;
- }
- if matches.is_present("buffer-size") {
- let s = matches.value_of("buffer-size").unwrap();
- self.buffer_size = s
- .parse()
- .context(crate::error::ParseBufferSize { input: s })?;
- }
- if matches.is_present("read-timeout") {
- let s = matches.value_of("read-timeout").unwrap();
- self.read_timeout = s
- .parse()
- .map(std::time::Duration::from_secs)
- .context(crate::error::ParseReadTimeout { input: s })?;
- }
- if matches.is_present("tls-identity-file") {
- self.tls_identity_file = Some(
- matches.value_of("tls-identity-file").unwrap().to_string(),
- );
- }
- if matches.is_present("allowed-login-methods") {
- self.allowed_login_methods = matches
- .values_of("allowed-login-methods")
- .unwrap()
- .map(crate::protocol::AuthType::try_from)
- .collect::<Result<
- std::collections::HashSet<crate::protocol::AuthType>,
- >>()?;
- }
- Ok(())
+ self.server.merge_args(matches)
}
fn run(&self) -> Result<()> {
let (acceptor, server) =
- if let Some(tls_identity_file) = &self.tls_identity_file {
+ if let Some(tls_identity_file) = &self.server.tls_identity_file {
create_server_tls(
- self.listen_address,
- self.buffer_size,
- self.read_timeout,
+ self.server.listen_address,
+ self.server.buffer_size,
+ self.server.read_timeout,
tls_identity_file,
- self.allowed_login_methods.clone(),
+ self.server.allowed_login_methods.clone(),
)?
} else {
create_server(
- self.listen_address,
- self.buffer_size,
- self.read_timeout,
- self.allowed_login_methods.clone(),
+ self.server.listen_address,
+ self.server.buffer_size,
+ self.server.read_timeout,
+ self.server.allowed_login_methods.clone(),
)?
};
tokio::run(futures::future::lazy(move || {
@@ -102,19 +45,6 @@ impl crate::config::Config for Config {
}
}
-impl Default for Config {
- fn default() -> Self {
- Self {
- listen_address: crate::config::default_listen_address(),
- buffer_size: crate::config::default_connection_buffer_size(),
- read_timeout: crate::config::default_read_timeout(),
- tls_identity_file: None,
- allowed_login_methods:
- crate::config::default_allowed_login_methods(),
- }
- }
-}
-
pub fn cmd<'a, 'b>(app: clap::App<'a, 'b>) -> clap::App<'a, 'b> {
app.about("Run a teleterm server")
.arg(
diff --git a/src/cmd/stream.rs b/src/cmd/stream.rs
index 809e480..14f4fac 100644
--- a/src/cmd/stream.rs
+++ b/src/cmd/stream.rs
@@ -1,41 +1,10 @@
use crate::prelude::*;
use tokio::io::AsyncWrite as _;
-#[derive(serde::Deserialize, Debug)]
+#[derive(serde::Deserialize, Debug, Default)]
pub struct Config {
- #[serde(
- deserialize_with = "crate::config::auth",
- default = "crate::config::default_auth"
- )]
- auth: crate::protocol::Auth,
-
- #[serde(
- deserialize_with = "crate::config::connect_address",
- default = "crate::config::default_connect_address"
- )]
- connect_address: (String, std::net::SocketAddr),
-
- #[serde(default = "crate::config::default_tls")]
- tls: bool,
-
- #[serde(default = "crate::config::default_connection_buffer_size")]
- buffer_size: usize,
-
- #[serde(skip, default = "crate::config::default_command")]
- command: String,
-
- #[serde(skip, default = "crate::config::default_args")]
- args: Vec<String>,
-}
-
-impl Config {
- fn host(&self) -> &str {
- &self.connect_address.0
- }
-
- fn addr(&self) -> &std::net::SocketAddr {
- &self.connect_address.1
- }
+ client: crate::config::Client,
+ command: crate::config::Command,
}
impl crate::config::Config for Config {
@@ -43,52 +12,33 @@ impl crate::config::Config for Config {
&mut self,
matches: &clap::ArgMatches<'a>,
) -> Result<()> {
- if matches.is_present("login-recurse-center") {
- let id = crate::oauth::load_client_auth_id(
- crate::protocol::AuthType::RecurseCenter,
- );
- self.auth = crate::protocol::Auth::recurse_center(
- id.as_ref().map(std::string::String::as_str),
- );
- }
- if matches.is_present("login-plain") {
- let username =
- matches.value_of("login-plain").unwrap().to_string();
- self.auth = crate::protocol::Auth::plain(&username);
- }
- if matches.is_present("address") {
- let address = matches.value_of("address").unwrap();
- self.connect_address =
- crate::config::to_connect_address(address)?;
- }
- if matches.is_present("tls") {
- self.tls = true;
- }
- if matches.is_present("buffer-size") {
- let buffer_size = matches.value_of("buffer-size").unwrap();
- self.buffer_size = buffer_size.parse().context(
- crate::error::ParseBufferSize { input: buffer_size },
- )?;
- }
- if matches.is_present("command") {
- self.command = matches.value_of("command").unwrap().to_string();
- }
- if matches.is_present("args") {
- self.args = matches
- .values_of("args")
- .unwrap()
- .map(std::string::ToString::to_string)
- .collect();
- }
+ self.client.merge_args(matches)?;
+ self.command.merge_args(matches)?;
Ok(())
}
fn run(&self) -> Result<()> {
- let host = self.host().to_string();
- let address = *self.addr();
+ let host = self.client.host().to_string();
+ let address = *self.client.addr();
+ let auth = match self.client.auth {
+ crate::protocol::AuthType::Plain => {
+ let username = self
+ .client
+ .username
+ .clone()
+ .context(crate::error::CouldntFindUsername)?;
+ crate::protocol::Auth::plain(&username)
+ }
+ crate::protocol::AuthType::RecurseCenter => {
+ let id = crate::oauth::load_client_auth_id(self.client.auth);
+ crate::protocol::Auth::recurse_center(
+ id.as_ref().map(std::string::String::as_str),
+ )
+ }
+ };
let fut: Box<
dyn futures::future::Future<Item = (), Error = Error> + Send,
- > = if self.tls {
+ > = if self.client.tls {
let connector = native_tls::TlsConnector::new()
.context(crate::error::CreateConnector)?;
let connect: crate::client::Connector<_> = Box::new(move || {
@@ -107,11 +57,11 @@ impl crate::config::Config for Config {
)
});
Box::new(StreamSession::new(
- &self.command,
- &self.args,
+ &self.command.command,
+ &self.command.args,
connect,
- self.buffer_size,
- &self.auth,
+ self.command.buffer_size,
+ &auth,
))
} else {
let connect: crate::client::Connector<_> = Box::new(move || {
@@ -121,11 +71,11 @@ impl crate::config::Config for Config {
)
});
Box::new(StreamSession::new(
- &self.command,
- &self.args,
+ &self.command.command,
+ &self.command.args,
connect,
- self.buffer_size,
- &self.auth,
+ self.command.buffer_size,
+ &auth,
))
};
tokio::run(fut.map_err(|e| {
@@ -135,19 +85,6 @@ impl crate::config::Config for Config {
}
}
-impl Default for Config {
- fn default() -> Self {
- Self {
- auth: crate::config::default_auth(),
- connect_address: crate::config::default_connect_address(),
- tls: crate::config::default_tls(),
- buffer_size: crate::config::default_connection_buffer_size(),
- command: crate::config::default_command(),
- args: crate::config::default_args(),
- }
- }
-}
-
pub fn cmd<'a, 'b>(app: clap::App<'a, 'b>) -> clap::App<'a, 'b> {
app.about("Stream your terminal")
.arg(
diff --git a/src/cmd/watch.rs b/src/cmd/watch.rs
index 66a6881..62ef2e0 100644
--- a/src/cmd/watch.rs
+++ b/src/cmd/watch.rs
@@ -1,32 +1,9 @@
use crate::prelude::*;
use std::io::Write as _;
-#[derive(serde::Deserialize, Debug)]
+#[derive(serde::Deserialize, Debug, Default)]
pub struct Config {
- #[serde(
- deserialize_with = "crate::config::auth",
- default = "crate::config::default_auth"
- )]
- auth: crate::protocol::Auth,
-
- #[serde(
- deserialize_with = "crate::config::connect_address",
- default = "crate::config::default_connect_address"
- )]
- connect_address: (String, std::net::SocketAddr),
-
- #[serde(default = "crate::config::default_tls")]
- tls: bool,
-}
-
-impl Config {
- fn host(&self) -> &str {
- &self.connect_address.0
- }
-
- fn addr(&self) -> &std::net::SocketAddr {
- &self.connect_address.1
- }
+ client: crate::config::Client,
}
impl crate::config::Config for Config {
@@ -34,37 +11,31 @@ impl crate::config::Config for Config {
&mut self,
matches: &clap::ArgMatches<'a>,
) -> Result<()> {
- if matches.is_present("login-recurse-center") {
- let id = crate::oauth::load_client_auth_id(
- crate::protocol::AuthType::RecurseCenter,
- );
- self.auth = crate::protocol::Auth::recurse_center(
- id.as_ref().map(std::string::String::as_str),
- );
- }
- if matches.is_present("login-plain") {
- let username =
- matches.value_of("login-plain").unwrap().to_string();
- self.auth = crate::protocol::Auth::plain(&username);
- }
- if matches.is_present("address") {
- let address = matches.value_of("address").unwrap();
- self.connect_address =
- crate::config::to_connect_address(address)?;
- }
- if matches.is_present("tls") {
- self.tls = true;
- }
- Ok(())
+ self.client.merge_args(matches)
}
fn run(&self) -> Result<()> {
- let host = self.host().to_string();
- let address = *self.addr();
- let auth = self.auth.clone();
+ let host = self.client.host().to_string();
+ let address = *self.client.addr();
+ let auth = match self.client.auth {
+ crate::protocol::AuthType::Plain => {
+ let username = self
+ .client
+ .username
+ .clone()
+ .context(crate::error::CouldntFindUsername)?;
+ crate::protocol::Auth::plain(&username)
+ }
+ crate::protocol::AuthType::RecurseCenter => {
+ let id = crate::oauth::load_client_auth_id(self.client.auth);
+ crate::protocol::Auth::recurse_center(
+ id.as_ref().map(std::string::String::as_str),
+ )
+ }
+ };
let fut: Box<
dyn futures::future::Future<Item = (), Error = Error> + Send,
- > = if self.tls {
+ > = if self.client.tls {
let connector = native_tls::TlsConnector::new()
.context(crate::error::CreateConnector)?;
let make_connector: Box<
@@ -110,16 +81,6 @@ impl crate::config::Config for Config {
}
}
-impl Default for Config {
- fn default() -> Self {
- Self {
- auth: crate::config::default_auth(),
- connect_address: crate::config::default_connect_address(),
- tls: crate::config::default_tls(),
- }
- }
-}
-
pub fn cmd<'a, 'b>(app: clap::App<'a, 'b>) -> clap::App<'a, 'b> {
app.about("Watch teleterm streams")
.arg(