allow setting of tunnel url

This commit is contained in:
Michael Neale
2025-11-04 18:40:12 +11:00
parent a4d80a3196
commit 4495713967
5 changed files with 13 additions and 60 deletions
+2 -2
View File
@@ -63,13 +63,13 @@ pub async fn run() -> Result<()> {
let listener = tokio::net::TcpListener::bind(settings.socket_addr()).await?;
let local_addr = listener.local_addr()?;
info!("listening on {}", local_addr);
let port = local_addr.port();
let app_state_clone = app_state.clone();
tokio::spawn(async move {
app_state_clone.auto_start_tunnel(port).await;
});
// Ensure the listener/socket is properly closed on cancellation by using graceful shutdown
axum::serve(listener, app)
.with_graceful_shutdown(shutdown_signal())
+1 -1
View File
@@ -38,7 +38,7 @@ impl AppState {
pub async fn auto_start_tunnel(&self, port: u16) {
let status = self.tunnel_manager.get_status().await;
if status.auto_start && status.state == crate::tunnel::TunnelState::Idle {
tracing::info!("Auto-starting tunnel on port {}", port);
match self.tunnel_manager.start(port).await {
-50
View File
@@ -47,53 +47,3 @@ pub async fn save_config(config: &TunnelConfig) -> Result<(), Box<dyn std::error
info!("Saved tunnel config to goose Config");
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
fn clear_secrets() -> Result<(), Box<dyn std::error::Error>> {
let cfg = Config::global();
let _ = cfg.delete_secret(SECRET_KEY_SECRET);
let _ = cfg.delete_secret(SECRET_KEY_AGENT_ID);
Ok(())
}
#[tokio::test]
async fn test_save_and_load_config() {
let config = TunnelConfig {
auto_start: true,
secret: Some("test_secret_12345".to_string()),
agent_id: Some("test_agent_id_67890".to_string()),
};
// Save config
save_config(&config).await.unwrap();
// Load config
let loaded = load_config().await;
assert_eq!(loaded.auto_start, config.auto_start);
assert_eq!(loaded.secret, config.secret);
assert_eq!(loaded.agent_id, config.agent_id);
// Cleanup
clear_secrets().unwrap();
}
#[tokio::test]
async fn test_load_config_defaults() {
// Clear any existing config
let _ = clear_secrets();
let cfg = Config::global();
let _ = cfg.delete(CONFIG_KEY_AUTO_START);
// Load should return defaults
let loaded = load_config().await;
assert!(!loaded.auto_start);
assert_eq!(loaded.secret, None);
assert_eq!(loaded.agent_id, None);
}
}
+7 -2
View File
@@ -415,6 +415,13 @@ pub async fn start(
agent_id: String,
handle: Arc<RwLock<Option<tokio::task::JoinHandle<()>>>>,
) -> Result<TunnelInfo> {
let worker_url =
std::env::var("GOOSE_TUNNEL_WORKER_URL").unwrap_or_else(|_| WORKER_URL.to_string());
if worker_url.to_lowercase() == "none" || worker_url.to_lowercase() == "no" {
anyhow::bail!("Tunnel is disabled via GOOSE_TUNNEL_WORKER_URL environment variable");
}
let agent_id_clone = agent_id.clone();
let server_secret_clone = server_secret;
let handle_clone = handle.clone();
@@ -425,8 +432,6 @@ pub async fn start(
*handle.write().await = Some(task);
let worker_url =
std::env::var("GOOSE_TUNNEL_WORKER_URL").unwrap_or_else(|_| WORKER_URL.to_string());
let public_url = format!("{}/tunnel/{}", worker_url, agent_id);
let hostname = Url::parse(&worker_url)?
.host_str()
@@ -39,12 +39,11 @@ export default function AppSettingsSection({ scrollToSection }: AppSettingsSecti
setIsMacOS(window.electron.platform === 'darwin');
}, []);
// Check if platform supports tunnel (macOS or Linux)
const supportsTunnel =
window.electron.platform === 'darwin' || window.electron.platform === 'linux';
// Check if experimental features should be hidden
const hideExperimental = window.appConfig.get('GOOSE_HIDE_EXPERIMENTAL') === 'true';
const tunnelWorkerUrl = window.appConfig.get('GOOSE_TUNNEL_WORKER_URL');
const hideTunnel = tunnelWorkerUrl === 'none' || tunnelWorkerUrl === 'no';
// Detect theme changes
useEffect(() => {
@@ -403,8 +402,7 @@ export default function AppSettingsSection({ scrollToSection }: AppSettingsSecti
</CardContent>
</Card>
{/* Experimental Features - only show on macOS and Linux, and not hidden by env var */}
{supportsTunnel && !hideExperimental && (
{supportsTunnel && !hideTunnel && (
<Card className="rounded-lg">
<CardHeader className="pb-0">
<button