#!/bin/bash
CFGFILE1=$HOME/.sshbuk.vars
CFGFILE2=/etc/opt/sshbuk/sshbuk.vars
## настройки по-умолчанию (можно переопределить ключами в ком. строке)
SSH_USER_DEFAULT="bukts"
SSH_PORT=122
VERBOSE="no"                # -voff
TOAZS="yes"                 # -c2a
OPATH='~'                   # -op '~'

fn_show_help() {
    echo "-----------------------------------------------------------------------------"
    echo "Выполнение команд на удаленной АЗС или копирование файлов между АЗС и Центром"
    echo "-----------------------------------------------------------------------------"
};

# функция связи по ssh
fn_do_ssh() {
    do_ssh_AZS_IP=$1
    do_ssh_AZS_CUR=$2
    do_ssh_KEY=$3
    # определить порт
    do_ssh_AZS_IP_tmp=$(echo $do_ssh_AZS_IP | cut -d":" -f1)
    if [ "$do_ssh_AZS_IP_tmp" == "$do_ssh_AZS_IP" ]; then
        do_ssh_AZS_PORT=$SSH_PORT
    else
        do_ssh_AZS_PORT=$(echo $do_ssh_AZS_IP | cut -d":" -f2)
        do_ssh_AZS_IP=$do_ssh_AZS_IP_tmp
    fi

    # определить пользователя
    do_ssh_AZS_IP_tmp=$(echo $do_ssh_AZS_IP | cut -d"@" -f1)
    if [ ! -z "$SSH_USER" ]; then
        do_ssh_AZS_USER=$SSH_USER
        do_ssh_AZS_IP=$(echo $do_ssh_AZS_IP | cut -d"@" -f2)
    elif [ "$do_ssh_AZS_IP_tmp" == "$do_ssh_AZS_IP" ]; then
        do_ssh_AZS_USER=$SSH_USER_DEFAULT
    else
        do_ssh_AZS_USER=$(echo $do_ssh_AZS_IP | cut -d"@" -f1)
        do_ssh_AZS_IP=$(echo $do_ssh_AZS_IP | cut -d"@" -f2)
    fi
    

    if [ "$VERBOSE" == "yes" ]; then
        echo ">> AZS=$do_ssh_AZS_CUR IP=$do_ssh_AZS_IP"
    fi
    # если задан файл - выполнть scp, а не ssh
    CML="-o ""StrictHostKeyChecking=no"" "
    if [ ! -z "$TANKONLY" ]; then
        CML="$CML-o ""ConnectTimeout=10"" "
        CML="$CML-o ""ServerAliveInterval=5"" "
        CML="$CML-o ""ServerAliveCountMax=2"" "
    fi
    if [ ! -z "$do_ssh_KEY" ]; then
        CML="$CML-i $do_ssh_KEY "
    fi
    
    if [ ! -z "$IFILE" ]; then
        # формирование команды в зависимости от направления передачи
        if [ "$TOAZS" == "yes" ]; then
            SSHCMD="scp -P ${do_ssh_AZS_PORT} $CML $IFILE ${do_ssh_AZS_USER}@${do_ssh_AZS_IP}:${OPATH}/"
        else
            if [ "$OPATH" == '~' ]; then
                OPATH0=$HOME
            else
                OPATH0=$(echo $OPATH | sed -e "s#^~/#$HOME/#" -e "s#%a#$do_ssh_AZS_CUR#" -e "s#%i#$do_ssh_AZS_IP#" )
                if [ "$OPATH" != "$OPATH0" ]; then
                    mkdir -p $OPATH0
                else
                    OPATH0=$OPATH
                fi
            fi
            SSHCMD="scp -P ${do_ssh_AZS_PORT} $CML ${do_ssh_AZS_USER}@${do_ssh_AZS_IP}:${IFILE} ${OPATH0}/"
        fi
    # иначе выполнить ssh; если $CMS не задана - будет открыт обычный сеанс ssh
    else
        SSHCMD="ssh ${do_ssh_AZS_USER}@${do_ssh_AZS_IP} -p ${do_ssh_AZS_PORT} $CML ${CMD}"
    fi
    fn_to_log "$(date +%H:%M:%S) $SSHCMD"
    $SSHCMD
    ERR=$?
    fn_to_log "$(date +%H:%M:%S) result=$ERR"
}

if [ -f "$CFGFILE1" ]; then
    . $CFGFILE1
elif [ -f "$CFGFILE2" ]; then
    . $CFGFILE2
else
    echo "Не найден файл sshbuk.vars" >& 2
    exit 1
fi

if [ -f $BINDIR/sshbuk.fn ]; then
    . $BINDIR/sshbuk.fn
else
    echo "Не найден файл \"sshbuk.fn\"" >& 2
    exit 1
fi

fn_make_log $LOGDIR
fn_to_log ""
fn_to_log "$(date +%H:%M:%S) $(basename $0) \"$@\""

## анализ командной строки
fn_command_line "$@"
AZS=$cml_azs
IPADR=$cml_ipadr
CMD=$cml_cmd
IFILE=$cml_ifile
if [ ! -z "$cml_list_file" ];   then AZSLIST=$cml_list_file;    fi
if [ ! -z "$cml_opath" ];       then OPATH=$cml_opath;          fi
if [ ! -z "$cml_port" ];        then SSH_PORT=$cml_port;        fi
if [ ! -z "$cml_user" ];        then SSH_USER=$cml_user;        fi
if [ ! -z "$cml_key_file" ];    then SSH_KEYFILE=$cml_key_file; fi
if [ ! -z "$cml_verbose" ];     then VERBOSE=$cml_verbose;      fi
if [ ! -z "$cml_toazs" ];       then TOAZS=$cml_toazs;          fi
if [ ! -z "$cml_tankonly" ];    then TANKONLY="yes";            fi

## если не задан ни номер АЗС, ни IP-адрес - вывести help и завершить
if [ -z "$AZS" -a -z "$IPADR" ]; then
    fn_show_help
    exit 1
fi

SSHKEY=$SSH_KEYFILE
if [ ! -z "$SSHKEY" -a "$SSHKEY" == "$(basename $SSHKEY)" ]; then
    SSHKEY=$SSH_KEYPATH_HOME/$SSH_KEYFILE
    if [ ! -f "$SSHKEY" ]; then
        SSHKEY=$SSH_KEYPATH_DEFAULT/$SSH_KEYFILE
    fi
fi
if [ ! -z "$SSHKEY" -a ! -f "$SSHKEY" ]; then
    SSHKEY=
fi

if [ ! -f "$AZSLIST" ]; then
    AZSLIST=$ETCPATH/$AZSLIST
    if [ ! -f "$AZSLIST" ]; then
        AZSLIST=
    fi
fi

fn_get_num_all_azs $AZSLIST
Line=1
Is="no"
while [ $Line -le $num_all_azs ]
do
    AZS_IP=
    AZS_CUR=

    if [ ! -z "$IPADR" ]; then
        AZS_IP=$IPADR
        AZS_CUR=$AZS
    else
        fn_get_azs_ip $AZSLIST $AZS $Line $AEX
        AZS_IP=$azs_ip
        AZS_CUR=$azs_cur
    fi
    if [ ! -z $AZS_IP ]; then
        Is="yes"
        fn_do_ssh $AZS_IP $AZS_CUR $SSHKEY
    fi

    if [ "$AZS" != "all" -o ! -z "$IPADR" ]; then
        break
    fi
    # увеличить индекс массива
    Line=$(expr $Line + 1)
done

if [ "$Is" != "yes" ]; then
    MSG="Задан незаригистрированный номер АЗС."
    echo $MSG >& 2
    fn_to_log "$(date +%H:%M:%S) exit; $MSG"
    exit 1
fi

fn_to_log "$(date +%H:%M:%S) ok"

if [ $ERR -ne 0 ]; then
  exit 1
fi

exit 0
