#!/bin/bash
# Copyright 2018 (c) jetapps.com

export LANG="en_US"
#export LC_ALL="en_US"

WHOAMI=`/usr/bin/whoami`
[[ ! $WHOAMI || $WHOAMI != 'root' ]] && echo -e "You must login as root in order to manage jetapps packages." && exit 1

# Do run jetapps more then once at the same time
BASE_PATH=/usr/local/jetapps;
LOCK_FILE=$BASE_PATH/tmp/jetapps.lock
[[ ! -f $LOCK_FILE ]] && touch $LOCK_FILE
exec {LOCK_FILE_FD}<>$LOCK_FILE
flock -xn $LOCK_FILE_FD
[[ $? -gt 0 ]] && echo -e "jetapps tool is already in use. Please try later" && exit 1
#

REPO_LOCATION=/etc/apt/sources.list.d
PACKAGES_DIR=$BASE_PATH"/etc/jetapps/"
TMP_DIR=$BASE_PATH"/tmp"
LOGS_DIR=$BASE_PATH"/var/log/jetapps"
LOGS_TTL_DAYS=30
CONF_EXT=".conf"
PACKAGES="jetbackup5-linux jetbackup5-directadmin jetbackup5-cpanel jetbackup5-interworx jetbackup5-plesk jetbackup5-webuzo"

declare -A PACKAGES_CHILD
PACKAGES_CHILD=( \
        # JetBackup 5
        ["jetbackup5-directadmin"]="jetbackup5-directadmin jetbackup5-base" \
        ["jetbackup5-cpanel"]="jetbackup5-cpanel jetbackup5-base" \
        ["jetbackup5-linux"]="jetbackup5-linux jetbackup5-base" \
        ["jetbackup5-interworx"]="jetbackup5-interworx jetbackup5-base" \
        ["jetbackup5-plesk"]="jetbackup5-plesk jetbackup5-base" \
        ["jetbackup5-webuzo"]="jetbackup5-webuzo jetbackup5-base" \
)

TIERS="release rc edge alpha"
RELEASE=$( lsb_release -sc )

PACKAGES_REGEX='^jetapps-?|^@@commandline'
INSTALLED_PACKAGES_REGEX='^installed|^@/?jetapps-?|^@@commandline'
INSTALLED_REGEX='^installed|^@'

CONTACT=
ACTION=$1

applyGPGKey() {
	GPG_FILE=/usr/share/keyrings/jetapps-archive-keyring.gpg
	GPG_OLD_FILE=/etc/apt/trusted.gpg.d/jetapps.gpg
	GPG_REMOTE_URL=https://repo.jetlicense.com/static/jetapps.asc
	curl -fsSL $GPG_REMOTE_URL | gpg --dearmor | tee $GPG_FILE >/dev/null
	#[[ -f $GPG_OLD_FILE ]] && rm -f $GPG_OLD_FILE
}

disableAllRepos() {
    for REPO in $TIERS; do
        REPO_FILE=$REPO_LOCATION"/jetapps-$REPO.list"
        [[ -f $REPO_FILE ]] && mv $REPO_FILE $REPO_FILE".disabled" 
    done
    apt-get update &>/dev/null
    return 0 
}

enableAllRepos() {
    for REPO in $TIERS; do
        REPO_FILE=$REPO_LOCATION"/jetapps-$REPO.list"
        [[ -f $REPO_FILE".disabled" ]] && mv $REPO_FILE".disabled" $REPO_FILE 
    done
    apt-get update &>/dev/null
    return 0 
}

# disable all repos
disableAllRepos

enableRepo() {
    REPO=$1
    [[ -z $REPO ]] && echo "No repo provided" && return 1
    REPO_FILE=$REPO_LOCATION"/jetapps-$REPO.list"
    if [[ -f $REPO_FILE".disabled" ]]; then
        mv $REPO_FILE".disabled" $REPO_FILE
    fi
    apt-get update &>/dev/null
    return 0 
}

timestamp() {
  date +"%Y%m%d.%H%M%S"
}

mkdir -p $LOGS_DIR
LOG_FILE=$LOGS_DIR"/"`timestamp`"_"$RANDOM".log"

addLogEntry() {
    ENTRY=$1
    echo -en "***********************************\n" >> $LOG_FILE
    echo -en $ENTRY >> $LOG_FILE
    echo -en "***********************************\n" >> $LOG_FILE
}

isInstalled() {
    PACKAGE=$1
    
    QUERY=$( dpkg-query -s $PACKAGE 2>/dev/null )
    echo $QUERY | grep 'install ok installed' &>/dev/null
    [[ $? -gt 0 ]] && return 1
    VERSION=$( echo $QUERY | sed 's/.*Version: \([0-9\.\-]\+\).*/\1/g' )
    echo $VERSION
    return 0
    
    #RESULT=`dpkg-query -s $PACKAGE 2>/dev/null  | grep '^Status: ' | grep 'install ok installed'`
    #addLogEntry "dpkg-query -s $PACKAGE 2>/dev/null  | grep '^Status: ' | grep 'install ok installed'\n\n$RESULT\n\n"
    #if [ -z "$RESULT" ]; then return 1; fi

    #IFS=" "
    #RESULT=(${RESULT[@]})
    #echo ${RESULT[1]}
    #return 0
}

getNextVersion() {
    PACKAGE=$1
    TIER=$2
    INSTALLED_VERSION=$3
    [[ ! -z "$TIER" ]] && enableRepo $TIER

    LATEST_VERSION=`apt-cache madison $PACKAGE | awk '{print $3}' | uniq | sort -V | tail -1`
    addLogEntry "apt-cache madison $PACKAGE | awk '{print \$3}' | uniq | sort -V | tail -1\n\n$LATEST_VERSION\n\n"
    if [ -z "$LATEST_VERSION" ]; then return 1; fi

    if [ -z "$INSTALLED_VERSION" ]; then
        INSTALLED_VERSION=`isInstalled $PACKAGE`
        INSTALLED=$?
    else
        INSTALLED=0
    fi

    if [ $INSTALLED -ne 0 ]; then
        echo $LATEST_VERSION
        return 0;
    fi

    GREATEST_VERSION=`echo -en "$LATEST_VERSION\n$INSTALLED_VERSION" | sort -V | tail -1`

    if [ "$INSTALLED_VERSION" == "$GREATEST_VERSION" ]; then return 2; fi

    echo $LATEST_VERSION
    return 0
}

checkPackageConf() {
    PACKAGE=$1
    TIER=$2

    PACKAGE_INFO_FILE=$PACKAGES_DIR/$PACKAGE$CONF_EXT

    QUERY=$( dpkg-query -s $PACKAGE 2>/dev/null )
    addLogEntry "dpkg-query -s $PACKAGE 2>/dev/null\n\n$QUERY\n\n"
    
    echo $QUERY | grep 'install ok installed' &>/dev/null
    if [ $? -gt 0 ]; then
        # if this package is not installed - delete the config file
        rm -f $PACKAGE_INFO_FILE
        return 1;
    fi

    VERSION=$( echo $QUERY | sed 's/.*Version: \([0-9\.\-]\+\).*/\1/g' )

    # TODO detect the install repo
    INSTALLED_REPO="jetapps-release"
    [[ -n $TIER ]] && INSTALLED_REPO="jetapps-"$TIER
    #if [ "$INSTALLED_REPO" == "installed" ]; then INSTALLED_REPO="jetapps-release"; fi
    INSTALLED_VERSION=$VERSION


    if ! [ -f $PACKAGE_INFO_FILE ]; then
        # if this package is installed and the config file not exists - create the config file
        echo -en "AUTOUPDATE=yes\nREPO=$INSTALLED_REPO\nVERSION=$INSTALLED_VERSION" > $PACKAGE_INFO_FILE
    else
        # if this package is installed and the config file exists - update the config file
        source $PACKAGE_INFO_FILE

        validateTier ${REPO}
        if [ $? -ne 0 ]; then updateConfig $PACKAGE "REPO" $INSTALLED_REPO; fi

        updateConfig $PACKAGE "VERSION" $INSTALLED_VERSION
    fi
}

validatePackage() {
    PACKAGE_NAME=$1
    for row in $PACKAGES; do
        if [ "$PACKAGE_NAME" == "$row" ]; then
            return 0
        fi
    done
    return 1
}

validateTier() {
    REPO_NAME=$1
    for row in $TIERS; do
        if [ "$REPO_NAME" == "jetapps-$row" ]; then
            return 0
        fi
    done
    return 1
}

updateConfig() {
    PACKAGE=$1
    VAR=$2
    VALUE=$3

    PACKAGE_INFO_FILE=$PACKAGES_DIR/$PACKAGE$CONF_EXT

    if ! [ -f $PACKAGE_INFO_FILE ]; then
        return 1
    fi

    sed -i "s/$VAR=.*$/$VAR=$VALUE/g" $PACKAGE_INFO_FILE > /dev/null 2>&1
    return 0
}

cleanRepo() {
    echo -en "***********************************\n" >> $LOG_FILE
    `apt-get update 2>/dev/null >> $LOG_FILE`
    RESULT=$?
    echo -en "***********************************\n" >> $LOG_FILE
    return $RESULT
}

printError() {
    if [ -n "$2" ]; then echo -en $2"\n"; fi
    echo -en $1"\n" >&2
    disableAllRepos
    exit 1
}

returnError() {
    if [ -n "$2" ]; then echo -en $2"\n"; fi
    echo -en $1"\n" >&2
    return 1
}

printSuccess() {
    echo -en $1"\n"
    disableAllRepos
    exit 0
}

returnSuccess() {
    echo -en $1"\n"
    return 0
}

printHelp() {
    echo -en "Usage:\n"
    echo -en "  jetapps --info jetbackup\n"
    echo -en "  jetapps --install jetbackup release\n"
    echo -en "  jetapps --chtier jetbackup rc\n"
    echo -en "  jetapps --chupdate jetbackup yes\n"
    echo -en "\n"
    echo -en "Options:\n"
    echo -en " -l, --list\t\tList all installed and available jetapps packages\n"
    echo -en " -d, --list-installed\tList all installed jetapps packages\n"
    echo -en " -i, --info\t\tPrint information about jetapps package\n"
    echo -en " -s, --install\t\tInstall a jetapps package on your system\n"
    echo -en " -u, --update\t\tUpdate a jetapps package on your system\n"
    echo -en " -t, --chtier\t\tChange a jetapps package tier\n"
    echo -en " -p, --chupdate\t\tChange a jetapps package auto update status\n"
    echo -en " -r, --remove\t\tRemove a jetapps package from your system\n"
    echo -en " -v, --version\t\tPrint jetapps cli tool version\n"
    echo -en "     --help\t\tPrint this help\n"
    echo -en "\n"
}

install() {

    PACKAGE=$1
    REPO=$2

    enableRepo $REPO

    echo -en "***********************************\n" >> $LOG_FILE
    apt-get install -y --no-remove $PACKAGE &>>$LOG_FILE
    RESULT=$?
    echo -en "***********************************\n" >> $LOG_FILE

    checkPackageConf $PACKAGE $REPO

    if [ $RESULT -ne 0 ]; then return 1; fi

    return 0;
}

###
# return 0 if nothing to do
# return 100 if the update was successful
# return err code otherwise.
###
update() {
    PACKAGE=$1
    MAX_VERSION=$2

    echo -en "Updating $PACKAGE..."

    INSTALLED_VERSION=$(isInstalled $PACKAGE)
    if [ $? -ne 0 ]; then returnError "Package is not installed"; return $?; fi

    REPO=""

    if ! [[ "$PACKAGE" =~ jetapps-* ]]; then
        validatePackage $PACKAGE
        if [ $? -ne 0 ]; then printError "Invalid package provided"; fi

        PACKAGE_INFO_FILE=$PACKAGES_DIR/$PACKAGE$CONF_EXT
        if ! [ -f $PACKAGE_INFO_FILE ]; then
            checkPackageConf $PACKAGE;
            if ! [ -f $PACKAGE_INFO_FILE ]; then returnError "Failed to update package conf file"; return $?; fi
        fi
        source $PACKAGE_INFO_FILE

        TIER=$3
        if [ -n "$TIER" ]; then
        	[[ "$TIER" == "stable" ]] && TIER="release"
        	[[ "$TIER" == "beta" ]] && TIER="rc"
        	
            validateTier "jetapps-$TIER"
            if [ $? -ne 0 ]; then returnError "Invalid package tier provided"; return $?; fi
        else
            TIER=`echo ${REPO} | sed 's/^jetapps-\(.*\)$/\1/'`
        fi

        REPO=$TIER
    fi

    NEXT_VERSION=`getNextVersion "$PACKAGE" "$TIER" "$INSTALLED_VERSION"`
    RESULT=$?
    if [ $RESULT -ne 0 ]; then
        if [ $RESULT == 1 ]; then returnError "Failed to get versions"; return $?; fi
        if [ $RESULT == 2 ]; then returnSuccess "Up to date"; return $?; fi
    fi

    if [[ "$REPO" == "jetapps-release" ]] && [[ -n "$MAX_VERSION" ]]; then
        GRATER_INSTALLED_VERSION=`echo -en "$INSTALLED_VERSION\n$MAX_VERSION" | sort -rV | tail -1`
        GRATER_NEXT_VERSION=`echo -en "$NEXT_VERSION\n$MAX_VERSION" | sort -V | tail -1`

        if [[ "$GRATER_NEXT_VERSION" != "$MAX_VERSION" ]] && [[ "$GRATER_INSTALLED_VERSION" == "$INSTALLED_VERSION" ]]; then
            returnError "Update is available, However the automatic updates for this version is disabled. In order to update to the latest version ($NEXT_VERSION) manually, please run the following command: /usr/bin/jetapps --update $PACKAGE"
            return $?
        fi
    fi

    echo -en "\n\t- Updating to version $NEXT_VERSION..."

    install $PACKAGE $TIER
    INSTALL_RESULT=$?

    if [ $INSTALL_RESULT == "0" ]; then
        sendEmail "JetApps - $PACKAGE Update Completed" "$PACKAGE version $NEXT_VERSION update completed successfully";
        returnSuccess "Completed"
        return 100;
    else
       INSTALLED_VERSION=`isInstalled $PACKAGE`

        if [ "$INSTALLED_VERSION" == "$NEXT_VERSION" ]; then
            sendEmail "JetApps - $PACKAGE Update Completed with Errors" "$PACKAGE version $NEXT_VERSION update completed with errors\n\nPlease see the log file $LOG_FILE for more details";
            returnError "The requested package was updated successfully, However the apt process has returned exit code $INSTALL_RESULT. For more information please see the log file $LOG_FILE" "Completed"
            return $?;
        else
            sendEmail "JetApps - $PACKAGE Update Failed" "$PACKAGE version $NEXT_VERSION update failed\n\nPlease see the log file $LOG_FILE for more details";
            returnError "Please see the log file $LOG_FILE for more details" "Failed"
            return $?;
        fi
    fi
}

remove() {
    PACKAGE=$1
    
    PACKAGES=$PACKAGE_NAME
    [[ ! -z ${PACKAGES_CHILD[$PACKAGE_NAME]} ]] && PACKAGES=${PACKAGES_CHILD[$PACKAGE_NAME]}

    echo -en "***********************************\n" >> $LOG_FILE
    apt-get remove -y $PACKAGES &>>$LOG_FILE
    RESULT=$?
    echo -en "***********************************\n" >> $LOG_FILE
    return $RESULT
}

sendEmail() {
    SUBJECT=$1
    MESSAGE=$2
    [[ -n "$CONTACT" ]] && echo $MESSAGE | mail -s "$SUBJECT on $HOSTNAME" $CONTACT;
}

info() {
  
    PACKAGE=$1

    PACKAGE_NAME=$row
    PACKAGE_TIER="Not Installed"
    PACKAGE_VERSION="Not Installed"
    PACKAGE_AUTOUPDATE="Not Installed"

    PACKAGE_INFO_FILE=$PACKAGES_DIR/$PACKAGE$CONF_EXT

    if [ -f $PACKAGE_INFO_FILE ]; then

        source $PACKAGE_INFO_FILE
        PACKAGE_TIER=`echo ${REPO} | sed 's/^jetapps-//'`
        PACKAGE_VERSION=${VERSION}
        PACKAGE_AUTOUPDATE="${AUTOUPDATE}"

    fi

    PACKAGE_TIERS=()
    for TIER in $TIERS; do
        getAvailablePackages $TIER | grep "^Package: $PACKAGE$" &>/dev/null
        [[ $? -eq 0 ]] && PACKAGE_TIERS+=( $TIER )
    done
    
    disableAllRepos

    echo -en "Package: $PACKAGE\n"
    echo -en "Available Tiers: ${PACKAGE_TIERS[*]}\n"
    echo -en "Current Tier: $PACKAGE_TIER\n"
    echo -en "Installed Version: $PACKAGE_VERSION\n"
    echo -en "Auto Update: $PACKAGE_AUTOUPDATE\n"
}

getAvailablePackages() {
    TIER=$1    
    FILE="/var/lib/apt/lists/"*".jetlicense.com_debian_dists_"$RELEASE"_"$TIER"_main_binary-amd64_Packages"
    cat $FILE 2>/dev/null
}

logsCleanup() {
    for log in `find $LOGS_DIR -type f -mtime $LOGS_TTL_DAYS`; do
        rm -f $log
    done
}

createLog() {
	
	old_umask=$(umask)
    umask 077
    touch $LOG_FILE
    umask "$old_umask"
    
	echo -en "Log file: $LOG_FILE\n\n";
}

applyGPGKey

case $ACTION in
    -a|--autoupdate)
        createLog
        logsCleanup
        cleanRepo

        update "jetapps-repo"

        RESULT=0
        for PACKAGE in $PACKAGES; do
            checkPackageConf $PACKAGE
            PACKAGE_INFO_FILE=$PACKAGES_DIR/$PACKAGE$CONF_EXT
            if [ -f $PACKAGE_INFO_FILE ]; then

                source $PACKAGE_INFO_FILE

                if [[ "${AUTOUPDATE}" == "yes" ]]; then
                    update $PACKAGE
                    [[ $? -ne 0 && $? -ne 100 ]] && RESULT=$?
                fi
            fi
        done

        disableAllRepos
        exit $RESULT
    ;;
    -p|--chupdate)
        cleanRepo

        PACKAGE=$2
        if [ "$PACKAGE" == "" ]; then printError "No package name was provided"; fi

        validatePackage $PACKAGE
        if [ $? -ne 0 ]; then printError "Invalid package provided";fi

        PACKAGE_INFO_FILE=$PACKAGES_DIR/$PACKAGE$CONF_EXT
        if ! [ -f $PACKAGE_INFO_FILE ]; then printError "This package is not installed"; fi

        AUTOUPDATE=$3
        if ! [[ $AUTOUPDATE == "yes" ]] && ! [[ $AUTOUPDATE == "no" ]]; then printError "Invalid auto update status provided"; fi

        updateConfig $PACKAGE "AUTOUPDATE" $AUTOUPDATE
        if [ $? -ne 0 ]; then printError "Failed to update package config file"; fi

        printSuccess "Package auto update status updated successfully"
    ;;
    -t|--chtier)
        cleanRepo

        PACKAGE=$2
        if [ "$PACKAGE" == "" ]; then printError "No package name was provided"; fi

        validatePackage $PACKAGE
        if [ $? -ne 0 ]; then printError "Invalid package provided";fi

        PACKAGE_INFO_FILE=$PACKAGES_DIR/$PACKAGE$CONF_EXT
        if ! [ -f $PACKAGE_INFO_FILE ]; then printError "This package is not installed"; fi

        TIER=$3
        if [ "$TIER" == "" ]; then printError "No package name was provided"; fi

		[[ "$TIER" == "stable" ]] && TIER="release"
		[[ "$TIER" == "beta" ]] && TIER="rc"

        validateTier "jetapps-$TIER"
        if [ $? -ne 0 ]; then printError "Invalid package tier provided"; fi

        updateConfig $PACKAGE "REPO" "jetapps-$TIER"
        if [ $? -ne 0 ]; then printError "Failed to update package config file"; fi

        printSuccess "Package tier updated successfully"
    ;;
    -u|--update)
        createLog
        cleanRepo

        PACKAGE=$2
        if [ "$PACKAGE" == "" ]; then printError "No package name was provided"; fi
        update $PACKAGE
        [[ $? -ne 100 ]] && disableAllRepos && exit $?

        disableAllRepos
        exit 0
    ;;
    -s|--install)
        createLog
        cleanRepo

        PACKAGE=$2
        TIER=$3

		[[ "$TIER" == "stable" ]] && TIER="release"
		[[ "$TIER" == "beta" ]] && TIER="rc"

        REPO="jetapps-"$TIER

        if [ "$PACKAGE" == "" ]; then printError "No package name was provided"; fi
        if [ "$TIER" == "" ]; then printError "No package tier was provided"; fi

        validatePackage $PACKAGE
        if [ $? -ne 0 ]; then printError "Invalid package provided"; fi

        validateTier $REPO
        if [ $? -ne 0 ]; then printError "Invalid package tier provided"; fi

        INSTALLED_VERSION=`isInstalled $PACKAGE`
        if [ $? == 0 ]; then printError "Package is already installed"; fi

        NEXT_VERSION=`getNextVersion "$PACKAGE" "$TIER" "$INSTALLED_VERSION"`
        RESULT=$?
        if [ $RESULT -ne 0 ]; then
            if [ $RESULT == 1 ]; then printError "Failed to get versions"; fi
            if [ $RESULT == 2 ]; then printSuccess "This package is up to date"; fi
        fi

        echo -en "Installing $PACKAGE version $NEXT_VERSION..."

        install $PACKAGE $TIER
        INSTALL_RESULT=$?

        if [ $INSTALL_RESULT == "0" ]; then
            sendEmail "JetApps - $PACKAGE Installation Completed" "$PACKAGE version $NEXT_VERSION installation completed successfully";
            printSuccess "Completed"
        else
           INSTALLED_VERSION=`isInstalled $PACKAGE`

            if [ "$INSTALLED_VERSION" == "$NEXT_VERSION" ]; then
                sendEmail "JetApps - $PACKAGE Installation Completed with Errors" "$PACKAGE version $NEXT_VERSION installation completed with errors\n\nPlease see the log file $LOG_FILE for more details";
                printError "The requested package was installed successfully, However the apt process has returned exit code $INSTALL_RESULT. For more information please see the log file $LOG_FILE" "Completed"
            else
                sendEmail "JetApps - $PACKAGE Installation Failed" "$PACKAGE version $NEXT_VERSION installation failed\n\nPlease see the log file $LOG_FILE for more details";
                printError "Please see the log file $LOG_FILE for more details" "Failed"
            fi
        fi
        
        disableAllRepos
    ;;
    -i|--info)
        enableAllRepos
        PACKAGE=$2
        if [ "$PACKAGE" == "" ]; then printError "No package name was provided"; fi

        validatePackage $PACKAGE
        if [ $? -ne 0 ]; then printError "Invalid package provided";fi

        info $PACKAGE
        disableAllRepos
    ;;
    -l|--list)
        enableAllRepos
        
        for row in $PACKAGES; do
            info $row
            echo -en "--\n"
        done
        
        disableAllRepos
        exit 0
    ;;
    -d|--list-installed)
        cleanRepo

        for PACKAGE in $PACKAGES; do
        	PACKAGE_INFO_FILE=$PACKAGES_DIR$PACKAGE$CONF_EXT
			if [ -f $PACKAGE_INFO_FILE ]; then		
				source $PACKAGE_INFO_FILE
				echo -en "Package: $PACKAGE version ${VERSION}\n"
			fi
        done
        exit 0
    ;;
    -r|--remove)
        createLog

        PACKAGE=$2
        if [ "$PACKAGE" == "" ]; then printError "No package name was provided"; fi

        validatePackage $PACKAGE
        if [ $? -ne 0 ]; then printError "Invalid package provided";fi

        checkPackageConf $PACKAGE
        PACKAGE_INFO_FILE=$PACKAGES_DIR/$PACKAGE$CONF_EXT
        if ! [ -f $PACKAGE_INFO_FILE ]; then printError "This package is not installed"; fi

        echo -en "Removing $PACKAGE package..."

        #if [ "$PACKAGE" == "jetbackup" ]; then PACKAGE="jetbackup-core"; fi

        remove $PACKAGE
        INSTALL_RESULT=$?

        if [ $INSTALL_RESULT == 0 ]; then
            rm -f $PACKAGE_INFO_FILE
            printSuccess "Completed"
        else
           INSTALLED_VERSION=`isInstalled $PACKAGE`

            if [ -n "$INSTALLED_VERSION" ]; then
                printError "Please see the log file $LOG_FILE for more details" "Failed"
            else
                printError "The requested package was removed successfully, However the apt process has returned exit code $INSTALL_RESULT. For more information please see the log file $LOG_FILE" "Completed"
            fi

        fi
        
        disableAllRepos
    ;;
    -v|--version)
        VERSION=`isInstalled "jetapps"`
        if [ $? -ne 0 ]; then printError "Unable to load version from apt"; fi

        echo -en "JetApps CLI Version $VERSION\n"
        echo -en "Copyright (C) 2012-$( date +"%Y" ) by JetApps.\n"
        exit 0
    ;;
    --help)
        printHelp
        exit 0
    ;;
    *)
        printHelp
        exit 1
    ;;
esac
