Files
topgrade/src/steps/remote/ssh.rs

47 lines
1.5 KiB
Rust
Raw Normal View History

2020-08-22 14:46:17 +03:00
#[cfg(unix)]
use crate::error::SkipStep;
use crate::{execution_context::ExecutionContext, terminal::print_separator, utils};
use anyhow::Result;
pub fn ssh_step(ctx: &ExecutionContext, hostname: &str) -> Result<()> {
let ssh = utils::require("ssh")?;
let topgrade = ctx.config().remote_topgrade_path();
if ctx.config().run_in_tmux() && !ctx.run_type().dry() {
#[cfg(unix)]
{
let command = format!(
"{ssh} -t {hostname} env TOPGRADE_PREFIX={hostname} TOPGRADE_KEEP_END=1 {topgrade}",
ssh = ssh.display(),
hostname = hostname,
topgrade = topgrade
);
crate::tmux::run_command(ctx, &command)?;
Err(SkipStep(String::from("Remote Topgrade launched in Tmux")).into())
}
#[cfg(not(unix))]
unreachable!("Tmux execution is only implemented in Unix");
} else {
let mut args = vec!["-t", hostname];
if let Some(ssh_arguments) = ctx.config().ssh_arguments() {
args.extend(ssh_arguments.split_whitespace());
}
let env = format!("TOPGRADE_PREFIX={}", hostname);
args.extend(&["env", &env, topgrade]);
if ctx.config().yes() {
args.push("-y");
}
print_separator(format!("Remote ({})", hostname));
println!("Connecting to {}...", hostname);
ctx.run_type().execute(&ssh).args(&args).check_run()
}
}