commit 9361880b33aa660dd529fae90a37889c55e806d0 Author: Vladimir V Maksimov Date: Sun Oct 26 02:03:14 2025 +0300 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e1e22f6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.yaml +bin/http_logger \ No newline at end of file diff --git a/bin/nohup.out b/bin/nohup.out new file mode 100644 index 0000000..71cd797 --- /dev/null +++ b/bin/nohup.out @@ -0,0 +1,10 @@ +2025/10/26 01:40:52 Ошибка загрузки конфига: open config.yaml: no such file or directory +2025/10/26 01:41:33 Ошибка загрузки конфига: open config.yaml: no such file or directory +2025/10/26 01:42:54 Запуск приложения +2025/10/26 01:42:54 Ошибка загрузки конфига: open config.yaml: no such file or directory +2025/10/26 01:43:36 Запуск приложения +2025/10/26 01:43:36 Слушаю 127.0.0.1:7001 ... +2025/10/26 01:43:50 Запуск приложения +2025/10/26 01:43:50 Слушаю 127.0.0.1:7001 ... +2025/10/26 01:43:54 Запуск приложения +2025/10/26 01:43:54 Слушаю 127.0.0.1:7001 ... diff --git a/bin/restart.sh b/bin/restart.sh new file mode 100755 index 0000000..9b03eff --- /dev/null +++ b/bin/restart.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +dir=$(dirname "$0") + +cd $dir + +./stop.sh +./start.sh \ No newline at end of file diff --git a/bin/start.sh b/bin/start.sh new file mode 100755 index 0000000..16f595e --- /dev/null +++ b/bin/start.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +dir=$(dirname "$0") + +cd $dir + +APP="http_logger" + +PID=$(ps -o pid= -C $APP | sed 's/^[ \t]*//') +if [ -z "$PID" ]; then + nohup ./$APP & + PID=$(ps -o pid= -C $APP | sed 's/^[ \t]*//') + echo "Процесс $APP был запущен ($PID)." +else + echo "Процесс $APP уже запущен ($PID)." +fi \ No newline at end of file diff --git a/bin/stop.sh b/bin/stop.sh new file mode 100755 index 0000000..83d99fe --- /dev/null +++ b/bin/stop.sh @@ -0,0 +1,31 @@ +#!/bin/sh + +APP_NAME="http_logger" + +if [ -z "$APP_NAME" ]; then + echo "Usage: $0 " + exit 1 +fi + +# Найти PID по имени процесса +PIDS=$(pgrep -f "$APP_NAME") + +if [ -z "$PIDS" ]; then + echo "Процесс с именем '$APP_NAME' не найден." + exit 0 +fi + +echo "Найден PID: $PIDS" + +for PID in $PIDS; do + echo "Отправка SIGTERM процессу $PID..." + kill "$PID" + + printf "Ожидание завершения процесса %s" "$PID" + while kill -0 "$PID" 2>/dev/null; do + printf "." + sleep 1 + done + echo "" + echo "Процесс $PID завершён." +done \ No newline at end of file diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..5227f61 --- /dev/null +++ b/build.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +# Определяем директорию скрипта +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +# Имя приложения +app="http_logger" + +cd $SCRIPT_DIR +go build -o ./bin/$app -buildvcs=false \ No newline at end of file diff --git a/config.yaml.default b/config.yaml.default new file mode 100644 index 0000000..f166b8d --- /dev/null +++ b/config.yaml.default @@ -0,0 +1,9 @@ +listen_addresses: + - ":8080" + - "127.0.0.1:9090" + +log_dir: "logs" + +telegram: + token:"*****" + group_id: -10012345 diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..84a17f2 --- /dev/null +++ b/go.mod @@ -0,0 +1,10 @@ +module http_logger + +go 1.25.1 + +require ( + git.gm6.ru/icewind/notify v0.0.0-20251025181146-68310ac711a7 + gopkg.in/yaml.v3 v3.0.1 +) + +require github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 // indirect diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..73855f7 --- /dev/null +++ b/go.sum @@ -0,0 +1,10 @@ +git.gm6.ru/icewind/notify v0.0.0-20251025181146-68310ac711a7 h1:F1SySndj7+K7dm0yOIq/OODRfgw3xpoJ7/mz06rNv0g= +git.gm6.ru/icewind/notify v0.0.0-20251025181146-68310ac711a7/go.mod h1:ydEvkfAmC16BxZL3+t0sq5+viZ3QNY/KH231RZ0sFwg= +github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 h1:wG8n/XJQ07TmjbITcGiUaOtXxdrINDz1b0J1w0SzqDc= +github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1/go.mod h1:A2S0CWkNylc2phvKXWBBdD3K0iGnDBGbzRpISP2zBl8= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/main.go b/main.go new file mode 100644 index 0000000..9a26755 --- /dev/null +++ b/main.go @@ -0,0 +1,112 @@ +package main + +import ( + "fmt" + "io" + "log" + "net/http" + "os" + "time" + + "gopkg.in/yaml.v3" + + "git.gm6.ru/icewind/notify" +) + +// Config — структура для чтения YAML-файла +type Config struct { + ListenAddresses []string `yaml:"listen_addresses"` + LogDir string `yaml:"log_dir"` + Telegram *ConfigTelegraam `yaml:"telegram"` +} + +type ConfigTelegraam struct { + Token string `yaml:"token"` + GroupID int64 `yaml:"group_id"` +} + +func main() { + log.Println("Запуск приложения") + // Загружаем конфиг + cfg, err := loadConfig("config.yaml") + if err != nil { + log.Fatalf("Ошибка загрузки конфига: %v", err) + } + + if cfg.Telegram == nil { + log.Fatalf("не указана секция telegram") + } + + tg, err := notify.NewTelegram(cfg.Telegram.Token, true) + if err != nil { + log.Fatal(err) + } + + // Общий обработчик + handler := func(w http.ResponseWriter, r *http.Request) { + t := time.Now() + + var body []byte + + if r.ContentLength > 1024 { + body = []byte("too long") + } else { + // Читаем тело запроса + body, _ = io.ReadAll(r.Body) + _ = r.Body.Close() + } + + // Формируем содержимое + entry := fmt.Sprintf("[%s] %s %s%s\n", t.Format(time.RFC3339), r.Method, r.Host, r.URL.String()) + entry += "Headers:\n" + for name, values := range r.Header { + for _, v := range values { + entry += fmt.Sprintf(" %s: %s\n", name, v) + } + } + entry += fmt.Sprintf("Body:\n%s\n", string(body)) + entry += "----\n" + + entry = "```" + entry + "```" + + _, err = tg.SendTextMessage(cfg.Telegram.GroupID, entry) + if err != nil { + log.Println(err) + w.WriteHeader(http.StatusBadGateway) + w.Write([]byte(err.Error())) + } else { + w.WriteHeader(http.StatusOK) + _, _ = w.Write([]byte("OK")) + } + } + + // Регистрируем хендлер + http.HandleFunc("/", handler) + + // Запускаем серверы для всех адресов + for _, addr := range cfg.ListenAddresses { + addr := addr // захватываем в область видимости + go func() { + log.Printf("Слушаю %s ...", addr) + if err := http.ListenAndServe(addr, nil); err != nil { + log.Printf("Ошибка на %s: %v", addr, err) + } + }() + } + + // Блокируем main, чтобы программа не завершилась + select {} +} + +// loadConfig читает YAML-конфиг из файла +func loadConfig(path string) (*Config, error) { + data, err := os.ReadFile(path) + if err != nil { + return nil, err + } + var cfg Config + if err := yaml.Unmarshal(data, &cfg); err != nil { + return nil, err + } + return &cfg, nil +}