|
|
|
@@ -302,8 +302,7 @@ async fn main() -> Result<()> {
|
|
|
|
|
.get(&requested_server)
|
|
|
|
|
.cloned()
|
|
|
|
|
.unwrap_or_default();
|
|
|
|
|
let raw_server = host.ssh.clone().unwrap_or_else(|| requested_server.clone());
|
|
|
|
|
let server = ssh_with_user(&raw_server, host.user.as_deref());
|
|
|
|
|
let server = ssh_command_target(&requested_server, &host);
|
|
|
|
|
let startup_command = resolved_startup_command(&args.command, &config, &host);
|
|
|
|
|
let local_forwards = parse_local_forwards(&args.local_forward)?;
|
|
|
|
|
let remote_forwards = parse_remote_forwards(&args.remote_forward)?;
|
|
|
|
@@ -655,8 +654,7 @@ fn run_trust_command(config: &dosh::config::ClientConfig, args: &Args) -> Result
|
|
|
|
|
|
|
|
|
|
let hosts = load_hosts_config(None).unwrap_or_default();
|
|
|
|
|
let host_config = hosts.hosts.get(host).cloned().unwrap_or_default();
|
|
|
|
|
let raw_server = host_config.ssh.clone().unwrap_or_else(|| host.to_string());
|
|
|
|
|
let server = ssh_with_user(&raw_server, host_config.user.as_deref());
|
|
|
|
|
let server = ssh_command_target(host, &host_config);
|
|
|
|
|
let ssh_port = args.ssh_port.or(host_config.ssh_port).or(config.ssh_port);
|
|
|
|
|
let ssh_auth_command = args
|
|
|
|
|
.ssh_auth_command
|
|
|
|
@@ -701,8 +699,8 @@ async fn run_setup_command(config: &dosh::config::ClientConfig, args: &Args) ->
|
|
|
|
|
for entry in imported {
|
|
|
|
|
match entry.action {
|
|
|
|
|
ImportAction::Added => println!(
|
|
|
|
|
"[ok] host config: [{}] ssh={} dosh_host={} port={}",
|
|
|
|
|
entry.alias, entry.ssh, entry.dosh_host, entry.port
|
|
|
|
|
"[ok] host config: [{}] ssh={} ssh_config={} dosh_host={} port={}",
|
|
|
|
|
entry.alias, entry.ssh, entry.ssh_config, entry.dosh_host, entry.port
|
|
|
|
|
),
|
|
|
|
|
ImportAction::Skipped => println!("[ok] host config: [{}] already exists", entry.alias),
|
|
|
|
|
}
|
|
|
|
@@ -710,8 +708,7 @@ async fn run_setup_command(config: &dosh::config::ClientConfig, args: &Args) ->
|
|
|
|
|
|
|
|
|
|
let hosts = load_hosts_config(None).unwrap_or_default();
|
|
|
|
|
let host_config = hosts.hosts.get(&host).cloned().unwrap_or_default();
|
|
|
|
|
let raw_server = host_config.ssh.clone().unwrap_or_else(|| host.clone());
|
|
|
|
|
let server = ssh_with_user(&raw_server, host_config.user.as_deref());
|
|
|
|
|
let server = ssh_command_target(&host, &host_config);
|
|
|
|
|
let ssh_port = args.ssh_port.or(host_config.ssh_port).or(config.ssh_port);
|
|
|
|
|
let ssh_auth_command = args
|
|
|
|
|
.ssh_auth_command
|
|
|
|
@@ -843,9 +840,15 @@ fn run_restart_command(config: &dosh::config::ClientConfig, args: &Args) -> Resu
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn status_ssh_target(requested: &str, host_config: &dosh::config::HostConfig) -> String {
|
|
|
|
|
ssh_command_target(requested, host_config)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn ssh_command_target(requested: &str, host_config: &dosh::config::HostConfig) -> String {
|
|
|
|
|
let raw_server = host_config
|
|
|
|
|
.ssh
|
|
|
|
|
.clone()
|
|
|
|
|
.ssh_config
|
|
|
|
|
.as_ref()
|
|
|
|
|
.or(host_config.ssh.as_ref())
|
|
|
|
|
.cloned()
|
|
|
|
|
.unwrap_or_else(|| requested.to_string());
|
|
|
|
|
ssh_with_user(&raw_server, host_config.user.as_deref())
|
|
|
|
|
}
|
|
|
|
@@ -882,11 +885,7 @@ async fn run_doctor_for_host(
|
|
|
|
|
) -> Result<()> {
|
|
|
|
|
let hosts = load_hosts_config(None).unwrap_or_default();
|
|
|
|
|
let host_config = hosts.hosts.get(requested).cloned().unwrap_or_default();
|
|
|
|
|
let raw_server = host_config
|
|
|
|
|
.ssh
|
|
|
|
|
.clone()
|
|
|
|
|
.unwrap_or_else(|| requested.to_string());
|
|
|
|
|
let server = ssh_with_user(&raw_server, host_config.user.as_deref());
|
|
|
|
|
let server = ssh_command_target(requested, &host_config);
|
|
|
|
|
let ssh_port = args.ssh_port.or(host_config.ssh_port).or(config.ssh_port);
|
|
|
|
|
let dosh_port = args
|
|
|
|
|
.dosh_port
|
|
|
|
@@ -1393,8 +1392,7 @@ async fn run_proxy_stdio_command(config: &dosh::config::ClientConfig, args: &Arg
|
|
|
|
|
.get(&requested_server)
|
|
|
|
|
.cloned()
|
|
|
|
|
.unwrap_or_default();
|
|
|
|
|
let raw_server = host.ssh.clone().unwrap_or_else(|| requested_server.clone());
|
|
|
|
|
let server = ssh_with_user(&raw_server, host.user.as_deref());
|
|
|
|
|
let server = ssh_command_target(&requested_server, &host);
|
|
|
|
|
let ssh_port = args.ssh_port.or(host.ssh_port).or(config.ssh_port);
|
|
|
|
|
let resolved_ssh_config = ssh_config(&server, ssh_port).unwrap_or_default();
|
|
|
|
|
let requested_udp_host = args
|
|
|
|
@@ -1561,11 +1559,7 @@ fn ensure_vscode_ssh_host(
|
|
|
|
|
) -> Result<GeneratedVscodeHost> {
|
|
|
|
|
let hosts = load_hosts_config(None).unwrap_or_default();
|
|
|
|
|
let host_config = hosts.hosts.get(requested).cloned().unwrap_or_default();
|
|
|
|
|
let raw_server = host_config
|
|
|
|
|
.ssh
|
|
|
|
|
.clone()
|
|
|
|
|
.unwrap_or_else(|| requested.to_string());
|
|
|
|
|
let server = ssh_with_user(&raw_server, host_config.user.as_deref());
|
|
|
|
|
let server = ssh_command_target(requested, &host_config);
|
|
|
|
|
let ssh_port = args.ssh_port.or(host_config.ssh_port).or(config.ssh_port);
|
|
|
|
|
let ssh_config = ssh_config(&server, ssh_port).unwrap_or_default();
|
|
|
|
|
let target_ssh_port = ssh_config.port.or(ssh_port).unwrap_or(22);
|
|
|
|
@@ -2864,6 +2858,18 @@ impl UpdateRole {
|
|
|
|
|
UpdateRole::Both => "both",
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn installer_arg_for_os(self, os: &str) -> Result<&'static str> {
|
|
|
|
|
if os == "windows" {
|
|
|
|
|
return match self {
|
|
|
|
|
UpdateRole::Auto | UpdateRole::Client => Ok("client"),
|
|
|
|
|
UpdateRole::Server | UpdateRole::Both => {
|
|
|
|
|
Err(anyhow!("Windows installs support client updates only"))
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
Ok(self.installer_arg())
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
|
|
|
@@ -2932,6 +2938,18 @@ fn release_artifact_name() -> &'static str {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn update_installer_name(os: &str) -> &'static str {
|
|
|
|
|
if os == "windows" {
|
|
|
|
|
"install.ps1"
|
|
|
|
|
} else {
|
|
|
|
|
"install.sh"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn update_installer_url(raw_base: &str, os: &str) -> String {
|
|
|
|
|
format!("{raw_base}/raw/branch/main/{}", update_installer_name(os))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn latest_release_download_url(repo: &str, artifact: &str) -> Option<String> {
|
|
|
|
|
let web = repo
|
|
|
|
|
.strip_suffix(".git")
|
|
|
|
@@ -3044,9 +3062,10 @@ fn run_update(config: &dosh::config::ClientConfig, options: UpdateOptions) -> Re
|
|
|
|
|
.clone()
|
|
|
|
|
.unwrap_or_else(|| "https://git.palav.dev/Palav/dosh.git".to_string());
|
|
|
|
|
let raw_base = raw_base_from_repo(&repo);
|
|
|
|
|
let installer = format!("{raw_base}/raw/branch/main/install.sh");
|
|
|
|
|
let os = std::env::consts::OS;
|
|
|
|
|
let installer = update_installer_url(&raw_base, os);
|
|
|
|
|
let artifact = release_artifact_name();
|
|
|
|
|
let installer_role = options.role.installer_arg();
|
|
|
|
|
let installer_role = options.role.installer_arg_for_os(os)?;
|
|
|
|
|
if options.check_only {
|
|
|
|
|
let local_version = env!("CARGO_PKG_VERSION");
|
|
|
|
|
let latest_tag = latest_release_tag(&repo)?;
|
|
|
|
@@ -3089,13 +3108,78 @@ fn run_update(config: &dosh::config::ClientConfig, options: UpdateOptions) -> Re
|
|
|
|
|
.join("dosh")
|
|
|
|
|
.join("source");
|
|
|
|
|
let use_prebuilt = std::env::var("DOSH_USE_PREBUILT").unwrap_or_else(|_| "1".to_string());
|
|
|
|
|
let status = run_update_installer(
|
|
|
|
|
config,
|
|
|
|
|
&repo,
|
|
|
|
|
&installer,
|
|
|
|
|
installer_role,
|
|
|
|
|
&update_cache.display().to_string(),
|
|
|
|
|
&use_prebuilt,
|
|
|
|
|
)?;
|
|
|
|
|
if !status.success() {
|
|
|
|
|
return Err(anyhow!("dosh update failed with status {status}"));
|
|
|
|
|
}
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn run_update_installer(
|
|
|
|
|
config: &dosh::config::ClientConfig,
|
|
|
|
|
repo: &str,
|
|
|
|
|
installer: &str,
|
|
|
|
|
installer_role: &str,
|
|
|
|
|
update_cache: &str,
|
|
|
|
|
use_prebuilt: &str,
|
|
|
|
|
) -> Result<std::process::ExitStatus> {
|
|
|
|
|
if cfg!(windows) {
|
|
|
|
|
let script = windows_update_script(
|
|
|
|
|
config,
|
|
|
|
|
repo,
|
|
|
|
|
installer,
|
|
|
|
|
installer_role,
|
|
|
|
|
update_cache,
|
|
|
|
|
use_prebuilt,
|
|
|
|
|
);
|
|
|
|
|
return Command::new("powershell.exe")
|
|
|
|
|
.arg("-NoProfile")
|
|
|
|
|
.arg("-ExecutionPolicy")
|
|
|
|
|
.arg("Bypass")
|
|
|
|
|
.arg("-Command")
|
|
|
|
|
.arg(script)
|
|
|
|
|
.stdin(Stdio::null())
|
|
|
|
|
.status()
|
|
|
|
|
.context("run dosh update installer");
|
|
|
|
|
}
|
|
|
|
|
let script = unix_update_script(
|
|
|
|
|
config,
|
|
|
|
|
repo,
|
|
|
|
|
installer,
|
|
|
|
|
installer_role,
|
|
|
|
|
update_cache,
|
|
|
|
|
use_prebuilt,
|
|
|
|
|
);
|
|
|
|
|
Command::new("sh")
|
|
|
|
|
.arg("-c")
|
|
|
|
|
.arg(script)
|
|
|
|
|
.stdin(Stdio::null())
|
|
|
|
|
.status()
|
|
|
|
|
.context("run dosh update installer")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn unix_update_script(
|
|
|
|
|
config: &dosh::config::ClientConfig,
|
|
|
|
|
repo: &str,
|
|
|
|
|
installer: &str,
|
|
|
|
|
installer_role: &str,
|
|
|
|
|
update_cache: &str,
|
|
|
|
|
use_prebuilt: &str,
|
|
|
|
|
) -> String {
|
|
|
|
|
let mut script = format!(
|
|
|
|
|
"curl -fsSL {} | DOSH_REPO={} DOSH_PORT={} DOSH_UPDATE_CACHE={} DOSH_UPDATE_QUIET=1 DOSH_USE_PREBUILT={} sh -s -- {}",
|
|
|
|
|
shell_word(&installer),
|
|
|
|
|
shell_word(&repo),
|
|
|
|
|
shell_word(installer),
|
|
|
|
|
shell_word(repo),
|
|
|
|
|
config.update_port.unwrap_or(config.dosh_port),
|
|
|
|
|
shell_word(&update_cache.display().to_string()),
|
|
|
|
|
shell_word(&use_prebuilt),
|
|
|
|
|
shell_word(update_cache),
|
|
|
|
|
shell_word(use_prebuilt),
|
|
|
|
|
shell_word(installer_role)
|
|
|
|
|
);
|
|
|
|
|
if config.server != "user@example.com" {
|
|
|
|
@@ -3104,16 +3188,47 @@ fn run_update(config: &dosh::config::ClientConfig, options: UpdateOptions) -> Re
|
|
|
|
|
if let Some(host) = &config.dosh_host {
|
|
|
|
|
script.push_str(&format!(" --dosh-host {}", shell_word(host)));
|
|
|
|
|
}
|
|
|
|
|
let status = Command::new("sh")
|
|
|
|
|
.arg("-c")
|
|
|
|
|
.arg(script)
|
|
|
|
|
.stdin(Stdio::null())
|
|
|
|
|
.status()
|
|
|
|
|
.context("run dosh update installer")?;
|
|
|
|
|
if !status.success() {
|
|
|
|
|
return Err(anyhow!("dosh update failed with status {status}"));
|
|
|
|
|
script
|
|
|
|
|
}
|
|
|
|
|
Ok(())
|
|
|
|
|
|
|
|
|
|
fn windows_update_script(
|
|
|
|
|
config: &dosh::config::ClientConfig,
|
|
|
|
|
repo: &str,
|
|
|
|
|
installer: &str,
|
|
|
|
|
installer_role: &str,
|
|
|
|
|
update_cache: &str,
|
|
|
|
|
use_prebuilt: &str,
|
|
|
|
|
) -> String {
|
|
|
|
|
let mut script = String::from("$ErrorActionPreference='Stop';");
|
|
|
|
|
script.push_str("$ProgressPreference='SilentlyContinue';");
|
|
|
|
|
for (name, value) in [
|
|
|
|
|
("DOSH_REPO", repo),
|
|
|
|
|
("DOSH_ROLE", installer_role),
|
|
|
|
|
(
|
|
|
|
|
"DOSH_PORT",
|
|
|
|
|
&config.update_port.unwrap_or(config.dosh_port).to_string(),
|
|
|
|
|
),
|
|
|
|
|
("DOSH_UPDATE_CACHE", update_cache),
|
|
|
|
|
("DOSH_UPDATE_QUIET", "1"),
|
|
|
|
|
("DOSH_USE_PREBUILT", use_prebuilt),
|
|
|
|
|
] {
|
|
|
|
|
script.push_str(&format!("$env:{name}={};", powershell_string(value)));
|
|
|
|
|
}
|
|
|
|
|
if config.server != "user@example.com" {
|
|
|
|
|
script.push_str(&format!(
|
|
|
|
|
"$env:DOSH_SERVER={};",
|
|
|
|
|
powershell_string(&config.server)
|
|
|
|
|
));
|
|
|
|
|
}
|
|
|
|
|
if let Some(host) = &config.dosh_host {
|
|
|
|
|
script.push_str(&format!("$env:DOSH_HOST={};", powershell_string(host)));
|
|
|
|
|
}
|
|
|
|
|
script.push_str(&format!("irm {} | iex", powershell_string(installer)));
|
|
|
|
|
script
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn powershell_string(value: &str) -> String {
|
|
|
|
|
format!("'{}'", value.replace('\'', "''"))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
|
|
@@ -3126,6 +3241,7 @@ enum ImportAction {
|
|
|
|
|
struct ImportedHost {
|
|
|
|
|
alias: String,
|
|
|
|
|
ssh: String,
|
|
|
|
|
ssh_config: String,
|
|
|
|
|
dosh_host: String,
|
|
|
|
|
port: u16,
|
|
|
|
|
action: ImportAction,
|
|
|
|
@@ -3139,8 +3255,8 @@ fn run_import_ssh(config: &dosh::config::ClientConfig, aliases: &[String]) -> Re
|
|
|
|
|
for entry in imported {
|
|
|
|
|
match entry.action {
|
|
|
|
|
ImportAction::Added => eprintln!(
|
|
|
|
|
"dosh import-ssh: added [{}] ssh={} dosh_host={}",
|
|
|
|
|
entry.alias, entry.ssh, entry.dosh_host
|
|
|
|
|
"dosh import-ssh: added [{}] ssh={} ssh_config={} dosh_host={}",
|
|
|
|
|
entry.alias, entry.ssh, entry.ssh_config, entry.dosh_host
|
|
|
|
|
),
|
|
|
|
|
ImportAction::Skipped => {
|
|
|
|
|
eprintln!(
|
|
|
|
@@ -3182,6 +3298,7 @@ fn import_ssh_aliases(
|
|
|
|
|
imported.push(ImportedHost {
|
|
|
|
|
alias: alias.clone(),
|
|
|
|
|
ssh: alias.clone(),
|
|
|
|
|
ssh_config: alias.clone(),
|
|
|
|
|
dosh_host: udp_host,
|
|
|
|
|
port: config.dosh_port,
|
|
|
|
|
action: ImportAction::Skipped,
|
|
|
|
@@ -3191,6 +3308,7 @@ fn import_ssh_aliases(
|
|
|
|
|
raw.push('\n');
|
|
|
|
|
raw.push_str(&format!("[{}]\n", toml_bare_key_or_quoted(alias)));
|
|
|
|
|
raw.push_str(&format!("ssh = {}\n", toml_string(alias)));
|
|
|
|
|
raw.push_str(&format!("ssh_config = {}\n", toml_string(alias)));
|
|
|
|
|
raw.push_str(&format!("dosh_host = {}\n", toml_string(&udp_host)));
|
|
|
|
|
raw.push_str(&format!("port = {}\n", config.dosh_port));
|
|
|
|
|
if let Some(user) = &ssh_config.user {
|
|
|
|
@@ -3205,6 +3323,7 @@ fn import_ssh_aliases(
|
|
|
|
|
imported.push(ImportedHost {
|
|
|
|
|
alias: alias.clone(),
|
|
|
|
|
ssh: alias.clone(),
|
|
|
|
|
ssh_config: alias.clone(),
|
|
|
|
|
dosh_host: udp_host,
|
|
|
|
|
port: config.dosh_port,
|
|
|
|
|
action: ImportAction::Added,
|
|
|
|
@@ -7652,9 +7771,10 @@ mod tests {
|
|
|
|
|
server_version_mismatch, should_flush_terminal_input_after_contact,
|
|
|
|
|
should_hold_during_startup_gate, should_hold_post_submit_input,
|
|
|
|
|
should_repaint_idle_alternate_screen, split_after_command_submit, ssh_destination_host,
|
|
|
|
|
ssh_username, ssh_with_user, startup_command, status_ssh_target, strip_stale_mouse_reports,
|
|
|
|
|
strip_terminal_focus_reports, terminal_private_mode_transition, toml_bare_key_or_quoted,
|
|
|
|
|
update_version_status, upsert_managed_block, valid_forward_host, vscode_safe_alias,
|
|
|
|
|
ssh_username, ssh_with_user, ssh_command_target, startup_command, status_ssh_target,
|
|
|
|
|
strip_stale_mouse_reports, strip_terminal_focus_reports, terminal_private_mode_transition,
|
|
|
|
|
toml_bare_key_or_quoted, unix_update_script, update_installer_url, update_version_status,
|
|
|
|
|
upsert_managed_block, valid_forward_host, vscode_safe_alias, windows_update_script,
|
|
|
|
|
};
|
|
|
|
|
use dosh::config::{ClientConfig, CommandExtension, HostConfig};
|
|
|
|
|
use dosh::native::EnvVar;
|
|
|
|
@@ -8801,6 +8921,83 @@ mod tests {
|
|
|
|
|
assert!(parse_update_options(&["--client".to_string(), "--server".to_string()]).is_err());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn update_installer_uses_platform_native_script() {
|
|
|
|
|
assert_eq!(
|
|
|
|
|
update_installer_url("https://git.palav.dev/Palav/dosh", "linux"),
|
|
|
|
|
"https://git.palav.dev/Palav/dosh/raw/branch/main/install.sh"
|
|
|
|
|
);
|
|
|
|
|
assert_eq!(
|
|
|
|
|
update_installer_url("https://git.palav.dev/Palav/dosh", "macos"),
|
|
|
|
|
"https://git.palav.dev/Palav/dosh/raw/branch/main/install.sh"
|
|
|
|
|
);
|
|
|
|
|
assert_eq!(
|
|
|
|
|
update_installer_url("https://git.palav.dev/Palav/dosh", "windows"),
|
|
|
|
|
"https://git.palav.dev/Palav/dosh/raw/branch/main/install.ps1"
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn windows_update_roles_are_client_only() {
|
|
|
|
|
assert_eq!(
|
|
|
|
|
UpdateRole::Auto.installer_arg_for_os("windows").unwrap(),
|
|
|
|
|
"client"
|
|
|
|
|
);
|
|
|
|
|
assert_eq!(
|
|
|
|
|
UpdateRole::Client.installer_arg_for_os("windows").unwrap(),
|
|
|
|
|
"client"
|
|
|
|
|
);
|
|
|
|
|
assert!(UpdateRole::Server.installer_arg_for_os("windows").is_err());
|
|
|
|
|
assert!(UpdateRole::Both.installer_arg_for_os("windows").is_err());
|
|
|
|
|
assert_eq!(
|
|
|
|
|
UpdateRole::Both.installer_arg_for_os("linux").unwrap(),
|
|
|
|
|
"both"
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn update_scripts_are_native_to_the_platform() {
|
|
|
|
|
let config = ClientConfig {
|
|
|
|
|
server: "palav".to_string(),
|
|
|
|
|
dosh_host: Some("dosh.example.com".to_string()),
|
|
|
|
|
dosh_port: 50000,
|
|
|
|
|
update_port: Some(50001),
|
|
|
|
|
..ClientConfig::default()
|
|
|
|
|
};
|
|
|
|
|
let unix = unix_update_script(
|
|
|
|
|
&config,
|
|
|
|
|
"https://git.palav.dev/Palav/dosh.git",
|
|
|
|
|
"https://git.palav.dev/Palav/dosh/raw/branch/main/install.sh",
|
|
|
|
|
"both",
|
|
|
|
|
"/tmp/dosh-cache",
|
|
|
|
|
"1",
|
|
|
|
|
);
|
|
|
|
|
assert!(unix.contains("curl -fsSL"));
|
|
|
|
|
assert!(unix.contains("install.sh"));
|
|
|
|
|
assert!(unix.contains("sh -s -- 'both'"));
|
|
|
|
|
assert!(unix.contains("--server 'palav'"));
|
|
|
|
|
assert!(unix.contains("--dosh-host 'dosh.example.com'"));
|
|
|
|
|
|
|
|
|
|
let windows = windows_update_script(
|
|
|
|
|
&config,
|
|
|
|
|
"https://git.palav.dev/Palav/dosh.git",
|
|
|
|
|
"https://git.palav.dev/Palav/dosh/raw/branch/main/install.ps1",
|
|
|
|
|
"client",
|
|
|
|
|
"C:\\Users\\palav\\AppData\\Local\\dosh\\source",
|
|
|
|
|
"1",
|
|
|
|
|
);
|
|
|
|
|
assert!(
|
|
|
|
|
windows.contains(
|
|
|
|
|
"irm 'https://git.palav.dev/Palav/dosh/raw/branch/main/install.ps1' | iex"
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
assert!(windows.contains("$env:DOSH_ROLE='client';"));
|
|
|
|
|
assert!(windows.contains("$env:DOSH_SERVER='palav';"));
|
|
|
|
|
assert!(windows.contains("$env:DOSH_HOST='dosh.example.com';"));
|
|
|
|
|
assert!(!windows.contains("install.sh"));
|
|
|
|
|
assert!(!windows.contains(" sh -s "));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn status_uses_host_alias_and_user() {
|
|
|
|
|
let host = HostConfig {
|
|
|
|
@@ -8818,6 +9015,19 @@ mod tests {
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn ssh_command_target_prefers_explicit_ssh_config_alias() {
|
|
|
|
|
let host = HostConfig {
|
|
|
|
|
ssh: Some("server.example.com".to_string()),
|
|
|
|
|
ssh_config: Some("work-alias".to_string()),
|
|
|
|
|
user: Some("alice".to_string()),
|
|
|
|
|
..HostConfig::default()
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
assert_eq!(ssh_command_target("work", &host), "alice@work-alias");
|
|
|
|
|
assert_eq!(status_ssh_target("work", &host), "alice@work-alias");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn status_detects_local_targets() {
|
|
|
|
|
assert!(is_local_status_target("localhost"));
|
|
|
|
|