parser beta 0.1 #1

Closed
nekitmilk wants to merge 3 commits from nekitmilk_add_getopt into dev
4 changed files with 166 additions and 0 deletions
Showing only changes of commit 7493c803fa - Show all commits

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

42
src/main.cpp Normal file
View File

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

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

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

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

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

В my_check_params

В my_check_params
Review

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

Возможно нужно будет их из структуры вынуть, это тоже спросим
int error = parse_params(argc, argv, opts);
if (!error)
{
if (opts.attack_type == "flood") {
cout << "type attack: " << opts.attack_type << "\n";
Review

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

тут уже можно завязываться не на опцию, а на статус код error но это временный код, пока не важно
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";
}
}
return 0;
}

91
src/parser.cpp Normal file
View File

@ -0,0 +1,91 @@
#include "parser.hpp"
// Гарантируется наличие минимума нужных аргументов для flood и scan
// Гарантируется, что после работы парсера мы получим только валидный тип атаки
// Добавить:
// 1. Валидацию IP, port
int parse_params(int argc, char** argv, Options& opts) {
serafim marked this conversation as resolved Outdated

Давай близко к схеме: my_check_params

Давай близко к схеме: my_check_params

Поправил

Поправил
// Короткие опции (с двоеточием для параметров)
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) {
serafim marked this conversation as resolved Outdated

Это кто, это откуда?

Это кто, это откуда?

Нашёл, это круто

Нашёл, это круто

Что?

Что?
switch (opt) {
serafim marked this conversation as resolved Outdated

Беленькая больше любит статус коды, а не буквы

Беленькая больше любит статус коды, а не буквы

А они же наверн работают как сокращениия --attach = -a тогда ничего не попишешь

А они же наверн работают как сокращениия --attach = -a тогда ничего не попишешь

Статус коды в конце функций/программ, здесь первая половина функции, какие статус коды?

Статус коды в конце функций/программ, здесь первая половина функции, какие статус коды?
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':

Это тоже my_diag

Это тоже 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";
return 1;
case '?':
std::cerr << "Unknown option!\n.--help for info\n";
return 1;
default:
return 1;
}
}
// Проверка обязательных параметров
if (opts.attack_type.empty()) {

Эти случаи должны возвращаться из функции в виде статус кодов. Потом в my_diag свитч кейс с этими сообщениями

Эти случаи должны возвращаться из функции в виде статус кодов. Потом в my_diag свитч кейс с этими сообщениями

Добавил основные статус коды

Добавил основные статус коды
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;
}
return 0;
}

19
src/parser.hpp Normal file
View File

@ -0,0 +1,19 @@
#pragma once
#include <iostream>
#include <string>
#include <unistd.h>
#include <getopt.h> // Для struct option
struct Options {

Это нужно объявить глобальными переменными (не я придумал)
https://stackoverflow.com/a/3627979

Это нужно объявить глобальными переменными (не я придумал) https://stackoverflow.com/a/3627979

struct Options - это просто описание структуры, откуда доставать параметры, условно тип данных

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; // Не обязательный параметр
};
// Прототип функции парсинга
int parse_params(int argc, char** argv, Options& opts);