parser beta 0.1 #1

Closed
nekitmilk wants to merge 3 commits from nekitmilk_add_getopt into dev
5 changed files with 65 additions and 32 deletions
Showing only changes of commit 2b79163781 - Show all commits

View File

@ -1,14 +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: my_app
all: dos
# Сюда дописывать файлики для компиляции
my_app:
$(CXX) $(CXXFLAGS) ./main.cpp ./parser.cpp -o my_app
dos:
$(CXX) $(CXXFLAGS) ./main.cpp ./my_check_params.cpp -o dos
rebuild:
rm -f my_app && make my_app
rm -f ./dos && make dos
clean:
rm -f my_app
rm -f ./dos

View File

@ -1,14 +1,15 @@
#include "parser.hpp"
#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[]) {
Options opts;
int error = parse_params(argc, argv, opts);
if (!error)
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";
@ -34,6 +35,9 @@ int main(int argc, char *argv[]) {
}
else {
cout << "err code:" << error << "\n";
}

BIN
src/my_app Executable file

Binary file not shown.

View File

@ -1,4 +1,4 @@
#include "parser.hpp"
#include "my_check_params.hpp"
// Гарантируется наличие минимума нужных аргументов для flood и scan
// Гарантируется, что после работы парсера мы получим только валидный тип атаки
@ -6,9 +6,19 @@
// Добавить:
// 1. Валидацию IP, port
// Статус коды:
// 2 - Атака флуд, все нужные опции есть
// 1 - Атака порт скан, все нужные опции есть
// 0 - нужна помощь
// -1 - пользователь не ввел тип атаки или ввел неверный тип атаки
// -10 - Пользователь выбрал тип атаки порт сканнинг, но не ввел нужные параметры
// -20 - Пользователь выбрал тип атаки флуд, но не ввел нужные параметры
// -100 - неизвестная ошибка
// -101 - неизвестная опция, следует предложить вызвать флаг помощи
// Какие-то еще коды?
int my_check_params(int argc, char** argv) {
int parse_params(int argc, char** argv, Options& opts) {
int status = -100;
// Короткие опции (с двоеточием для параметров)
const char* short_options = "a:d:i:p:l:t:b:h";
@ -60,32 +70,48 @@ int parse_params(int argc, char** argv, Options& opts) {
<< " -l, --log FILE Log file\n"
<< " -t, --telegram ID Telegram ID\n"
<< " -b, --token TOKEN Telegram bot token\n";
return 1;
status = 0;
break;
case '?':
std::cerr << "Unknown option!\n.--help for info\n";
Review

my_diag

my_diag
return 1;
status = -101;
break;
default:

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

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

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

В default? По идее нет, но это просто на всякий случай, если вдруг по какой-то причине ни одно из условий не было выполнено, то мы код -100 вернем
return 1;
status = -100;
break;
}
}
// Проверка обязательных параметров
if (opts.attack_type.empty()) {
std::cerr << "Error: Missing required parameters!\n--help for more info\n";
return 1;
}
else if (opts.attack_type != "flood" && opts.attack_type != "scan"){
std::cerr << "Error: Only scan or flood type of attack!\n--help for more info\n";
return 1;
}
else if (opts.attack_type == "flood" && (opts.domain.empty() || opts.ip.empty() || opts.port.empty())) {
std::cerr << "Error: Missing required parameters!\n--help for more info\n";
return 1;
}
else if (opts.attack_type == "scan" && (opts.domain.empty() || opts.ip.empty())) {
std::cerr << "Error: Missing required parameters!\n--help for more info\n";
return 1;
if (status != 0)
{
if (opts.attack_type != "flood" && opts.attack_type != "scan") {
std::cerr << "Error: Missing required parameters!\n--help for more info\n";
Review

my_diag

my_diag
Review

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

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

my_diag

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

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

Если у нас при типе атаки flood порт задан, а ip и domain нет, то это тоже неверная комбинация
std::cerr << "Error: Missing required parameters!\n--help for more info\n";
Review

my_diag

my_diag
status = -20;
}
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()) {
std::cerr << "Error: Missing required parameters!\n--help for more info\n";

my_diag

my_diag
status = 2;
}
// Какие-то еще коды?
Review

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

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

добавил

добавил
}
return 0;
Review

Переносы

Переносы
Review

убрал

убрал
return status;
}

View File

@ -5,6 +5,7 @@
#include <unistd.h>
#include <getopt.h> // Для struct option
struct Options {
std::string attack_type; // Обязательный параметр
std::string domain; // Обязательный параметр
@ -15,5 +16,7 @@ struct Options {
std::string telegram_token; // Не обязательный параметр
};
extern Options opts; // Теперь это глобальная переменная, где она должна определяться?
// Прототип функции парсинга
int parse_params(int argc, char** argv, Options& opts);
int my_check_params(int argc, char** argv);