parser beta 0.1 #1

Closed
nekitmilk wants to merge 3 commits from nekitmilk_add_getopt into dev
4 changed files with 199 additions and 0 deletions

14
src/Makefile Normal file
View File

@ -0,0 +1,14 @@
CXX = g++
serafim marked this conversation as resolved
Review

Было бы круто sh скрипт на билд при помощи GCC

Было бы круто sh скрипт на билд при помощи GCC
Review

Это мейкфайл, который собирает удобно проект, запуск производится через консольную команду (сейчас ./my_app [флаги][аргументы])

Я могу написать bash скрипт, который будет запускать эту команду (1 строчка), но конкретно этот файлик нужен исключительно для нашего удобства при разработке, чтобы все быстренько собирать и пересобирать :)

Это мейкфайл, который собирает удобно проект, запуск производится через консольную команду (сейчас ./my_app [флаги][аргументы]) Я могу написать bash скрипт, который будет запускать эту команду (1 строчка), но конкретно этот файлик нужен исключительно для нашего удобства при разработке, чтобы все быстренько собирать и пересобирать :)
Review

Также на рисунке у нас указан компилятор g++ (сейчас он и собирает программу), в целом нет проблем использовать gcc, там кажется флаги нужно просто под плюсы настроить, но нужно определиться тогда в документах

Также на рисунке у нас указан компилятор g++ (сейчас он и собирает программу), в целом нет проблем использовать gcc, там кажется флаги нужно просто под плюсы настроить, но нужно определиться тогда в документах
Review

Сейчас у Беленькой уточним, норм ли Makefile

Сейчас у Беленькой уточним, норм ли Makefile
CXXFLAGS = -Iinclude/
all: dos
# Сюда дописывать файлики для компиляции
dos:
$(CXX) $(CXXFLAGS) ./main.cpp ./my_check_params.cpp -o dos
rebuild:
rm -f ./dos && make dos
clean:
rm -f ./dos

46
src/main.cpp Normal file
View File

@ -0,0 +1,46 @@
#include "my_check_params.hpp"
Options opts;
using namespace std;
// Компиляция из директории вызвать команду make my_app
// Запуск: ./my_app [флаги и аргументы к ним] (начать можно с флага --help)
Review

Опции должны быть глобальными переменными

Опции должны быть глобальными переменными
Review

Сделал глобальными в заголовочном файле, где должны определяться, в main.cpp?

Сделал глобальными в заголовочном файле, где должны определяться, в main.cpp?
Review

В my_check_params

В my_check_params
Review

Возможно нужно будет их из структуры вынуть, это тоже спросим

Возможно нужно будет их из структуры вынуть, это тоже спросим
int main(int argc, char *argv[]) {
int error = my_check_params(argc, argv);
if (error > 0)
{
if (opts.attack_type == "flood") {
Review

тут уже можно завязываться не на опцию, а на статус код error
но это временный код, пока не важно

тут уже можно завязываться не на опцию, а на статус код error но это временный код, пока не важно
cout << "type attack: " << opts.attack_type << "\n";
cout << "domain: " << opts.domain << "\n";
cout << "ip: " << opts.ip << "\n";
cout << "port: " << opts.port << "\n";
cout << "log file path: " << opts.log_file << "\n";
}
else if (opts.attack_type == "scan") {
cout << "type attack: " << opts.attack_type << "\n";
cout << "domain: " << opts.domain << "\n";
cout << "ip: " << opts.ip << "\n";
cout << "log file path: " << opts.log_file << "\n";
}
if (!opts.telegram_id.empty()) {
cout << "telegram_id: " << opts.telegram_id << "\n";
}
if (!opts.telegram_token.empty()) {
cout << "telegram_token: " << opts.telegram_token << "\n";
}
}
else {
cout << "err code:" << error << "\n";
}
return 0;
}

117
src/my_check_params.cpp Normal file
View File

@ -0,0 +1,117 @@
#include "my_check_params.hpp"
// Гарантируется наличие минимума нужных аргументов для flood и scan
// Гарантируется, что после работы парсера мы получим только валидный тип атаки
// Добавить:
// 1. Валидацию IP, port
// Статус коды:
// 2 - Атака флуд, все нужные опции есть
// 1 - Атака порт скан, все нужные опции есть
// 0 - нужна помощь
// -1 - пользователь не ввел тип атаки или ввел неверный тип атаки
// -10 - Пользователь выбрал тип атаки порт сканнинг, но не ввел нужные параметры
// -20 - Пользователь выбрал тип атаки флуд, но не ввел нужные параметры
// -100 - неизвестная ошибка
// -101 - неизвестная опция или потерян аргумент, следует предложить вызвать флаг помощи
// -600 - пользователь ввел токен, но не id или наоборот
// Какие-то еще коды?
int my_check_params(int argc, char** argv) {
int status = -100;
// Короткие опции (с двоеточием для параметров)
const char* short_options = "a:d:i:p:l:t:b:h";
// Длинные опции
const struct option long_options[] = {
{"attack", required_argument, NULL, 'a'},
{"domain", required_argument, NULL, 'd'},
{"ip", required_argument, NULL, 'i'},
{"port", required_argument, NULL, 'p'},
{"log", required_argument, NULL, 'l'},
{"telegram", required_argument, NULL, 't'},
{"token", required_argument, NULL, 'b'},
{"help", no_argument, NULL, 'h'},
{NULL, 0, NULL, 0}
};
int opt;
while ((opt = getopt_long(argc, argv, short_options, long_options, NULL)) != -1) {
switch (opt) {
case 'a':
opts.attack_type = optarg;
break;
case 'd':
opts.domain = optarg;
break;
case 'i':
opts.ip = optarg;
break;
case 'p':
opts.port = optarg;
break;
case 'l':
opts.log_file = optarg;
break;
case 't':
opts.telegram_id = optarg;
break;
case 'b':
opts.telegram_token = optarg;
break;
case 'h':
Review

Вообще все выводы сунуть в my_diag в принципе его можно написать, my_check_params ничего не выводит, а только статус код возвращает

Вообще все выводы сунуть в my_diag в принципе его можно написать, my_check_params ничего не выводит, а только статус код возвращает
Review

Я временно эти cout'ы поставил, просто чтобы уже видеть как это работает, потом это можно будет вынести в my_diag в соответствии со статус кодами (как только приступим его создавать)

Я временно эти cout'ы поставил, просто чтобы уже видеть как это работает, потом это можно будет вынести в my_diag в соответствии со статус кодами (как только приступим его создавать)
// std::cout << "Usage: " << argv[0] << " [options]\n"
// << "Required:\n"
// << " -a, --attack TYPE Type of attack (scan|flood)\n"
// << " -d, --domain DOMAIN Target domain\n"
// << " -i, --ip IP Target IP\n"
// << " -p, --port PORT Port. Required only for flood type!\n"
// << "Optional:\n"
// << " -l, --log FILE Log file\n"
// << " -t, --telegram ID Telegram ID\n"
// << " -b, --token TOKEN Telegram bot token\n";
status = 0;
break;
case '?':
Review

my_diag

my_diag
// std::cerr << "Unknown option!\n.--help for info\n";
status = -101;
break;

А сюда можно попасть?

А сюда можно попасть?

В default? По идее нет, но это просто на всякий случай, если вдруг по какой-то причине ни одно из условий не было выполнено, то мы код -100 вернем

В default? По идее нет, но это просто на всякий случай, если вдруг по какой-то причине ни одно из условий не было выполнено, то мы код -100 вернем
default:
status = -100;
break;
}
}
// Проверка обязательных параметров
if (status != 0 && status != -101)
{
if (opts.attack_type != "flood" && opts.attack_type != "scan") {
Review

my_diag

my_diag
Review

В этих условиях cout'ы временны, останется только код

В этих условиях cout'ы временны, останется только код
// std::cerr << "Error: Missing required parameters!\n--help for more info\n";
status = -1;
}
else if (opts.attack_type == "scan" && (opts.domain.empty() || opts.ip.empty())) {
Review

my_diag

my_diag
// std::cerr << "Error: Missing required parameters!\n--help for more info\n";
status = -10;
}
Review

Если у нас при типе атаки flood порт задан, а ip и domain нет, то это тоже неверная комбинация

Если у нас при типе атаки flood порт задан, а ip и domain нет, то это тоже неверная комбинация
else if (opts.attack_type == "flood" && (opts.domain.empty() || opts.ip.empty() || opts.port.empty())) {
Review

my_diag

my_diag
// std::cerr << "Error: Missing required parameters!\n--help for more info\n";
status = -20;
}
else if ((!opts.telegram_id.empty() && opts.telegram_token.empty()) || (opts.telegram_id.empty() && !opts.telegram_token.empty())) {

my_diag

my_diag
status = -600;
}
else if (opts.attack_type == "scan" && !opts.domain.empty() && !opts.ip.empty()) {
// std::cerr << "Error: Missing required parameters!\n--help for more info\n";

my_diag

my_diag
status = 1;
}
else if (opts.attack_type == "flood" && !opts.domain.empty() && !opts.ip.empty() && !opts.port.empty()) {
Review

Если есть telegram_id, то должен быть и token и наоборот

Если есть telegram_id, то должен быть и token и наоборот
Review

добавил

добавил
// std::cerr << "Error: Missing required parameters!\n--help for more info\n";
status = 2;
}
// Какие-то еще коды?
Review

Переносы

Переносы
Review

убрал

убрал
}
return status;
}

22
src/my_check_params.hpp Normal file
View File

@ -0,0 +1,22 @@
#pragma once
#include <iostream>
#include <string>
#include <unistd.h>
#include <getopt.h> // Для struct option
struct Options {
std::string attack_type; // Обязательный параметр
std::string domain; // Обязательный параметр
std::string ip; // Обязательный параметр
std::string port; // Обязательный параметр (не обязательный для скана)
std::string log_file = "/var/logs/DosAtk"; // Значение по умолчанию, не обязательный
std::string telegram_id; // Не обязательный параметр
std::string telegram_token; // Не обязательный параметр
};
extern Options opts; // Теперь это глобальная переменная, где она должна определяться?
// Прототип функции парсинга
int my_check_params(int argc, char** argv);