Compare commits
7
Commits
d51cc248e7
..
v0.1.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
013d653f99 | ||
|
|
4e7e4cff10 | ||
|
|
fbad776441 | ||
|
|
90d9b583c0 | ||
|
|
f7c4ebaaf7 | ||
|
|
27419f4ca8 | ||
|
|
ec2422bc3e |
@@ -110,7 +110,7 @@ Install the client on macOS:
|
||||
|
||||
```bash
|
||||
curl -fsSL https://git.palav.dev/Palav/dosh/raw/branch/main/install.sh \
|
||||
| DOSH_REPO=https://git.palav.dev/Palav/dosh.git DOSH_SERVER=palav DOSH_HOST=git.palav.dev DOSH_PORT=50000 sh -s -- client
|
||||
| DOSH_REPO=https://git.palav.dev/Palav/dosh.git DOSH_PORT=50000 sh -s -- client
|
||||
```
|
||||
|
||||
Update an installed client later:
|
||||
@@ -130,21 +130,22 @@ verifies the archive before installing it.
|
||||
Install the client on Windows PowerShell:
|
||||
|
||||
```powershell
|
||||
$env:DOSH_REPO="https://git.palav.dev/Palav/dosh.git"; $env:DOSH_SERVER="palav"; $env:DOSH_HOST="git.palav.dev"; $env:DOSH_PORT="50000"; irm https://git.palav.dev/Palav/dosh/raw/branch/main/install.ps1 | iex
|
||||
$env:DOSH_REPO="https://git.palav.dev/Palav/dosh.git"; $env:DOSH_PORT="50000"; irm https://git.palav.dev/Palav/dosh/raw/branch/main/install.ps1 | iex
|
||||
```
|
||||
|
||||
Attach:
|
||||
|
||||
```bash
|
||||
dosh palav
|
||||
dosh user@server.example.com
|
||||
```
|
||||
|
||||
Plain `dosh palav` opens a fresh terminal session. Use named sessions when you want
|
||||
to reattach to the same persistent terminal from multiple clients:
|
||||
Plain `dosh user@server.example.com` opens a fresh terminal session. Use named
|
||||
sessions when you want to reattach to the same persistent terminal from multiple
|
||||
clients:
|
||||
|
||||
```bash
|
||||
dosh --session work palav
|
||||
dosh --session logs palav
|
||||
dosh --session work user@server.example.com
|
||||
dosh --session logs user@server.example.com
|
||||
```
|
||||
|
||||
Press `Ctrl-]` to detach the current client while leaving the server session alive.
|
||||
@@ -170,7 +171,8 @@ UDP host from an SSH alias when `dosh_host` is not configured. To make that expl
|
||||
in Dosh's host config:
|
||||
|
||||
```bash
|
||||
dosh import-ssh palav homelab
|
||||
dosh import-ssh homelab
|
||||
dosh homelab
|
||||
```
|
||||
|
||||
Optional command extensions are just config-side startup shortcuts; Dosh has no
|
||||
@@ -184,12 +186,12 @@ command = "tm {args}"
|
||||
description = "Open the server-side tmux dashboard"
|
||||
```
|
||||
|
||||
Then `dosh palav tm` sends `tm`, and `dosh palav tm dosh` sends `tm 'dosh'`.
|
||||
Then `dosh homelab tm` sends `tm`, and `dosh homelab tm dosh` sends `tm 'dosh'`.
|
||||
Remove that table to remove the integration. Hosts can override or opt out:
|
||||
|
||||
```toml
|
||||
# ~/.config/dosh/hosts.toml
|
||||
[palav.extensions.tm]
|
||||
[homelab.extensions.tm]
|
||||
command = "/opt/tm/bin/tm {args}"
|
||||
|
||||
[other-host.extensions.tm]
|
||||
|
||||
@@ -95,7 +95,7 @@ Dosh also calls `ssh -G <alias>` to infer the UDP target host when no `dosh_host
|
||||
configured. To write explicit Dosh host entries from SSH aliases:
|
||||
|
||||
```bash
|
||||
dosh import-ssh palav homelab
|
||||
dosh import-ssh homelab
|
||||
```
|
||||
|
||||
This appends entries to `~/.config/dosh/hosts.toml` without trying to become an
|
||||
@@ -112,12 +112,12 @@ command = "tm {args}"
|
||||
description = "Open the server-side tmux dashboard"
|
||||
```
|
||||
|
||||
With that config, `dosh palav tm` runs `tm` in the remote Dosh shell and
|
||||
`dosh palav tm dosh` runs `tm 'dosh'`. Removing the table removes the integration.
|
||||
With that config, `dosh homelab tm` runs `tm` in the remote Dosh shell and
|
||||
`dosh homelab tm dosh` runs `tm 'dosh'`. Removing the table removes the integration.
|
||||
Host config can override a global extension, or disable it:
|
||||
|
||||
```toml
|
||||
[palav.extensions.tm]
|
||||
[homelab.extensions.tm]
|
||||
command = "/opt/tm/bin/tm {args}"
|
||||
|
||||
[other-host.extensions.tm]
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
# Dosh Release Evidence - 2026-06-20
|
||||
|
||||
Code benchmarked: `b44ff8e Improve release and benchmark tooling`
|
||||
Runtime code benchmarked: `b44ff8e Improve release and benchmark tooling`
|
||||
|
||||
Release docs/default cleanup after that benchmark removed personal host aliases from
|
||||
public examples and test fixtures; it did not change release runtime paths.
|
||||
|
||||
Environment:
|
||||
|
||||
@@ -21,8 +24,10 @@ Artifacts:
|
||||
|
||||
| artifact | sha256 |
|
||||
| --- | --- |
|
||||
| `dosh-linux-x86_64.tar.gz` | `f421ee56aac61892c9e152d2ef018cf95eb35dec2ca1b2b5cc82eeb1fcc12911` |
|
||||
| `dosh-0.1.0-linux-x86_64.tar.gz` | `f421ee56aac61892c9e152d2ef018cf95eb35dec2ca1b2b5cc82eeb1fcc12911` |
|
||||
| `dosh-linux-x86_64.tar.gz` | `9f586852a506cca3caf618743e12967265879ee10f5294d179cdcd668db1e808` |
|
||||
| `dosh-0.1.0-linux-x86_64.tar.gz` | `9f586852a506cca3caf618743e12967265879ee10f5294d179cdcd668db1e808` |
|
||||
| `dosh-macos-aarch64.tar.gz` | `dd1151aa2b40be37288dc19a07521b0ec72d1106439eb484cdff01cca3b891c6` |
|
||||
| `dosh-0.1.0-macos-aarch64.tar.gz` | `dd1151aa2b40be37288dc19a07521b0ec72d1106439eb484cdff01cca3b891c6` |
|
||||
|
||||
The installer verifies `<artifact>.sha256` when the sidecar is published.
|
||||
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@ param(
|
||||
[string]$DoshHost = $(if ($env:DOSH_HOST) { $env:DOSH_HOST } else { $env:DOSH_DOSH_HOST }),
|
||||
[int]$Port = $(if ($env:DOSH_PORT) { [int]$env:DOSH_PORT } else { 50000 }),
|
||||
[string]$Prefix = $(if ($env:PREFIX) { $env:PREFIX } else { Join-Path $HOME ".local" }),
|
||||
[switch]$UsePrebuilt = $($env:DOSH_USE_PREBUILT -and $env:DOSH_USE_PREBUILT -ne "0"),
|
||||
[switch]$UsePrebuilt = $(-not $env:DOSH_USE_PREBUILT -or $env:DOSH_USE_PREBUILT -ne "0"),
|
||||
[string]$BinaryUrl = $env:DOSH_BINARY_URL,
|
||||
[string]$BinaryBase = $env:DOSH_BINARY_BASE,
|
||||
[string]$BinaryName = $env:DOSH_BINARY_NAME,
|
||||
|
||||
+32
-9
@@ -12,7 +12,7 @@ start_server=1
|
||||
force_config=0
|
||||
update_cache="${DOSH_UPDATE_CACHE:-$HOME/.cache/dosh/source}"
|
||||
quiet="${DOSH_UPDATE_QUIET:-0}"
|
||||
use_prebuilt="${DOSH_USE_PREBUILT:-0}"
|
||||
use_prebuilt="${DOSH_USE_PREBUILT:-1}"
|
||||
binary_url="${DOSH_BINARY_URL:-}"
|
||||
binary_base="${DOSH_BINARY_BASE:-}"
|
||||
binary_name="${DOSH_BINARY_NAME:-}"
|
||||
@@ -38,8 +38,8 @@ Options:
|
||||
Environment alternatives:
|
||||
DOSH_REPO, DOSH_ROLE, DOSH_SERVER, DOSH_HOST, DOSH_PORT, PREFIX,
|
||||
DOSH_UPDATE_CACHE
|
||||
DOSH_USE_PREBUILT=1
|
||||
Try a release tarball before building from source
|
||||
DOSH_USE_PREBUILT=0
|
||||
Build from source instead of trying a release tarball first
|
||||
DOSH_BINARY_URL URL
|
||||
Exact release tarball URL to install
|
||||
DOSH_BINARY_BASE URL
|
||||
@@ -204,6 +204,24 @@ release_download_url() {
|
||||
fi
|
||||
}
|
||||
|
||||
release_latest_tag_download_url() {
|
||||
if [ -n "$binary_url" ] || [ -n "$binary_base" ] || [ "$binary_version" != "latest" ] || [ -z "$repo" ]; then
|
||||
return 1
|
||||
fi
|
||||
web_base="$(repo_web_base "$repo")" || return 1
|
||||
latest_url="$(curl -fsSL -o /dev/null -w '%{url_effective}' "$web_base/releases/latest" 2>/dev/null || true)"
|
||||
case "$latest_url" in
|
||||
"$web_base"/releases/tag/*)
|
||||
tag="${latest_url##"$web_base"/releases/tag/}"
|
||||
[ -n "$tag" ] || return 1
|
||||
printf '%s/releases/download/%s/%s\n' "$web_base" "$tag" "$(release_artifact_name)"
|
||||
;;
|
||||
*)
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
find_extracted_binary() {
|
||||
find "$1" -type f -name "$2" 2>/dev/null | sed -n '1p'
|
||||
}
|
||||
@@ -254,9 +272,14 @@ try_install_prebuilt() {
|
||||
[ "$quiet" = "1" ] && echo "Trying Dosh prebuilt $(release_artifact_name)"
|
||||
need curl
|
||||
need tar
|
||||
if ! curl -fL "$download_url" -o "$archive"; then
|
||||
echo "prebuilt unavailable: $download_url" >&2
|
||||
return 1
|
||||
if ! curl -fsL "$download_url" -o "$archive" 2>/dev/null; then
|
||||
alt_download_url="$(release_latest_tag_download_url || true)"
|
||||
if [ -z "$alt_download_url" ] || ! curl -fsL "$alt_download_url" -o "$archive"; then
|
||||
echo "prebuilt unavailable: $download_url" >&2
|
||||
[ -z "$alt_download_url" ] || echo "prebuilt unavailable: $alt_download_url" >&2
|
||||
return 1
|
||||
fi
|
||||
download_url="$alt_download_url"
|
||||
fi
|
||||
verify_archive_checksum "$download_url" "$archive" "$checksum_file" || return 1
|
||||
mkdir -p "$tmpdir/extract"
|
||||
@@ -482,9 +505,9 @@ EOF
|
||||
fi
|
||||
cat >"$hosts_config" <<EOF
|
||||
# Example:
|
||||
# [palav]
|
||||
# ssh = "palav"
|
||||
# dosh_host = "palav.dev"
|
||||
# [homelab]
|
||||
# ssh = "homelab"
|
||||
# dosh_host = "server.example.com"
|
||||
# port = 50000
|
||||
# default_command = "tm"
|
||||
# predict = true
|
||||
|
||||
@@ -171,7 +171,7 @@ dosh doctor homelab # host resolution, trust state, UDP reachability, server
|
||||
dosh sessions homelab # list live sessions
|
||||
dosh trust homelab # fetch + pin the Dosh host key (via SSH fallback)
|
||||
dosh trust --remove homelab
|
||||
dosh import-ssh palav homelab # write a hosts.toml entry from an SSH alias
|
||||
dosh import-ssh homelab # write a hosts.toml entry from an SSH alias
|
||||
dosh update # update the installed client
|
||||
```
|
||||
|
||||
|
||||
@@ -44,12 +44,21 @@ api="$base/api/v1/repos/$repo"
|
||||
auth_header="Authorization: token $token"
|
||||
|
||||
release_json="$(curl -fsS -H "$auth_header" "$api/releases/tags/$tag" || true)"
|
||||
release_id="$(printf '%s\n' "$release_json" | sed -n 's/.*"id":[[:space:]]*\([0-9][0-9]*\).*/\1/p' | sed -n '1p')"
|
||||
release_id=""
|
||||
if [ -n "$release_json" ] && command -v jq >/dev/null 2>&1; then
|
||||
release_id="$(printf '%s\n' "$release_json" | jq -r '.id // empty')"
|
||||
elif [ -n "$release_json" ]; then
|
||||
release_id="$(printf '%s\n' "$release_json" | sed -n 's/^[[:space:]]*{"id":[[:space:]]*\([0-9][0-9]*\).*/\1/p' | sed -n '1p')"
|
||||
fi
|
||||
|
||||
if [ -z "$release_id" ]; then
|
||||
payload="$(printf '{"tag_name":"%s","target_commitish":"main","name":"%s","body":"Dosh release %s","draft":false,"prerelease":false}\n' "$tag" "$title" "$tag")"
|
||||
release_json="$(curl -fsS -H "$auth_header" -H 'Content-Type: application/json' -X POST "$api/releases" -d "$payload")"
|
||||
release_id="$(printf '%s\n' "$release_json" | sed -n 's/.*"id":[[:space:]]*\([0-9][0-9]*\).*/\1/p' | sed -n '1p')"
|
||||
if command -v jq >/dev/null 2>&1; then
|
||||
release_id="$(printf '%s\n' "$release_json" | jq -r '.id // empty')"
|
||||
else
|
||||
release_id="$(printf '%s\n' "$release_json" | sed -n 's/^[[:space:]]*{"id":[[:space:]]*\([0-9][0-9]*\).*/\1/p' | sed -n '1p')"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$release_id" ]; then
|
||||
@@ -57,11 +66,29 @@ if [ -z "$release_id" ]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
delete_existing_asset() {
|
||||
name="$1"
|
||||
if ! command -v jq >/dev/null 2>&1; then
|
||||
return 0
|
||||
fi
|
||||
printf '%s\n' "$release_json" \
|
||||
| jq -r --arg name "$name" '.assets[]? | select(.name == $name) | .id' \
|
||||
| while IFS= read -r asset_id; do
|
||||
[ -n "$asset_id" ] || continue
|
||||
echo "replacing $name"
|
||||
curl -fsS \
|
||||
-H "$auth_header" \
|
||||
-X DELETE \
|
||||
"$api/releases/$release_id/assets/$asset_id" >/dev/null
|
||||
done
|
||||
}
|
||||
|
||||
for artifact in "$@"; do
|
||||
if [ ! -f "$artifact" ]; then
|
||||
continue
|
||||
fi
|
||||
name="$(basename "$artifact")"
|
||||
delete_existing_asset "$name"
|
||||
echo "uploading $name"
|
||||
curl -fsS \
|
||||
-H "$auth_header" \
|
||||
|
||||
+57
-21
@@ -1110,6 +1110,38 @@ fn latest_release_download_url(repo: &str, artifact: &str) -> Option<String> {
|
||||
Some(format!("{web}/releases/latest/download/{artifact}"))
|
||||
}
|
||||
|
||||
fn latest_release_tag_download_url(repo: &str, artifact: &str) -> Result<Option<String>> {
|
||||
let web = repo
|
||||
.strip_suffix(".git")
|
||||
.unwrap_or(repo)
|
||||
.trim_end_matches('/');
|
||||
if !web.starts_with("http://") && !web.starts_with("https://") {
|
||||
return Ok(None);
|
||||
}
|
||||
let output = Command::new("curl")
|
||||
.arg("-fsSL")
|
||||
.arg("-o")
|
||||
.arg("/dev/null")
|
||||
.arg("-w")
|
||||
.arg("%{url_effective}")
|
||||
.arg(format!("{web}/releases/latest"))
|
||||
.stdin(Stdio::null())
|
||||
.output()
|
||||
.with_context(|| format!("resolve latest release for {web}"))?;
|
||||
if !output.status.success() {
|
||||
return Ok(None);
|
||||
}
|
||||
let effective = String::from_utf8_lossy(&output.stdout);
|
||||
let prefix = format!("{web}/releases/tag/");
|
||||
let Some(tag) = effective.strip_prefix(&prefix) else {
|
||||
return Ok(None);
|
||||
};
|
||||
if tag.is_empty() {
|
||||
return Ok(None);
|
||||
}
|
||||
Ok(Some(format!("{web}/releases/download/{tag}/{artifact}")))
|
||||
}
|
||||
|
||||
fn url_reachable(url: &str) -> Result<bool> {
|
||||
let status = Command::new("curl")
|
||||
.arg("-fsIL")
|
||||
@@ -1130,19 +1162,23 @@ fn run_update(config: &dosh::config::ClientConfig, check_only: bool) -> Result<(
|
||||
let raw_base = raw_base_from_repo(&repo);
|
||||
let installer = format!("{raw_base}/raw/branch/main/install.sh");
|
||||
let artifact = release_artifact_name();
|
||||
let binary_url = latest_release_download_url(&repo, artifact);
|
||||
if check_only {
|
||||
println!("dosh {}", env!("CARGO_PKG_VERSION"));
|
||||
println!("repo: {repo}");
|
||||
println!("installer: {installer}");
|
||||
if let Some(binary_url) = &binary_url {
|
||||
let status = if url_reachable(binary_url)? {
|
||||
"available"
|
||||
} else {
|
||||
"missing"
|
||||
};
|
||||
if let Some(latest_url) = latest_release_download_url(&repo, artifact) {
|
||||
let mut status = "missing";
|
||||
let mut display_url = latest_url.clone();
|
||||
if url_reachable(&latest_url)? {
|
||||
status = "available";
|
||||
} else if let Some(tag_url) = latest_release_tag_download_url(&repo, artifact)?
|
||||
&& url_reachable(&tag_url)?
|
||||
{
|
||||
status = "available";
|
||||
display_url = tag_url;
|
||||
}
|
||||
println!("prebuilt: {status} ({artifact})");
|
||||
println!("prebuilt_url: {binary_url}");
|
||||
println!("prebuilt_url: {display_url}");
|
||||
} else {
|
||||
println!("prebuilt: unavailable for non-HTTP repo");
|
||||
}
|
||||
@@ -4363,10 +4399,10 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn parses_ssh_config_hostname() {
|
||||
let raw = "user palav\nhostname palav.dev\nport 22\n";
|
||||
let raw = "user alice\nhostname server.example.com\nport 22\n";
|
||||
assert_eq!(
|
||||
parse_ssh_config(raw).hostname,
|
||||
Some("palav.dev".to_string())
|
||||
Some("server.example.com".to_string())
|
||||
);
|
||||
}
|
||||
|
||||
@@ -4389,9 +4425,9 @@ mod tests {
|
||||
#[test]
|
||||
fn parses_ssh_config_user_and_identity_files() {
|
||||
let parsed = parse_ssh_config(
|
||||
"user palav\nidentityfile ~/.ssh/id_ed25519\nidentityfile ~/.ssh/work\n",
|
||||
"user alice\nidentityfile ~/.ssh/id_ed25519\nidentityfile ~/.ssh/work\n",
|
||||
);
|
||||
assert_eq!(parsed.user, Some("palav".to_string()));
|
||||
assert_eq!(parsed.user, Some("alice".to_string()));
|
||||
assert_eq!(
|
||||
parsed.identity_files,
|
||||
vec!["~/.ssh/id_ed25519".to_string(), "~/.ssh/work".to_string()]
|
||||
@@ -4478,37 +4514,37 @@ mod tests {
|
||||
#[test]
|
||||
fn detects_existing_imported_host_tables() {
|
||||
assert!(raw_contains_host_table(
|
||||
"[palav]\nssh = \"palav\"\n",
|
||||
"palav"
|
||||
"[homelab]\nssh = \"homelab\"\n",
|
||||
"homelab"
|
||||
));
|
||||
assert!(raw_contains_host_table("[\"home box\"]\n", "home box"));
|
||||
assert_eq!(toml_bare_key_or_quoted("palav"), "palav");
|
||||
assert_eq!(toml_bare_key_or_quoted("homelab"), "homelab");
|
||||
assert_eq!(toml_bare_key_or_quoted("home box"), "\"home box\"");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn strips_user_from_fallback_udp_host() {
|
||||
assert_eq!(ssh_destination_host("palav@example.com"), "example.com");
|
||||
assert_eq!(ssh_destination_host("alice@example.com"), "example.com");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn parses_user_from_ssh_destination() {
|
||||
assert_eq!(ssh_username("palav@example.com"), Some("palav".to_string()));
|
||||
assert_eq!(ssh_username("alice@example.com"), Some("alice".to_string()));
|
||||
assert_eq!(ssh_username("example.com"), None);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn applies_host_config_user_to_plain_ssh_destination() {
|
||||
assert_eq!(
|
||||
ssh_with_user("example.com", Some("palav")),
|
||||
"palav@example.com"
|
||||
ssh_with_user("example.com", Some("alice")),
|
||||
"alice@example.com"
|
||||
);
|
||||
assert_eq!(
|
||||
ssh_with_user("root@example.com", Some("palav")),
|
||||
ssh_with_user("root@example.com", Some("alice")),
|
||||
"root@example.com"
|
||||
);
|
||||
assert_eq!(
|
||||
ssh_with_user("ssh://example.com", Some("palav")),
|
||||
ssh_with_user("ssh://example.com", Some("alice")),
|
||||
"ssh://example.com"
|
||||
);
|
||||
}
|
||||
|
||||
+10
-10
@@ -1279,16 +1279,16 @@ mod tests {
|
||||
let second = host_public_key(&SigningKey::from_bytes(&[2u8; 32]));
|
||||
|
||||
assert_eq!(
|
||||
trust_host(&path, "palav", &first, "ssh", false).unwrap(),
|
||||
trust_host(&path, "homelab", &first, "ssh", false).unwrap(),
|
||||
TrustResult::Trusted
|
||||
);
|
||||
assert_eq!(
|
||||
trust_host(&path, "palav", &first, "ssh", false).unwrap(),
|
||||
trust_host(&path, "homelab", &first, "ssh", false).unwrap(),
|
||||
TrustResult::AlreadyTrusted
|
||||
);
|
||||
assert!(trust_host(&path, "palav", &second, "ssh", false).is_err());
|
||||
assert!(trust_host(&path, "homelab", &second, "ssh", false).is_err());
|
||||
assert_eq!(
|
||||
trust_host(&path, "palav", &second, "ssh", true).unwrap(),
|
||||
trust_host(&path, "homelab", &second, "ssh", true).unwrap(),
|
||||
TrustResult::Trusted
|
||||
);
|
||||
}
|
||||
@@ -1301,16 +1301,16 @@ mod tests {
|
||||
let second = host_public_key(&SigningKey::from_bytes(&[2u8; 32]));
|
||||
|
||||
assert_eq!(
|
||||
verify_known_host(&path, "palav", &first).unwrap(),
|
||||
verify_known_host(&path, "homelab", &first).unwrap(),
|
||||
KnownHostStatus::Unknown
|
||||
);
|
||||
trust_host(&path, "palav", &first, "ssh", false).unwrap();
|
||||
trust_host(&path, "homelab", &first, "ssh", false).unwrap();
|
||||
assert_eq!(
|
||||
verify_known_host(&path, "palav", &first).unwrap(),
|
||||
verify_known_host(&path, "homelab", &first).unwrap(),
|
||||
KnownHostStatus::Trusted
|
||||
);
|
||||
assert!(matches!(
|
||||
verify_known_host(&path, "palav", &second).unwrap(),
|
||||
verify_known_host(&path, "homelab", &second).unwrap(),
|
||||
KnownHostStatus::Mismatch { .. }
|
||||
));
|
||||
}
|
||||
@@ -1625,8 +1625,8 @@ mod tests {
|
||||
protocol_version: NATIVE_PROTOCOL_VERSION,
|
||||
client_random: [1u8; 32],
|
||||
client_ephemeral_public: [2u8; 32],
|
||||
requested_host: "palav".to_string(),
|
||||
requested_user: "palav".to_string(),
|
||||
requested_host: "homelab".to_string(),
|
||||
requested_user: "alice".to_string(),
|
||||
requested_session: "term".to_string(),
|
||||
requested_mode: "read-write".to_string(),
|
||||
terminal_size: (80, 24),
|
||||
|
||||
+2
-2
@@ -291,8 +291,8 @@ mod tests {
|
||||
protocol_version: crate::native::NATIVE_PROTOCOL_VERSION,
|
||||
client_random: [1u8; 32],
|
||||
client_ephemeral_public: [2u8; 32],
|
||||
requested_host: "palav".to_string(),
|
||||
requested_user: "palav".to_string(),
|
||||
requested_host: "homelab".to_string(),
|
||||
requested_user: "alice".to_string(),
|
||||
requested_session: "term".to_string(),
|
||||
requested_mode: "read-write".to_string(),
|
||||
terminal_size: (80, 24),
|
||||
|
||||
Reference in New Issue
Block a user