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