Add dosh update command
ci / test (push) Has been cancelled
ci / remote-bench (push) Has been cancelled

This commit is contained in:
Codex
2026-06-11 09:49:53 -04:00
parent da60b71984
commit 3ad8f95833
6 changed files with 62 additions and 1 deletions
+6
View File
@@ -106,6 +106,12 @@ 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
```
Update an installed client later:
```bash
dosh update
```
Install the client on Windows PowerShell:
```powershell
+2
View File
@@ -451,6 +451,8 @@ Client config: `~/.config/dosh/client.toml`
```toml
server = "user@example.com"
update_repo = "https://git.palav.dev/Palav/dosh.git"
update_port = 50000
ssh_auth_command = "~/.local/bin/dosh-auth"
# ssh_port = 22
dosh_port = 50000
+3
View File
@@ -47,8 +47,11 @@ try {
$clientConfig = Join-Path $configDir "client.toml"
if ($ForceConfig -or -not (Test-Path $clientConfig)) {
$defaultServer = if ($Server) { $Server } else { "user@example.com" }
$updateRepo = if ($Repo) { $Repo } else { "https://git.palav.dev/Palav/dosh.git" }
$doshHostLine = if ($DoshHost) { "dosh_host = `"$DoshHost`"" } else { "# dosh_host = `"public.example.com`"" }
@"
update_repo = "$updateRepo"
update_port = $Port
server = "$defaultServer"
$doshHostLine
ssh_auth_command = "~/.local/bin/dosh-auth"
+3
View File
@@ -207,12 +207,15 @@ if [ "$role" = "client" ] || [ "$role" = "both" ]; then
client_config="$config_dir/client.toml"
if [ "$force_config" -eq 1 ] || [ ! -f "$client_config" ]; then
default_server="${server:-user@example.com}"
update_repo="${repo:-https://git.palav.dev/Palav/dosh.git}"
if [ -n "$dosh_host" ]; then
dosh_host_line="dosh_host = \"$dosh_host\""
else
dosh_host_line="# dosh_host = \"public.example.com\""
fi
cat >"$client_config" <<EOF
update_repo = "$update_repo"
update_port = $port
server = "$default_server"
$dosh_host_line
ssh_auth_command = "~/.local/bin/dosh-auth"
+44 -1
View File
@@ -17,7 +17,7 @@ use serde::{Deserialize, Serialize};
use std::fs;
use std::io::{Read, Write};
use std::net::{SocketAddr, ToSocketAddrs};
use std::process::Command;
use std::process::{Command, Stdio};
use std::time::{Duration, Instant, SystemTime, UNIX_EPOCH};
use tokio::net::UdpSocket;
use tokio::sync::mpsc;
@@ -76,6 +76,9 @@ struct CachedCredential {
async fn main() -> Result<()> {
let args = Args::parse();
let config = load_client_config(None).unwrap_or_default();
if args.server.as_deref() == Some("update") {
return run_update(&config);
}
let server = args.server.unwrap_or(config.server);
let session = select_session(args.session.as_deref(), args.new, &config.default_session);
let mode = if args.view_only || config.view_only {
@@ -208,6 +211,46 @@ async fn main() -> Result<()> {
run_terminal(socket, cred, Some(first)).await
}
fn run_update(config: &dosh::config::ClientConfig) -> Result<()> {
let repo = config
.update_repo
.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 mut script = format!(
"curl -fsSL {} | DOSH_REPO={} DOSH_PORT={} sh -s -- client",
shell_word(&installer),
shell_word(&repo),
config.update_port.unwrap_or(config.dosh_port)
);
if config.server != "user@example.com" {
script.push_str(&format!(" --server {}", shell_word(&config.server)));
}
if let Some(host) = &config.dosh_host {
script.push_str(&format!(" --dosh-host {}", shell_word(host)));
}
script.push_str(" --force-config");
let status = Command::new("sh")
.arg("-lc")
.arg(script)
.stdin(Stdio::null())
.status()
.context("run dosh update installer")?;
if !status.success() {
return Err(anyhow!("dosh update failed with status {status}"));
}
Ok(())
}
fn raw_base_from_repo(repo: &str) -> String {
repo.trim_end_matches(".git").to_string()
}
fn shell_word(value: &str) -> String {
format!("'{}'", value.replace('\'', "'\\''"))
}
fn local_bootstrap(
session: &str,
mode: &str,
+4
View File
@@ -44,6 +44,8 @@ impl Default for ServerConfig {
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ClientConfig {
pub update_repo: Option<String>,
pub update_port: Option<u16>,
pub server: String,
pub dosh_host: Option<String>,
pub ssh_auth_command: Option<String>,
@@ -59,6 +61,8 @@ pub struct ClientConfig {
impl Default for ClientConfig {
fn default() -> Self {
Self {
update_repo: None,
update_port: None,
server: "user@example.com".to_string(),
dosh_host: None,
ssh_auth_command: Some("~/.local/bin/dosh-auth".to_string()),