Compare commits

..
1 Commits
Author SHA1 Message Date
icewind bdb6574cf7 Initial commit 2025-10-25 22:46:26 +00:00
12 changed files with 20 additions and 217 deletions
-2
View File
@@ -1,2 +0,0 @@
*.yaml
bin/http_logger
+18
View File
@@ -0,0 +1,18 @@
MIT License
Copyright (c) 2025 icewind
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
associated documentation files (the "Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the
following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial
portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
+2
View File
@@ -0,0 +1,2 @@
# http_logger
-10
View File
@@ -1,10 +0,0 @@
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
View File
@@ -1,8 +0,0 @@
#!/bin/sh
dir=$(dirname "$0")
cd $dir
./stop.sh
./start.sh
-16
View File
@@ -1,16 +0,0 @@
#!/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
View File
@@ -1,31 +0,0 @@
#!/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
View File
@@ -1,9 +0,0 @@
#!/bin/sh
# Определяем директорию скрипта
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
# Имя приложения
app="http_logger"
cd $SCRIPT_DIR
go build -o ./bin/$app -buildvcs=false
-9
View File
@@ -1,9 +0,0 @@
listen_addresses:
- ":8080"
- "127.0.0.1:9090"
log_dir: "logs"
telegram:
token:"*****"
group_id: -10012345
-10
View File
@@ -1,10 +0,0 @@
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
View File
@@ -1,10 +0,0 @@
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
View File
@@ -1,112 +0,0 @@
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
}