#!/bin/bash

set -u

RESULTS="$HOME/Results"
NETLOG_FILE='/tmp/check_network.txt'
hosts=('hq.corp.mos.ru' 'owa.mos.ru')
cur_time=$(date +%F_%H:%M:%S)

# Проверка установки sshpass
func_check_sshpass_install() {
if rpm -qa | grep sshpass; then
kdialog --passivepopup 'sshpass установлен' 1 --title 'Мостех.Помощь' --icon 'mostech-help-utility'
else
kdialog --error 'sshpass НЕ установлен!\n\nНеобходимо установить пакет командой:\nsudo dnf install sshpass' --title 'Мостех.Помощь' --icon 'mostech-help-utility'; exit 1
fi
}

# Запрос логина и пароля
get_logpass() {
SSH_USER=$(kdialog --inputbox "Введите логин для подключения (текущий - $USER):" $USER --title 'Мостех.Помощь' --icon 'mostech-help-utility')
if [[ $? -ne 0 ]]; then kdialog --passivepopup 'Отмена!' 2 --title 'Мостех.Помощь' --icon 'mostech-help-utility'; exit 1;
elif [[ -z $SSH_USER ]]; then kdialog --error 'Пустое значение!' --title 'Мостех.Помощь' --icon 'mostech-help-utility'; get_logpass;
fi
SSH_PASS=$(kdialog --password "Введите пароль для подключения:" --title 'Мостех.Помощь' --icon 'mostech-help-utility')
if [[ $? -ne 0 ]]; then kdialog --passivepopup 'Отмена!' 2 --title 'Мостех.Помощь' --icon 'mostech-help-utility'; exit 1;
elif [[ -z $SSH_PASS ]]; then kdialog --error 'Пустое значение!' --title 'Мостех.Помощь' --icon 'mostech-help-utility'; get_logpass;
fi
}

# Удаленная сетевая диагностика
remote_net_diag() {
if ! sshpass -p $SSH_PASS ssh $SSH_USER@$ip_host2 exit; then kdialog --error "Ошибка подключения к удаленному хосту!\nИмя/IP-адрес хоста: $ip_host2\n\nВозможные причины:\n- служба ssh уже неактивна\n- неверные логин/пароль\n- отсутствуют права на подключение\n- ssh 'слушает' другой сетевой интерфейс или нестандартный порт (не 22)" --title 'Мостех.Помощь' --icon 'mostech-help-utility' --ok-label 'Выход'; unset SSH_PASS; exit 1;
else
kdialog --passivepopup 'Выполняется сбор информации, ожидайте...\nЭто может занять несколько минут' 2 --title 'Мостех.Помощь' --icon 'mostech-help-utility'
if [[ -f "$NETLOG_FILE" ]]; then rm -f "$NETLOG_FILE"; fi
for x in "${hosts[@]}"; do
	sshpass -p $SSH_PASS ssh -t -o StrictHostKeyChecking=no $SSH_USER@$ip_host2 "host $x; echo $'\n'" >> "$NETLOG_FILE";
	sshpass -p $SSH_PASS ssh -t -o StrictHostKeyChecking=no $SSH_USER@$ip_host2 "ping -c 4 $x; echo $'\n'" >> "$NETLOG_FILE";
	sshpass -p $SSH_PASS ssh -t -o StrictHostKeyChecking=no $SSH_USER@$ip_host2 "traceroute -I $x; echo $'\n'" >> "$NETLOG_FILE";
done
kdialog --title 'Мостех.Помощь' --icon 'mostech-help-utility' --geometry 700x700 --textbox /dev/stdin < "$NETLOG_FILE";
rm -f "$NETLOG_FILE"
fi
}

# Стандартная сетевая диагностика
network_diagnostic1() {
SOURCE_IP=$(hostname -i | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}")
ip_host=$(kdialog --inputbox 'Введите IP-адрес или DNS-имя хоста' --title 'Мостех.Помощь' --icon 'mostech-help-utility' --geometry 350x350)
if [[ $? -ne 0 ]]; then kdialog --passivepopup 'Отмена!' 2 --title 'Мостех.Помощь' --icon 'mostech-help-utility'; exit 1;
elif [[ -z $ip_host ]]; then kdialog --error 'Пустое значение!' --title 'Мостех.Помощь' --icon 'mostech-help-utility'; network_diagnostic1;
fi
kdialog --passivepopup 'Выполняется диагностика, ожидайте...\nЭто может занять несколько минут' 2 --title 'Мостех.Помощь' --icon 'mostech-help-utility'
ping -c 4 $ip_host > "$NETLOG_FILE" && echo $'\n' >> "$NETLOG_FILE"
if ping -c 4 $ip_host > /dev/null 2>&1; then check1='ДОСТУПЕН'; else check1='НЕДОСТУПЕН'; fi
traceroute -I $ip_host >> "$NETLOG_FILE" && echo $'\n' >> "$NETLOG_FILE"
if traceroute -I $ip_host > /dev/null 2>&1; then check2='ДОСТУПЕН'; else check2='НЕДОСТУПЕН'; fi
nc -zv -w 2 $ip_host 22 2>&1 | grep $ip_host >> "$NETLOG_FILE" && echo $'\n' >> "$NETLOG_FILE"
if nc -zv -w 2 $ip_host 22; then check3='ДОСТУПЕН'; else check3='НЕДОСТУПЕН'; fi
nc -zv -w 2 $ip_host 5900 2>&1 | grep $ip_host >> "$NETLOG_FILE" && echo $'\n' >> "$NETLOG_FILE"
if nc -zv -w 2 $ip_host 5900; then check4='ДОСТУПЕН'; else check4='НЕДОСТУПЕН'; fi
kdialog --yesno "Ваш текущий IP-адрес(а): $SOURCE_IP\nЦелевой IP-адрес: $ip_host\n\nРЕЗУЛЬТАТЫ:\n\nПроверка ping: $check1\nПроверка traceroute: $check2\nПроверка ssh: $check3\nПроверка vnc: $check4\n\nПосмотреть подробные результаты ?\n" --title 'Мостех.Помощь' --icon 'mostech-help-utility' --yes-label 'Да, смотреть подробнее' --no-label 'Нет, выход из программы'
if [[ $? -eq 0 ]]; then
kdialog --title 'Мостех.Помощь' --icon 'mostech-help-utility' --geometry 600x500 --textbox /dev/stdin < "$NETLOG_FILE"; rm -f "$NETLOG_FILE";
else
kdialog --passivepopup 'Выход из программы...' 2 --title 'Мостех.Помощь' --icon 'mostech-help-utility'; rm -f "$NETLOG_FILE"; exit 0;
fi
}

# Проверка удаленного подключения по ssh
network_diagnostic2() {
ip_host2=$(kdialog --inputbox 'Введите IP-адрес или DNS-имя хоста' --title 'Мостех.Помощь' --icon 'mostech-help-utility' --geometry 350x350)
if [[ $? -ne 0 ]]; then kdialog --passivepopup 'Отмена!' 2 --title 'Мостех.Помощь' --icon 'mostech-help-utility'; exit 1;
elif [[ -z $ip_host2 ]]; then kdialog --error 'Пустое значение!' --title 'Мостех.Помощь' --icon 'mostech-help-utility'; network_diagnostic2;
fi
kdialog --passivepopup 'Проверка доступности хоста...' 2 --title 'Мостех.Помощь' --icon 'mostech-help-utility'
if ping -c 4 $ip_host2 > /dev/null 2>&1 && nc -zv -w 2 $ip_host2 22; then
	kdialog --passivepopup 'Хост доступен' 1 --title 'Мостех.Помощь' --icon 'mostech-help-utility'
	get_logpass
	kdialog --passivepopup 'Выполняется диагностика, ожидайте...' 1 --title 'Мостех.Помощь' --icon 'mostech-help-utility'
else
kdialog --error 'Хост недоступен по SSH!\nПроведение работ невозможно!' --title 'Мостех.Помощь' --icon 'mostech-help-utility' --ok-label 'Выход'; exit 2
fi
}

# Выгрузка стандартных логов (-b)
logs_upload() {
LOG_FILE="/tmp/logs_from_$ip_host2.txt"
if ! sshpass -p $SSH_PASS ssh $SSH_USER@$ip_host2 exit; then kdialog --error "Ошибка подключения к удаленному хосту!\nИмя/IP-адрес хоста: $ip_host2\n\nВозможные причины:\n- служба ssh уже неактивна\n- неверные логин/пароль\n- отсутствуют права на подключение\n- ssh 'слушает' другой сетевой интерфейс или нестандартный порт (не 22)" --title 'Мостех.Помощь' --icon 'mostech-help-utility' --ok-label 'Выход'; unset SSH_PASS; exit 1;
else
	kdialog --passivepopup 'Выполняется сбор информации, ожидайте...\nЭто может занять несколько минут' 3 --title 'Мостех.Помощь' --icon 'mostech-help-utility'
	sshpass -p $SSH_PASS ssh -o StrictHostKeyChecking=no $SSH_USER@$ip_host2 journalctl -q -b > "$LOG_FILE"; tar -czf /tmp/logs_from_$ip_host2-$cur_time.tar.gz "$LOG_FILE"; rm -f "$LOG_FILE"
	mv /tmp/logs_from_$ip_host2-$cur_time.tar.gz "$RESULTS"
	kdialog --msgbox "Выгрузка сохранена в архиве logs_from_$ip_host2.tar.gz в директории $RESULTS\n\nНажмите кнопку 'Выход'!" --title 'Мостех.Помощь' --icon 'mostech-help-utility' --ok-label 'Выход'
	exit 0
fi
}

# Выбор режима работы утилиты (стандарт / админский)
set_work_mode() {
kdialog --yesno 'Выберите режим работы приложения:' --title 'Мостех.Помощь' --icon 'mostech-help-utility' --yes-label 'Привилегированный' --no-label 'Стандартный'
if [[ $? -eq 0 ]]; then pkexec /usr/sbin/mostech-help-utility-priv;
else
kdialog --passivepopup 'Продолжение работы' 2 --title 'Мостех.Помощь' --icon 'mostech-help-utility'
while true; do
set_action=$(kdialog --radiolist 'Выберите доступное действие:' --geometry 500x200 --title 'Мостех.Помощь' --icon 'mostech-help-utility' 1 'Сетевая диагностика ДО хоста' off  2 'Сетевая диагностика С хоста до HQ и OWA' off 3 'Выгрузка логов (упрощенный режим, с момента последней загрузки)' off)
case $set_action in
	1) network_diagnostic1;;
	2) network_diagnostic2; remote_net_diag;;
	3) network_diagnostic2; logs_upload;;
	*) kdialog --passivepopup 'Отмена!' 2 --title 'Мостех.Помощь' --icon 'mostech-help-utility'; exit 1;;
esac
done
fi
}

if [[ ! -d "$RESULTS" ]]; then mkdir "$RESULTS"; fi
func_check_sshpass_install
set_work_mode
