improve ssh
This commit is contained in:
parent
88c2cfbd8e
commit
8cc457dffc
2 changed files with 36 additions and 15 deletions
|
@ -169,11 +169,22 @@ pub fn lookup_name_with_locale(
|
||||||
/// # Errors
|
/// # Errors
|
||||||
/// * No action in menu item
|
/// * No action in menu item
|
||||||
/// * Cannot run command (i.e. not found)
|
/// * Cannot run command (i.e. not found)
|
||||||
|
/// # Panics
|
||||||
|
/// When internal regex unwrapping fails. Should not happen as the regex is static
|
||||||
pub fn spawn_fork(cmd: &str, working_dir: Option<&String>) -> Result<(), Error> {
|
pub fn spawn_fork(cmd: &str, working_dir: Option<&String>) -> Result<(), Error> {
|
||||||
// todo fix actions ??
|
let re = Regex::new(r#"'([^']*)'|"([^"]*)"|(\S+)"#).expect("invalid regex in spawn_fork");
|
||||||
// todo graphical disk map icon not working
|
let parts: Vec<String> = re
|
||||||
|
.captures_iter(cmd)
|
||||||
|
.map(|cap| {
|
||||||
|
cap.get(1)
|
||||||
|
.or_else(|| cap.get(2))
|
||||||
|
.or_else(|| cap.get(3))
|
||||||
|
.unwrap()
|
||||||
|
.as_str()
|
||||||
|
.to_string()
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
let parts = cmd.split(' ').collect::<Vec<_>>();
|
|
||||||
if parts.is_empty() {
|
if parts.is_empty() {
|
||||||
return Err(Error::MissingAction);
|
return Err(Error::MissingAction);
|
||||||
}
|
}
|
||||||
|
|
|
@ -299,7 +299,7 @@ struct SshProvider<T: Clone> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Clone> SshProvider<T> {
|
impl<T: Clone> SshProvider<T> {
|
||||||
fn new(menu_item_data: T, config: &Config) -> Self {
|
fn new(menu_item_data: T) -> Self {
|
||||||
let re = Regex::new(r"(?m)^\s*Host\s+(.+)$").unwrap();
|
let re = Regex::new(r"(?m)^\s*Host\s+(.+)$").unwrap();
|
||||||
let items: Vec<_> = dirs::home_dir()
|
let items: Vec<_> = dirs::home_dir()
|
||||||
.map(|home| home.join(".ssh").join("config"))
|
.map(|home| home.join(".ssh").join("config"))
|
||||||
|
@ -316,7 +316,7 @@ impl<T: Clone> SshProvider<T> {
|
||||||
MenuItem::new(
|
MenuItem::new(
|
||||||
host.to_owned(),
|
host.to_owned(),
|
||||||
Some("computer".to_owned()),
|
Some("computer".to_owned()),
|
||||||
config.term.clone().map(|cmd| format!("{cmd} ssh {host}")),
|
Some(format!("ssh {host}")),
|
||||||
vec![],
|
vec![],
|
||||||
None,
|
None,
|
||||||
0.0,
|
0.0,
|
||||||
|
@ -457,12 +457,12 @@ struct AutoItemProvider {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AutoItemProvider {
|
impl AutoItemProvider {
|
||||||
fn new(config: &Config) -> Self {
|
fn new() -> Self {
|
||||||
AutoItemProvider {
|
AutoItemProvider {
|
||||||
drun: DRunProvider::new(AutoRunType::DRun),
|
drun: DRunProvider::new(AutoRunType::DRun),
|
||||||
file: FileItemProvider::new(AutoRunType::File),
|
file: FileItemProvider::new(AutoRunType::File),
|
||||||
math: MathProvider::new(AutoRunType::Math),
|
math: MathProvider::new(AutoRunType::Math),
|
||||||
ssh: SshProvider::new(AutoRunType::Ssh, config),
|
ssh: SshProvider::new(AutoRunType::Ssh),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -485,7 +485,10 @@ impl ItemProvider<AutoRunType> for AutoItemProvider {
|
||||||
} else if trimmed_search.starts_with("ssh") {
|
} else if trimmed_search.starts_with("ssh") {
|
||||||
self.ssh.get_elements(search_opt)
|
self.ssh.get_elements(search_opt)
|
||||||
} else {
|
} else {
|
||||||
self.drun.get_elements(search_opt)
|
// return ssh and drun items
|
||||||
|
let mut drun = self.drun.get_elements(search_opt);
|
||||||
|
drun.append(&mut self.ssh.get_elements(search_opt));
|
||||||
|
drun
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
self.drun.get_elements(search_opt)
|
self.drun.get_elements(search_opt)
|
||||||
|
@ -527,7 +530,7 @@ pub fn d_run(config: &Config) -> Result<(), Error> {
|
||||||
/// Will return `Err`
|
/// Will return `Err`
|
||||||
/// * if it was not able to spawn the process
|
/// * if it was not able to spawn the process
|
||||||
pub fn auto(config: &Config) -> Result<(), Error> {
|
pub fn auto(config: &Config) -> Result<(), Error> {
|
||||||
let mut provider = AutoItemProvider::new(config);
|
let mut provider = AutoItemProvider::new();
|
||||||
let cache_path = provider.drun.cache_path.clone();
|
let cache_path = provider.drun.cache_path.clone();
|
||||||
let mut cache = provider.drun.cache.clone();
|
let mut cache = provider.drun.cache.clone();
|
||||||
let mut cfg_clone = config.clone();
|
let mut cfg_clone = config.clone();
|
||||||
|
@ -596,18 +599,25 @@ pub fn file(config: &Config) -> Result<(), Error> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn ssh_launch<T: Clone>(menu_item: &MenuItem<T>, config: &Config) -> Result<(), Error> {
|
fn ssh_launch<T: Clone>(menu_item: &MenuItem<T>, config: &Config) -> Result<(), Error> {
|
||||||
if let Some(action) = &menu_item.action {
|
let ssh_cmd = if let Some(action) = &menu_item.action {
|
||||||
spawn_fork(action, None)?;
|
action.clone()
|
||||||
} else {
|
} else {
|
||||||
let cmd = config
|
let cmd = config
|
||||||
.term
|
.term
|
||||||
.clone()
|
.clone()
|
||||||
.map(|s| format!("{s} ssh {}", menu_item.label));
|
.map(|s| format!("{s} ssh {}", menu_item.label));
|
||||||
if let Some(cmd) = cmd {
|
if let Some(cmd) = cmd {
|
||||||
spawn_fork(&cmd, None)?;
|
cmd
|
||||||
|
} else {
|
||||||
|
return Err(Error::MissingAction);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
Err(Error::MissingAction)
|
|
||||||
|
let cmd = format!(
|
||||||
|
"{} bash -c \"source ~/.bashrc; {ssh_cmd}\"",
|
||||||
|
config.term.clone().unwrap_or_default()
|
||||||
|
);
|
||||||
|
spawn_fork(&cmd, menu_item.working_dir.as_ref())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Shows the ssh mode
|
/// Shows the ssh mode
|
||||||
|
@ -617,7 +627,7 @@ fn ssh_launch<T: Clone>(menu_item: &MenuItem<T>, config: &Config) -> Result<(),
|
||||||
/// * if it was not able to spawn the process
|
/// * if it was not able to spawn the process
|
||||||
/// * if it didn't find a terminal
|
/// * if it didn't find a terminal
|
||||||
pub fn ssh(config: &Config) -> Result<(), Error> {
|
pub fn ssh(config: &Config) -> Result<(), Error> {
|
||||||
let provider = SshProvider::new(String::new(), config);
|
let provider = SshProvider::new(String::new());
|
||||||
let selection_result = gui::show(config.clone(), provider, true);
|
let selection_result = gui::show(config.clone(), provider, true);
|
||||||
if let Ok(mi) = selection_result {
|
if let Ok(mi) = selection_result {
|
||||||
ssh_launch(&mi, config)?;
|
ssh_launch(&mi, config)?;
|
||||||
|
|
Loading…
Add table
Reference in a new issue