#!/bin/sh
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#

#
# guacctl
# -------
#
# Utility for sending Guacamole-specific console codes for controlling a
# terminal session, such as:
#
#     * Downloading files (SSH only)
#     * Setting the destination directory for uploads (SSH only)
#     * Redirecting output to a named pipe stream (SSH or telnet)
#
# This script may also be run as "guacget", in which case the script accepts
# no options and assumes anything given on the commandline is a file to be
# downloaded.
#

##
## Given the name of a file, which may be a relative path, produce the full,
## real, non-relative path for that same file.
##
## @param FILENAME
##     The name of the file to produce the full path of.
##
fullpath() {
    FILENAME="$1"
    DIR=`dirname "$FILENAME"`
    FILE=`basename "$FILENAME"`
    (cd "$DIR" && echo "$PWD/$FILE")
}

##
## Sends the Guacamole-specific console code for initiating a download.
##
## @param FILENAME
##     The full path of the file to download.
##
send_download_file() {
    FILENAME="$1"
    printf "\033]482200;%s\007" "$FILENAME"
}

##
## Sends the Guacamole-specific console code for setting the upload directory.
##
## @param FILENAME
##     The full path to the directory which should receive uploads.
##
send_set_directory() {
    FILENAME="$1"
    printf "\033]482201;%s\007" "$FILENAME"
}

##
## Sends the Guacamole-specific console code for redirecting output to a named
## pipe stream (instead of the terminal emulator)
##
## @param NAME
##     The name of the pipe stream to open.
##
send_open_pipe_stream() {
    NAME="$1"
    printf "\033]482202;%s\007" "$NAME"
}

##
## Sends the Guacamole-specific console code for redirecting output back to the
## terminal emulator
##
send_close_pipe_stream() {
    printf "\033]482203;\007"
}

##
## Prints the given error text to STDERR.
##
## @param ...
##     The text to print as an error message.
##
error() {
    echo "$NAME:" "$@" >&2
}

##
## Prints usage documentation for this script.
##
usage() {
    cat >&2 <<END
guacctl 0.9.14, Apache Guacamole terminal session control utility.
Usage: guacctl [OPTION] [FILE or NAME]...

    -d, --download         download each of the files listed.
    -s, --set-directory    set the destination directory for future uploaded 
                           files.
    -o, --open-pipe        redirect output to a new pipe stream with the given
                           name.
    -c, --close-pipe       close any existing pipe stream and redirect output
                           back to the terminal emulator.
END
}

##
## Initiates a download for each of the specified files.
##
## @param ...
##     The name of each file that should be downloaded, as originally
##     provided to guacctl.
##
download_files() {

    #
    # Validate arguments
    #

    if [ $# -lt 1 ]; then
        error "No files specified."
        return;
    fi

    #
    # Send download code for each file given
    #

    for FILENAME in "$@"; do
        if [ -e "$FILENAME" ]; then
            send_download_file "`fullpath "$FILENAME"`"
        else
            error "$FILENAME: File does not exist."
        fi
    done

}

##
## Changes the upload path for future uploads to the given directory.
##
## @param ...
##     The name of the directory to use for uploads, as provided to guacctl.
##
set_directory() {

    #
    # Validate arguments
    #

    if [ $# -lt 1 ]; then
        error "No destination directory specified."
        return;
    fi

    if [ $# -gt 1 ]; then
        error "Only one destination directory may be given."
        return;
    fi

    #
    # Send code for setting the upload directory
    #

    FILENAME="$1"
    if [ -d "$FILENAME" ]; then
        send_set_directory "`fullpath "$FILENAME"`"
    else
        error "$FILENAME: File does not exist or is not a directory."
    fi

}

##
## Opens a new pipe stream having the given name and redirects terminal output
## to that stream.
##
## @param ...
##     The name of the pipe stream to open, as provided to guacctl.
##
open_pipe_stream() {

    #
    # Validate arguments
    #

    if [ $# -lt 1 ]; then
        error "No pipe name specified."
        return;
    fi

    if [ $# -gt 1 ]; then
        error "Only one pipe name may be given."
        return;
    fi

    #
    # Send code for opening the named pipe stream
    #

    NAME="$1"
    send_open_pipe_stream "$NAME"

}

##
## Closes the currently-open pipe stream and redirects terminal output back to
## the terminal emulator
##
## @param ...
##     The arguments provided to guacctl, which should be empty.
##
close_pipe_stream() {

    #
    # Validate arguments
    #

    if [ $# -gt 0 ]; then
        error "Closing an open pipe stream does not require any arguments."
        return;
    fi

    #
    # Send code for closing the currently-open named pipe stream
    #

    send_close_pipe_stream

}

#
# Get script name
#

NAME=`basename "$0"`

#
# Handle downloads directly if invoked as "guacget"
#

if [ "x$NAME" = "xguacget" ]; then
    download_files "$@"
    exit 0;
fi

#
# Parse options
#

case "$1" in

    #
    # Download files
    #

    "--download"|"-d")
        shift
        download_files "$@"
        ;;

    #
    # Set upload directory
    #

    "--set-directory"|"-s")
        shift
        set_directory "$@"
        ;;

    #
    # Redirect to pipe
    #

    "--open-pipe"|"-o")
        shift
        open_pipe_stream "$@"
        ;;

    #
    # Redirect back to terminal
    #

    "--close-pipe"|"-c")
        shift
        close_pipe_stream "$@"
        ;;

    #
    # Show usage info if options are invalid
    #

    *)
        usage
        exit 1
        ;;
esac

