1 Commits

Author SHA1 Message Date
Uber Veng
d4ca9e7542 first-run script fix 2026-05-29 05:54:10 +07:00
3 changed files with 36 additions and 20 deletions

2
Cargo.lock generated
View File

@@ -1203,7 +1203,7 @@ dependencies = [
[[package]] [[package]]
name = "ostiary" name = "ostiary"
version = "1.1.1" version = "1.1.2"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"base64", "base64",

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "ostiary" name = "ostiary"
version = "1.1.1" version = "1.1.2"
edition = "2024" edition = "2024"
[dependencies] [dependencies]

View File

@@ -170,44 +170,60 @@ async fn run_exec(
/// Runs before ratatui starts. Prompts for endpoint URL and name on first launch. /// Runs before ratatui starts. Prompts for endpoint URL and name on first launch.
fn prompt_first_endpoint() -> Result<(String, String)> { fn prompt_first_endpoint() -> Result<(String, String)> {
use std::io::Write; use std::io::{BufRead, BufReader, Write};
println!(); // Open /dev/tty directly so input works even when launched via `curl | bash`
println!(" ╔══════════════════════════════════╗"); // (where stdin is the pipe carrying the script, not the keyboard).
println!(" ║ Ostiary — первый запуск ║"); let tty = std::fs::OpenOptions::new()
println!(" ╚══════════════════════════════════╝"); .read(true)
println!(); .write(true)
println!(" Конфиг будет сохранён в:"); .open("/dev/tty")
println!(" {}", config::config_path().display()); .map_err(|e| anyhow::anyhow!(
println!(); "Не удалось открыть терминал ({e}). Запустите ostiary напрямую."
))?;
let mut out = tty.try_clone()?;
let mut reader = BufReader::new(tty);
writeln!(out)?;
writeln!(out, " ╔══════════════════════════════════╗")?;
writeln!(out, " ║ Ostiary — первый запуск ║")?;
writeln!(out, " ╚══════════════════════════════════╝")?;
writeln!(out)?;
writeln!(out, " Конфиг будет сохранён в:")?;
writeln!(out, " {}", config::config_path().display())?;
writeln!(out)?;
let name = loop { let name = loop {
print!(" Название эндпоинта: "); write!(out, " Название эндпоинта: ")?;
std::io::stdout().flush()?; out.flush()?;
let mut buf = String::new(); let mut buf = String::new();
std::io::stdin().read_line(&mut buf)?; if reader.read_line(&mut buf)? == 0 {
anyhow::bail!("Неожиданный конец ввода.");
}
let val = buf.trim().to_string(); let val = buf.trim().to_string();
if val.is_empty() { if val.is_empty() {
println!(" Название не может быть пустым. Попробуйте ещё раз.\n"); writeln!(out, " Название не может быть пустым. Попробуйте ещё раз.\n")?;
continue; continue;
} }
break val; break val;
}; };
let url = loop { let url = loop {
print!(" URL эндпоинта: "); write!(out, " URL эндпоинта: ")?;
std::io::stdout().flush()?; out.flush()?;
let mut buf = String::new(); let mut buf = String::new();
std::io::stdin().read_line(&mut buf)?; if reader.read_line(&mut buf)? == 0 {
anyhow::bail!("Неожиданный конец ввода.");
}
let val = buf.trim().to_string(); let val = buf.trim().to_string();
if val.is_empty() { if val.is_empty() {
println!(" URL не может быть пустым. Попробуйте ещё раз.\n"); writeln!(out, " URL не может быть пустым. Попробуйте ещё раз.\n")?;
continue; continue;
} }
break val; break val;
}; };
println!(); writeln!(out)?;
Ok((url, name)) Ok((url, name))
} }