parent
36fe2f9db8
commit
33550ccc69
@ -0,0 +1 @@ |
||||
example |
@ -0,0 +1,5 @@ |
||||
{ |
||||
"files.associations": { |
||||
"*.tcc": "cpp" |
||||
} |
||||
} |
@ -0,0 +1,48 @@ |
||||
#ifndef IP_BAN |
||||
#define IP_BAN |
||||
|
||||
#include <iostream> |
||||
#include <vector> |
||||
#include <string> |
||||
#include <future> |
||||
#include <mutex> |
||||
|
||||
#include <time.h> |
||||
#include <unistd.h> |
||||
|
||||
using namespace std; |
||||
|
||||
namespace marcelb { |
||||
|
||||
#define BOT_LOOP_TIME 60 // 1 minutes
|
||||
#define BOT_SLEEP_LOOP_TIME 1 // 1 second
|
||||
|
||||
struct _ban { |
||||
string ip; |
||||
time_t _time; |
||||
}; |
||||
|
||||
class ipban { |
||||
mutex io; |
||||
time_t ban_duration; // u sekundama
|
||||
vector<_ban> banned; |
||||
future<void> unban_bot; |
||||
bool run_unban_bot = true; |
||||
// interface možda bude trebao za ban
|
||||
|
||||
bool unban(vector<_ban>::iterator ban_itr); |
||||
bool ufw_ban(const string& ip); |
||||
bool ufw_unban(const string& ip); |
||||
|
||||
public: |
||||
ipban(const uint& _duration); // u minutama?
|
||||
bool ban(const string& ip); |
||||
~ipban(); |
||||
|
||||
}; |
||||
|
||||
static void sleep_if(const uint& _time, const bool& _condition); |
||||
|
||||
} |
||||
|
||||
#endif |
@ -0,0 +1,59 @@ |
||||
#include "../lib/ipban.hpp" |
||||
|
||||
marcelb::ipban::ipban(const uint& _duration) { |
||||
ban_duration = _duration*60; |
||||
|
||||
unban_bot = async(launch::async, [&]() { |
||||
while (run_unban_bot) { |
||||
sleep_if(BOT_LOOP_TIME, run_unban_bot); |
||||
cout << "Sleep" << endl; |
||||
io.lock(); |
||||
for (uint i=0; i<banned.size(); i++) { |
||||
if (difftime(time(NULL), banned[i]._time) >= ban_duration) { |
||||
unban(banned.begin() + i); |
||||
} |
||||
} |
||||
io.unlock(); |
||||
} |
||||
return; |
||||
}); |
||||
|
||||
} |
||||
|
||||
marcelb::ipban::~ipban() { |
||||
run_unban_bot = false; |
||||
unban_bot.get(); |
||||
for (uint i=0; i<banned.size(); i++) { |
||||
unban(banned.begin() + i); |
||||
} |
||||
} |
||||
|
||||
bool marcelb::ipban::ban(const string& ip) { |
||||
ufw_ban(ip); |
||||
io.lock(); |
||||
banned.push_back({ip, time(NULL)}); |
||||
io.unlock(); |
||||
} |
||||
|
||||
bool marcelb::ipban::unban(vector<_ban>::iterator ban_itr) { |
||||
ufw_unban(ban_itr->ip); |
||||
io.lock(); |
||||
banned.erase(ban_itr); |
||||
io.unlock(); |
||||
} |
||||
|
||||
bool marcelb::ipban::ufw_ban(const string& ip) { |
||||
cout << "UFW ban IP: " << ip << endl; |
||||
} |
||||
|
||||
|
||||
bool marcelb::ipban::ufw_unban(const string& ip) { |
||||
cout << "UFW unban IP: " << ip << endl; |
||||
} |
||||
|
||||
static void marcelb::sleep_if(const uint& _time, const bool& _condition) { |
||||
time_t start_time = time(NULL); |
||||
do { |
||||
sleep(BOT_SLEEP_LOOP_TIME); |
||||
} while (difftime(time(NULL), start_time) < _time && _condition); |
||||
} |
@ -0,0 +1,10 @@ |
||||
#include "../lib/ipban.hpp" |
||||
|
||||
using namespace marcelb; |
||||
|
||||
int main() { |
||||
ipban myban(1); |
||||
myban.ban("192.168.2.74"); |
||||
sleep(80);
|
||||
return 0; |
||||
} |
Loading…
Reference in new issue