guilsyTrue's picture
Add ZabotaChat: bot for recurring clients with schedule
d300ab1
Raw
History Blame Contribute Delete
2.31 kB
# 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)
}