Skip to content

Commit

Permalink
#159 fixes for docklet_rstudio_addusers remove old shelling out code
Browse files Browse the repository at this point in the history
to instead use ssh pkg
  • Loading branch information
sckott committed Jun 11, 2018
1 parent dfacd9d commit b3ef94d
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 73 deletions.
63 changes: 33 additions & 30 deletions R/docklet.R
Expand Up @@ -88,6 +88,7 @@
#' ## This adds 100 users to the instance, with username/passwords
#' ## following pattern user1/user1 ... through 100
#' d <- docklet_create()
#' d <- droplet(d$id)
#' d %>% docklet_rstudio() %>% docklet_rstudio_addusers()
#'
#' # Spin up a Shiny server (opens in default browser)
Expand Down Expand Up @@ -146,23 +147,25 @@ docklet_images <- function(droplet, all = TRUE, ssh_user = "root") {
#' @export
#' @rdname docklet_create
docklet_pull <- function(droplet, repo, ssh_user = "root", keyfile = NULL,
ssh_passwd = NULL) {
ssh_passwd = NULL, verbose = FALSE) {

docklet_docker(droplet, "pull", repo, ssh_user = ssh_user,
keyfile = keyfile, ssh_passwd = ssh_passwd)
keyfile = keyfile, ssh_passwd = ssh_passwd, verbose = verbose)
}

#' @export
#' @rdname docklet_create
docklet_run <- function(droplet, ..., rm = FALSE, name = NULL,
ssh_user = "root", keyfile = NULL, ssh_passwd = NULL) {
ssh_user = "root", keyfile = NULL, ssh_passwd = NULL, verbose = FALSE) {

docklet_docker(droplet,
"run", c(
if (rm) " --rm",
if (!is.null(name)) paste0(" --name=", name),
...
),
ssh_user = ssh_user, keyfile = keyfile, ssh_passwd = ssh_passwd
ssh_user = ssh_user, keyfile = keyfile, ssh_passwd = ssh_passwd,
verbose = verbose
)
}

Expand All @@ -182,31 +185,27 @@ docklet_rm <- function(droplet, container, ssh_user = "root") {
#' @export
#' @rdname docklet_create
docklet_docker <- function(droplet, cmd, args = NULL, docker_args = NULL,
ssh_user = "root", keyfile = NULL, ssh_passwd = NULL) {
ssh_user = "root", keyfile = NULL, ssh_passwd = NULL, verbose = FALSE) {

args <- paste(args, collapse = " ")
droplet_ssh(
droplet,
user = ssh_user, keyfile = keyfile, ssh_passwd = ssh_passwd,
paste(c("docker", docker_args, cmd, args), collapse = " "))
paste(c("docker", docker_args, cmd, args), collapse = " "),
verbose = verbose)
}

#' @export
#' @rdname docklet_create
docklet_rstudio <- function(droplet,
user = 'rstudio', password = 'rstudio',
email = 'rstudio@example.com',
img = 'rocker/rstudio',
port = '8787',
volume = '',
dir = '',
browse = TRUE,
add_users = FALSE,
ssh_user = "root",
keyfile = NULL,
ssh_passwd = NULL) {
docklet_rstudio <- function(droplet, user = 'rstudio', password = 'rstudio',
email = 'rstudio@example.com', img = 'rocker/rstudio', port = '8787',
volume = '', dir = '', browse = TRUE, add_users = FALSE,
ssh_user = "root", keyfile = NULL, ssh_passwd = NULL, verbose = FALSE) {

droplet <- as.droplet(droplet)

docklet_pull(droplet, img, ssh_user, keyfile = keyfile, ssh_passwd = ssh_passwd)
docklet_pull(droplet, img, ssh_user, keyfile = keyfile,
ssh_passwd = ssh_passwd, verbose = verbose)
docklet_run(droplet,
" -d",
" -p ", paste0(port, ":8787"),
Expand Down Expand Up @@ -234,27 +233,31 @@ docklet_rstudio <- function(droplet,
#' @export
#' @rdname docklet_create
docklet_rstudio_addusers <- function(droplet,
user = 'rstudio', password = 'rstudio',
img = 'rocker/rstudio',
port = '8787') {
user = 'rstudio', password = 'rstudio', img = 'rocker/rstudio',
port = '8787', ssh_user = "root", keyfile = NULL, ssh_passwd = NULL,
verbose = FALSE) {

droplet <- as.droplet(droplet)

# check if rstudio container already running, shut down if up
cons <- docklet_ps_data(droplet)
cons <- docklet_ps_data(droplet, ssh_user = ssh_user,
keyfile = keyfile, ssh_passwd = ssh_passwd, verbose = verbose)
id <- cons[ grep("rocker/rstudio:latest", cons$image), "container.id" ]
if (length(id) > 0) {
docklet_stop(droplet, container = id)
docklet_rm(droplet, container = id)
}

# spin up new container with users
docklet_run(droplet,
" -d",
" -p ", paste0(port, ":8787"),
" -e USER=", user,
" -e PASSWORD=", password,
" ", img,
' bash -c "add-students && supervisord"'
docklet_run(
droplet,
" -d",
" -p ", paste0(port, ":8787"),
paste0(" -e USER=", user),
paste0(" -e PASSWORD=", password),
" ", img,
' bash -c "add-students && supervisord"',
verbose = verbose
)
}

Expand Down
52 changes: 17 additions & 35 deletions R/docklet_ps_data.R
@@ -1,44 +1,26 @@
# get ps info as a data.frame ----------------------
## FIXME - don't want to basically duplicate other internal fxns,
## but, the base fxn do_system() needs the change to intern=TRUE
docklet_ps_data <- function(droplet, all = TRUE, ssh_user = "root") {
tmp <- docklet_docker2(droplet, "ps", if (all) "-a", ssh_user = ssh_user)
tmp <- paste0(gsub("\\s\\s+", ",", unname(sapply(tmp, strTrim))), collapse = "\n")
tmp <- gsub("\"|'", "", tmp)
df <- read.csv(text = paste0(tmp, "\n", collapse = ""), stringsAsFactors = FALSE)
setNames(df, tolower(names(df)))
}
docklet_ps_data <- function(droplet, all = TRUE, ssh_user = "root",
keyfile = NULL, ssh_passwd = NULL, verbose = FALSE) {

docklet_docker2 <- function(droplet, cmd, args = NULL, docker_args = NULL, ssh_user = "root") {
args <- paste(args, collapse = "")
droplet_ssh2(droplet, user = ssh_user, paste(c("docker", docker_args, cmd, args), collapse = " "))
tmp <- docklet_docker2(droplet, "ps", if (all) "-a", ssh_user = ssh_user,
keyfile = keyfile, ssh_passwd = ssh_passwd)
tmp <- paste0(gsub("\\s\\s+", ",", unname(sapply(tmp, strTrim))),
collapse = "\n")
tmp <- gsub("\"|'", "", tmp)
df <- read.csv(text = paste0(tmp, "\n", collapse = ""),
stringsAsFactors = FALSE)
stats::setNames(df, tolower(names(df)))
}

droplet_ssh2 <- function(droplet, ..., user = "root", verbose = FALSE) {
droplet <- as.droplet(droplet)
docklet_docker2 <- function(droplet, cmd, args = NULL, docker_args = NULL,
ssh_user = "root", keyfile = NULL, ssh_passwd = NULL, verbose = FALSE) {

lines <- paste(c(...), collapse = " \\\n&& ")
if (lines == "") stop("Provide commands", call. = FALSE)
cmd <- paste0(
"ssh ", ssh_options(),
" ", user, "@", droplet_ip(droplet),
" ", shQuote(lines)
args <- paste(args, collapse = "")
droplet_ssh(droplet, paste(c("docker", docker_args, cmd, args),
collapse = " "),
user = ssh_user, keyfile = keyfile, ssh_passwd = ssh_passwd,
verbose = verbose
)
do_system2(droplet, cmd, verbose = verbose)
}

do_system2 <- function(droplet, cmd, verbose = FALSE) {
cli_tools()
mssg(verbose, cmd)
system(cmd, intern = TRUE)
}

# FIXME: remove me, hold-over from before using ssh pkg
ssh_options <- function() {
opts <- c(
BatchMode = "yes",
StrictHostKeyChecking = "no",
UserKnownHostsFile = file.path(tempdir(), "hosts")
)
paste0("-o ", names(opts), "=", opts, collapse = " ")
}
18 changes: 15 additions & 3 deletions R/droplet-ssh.R
Expand Up @@ -114,11 +114,19 @@ do_ssh <- function(droplet, cmd, user, keyfile = NULL, ssh_passwd = NULL, verbos
if (user_ip %in% ls(envir = analogsea_sessions)) {
session <- get(user_ip, envir = analogsea_sessions)
if (!ssh::ssh_info(session=session)$connected) {
session <- ssh::ssh_connect(user_ip, keyfile, ssh_passwd)
session <- if (is.null(ssh_passwd)) {
ssh::ssh_connect(user_ip, keyfile)
} else {
ssh::ssh_connect(user_ip, keyfile, ssh_passwd)
}
assign(user_ip, session, envir = analogsea_sessions)
}
} else {
session <- ssh::ssh_connect(user_ip, keyfile, ssh_passwd)
session <- if (is.null(ssh_passwd)) {
ssh::ssh_connect(user_ip, keyfile)
} else {
ssh::ssh_connect(user_ip, keyfile, ssh_passwd)
}
assign(user_ip, session, envir = analogsea_sessions)
}
out <- ssh::ssh_exec_wait(session = session, command = cmd)
Expand All @@ -136,7 +144,11 @@ do_scp <- function(droplet, local, remote, user,
if (user_ip %in% ls(envir = analogsea_sessions)) {
session <- get(user_ip, envir = analogsea_sessions)
} else {
session <- ssh::ssh_connect(user_ip, keyfile, ssh_passwd)
session <- if (is.null(ssh_passwd)) {
ssh::ssh_connect(user_ip, keyfile)
} else {
ssh::ssh_connect(user_ip, keyfile, ssh_passwd)
}
assign(user_ip, session, envir = analogsea_sessions)
}
if (scp == "upload") cat(ssh::scp_upload(session = session,
Expand Down
12 changes: 7 additions & 5 deletions man/docklet_create.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit b3ef94d

Please sign in to comment.