Compare commits
1
Commits
master
..
bdb6574cf7
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bdb6574cf7 |
@@ -1,2 +0,0 @@
|
|||||||
*.yaml
|
|
||||||
bin/http_logger
|
|
||||||
@@ -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.
|
||||||
@@ -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 ...
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
dir=$(dirname "$0")
|
|
||||||
|
|
||||||
cd $dir
|
|
||||||
|
|
||||||
./stop.sh
|
|
||||||
./start.sh
|
|
||||||
@@ -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
@@ -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
|
|
||||||
@@ -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
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
listen_addresses:
|
|
||||||
- ":8080"
|
|
||||||
- "127.0.0.1:9090"
|
|
||||||
|
|
||||||
log_dir: "logs"
|
|
||||||
|
|
||||||
telegram:
|
|
||||||
token:"*****"
|
|
||||||
group_id: -10012345
|
|
||||||
@@ -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
|
|
||||||
@@ -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=
|
|
||||||
@@ -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
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user