Spaces:
Sleeping
Sleeping
| # Shared connection helper (SSH tunnel + RPostgres), mirrors analytics scripts. | |
| zabota_connect <- function() { | |
| db_host <- Sys.getenv("DB_HOST", "localhost") | |
| db_port <- as.integer(Sys.getenv("DB_PORT", "5432")) | |
| db_name <- Sys.getenv("DB_NAME", "superset_data") | |
| db_user <- Sys.getenv("DB_USER", "superset_data") | |
| db_password <- Sys.getenv("DB_PASSWORD", "") | |
| db_sslmode <- Sys.getenv("DB_SSLMODE", "prefer") | |
| db_gssencmode <- Sys.getenv("DB_GSSENCMODE", "disable") | |
| use_ssh_tunnel <- tolower(Sys.getenv("USE_SSH_TUNNEL", "false")) %in% c("1", "true", "yes") | |
| wait_for_local_port <- function(host, port, timeout_sec = 8) { | |
| deadline <- Sys.time() + timeout_sec | |
| repeat { | |
| cn <- try(suppressWarnings(socketConnection(host, port, open = "r+", blocking = TRUE, timeout = 1)), silent = TRUE) | |
| if (!inherits(cn, "try-error")) { close(cn); return(TRUE) } | |
| if (Sys.time() > deadline) return(FALSE) | |
| Sys.sleep(0.3) | |
| } | |
| } | |
| if (use_ssh_tunnel) { | |
| ssh_host <- Sys.getenv("SSH_HOST", db_host) | |
| ssh_user <- Sys.getenv("SSH_USER", "") | |
| ssh_key <- Sys.getenv("SSH_KEY", "~/.ssh/id_rsa") | |
| ssh_local_port <- as.integer(Sys.getenv("SSH_LOCAL_PORT", "5433")) | |
| ssh_remote_db_host <- Sys.getenv("SSH_REMOTE_DB_HOST", "localhost") | |
| ssh_remote_db_port <- as.integer(Sys.getenv("SSH_REMOTE_DB_PORT", as.character(db_port))) | |
| args <- c("-f", "-N", "-o", "ExitOnForwardFailure=yes", | |
| "-L", paste0(ssh_local_port, ":", ssh_remote_db_host, ":", ssh_remote_db_port), | |
| "-i", path.expand(ssh_key), paste0(ssh_user, "@", ssh_host)) | |
| out <- tryCatch(system2("ssh", args, stdout = TRUE, stderr = TRUE), | |
| warning = function(w) character(), error = function(e) conditionMessage(e)) | |
| st <- attr(out, "status"); st <- if (is.null(st)) 0L else st | |
| txt <- paste(out, collapse = "\n") | |
| if (st != 0L && !grepl("Address already in use", txt, fixed = TRUE)) stop("SSH tunnel failed:\n", txt) | |
| db_host <- "localhost"; db_port <- ssh_local_port | |
| if (!wait_for_local_port("127.0.0.1", db_port)) stop("tunnel port unreachable") | |
| } | |
| DBI::dbConnect(RPostgres::Postgres(), host = db_host, port = db_port, dbname = db_name, | |
| user = db_user, password = db_password, sslmode = db_sslmode, gssencmode = db_gssencmode) | |
| } | |