Unverified Commit 339f520c authored by Andrea Orlati's avatar Andrea Orlati Committed by GitHub
Browse files

Fix issue 653 (#669)

* fix-issue-653: first past of the fix, script are provided and test for internet, thsy shoud be tested from local area network.

* fix issue #653 some bug fixing. Still need some tweak for local area connection.

* fix issue #653: some adjustments according comments
parent d99b4979
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -97,6 +97,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/

## [next release]
## Added
    issue #653 - added a couple of scriptsto ease vnc conection from remote a file copying. The scripts support 
                 linux and macos
## Fixed
    issue #448 - Added Sky Offsets to calibration tool client
    issue #585 - Fixed misshandled schedule with NULL as backend (Dry Run)
+1 −1
Original line number Diff line number Diff line
@@ -53,7 +53,7 @@ pppppp_MODULES =

# new bootup scripts (discos):
SCRIPTS=discosup discosdown discosConsole
SCRIPTS_L         = escs escsConsole
SCRIPTS_L         = med-vnc med-copy


#INSTALL_FILES      = ../app-defaults/escsStartup.xml
+147 −0
Original line number Diff line number Diff line
#!/usr/bin/env bash

print_help() {
    echo " "
    echo "`basename $0` v1.0"
    echo " "
    echo "Copy files from and toward the DISCOS system."
    echo "Usage: '`basename $0` [-t|--port portnumber] -r|--remote <projectid>@<gatein> -d|--download Source Destination"
    echo "       '`basename $0` [-t|--port portnumber] -r|--remote <projectid>@<gatein> -u|--upload Source Destination"
    echo "       '`basename $0` -h|--help'"
    echo "-d | --download this allows to download files or folders from DISCOS to your local machine"
    echo "-h | --help prints this help message and exit"
	 echo "-p | --port ssh port, if different from the default one"
    echo "-r | --remote provides the credentials to log into DISCOS"
    echo "       <projectid> indicates the project for which files are copied."
    echo "       <gatein> access point into the observatory lan. This information is provided by local staff."
    echo "                Use 'local' if already inside the local area network."	     
    echo "-u | --upload this allows to upload files or folders to DISCOS from your local machine"
    exit 1
}

current_system="LINUX"
upload=""
download=""
ssh_port="22"
project=""
gatein=""
local="FALSE"
src=""
dest=""

while [[ $# -gt 0 ]]
do
key="$1"
case $key in
    -h|--help)
    print_help
    ;;
    -p|--port)
    ssh_port=$2
    shift
    shift
    ;;
    -d|--download)
    download="TRUE"
    shift
    ;;
    -u|--upload)
    upload="TRUE"
    shift
    ;;
    -r|--remote)
    if [[ $2 == *"@"* ]]; then
        while IFS='@' read -ra ARG; do
            if [[ "${#ARG[@]}" -ne 2 ]]; then
                echo -e "Please provide a correct <projectid>@<gatein> pair, retry!"
                print_help
            fi
            project=${ARG[0]}
            gatein=${ARG[1]}
        done <<< "$2"
    else
        echo "Bad argument format: '$2'!"
        print_help
    fi
    shift
    shift    
    ;;
    *)
    if [[ "$src" == "" ]]
    then
        src=$key
    elif [[ "$dest" == "" ]]
    then
        dest=$key
    else
        echo "Too many arguments provided!"
        print_help
    fi
    shift
    ;;
esac
done

if [[ "$src" == "" || "$dest" == "" ]]; then
   echo -e "Inconsistent input, both source and destination should be provided!"
   print_help
fi

if [[ "$gatein" == "" ]]; then
   echo -e "Remote credentials must be provided!"
   print_help
fi

if [[ "$gatein" == "local" ]]; then
    local="TRUE"
fi

if [[ "$upload" == "" && "$download" == "" ]]; then
   echo -e "Inconsistent input, at least one of '--upload' and '--download' should be provided!"
   print_help
fi

if [[ "$upload" != "" && "$download" != "" ]]; then
   echo -e "Inconsistent input, only one of '--upload' and '--download' should be provided!"
   print_help
fi

if [[ "$OSTYPE" == *"linux-gnu"* ]]
then
   echo -e "Linux OS is detected..."
   current_system="LINUX"
elif [[ "$OSTYPE" == *"darwin"* ]]
then
   echo -e "Mac OS is detected..."
   current_system="MACOS"
else
   echo -e "Not supported OS, some unpredictable results may happen!"	
fi

#echo $local
#echo $project
#echo $gatein
#echo $ssh_port
#echo $files
#echo $upload
#echo $download
#echo $current_system

proxy="ProxyCommand=ssh -p ""$ssh_port"" -W %h:%p observer@""$gatein"
#echo $proxy


if [[ "$local" == "FALSE" ]]; then 
    if [[ "$upload" == "TRUE" ]]; then
        scp -r -P 9922 -o "$proxy" $src "$project"@192.167.189.98:$dest 2> /dev/null
    elif [[ "$download" == "TRUE" ]]; then
        scp -r -P 9922 -o "$proxy" "$project"@192.167.189.98:$src $dest 2> /dev/null
    fi
else
    if [[ "$upload" == "TRUE" ]]; then
        scp -r -P 9922 $src "$project"@192.167.189.98:$dest 2> /dev/null
    elif [[ "$download" == "TRUE" ]]; then
        scp -r -P 9922 "$project"@192.167.189.98:$src $dest 2> /dev/null
    fi
fi
+174 −0
Original line number Diff line number Diff line
#!/usr/bin/env bash

print_help() {
    echo " "
    echo "`basename $0` v1.0"
    echo " "
    echo "Start a new session toward DISCOS control software"
    echo "Usage: '`basename $0` [OPTIONS] [-t|--port portnumber] <role>@<gatein>'"
    echo "       '`basename $0` -r|--roles'"
    echo "       '`basename $0` -h|--help'"
    echo "<role> indicates the role (observer or administrative privileges) for which the connection is done"
    echo "<gatein> access point into the observatory LAN. This information is provided by local staff." 
    echo "         Use 'local' if already inside the local area network."
    echo "-h | --help prints this help message and exit"
    echo "-r | --roles shows all the available roles"
    echo "-p | --port ssh port if different from the default one" 
    echo "Options:"
    echo "    -v | --viewonly           start the vncviewer in view only mode"
    exit 1
}

vnc_avail="TRUE"
local_connection="FALSE"
ssh_port="22"
viewonly=""
role=""
gatein=""
remote_port=0
current_system="LINUX"

remote_sessions=( "discos:9901:15001" "observer:9902:15002" )


while [[ $# -gt 0 ]]
do
key="$1"

case $key in
    -h|--help)
    print_help
    ;;
    -r|--roles)
    echo "Available roles are: "
    for session in "${remote_sessions[@]}" ; do
    	echo "${session%%:*}"
    done
    exit 0
    ;;
    -p|--port)
    ssh_port=$2
    shift
    shift
    ;;
    -v|--viewonly)
    viewonly="-ViewOnly"
    shift
    ;;
    *)
    if [[ $1 == *"@"* ]]; then
        while IFS='@' read -ra ARG; do
            if [[ "${#ARG[@]}" -ne 2 ]]; then
                echo "Please provide a correct <role>@<gatein> pair, retry!"
                print_help
            fi
            role=${ARG[0]}
            gatein=${ARG[1]}
        done <<< "$1"
    else
        echo "Unrecognized option: '$1'!"
        print_help
    fi
    shift
    ;;
esac
done

if [[ "$gatein" == "local" ]]; then
    local_connection="TRUE"
fi

if [[ "$OSTYPE" == *"linux-gnu"* ]]
then
   echo -e "Linux OS is detected..."
   current_system="LINUX"
elif [[ "$OSTYPE" == *"darwin"* ]]
then
   echo -e "Mac OS is detected..."
   current_system="MACOS"
else
   echo -e "Not supported OS, some unpredictable results may happen!"	
fi

if ! hash vncviewer &>/dev/null; then
    echo -e "'vncviewer' is not installed, this script is setting up the connection but won't automatically start vnc.\nA custom client should be manually started."
    vnc_avail="FALSE"
fi

if hash netstat &>/dev/null; then
    if [[ "$current_system" == "LINUX" ]]; then
        PORTCOMMAND="netstat -tulpn"
    else
        PORTCOMMAND="netstat -avnp tcp"
    fi
else
    echo -e "This program requires 'netstat' to be installed.\nThe package to install may vary depending on your operating system.\n"
    print_help
fi

for session in "${remote_sessions[@]}" ; do
    role_name="${session%%:*}"
    ports="${session#*:}"
    rport="${ports%:*}"
    lport="${ports#*:}"
    if [[ "$role" == "$role_name" ]]; then
        if [ "$local_connection" = "TRUE" ]; then
        		#this is for local area connection when it will enabled
            #remote_port=$lport
            remote_port=$rport
            ssh_port=5122 
        else
            remote_port=$rport
        fi
        break
    fi
done

if [[ $remote_port -eq 0 ]]; then
    echo "Please, provide a correct role, use the switch '--roles' for a complete list of available roles"
    print_help
fi

for i in {0..50}
do
    local_port_attempt=$((9000 + i))
    if ! $PORTCOMMAND | grep 127.0.0.1[.:]$local_port_attempt &>/dev/null; then
        local_port=$local_port_attempt
        break
    fi
done

if [[ -z "$local_port" ]]; then
    echo "Could not find an available port in range 9000-9050"
    exit 1
fi

#echo $local_connection
#echo $role
#echo $remote_port
#echo $local_port
#echo $gatein
#echo $ssh_port
#echo $viewonly
#echo $vnc_avail

if [[ "$local_connection" = "TRUE" ]]; then
    echo "Connecting from local area...."
    #ssh -N -f -L $local_port:192.168.1.99:$remote_port $role@192.167.189.98
else
    echo "Connecting from wide area....."
fi
ssh -N -f -p $ssh_port -L $local_port:192.167.189.98:$remote_port $role@$gatein
if [[ "$vnc_avail" == "TRUE" ]]; then
    echo "Starting vncviewer...."
    vncviewer localhost:$local_port $viewonly &>/dev/null
else
    echo "Connection is set, please use your preferred vnc client to connect to 'localhost', port "$local_port
fi