#!/usr/bin/env bash # # DropShell # # Copyright (C) 2013-2014 Andrea Fabrizi # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # #Looking for dropbox uploader if [ -f "./dropbox_uploader.sh" ]; then DU="./dropbox_uploader.sh" else DU=$(which dropbox_uploader.sh) if [ $? -ne 0 ]; then echo "Dropbox Uploader not found!" exit 1 fi fi #For MacOSX, install coreutils (which includes greadlink) # $brew install coreutils if [ "${OSTYPE:0:6}" == "darwin" ]; then READLINK="greadlink" else READLINK="readlink" fi SHELL_HISTORY=~/.dropshell_history DU_OPT="-q" BIN_DEPS="id $READLINK ls basename ls pwd cut" VERSION="0.2" umask 077 #Dependencies check for i in $BIN_DEPS; do which $i > /dev/null if [ $? -ne 0 ]; then echo -e "Error: Required program could not be found: $i" exit 1 fi done #Check DropBox Uploader if [ ! -f "$DU" ]; then echo "Dropbox Uploader not found: $DU" echo "Please change the 'DU' variable according to the Dropbox Uploader location." exit 1 else DU=$($READLINK -m "$DU") fi #Returns the current user function get_current_user { id -nu } function normalize_path { $READLINK -m "$1" } ################ #### START #### ################ echo -e "DropShell v$VERSION" echo -e "The Interactive Dropbox SHELL" echo -e "Andrea Fabrizi - andrea.fabrizi@gmail.com\n" echo -e "Type help for the list of the available commands.\n" history -r "$SHELL_HISTORY" username=$(get_current_user) #Initial Working Directory CWD="/" function sh_ls { local arg1=$1 #Listing current dir if [ -z "$arg1" ]; then $DU $DU_OPT list "$CWD" #Listing $arg1 else #Relative or absolute path? if [ ${arg1:0:1} == "/" ]; then $DU $DU_OPT list "$(normalize_path "$arg1")" else $DU $DU_OPT list "$(normalize_path "$CWD/$arg1")" fi #Checking for errors if [ $? -ne 0 ]; then echo -e "ls: cannot access '$arg1': No such file or directory" fi fi } function sh_cd { local arg1=$1 OLD_CWD=$CWD if [ -z "$arg1" ]; then CWD="/" elif [ ${arg1:0:1} == "/" ]; then CWD=$arg1 else CWD=$(normalize_path "$OLD_CWD/$arg1/") fi $DU $DU_OPT list "$CWD" > /dev/null #Checking for errors if [ $? -ne 0 ]; then echo -e "cd: $arg1: No such file or directory" CWD=$OLD_CWD fi } function sh_get { local arg1=$1 local arg2=$2 if [ ! -z "$arg1" ]; then #Relative or absolute path? if [ ${arg1:0:1} == "/" ]; then $DU $DU_OPT download "$(normalize_path "$arg1")" "$arg2" else $DU $DU_OPT download "$(normalize_path "$CWD/$arg1")" "$arg2" fi #Checking for errors if [ $? -ne 0 ]; then echo -e "get: Download error" fi #args error else echo -e "get: missing operand" echo -e "syntax: get [LOCAL_FILE/DIR]" fi } function sh_put { local arg1=$1 local arg2=$2 if [ ! -z "$arg1" ]; then #Relative or absolute path? if [ "${arg2:0:1}" == "/" ]; then $DU $DU_OPT upload "$arg1" "$(normalize_path "$arg2")" else $DU $DU_OPT upload "$arg1" "$(normalize_path "$CWD/$arg2")" fi #Checking for errors if [ $? -ne 0 ]; then echo -e "put: Upload error" fi #args error else echo -e "put: missing operand" echo -e "syntax: put " fi } function sh_rm { local arg1=$1 if [ ! -z "$arg1" ]; then #Relative or absolute path? if [ ${arg1:0:1} == "/" ]; then $DU $DU_OPT remove "$(normalize_path "$arg1")" else $DU $DU_OPT remove "$(normalize_path "$CWD/$arg1")" fi #Checking for errors if [ $? -ne 0 ]; then echo -e "rm: cannot remove '$arg1'" fi #args error else echo -e "rm: missing operand" echo -e "syntax: rm " fi } function sh_mkdir { local arg1=$1 if [ ! -z "$arg1" ]; then #Relative or absolute path? if [ ${arg1:0:1} == "/" ]; then $DU $DU_OPT mkdir "$(normalize_path "$arg1")" else $DU $DU_OPT mkdir "$(normalize_path "$CWD/$arg1")" fi #Checking for errors if [ $? -ne 0 ]; then echo -e "mkdir: cannot create directory '$arg1'" fi #args error else echo -e "mkdir: missing operand" echo -e "syntax: mkdir " fi } function sh_mv { local arg1=$1 local arg2=$2 if [ ! -z "$arg1" -a ! -z "$arg2" ]; then #SRC relative or absolute path? if [ ${arg1:0:1} == "/" ]; then SRC="$arg1" else SRC="$CWD/$arg1" fi #DST relative or absolute path? if [ ${arg2:0:1} == "/" ]; then DST="$arg2" else DST="$CWD/$arg2" fi $DU $DU_OPT move "$(normalize_path "$SRC")" "$(normalize_path "$DST")" #Checking for errors if [ $? -ne 0 ]; then echo -e "mv: cannot move '$arg1' to '$arg2'" fi #args error else echo -e "mv: missing operand" echo -e "syntax: mv " fi } function sh_cp { local arg1=$1 local arg2=$2 if [ ! -z "$arg1" -a ! -z "$arg2" ]; then #SRC relative or absolute path? if [ ${arg1:0:1} == "/" ]; then SRC="$arg1" else SRC="$CWD/$arg1" fi #DST relative or absolute path? if [ ${arg2:0:1} == "/" ]; then DST="$arg2" else DST="$CWD/$arg2" fi $DU $DU_OPT copy "$(normalize_path "$SRC")" "$(normalize_path "$DST")" #Checking for errors if [ $? -ne 0 ]; then echo -e "cp: cannot copy '$arg1' to '$arg2'" fi #args error else echo -e "cp: missing operand" echo -e "syntax: cp " fi } function sh_free { $DU $DU_OPT info | grep "Free:" | cut -f 2 } function sh_cat { local arg1=$1 if [ ! -z "$arg1" ]; then tmp_cat="/tmp/sh_cat_$RANDOM" sh_get "$arg1" "$tmp_cat" cat "$tmp_cat" rm -fr "$tmp_cat" #args error else echo -e "cat: missing operand" echo -e "syntax: cat " fi } while (true); do #Reading command from shell read -e -p "$username@Dropbox:$CWD$ " input #Tokenizing command eval tokens=($input) cmd=${tokens[0]} arg1=${tokens[1]} arg2=${tokens[2]} #Saving command in the history file history -s "$input" history -w "$SHELL_HISTORY" case $cmd in ls) sh_ls "$arg1" ;; cd) sh_cd "$arg1" ;; pwd) echo $CWD ;; get) sh_get "$arg1" "$arg2" ;; put) sh_put "$arg1" "$arg2" ;; rm) sh_rm "$arg1" ;; mkdir) sh_mkdir "$arg1" ;; mv) sh_mv "$arg1" "$arg2" ;; cp) sh_cp "$arg1" "$arg2" ;; cat) sh_cat "$arg1" ;; free) sh_free ;; lls) ls -l ;; lpwd) pwd ;; lcd) cd "$arg1" ;; help) echo -e "Supported commands: ls, cd, pwd, get, put, cat, rm, mkdir, mv, cp, free, lls, lpwd, lcd, help, exit\n" ;; quit|exit) exit 0 ;; *) if [ ! -z "$cmd" ]; then echo -ne "Unknown command: $cmd\n" fi ;; esac done