#!/bin/bash

set -u

RESULTS="$HOME/Мостех.Помощь. Результаты обработки"
NETLOG_FILE='/tmp/check_network.txt'
hosts=('hq.corp.mos.ru' 'owa.mos.ru')
cur_time=$(date +%F_%H:%M)

# Проверка установки 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-адрес(а):\n$SOURCE_IP\n\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 по пути:\n$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 600x220 --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
