Добавление my_log() и скрипта build.py (#19)

Стратегия ротации логов:
Когда размер лога достигает 10мб - создаётся новый лог.

build.py действует аналогично build.sh, плюс создаёт файл логов изначально, если запуск впервые.

Co-authored-by: Serafim <simasuh@gmail.com>
Reviewed-on: https://gitea.serafimdev.com/serafim/dos/pulls/19
Reviewed-by: serafim <simasuh@gmail.com>
Co-authored-by: dr-wh0 <79003667309@yandex.ru>
Co-committed-by: dr-wh0 <79003667309@yandex.ru>
This commit is contained in:
dr-wh0 2025-04-28 21:59:32 +03:00 committed by serafim
parent 39768fda38
commit 9ee7ea7847
2 changed files with 107 additions and 20 deletions

20
build.py Executable file
View File

@ -0,0 +1,20 @@
#!/usr/bin/env python3
import os
import sys
import subprocess
log_path = "/var/log/DosAtk"
if not os.path.exists(log_path):
if os.getuid() == 0: # Если уже root
os.system("mkdir -p /var/log && touch /var/log/DosAtk")
os.system("chmod 666 /var/log/DosAtk")
else:
os.system("sudo mkdir -p /var/log && sudo touch /var/log/DosAtk 2>/dev/null || true")
os.system("sudo chmod 666 /var/log/DosAtk 2>/dev/null || true")
# Компиляция
if subprocess.call(["g++", "src/DosAtk.cpp", "-o", "DosAtk", "-lcurl", "-lssl", "-lcrypto"]) != 0:
sys.exit(1)
# Запуск с аргументами
os.execvp("./DosAtk", ["./DosAtk"] + sys.argv[1:])

View File

@ -21,8 +21,14 @@
#include <getopt.h> // Для struct option и getopt_long() #include <getopt.h> // Для struct option и getopt_long()
#include <curl/curl.h> // Основной заголовок libcurl #include <curl/curl.h> // Основной заголовок libcurl
#include <iostream> // стандартный input output #include <iostream> // стандартный input output
#include <iomanip> #include <iomanip> // Форматированный ввод/вывод
#include <nlohmann/json.hpp> #include <nlohmann/json.hpp>// Работа с JSON
#include <stdio.h> // Стандартный ввод/вывод (C)
#include <stdlib.h> // Базовые функции (C)
#include <string.h> // Работа со строками (C)
#include <netinet/in.h> // Сетевые функции, интернет-адреса
#include <sys/stat.h> // Для создания директории mkdir
#include <fstream> // Работа с файловыми потоками
/* /*
@ -222,7 +228,7 @@ int my_udp() {
target_addr.sin_port = htons(curr_port); target_addr.sin_port = htons(curr_port);
// Преобразование IP // Преобразование IP
if (inet_pton(AF_INET, global_ip, &target_addr.sin_addr) <= 0) { if (inet_pton(AF_INET, ip.c_str(), &target_addr.sin_addr) <= 0) {
n_fail_requests++; n_fail_requests++;
status = -501; // Код ошибки: неверный IP status = -501; // Код ошибки: неверный IP
if (sockfd != -1) close(sockfd); if (sockfd != -1) close(sockfd);
@ -257,7 +263,7 @@ int my_udp() {
return status; return status;
} }
void my_diag(int status) void my_diag()
{ {
// Данная функция вызывается в случае ошибки на каком-то этапе и на основании поступившего кода, // Данная функция вызывается в случае ошибки на каком-то этапе и на основании поступившего кода,
// формирует сообщение с описанием произошедшей ошибки // формирует сообщение с описанием произошедшей ошибки
@ -361,7 +367,7 @@ bool is_numeric(const std::string& s)
return true; return true;
} }
void my_msg() int my_msg()
{ {
printf("begin my_msg"); // debug printf("begin my_msg"); // debug
@ -441,13 +447,79 @@ void my_msg()
} }
printf("end my_msg"); // debug printf("end my_msg"); // debug
return status;
} }
int my_log() int my_log()
{ {
// Данная функция записывает в файл лога сообщение // Данная функция записывает в файл лога сообщение
printf("start my_log"); // debug printf("start my_log\n"); // debug
printf("end my_log"); // debug
// === Объявление локальных переменных ===
std::ofstream log_stream; // Поток для работы с файлом
std::string current_log_name; // Текущее имя лог-файла
struct stat file_stat; // Информация о файле
std::chrono::system_clock::time_point now; // Текущее время
std::time_t now_time_t; // Время в time_t
std::tm now_tm; // Время в tm структуре
char time_buf[20]; // Буфер для времени
std::string rotated_log_name; // Новое имя файла при ротации
int stat_result; // Результат проверки stat
std::chrono::milliseconds ms; // Миллисекунды
const size_t max_log_size = 10485760; // Лимит размера лога (10MB)
// === Инициализация переменных ===
now = std::chrono::system_clock::now();
now_time_t = std::chrono::system_clock::to_time_t(now);
localtime_r(&now_time_t, &now_tm);
memset(time_buf, 0, sizeof(time_buf));
strftime(time_buf, sizeof(time_buf), "%Y%m%d_%H%M%S", &now_tm);
current_log_name = log_file;
rotated_log_name = log_file + "_" + time_buf;
memset(&file_stat, 0, sizeof(file_stat));
stat_result = stat(log_file.c_str(), &file_stat);
ms = std::chrono::duration_cast<std::chrono::milliseconds>(
now.time_since_epoch()) % 1000;
// === Основная логика ===
// Если путь к лог-файлу не указан
if(log_file.empty()) {
return 0;
}
// Открытие файла в режиме добавления
log_stream.open(log_file, std::ios::app | std::ios::ate);
// Проверка успешности открытия файла
if(!log_stream.is_open()) {
return 1;
}
// Запись сообщения в лог
log_stream << "[" << std::put_time(&now_tm, "%Y-%m-%d %H:%M:%S")
<< "." << std::setfill('0') << std::setw(3) << ms.count() << "] "
<< log_msg << std::endl;
// Проверка размер файла и выполняем ротацию
if(stat_result == 0 && file_stat.st_size > max_log_size) {
log_stream.close(); // Закрываем файл перед ротацией
// Переименование файла
if(rename(log_file.c_str(), rotated_log_name.c_str()) != 0) {
return 1;
}
// Открытие нового лог-файла
log_stream.open(log_file, std::ios::app);
if(!log_stream.is_open()) {
return 1;
}
}
log_stream.close();
printf("end my_log\n"); // debug
return 0; return 0;
} }
@ -520,15 +592,15 @@ int my_tcp_syn() {
printf("start my_tcp_syn"); // debug printf("start my_tcp_syn"); // debug
// === Объявление локальных переменных === // === Объявление локальных переменных ===
int sock; // Основной raw-сокет для отправки пакетов int sock; // Основной raw-сокет для отправки пакетов
int one; // Флаг для setsockopt int one; // Флаг для setsockopt
// Структуры для адресов // Структуры для адресов
struct sockaddr_in target_addr; // Адрес цели struct sockaddr_in target_addr; // Адрес цели
// Параметры подключения // Параметры подключения
uint16_t target_port; // Порт цели (в сетевом порядке байт) uint16_t target_port; // Порт цели (в сетевом порядке байт)
// Структуры заголовков // Структуры заголовков
struct iphdr ip_header; // IP-заголовок пакета struct iphdr ip_header; // IP-заголовок пакета
struct tcphdr tcp_header; // TCP-заголовок пакета struct tcphdr tcp_header; // TCP-заголовок пакета
// Псевдозаголовок для контрольной суммы // Псевдозаголовок для контрольной суммы
struct { struct {
uint32_t saddr; uint32_t saddr;
@ -538,8 +610,8 @@ int my_tcp_syn() {
uint16_t tcp_len; uint16_t tcp_len;
} pseudo_header; } pseudo_header;
// Буферы данных // Буферы данных
char temp_buf[sizeof(pseudo_header) + sizeof(tcphdr)]; // Буфер для контрольной суммы char temp_buf[sizeof(pseudo_header) + sizeof(tcphdr)]; // Буфер для контрольной суммы
char packet[sizeof(iphdr) + sizeof(tcphdr)]; // Итоговый пакет char packet[sizeof(iphdr) + sizeof(tcphdr)]; // Итоговый пакет
// Переменные для встроенного расчета контрольной суммы // Переменные для встроенного расчета контрольной суммы
uint16_t *checksum_ptr; uint16_t *checksum_ptr;
@ -643,16 +715,11 @@ int my_tcp_syn() {
return 2; return 2;
} }
close(sock); close(sock);
printf("end my_tcp_syn"); // debug printf("end my_tcp_syn"); // debug
return 0; return 0;
} }
int my_udp() {
return 0;
}
// Callback для записи ответа от сервера // Callback для записи ответа от сервера
size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* output) { size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* output) {
size_t total_size = size * nmemb; size_t total_size = size * nmemb;