auspex/main.go

204 lines
7.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"bufio"
"fmt"
"os"
"strings"
)
const appVersion = "1.3.5"
// Цвета терминала (общие для всех модулей)
const (
cReset = "\033[0m"
cRed = "\033[0;31m"
cGreen = "\033[0;32m"
cYellow = "\033[1;33m"
cBlue = "\033[0;34m"
cCyan = "\033[0;36m"
)
func main() {
// Загружаем конфигурацию из /etc/auspex/auspex.env
if err := loadConfig(); err != nil {
// Файл не найден - выводим предупреждение
fmt.Printf("⚠️ %v\n", err)
fmt.Println("⚠️ Используются значения по умолчанию")
fmt.Printf("💡 Создайте файл конфигурации: sudo mkdir -p /etc/auspex && sudo nano /etc/auspex/auspex.env\n\n")
}
// Если переданы аргументы — быстрый вызов
if len(os.Args) > 1 {
runByFlag(os.Args[1], os.Args[2:])
return
}
// Интерактивное меню
showMenu()
}
func runByFlag(flag string, extraArgs []string) {
switch flag {
case "-ss":
fmt.Printf("%s⚡ Auspex — Просмотр занятых портов (TUI)%s\n\n", cCyan, cReset)
if err := runPortsView(); err != nil {
fmt.Fprintf(os.Stderr, "Ошибка: %v\n", err)
os.Exit(1)
}
case "-c":
fmt.Printf("%s🔐 Auspex — Проверка SSL сертификатов%s\n\n", cCyan, cReset)
if err := runCertCheck(); err != nil {
fmt.Fprintf(os.Stderr, "Ошибка: %v\n", err)
os.Exit(1)
}
case "-p":
fmt.Printf("%s🌐 Auspex — Проверка доступности портов%s\n\n", cCyan, cReset)
if err := runPortCheck(); err != nil {
fmt.Fprintf(os.Stderr, "Ошибка: %v\n", err)
os.Exit(1)
}
case "-m":
fmt.Printf("%s🔄 Auspex — Проверка совпадений Angie ↔ Docker%s\n\n", cCyan, cReset)
clientFilter := ""
if len(extraArgs) > 0 {
clientFilter = extraArgs[0]
}
if err := runMatchCheck(clientFilter); err != nil {
fmt.Fprintf(os.Stderr, "Ошибка: %v\n", err)
os.Exit(1)
}
case "-l":
fmt.Printf("%s📝 Auspex — Проверка активности логов%s\n\n", cCyan, cReset)
if err := runLogCheck(); err != nil {
fmt.Fprintf(os.Stderr, "Ошибка: %v\n", err)
os.Exit(1)
}
case "-sv":
fmt.Printf("%s🔧 Auspex — Проверка состояния служб%s\n\n", cCyan, cReset)
if err := runServiceCheck(); err != nil {
fmt.Fprintf(os.Stderr, "Ошибка: %v\n", err)
os.Exit(1)
}
case "-dc", "-d":
fmt.Printf("%s🐳 Auspex — Проверка контейнеров Docker%s\n\n", cCyan, cReset)
if err := runDockerCheck(); err != nil {
fmt.Fprintf(os.Stderr, "Ошибка: %v\n", err)
os.Exit(1)
}
case "-v", "--version":
fmt.Printf("auspex v%s\n", appVersion)
case "-h", "--help":
printUsage()
default:
fmt.Fprintf(os.Stderr, "%sНеизвестный флаг: %s%s\n\n", cRed, flag, cReset)
printUsage()
os.Exit(1)
}
}
func showMenu() {
printBanner()
fmt.Printf("%sВыберите утилиту:%s\n\n", cBlue, cReset)
fmt.Printf(" %s1%s) %s-ss%s Просмотр занятых портов (TUI интерфейс)\n", cGreen, cReset, cCyan, cReset)
fmt.Printf(" %s2%s) %s-c %s Проверка SSL сертификатов\n", cGreen, cReset, cCyan, cReset)
fmt.Printf(" %s3%s) %s-p %s Проверка доступности портов (nginx upstream)\n", cGreen, cReset, cCyan, cReset)
fmt.Printf(" %s4%s) %s-m %s Проверка совпадений портов Angie ↔ Docker\n", cGreen, cReset, cCyan, cReset)
fmt.Printf(" %s5%s) %s-l %s Проверка активности логов (PostgreSQL)\n", cGreen, cReset, cCyan, cReset)
fmt.Printf(" %s6%s) %s-sv%s Проверка состояния служб (systemd)\n", cGreen, cReset, cCyan, cReset)
fmt.Printf(" %s7%s) %s-dc%s Проверка контейнеров Docker\n", cGreen, cReset, cCyan, cReset)
fmt.Printf(" %s0%s) Выход\n\n", cGreen, cReset)
fmt.Printf("%sДля быстрого вызова: auspex <ключ>%s\n", cYellow, cReset)
fmt.Printf("%sПример: auspex -ss | auspex -c | auspex -p | auspex -m [клиент] | auspex -l | auspex -sv | auspex -dc%s\n\n", cYellow, cReset)
reader := bufio.NewReader(os.Stdin)
for {
fmt.Printf("%s>>> %s", cGreen, cReset)
input, _ := reader.ReadString('\n')
input = strings.TrimSpace(input)
switch input {
case "1", "-ss", "ss":
if err := runPortsView(); err != nil {
fmt.Fprintf(os.Stderr, "Ошибка: %v\n", err)
}
return
case "2", "-c", "c":
if err := runCertCheck(); err != nil {
fmt.Fprintf(os.Stderr, "Ошибка: %v\n", err)
}
return
case "3", "-p", "p":
if err := runPortCheck(); err != nil {
fmt.Fprintf(os.Stderr, "Ошибка: %v\n", err)
}
return
case "4", "-m", "m":
fmt.Printf(" Имя клиента (Enter = все): ")
clientInput, _ := reader.ReadString('\n')
clientInput = strings.TrimSpace(clientInput)
if err := runMatchCheck(clientInput); err != nil {
fmt.Fprintf(os.Stderr, "Ошибка: %v\n", err)
}
return
case "5", "-l", "l":
if err := runLogCheck(); err != nil {
fmt.Fprintf(os.Stderr, "Ошибка: %v\n", err)
}
return
case "6", "-sv", "sv":
if err := runServiceCheck(); err != nil {
fmt.Fprintf(os.Stderr, "Ошибка: %v\n", err)
}
return
case "7", "-dc", "-d", "dc", "d":
if err := runDockerCheck(); err != nil {
fmt.Fprintf(os.Stderr, "Ошибка: %v\n", err)
}
return
case "0", "q", "quit", "exit":
fmt.Println("Выход.")
return
default:
fmt.Printf("%sНеизвестная команда. Введите 1-7 или 0 для выхода.%s\n", cRed, cReset)
}
}
}
func printBanner() {
fmt.Printf(`%s
█████╗ ██╗ ██╗███████╗██████╗ ███████╗██╗ ██╗
██╔══██╗██║ ██║██╔════╝██╔══██╗██╔════╝╚██╗██╔╝
███████║██║ ██║███████╗██████╔╝█████╗ ╚███╔╝
██╔══██║██║ ██║╚════██║██╔═══╝ ██╔══╝ ██╔██╗
██║ ██║╚██████╔╝███████║██║ ███████╗██╔╝ ██╗
╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚══════╝╚═╝ ╚═╝
%s`, cCyan, cReset)
fmt.Printf(" %sv%s%s — набор утилит мониторинга инфраструктуры\n\n", cBlue, appVersion, cReset)
}
func printUsage() {
fmt.Printf("Использование: auspex [флаг] [аргументы]\n\n")
fmt.Printf("Флаги:\n")
fmt.Printf(" %-12s Просмотр занятых портов (интерактивный TUI)\n", "-ss")
fmt.Printf(" %-12s Проверка SSL сертификатов в %s\n", "-c", cfgSSLDir)
fmt.Printf(" %-12s Проверка доступности портов (nginx upstream)\n", "-p")
fmt.Printf(" %-12s Проверка совпадений портов Angie ↔ Docker [имя_клиента]\n", "-m")
fmt.Printf(" %-12s Проверка активности логов (PostgreSQL)\n", "-l")
fmt.Printf(" %-12s Проверка состояния служб systemd\n", "-sv")
fmt.Printf(" %-12s Проверка контейнеров Docker\n", "-dc")
fmt.Printf(" %-12s Показать версию\n", "-v")
fmt.Printf(" %-12s Показать эту справку\n\n", "-h")
fmt.Printf("Без аргументов запускается интерактивное меню.\n")
}