Initial commit

This commit is contained in:
Vladimir V Maksimov
2025-10-26 02:03:14 +03:00
commit 9361880b33
10 changed files with 217 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
*.yaml
bin/http_logger

10
bin/nohup.out Normal file
View File

@@ -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 ...

8
bin/restart.sh Executable file
View File

@@ -0,0 +1,8 @@
#!/bin/sh
dir=$(dirname "$0")
cd $dir
./stop.sh
./start.sh

16
bin/start.sh Executable file
View File

@@ -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

31
bin/stop.sh Executable file
View File

@@ -0,0 +1,31 @@
#!/bin/sh
APP_NAME="http_logger"
if [ -z "$APP_NAME" ]; then
echo "Usage: $0 <app_name>"
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

9
build.sh Executable file
View File

@@ -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

9
config.yaml.default Normal file
View File

@@ -0,0 +1,9 @@
listen_addresses:
- ":8080"
- "127.0.0.1:9090"
log_dir: "logs"
telegram:
token:"*****"
group_id: -10012345

10
go.mod Normal file
View File

@@ -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

10
go.sum Normal file
View File

@@ -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=

112
main.go Normal file
View File

@@ -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
}