dssh: add the option to set (or not set) a controlling terminal.
[cmccabe-bin] / dssh
1 #!/usr/bin/env bash
2
3 #
4 # Get a login for a docker container.
5 #
6
7 die() {
8     echo $@
9     exit 1
10 }
11
12 usage() {
13     cat <<EOF
14 dssh: log in to a docker node
15
16 usage: dssh: [options]
17
18 options:
19 -h:           show this help message.
20 -i [ID]:      ssh into a docker node with this container ID
21 -n [name]:    ssh into a docker node with this name
22 -t [0 or 1]:  0 to avoid allocating a TTY; 1 to allocate one.
23               The default will be set based on whether this appears
24               to be an interactive shell.
25 EOF
26 }
27
28 DOCKER_IMAGE_ID=""
29 DOCKER_IMAGE_NAME=""
30 if [ -t 0 ]; then
31     ALLOCATE_TTY=1
32 else
33     ALLOCATE_TTY=0
34 fi
35 while getopts  "hi:n:t:" flag; do
36     case $flag in
37     h) usage; exit 0;;
38     i) DOCKER_IMAGE_ID=${OPTARG};;
39     n) DOCKER_IMAGE_NAME=${OPTARG};;
40     t) ALLOCATE_TTY=${OPTARG};;
41     *) echo "getopts error"
42         echo
43         usage
44         exit 1;;
45     esac
46 done
47 shift $(expr $OPTIND - 1)
48 if [ $# -eq 0 ]; then
49     RUN_COMMAND="/bin/bash"
50 else
51     RUN_COMMAND="${@}"
52 fi
53 EXTRA_DOCKER_ARGS=""
54 if [ ${ALLOCATE_TTY} -ne 0 ]; then
55     EXTRA_DOCKER_ARGS="${EXTRA_DOCKER_ARGS} -t"
56 fi
57
58 which docker &>/dev/null || die "docker must be on the PATH."
59
60 if [ "x${DOCKER_IMAGE_NAME}" == "x" ]; then
61     if [ "x${DOCKER_IMAGE_ID}" == "x" ]; then
62         usage
63         exit 1
64     fi
65 else
66     if [ "x${DOCKER_IMAGE_ID}" == "x" ]; then
67         :
68     else
69         echo "You must not supply both an ID and a name."
70         exit 1
71     fi
72     DOCKER_IMAGE_ID=$(docker ps -f name=${DOCKER_IMAGE_NAME} -q)
73     [ "x${DOCKER_IMAGE_ID}" == "x" ] && \
74         die "failed to find a docker image named ${DOCKER_IMAGE_NAME}"
75 fi
76
77 docker exec -i ${EXTRA_DOCKER_ARGS} "${DOCKER_IMAGE_ID}" ${RUN_COMMAND}