Add some more checks
This commit is contained in:
parent
8325bcd4f2
commit
af77f68cd6
5 changed files with 199 additions and 0 deletions
2
server_instance/externalscripts/batman_originators
Normal file
2
server_instance/externalscripts/batman_originators
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
#!/bin/sh
|
||||||
|
/usr/bin/sudo /opt/bin/zabbix_server/batman_originators.sh
|
2
server_instance/externalscripts/radvd_adv_count
Normal file
2
server_instance/externalscripts/radvd_adv_count
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
#!/bin/sh
|
||||||
|
/usr/bin/sudo /opt/bin/zabbix_server/radvd_adv_count
|
2
server_instance/zabbix_server/batman_originators.sh
Normal file
2
server_instance/zabbix_server/batman_originators.sh
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
#!/bin/bash
|
||||||
|
batctl tg | cut -d")" -f2 | cut -d" " -f3 | grep -v "^$" | sort | uniq | wc -l
|
191
server_instance/zabbix_server/compile_to_radvd_adv_count.cpp
Normal file
191
server_instance/zabbix_server/compile_to_radvd_adv_count.cpp
Normal file
|
@ -0,0 +1,191 @@
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <iostream>
|
||||||
|
#include <sstream>
|
||||||
|
#include <string>
|
||||||
|
#include <time.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <sys/un.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <map>
|
||||||
|
#include <list>
|
||||||
|
|
||||||
|
#define MAX_GW_AGE 300
|
||||||
|
#define SOCKET "/tmp/radvdump_gateway_count.sock"
|
||||||
|
int stop = 0;
|
||||||
|
int radvdFD = 0;
|
||||||
|
std::map<std::string, time_t> routerLastSeenMap;
|
||||||
|
|
||||||
|
void runRadvd() {
|
||||||
|
if (radvdFD != 0) {
|
||||||
|
close(radvdFD);
|
||||||
|
}
|
||||||
|
|
||||||
|
int fd[2];
|
||||||
|
pipe(fd);
|
||||||
|
|
||||||
|
int pid = fork();
|
||||||
|
if (pid == 0) {
|
||||||
|
close(fd[0]);
|
||||||
|
dup2(fd[1], 1);
|
||||||
|
execlp("radvdump", "radvdump", NULL);
|
||||||
|
} else if (pid < 0) {
|
||||||
|
// error
|
||||||
|
} else {
|
||||||
|
close(fd[1]);
|
||||||
|
radvdFD = fd[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int openConnection() {
|
||||||
|
int s, t, len;
|
||||||
|
struct sockaddr_un remote;
|
||||||
|
char str[100];
|
||||||
|
|
||||||
|
if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
remote.sun_family = AF_UNIX;
|
||||||
|
strcpy(remote.sun_path, SOCKET);
|
||||||
|
len = strlen(remote.sun_path) + sizeof(remote.sun_family);
|
||||||
|
|
||||||
|
if (connect(s, (struct sockaddr *)&remote, len) == -1) {
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateRouter(const std::string &routerString) {
|
||||||
|
routerLastSeenMap.insert(std::make_pair(routerString, time(NULL)));
|
||||||
|
}
|
||||||
|
|
||||||
|
void parseBlock(const std::string &string) {
|
||||||
|
std::stringstream ss(string);
|
||||||
|
std::string line;
|
||||||
|
|
||||||
|
while (std::getline(ss, line, '\n')) {
|
||||||
|
size_t pos;
|
||||||
|
std::string needle("based on Router Advertisement from");
|
||||||
|
if ((pos = line.find(needle)) != std::string::npos) {
|
||||||
|
std::string routerString = line.substr(pos + needle.size() + 1);
|
||||||
|
updateRouter(routerString);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t countRouters() {
|
||||||
|
std::list<std::string> timedOut;
|
||||||
|
uint64_t count = 0;
|
||||||
|
time_t now = time(NULL);
|
||||||
|
for (std::map<std::string, time_t>::iterator it = routerLastSeenMap.begin(); it != routerLastSeenMap.end(); ++it) {
|
||||||
|
if (now - it->second < MAX_GW_AGE) {
|
||||||
|
count++;
|
||||||
|
} else {
|
||||||
|
timedOut.push_back(it->first);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (std::list<std::string>::iterator it = timedOut.begin(); it != timedOut.end(); ++it) {
|
||||||
|
routerLastSeenMap.erase(*it);
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
int createSocket() {
|
||||||
|
int create_socket;
|
||||||
|
if((create_socket = socket(AF_LOCAL, SOCK_STREAM, 0)) < 0) {
|
||||||
|
perror("socket");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
unlink(SOCKET);
|
||||||
|
|
||||||
|
struct sockaddr_un address;
|
||||||
|
socklen_t addrlen;
|
||||||
|
address.sun_family = AF_UNIX;
|
||||||
|
strcpy(address.sun_path, SOCKET);
|
||||||
|
addrlen = sizeof(address);
|
||||||
|
|
||||||
|
if(bind(create_socket, (struct sockaddr *)&address, addrlen) != 0) {
|
||||||
|
perror("bind");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
listen(create_socket, 5);
|
||||||
|
chmod(SOCKET, 0666);
|
||||||
|
|
||||||
|
return create_socket;
|
||||||
|
}
|
||||||
|
|
||||||
|
void handleClient(int socket) {
|
||||||
|
struct sockaddr_un address;
|
||||||
|
socklen_t addrlen;
|
||||||
|
int client = accept(socket, (struct sockaddr *)&address, &addrlen);
|
||||||
|
if(client >= 0) {
|
||||||
|
std::stringstream ss("");
|
||||||
|
ss << countRouters() << "\n";
|
||||||
|
write(client, ss.str().c_str(), ss.str().size());
|
||||||
|
close(client);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void serverMode() {
|
||||||
|
int socket = createSocket();
|
||||||
|
runRadvd();
|
||||||
|
while (!stop) {
|
||||||
|
static fd_set fdSet;
|
||||||
|
FD_ZERO(&fdSet);
|
||||||
|
//FD_SET(0, &fdSet);
|
||||||
|
FD_SET(socket, &fdSet);
|
||||||
|
FD_SET(radvdFD, &fdSet);
|
||||||
|
|
||||||
|
int maxFd = radvdFD;
|
||||||
|
|
||||||
|
int res = select(maxFd + 1, &fdSet, NULL, NULL, NULL);
|
||||||
|
if (res == -1)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (FD_ISSET(socket, &fdSet)) {
|
||||||
|
handleClient(socket);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (FD_ISSET(radvdFD, &fdSet)) {
|
||||||
|
char buf[1024];
|
||||||
|
int n = read(radvdFD, buf, 1024);
|
||||||
|
if (n > 0) {
|
||||||
|
parseBlock(std::string(buf, n));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (FD_ISSET(0, &fdSet)) {
|
||||||
|
char buf[16];
|
||||||
|
int n = read(0, buf, 16);
|
||||||
|
std::cout << countRouters() << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
|
||||||
|
int clientFd = openConnection();
|
||||||
|
if (clientFd == -1) {
|
||||||
|
int pid = fork();
|
||||||
|
if (pid == 0)
|
||||||
|
serverMode();
|
||||||
|
sleep(10);
|
||||||
|
clientFd = openConnection();
|
||||||
|
if (clientFd == -1) {
|
||||||
|
std::cout << "FAIL." << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
char buf[128];
|
||||||
|
size_t n = read(clientFd, buf, 128);
|
||||||
|
write(1, buf, n);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
2
sudoers.d/21_zabbix_server
Normal file
2
sudoers.d/21_zabbix_server
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
zabbix ALL= NOPASSWD: /opt/bin/zabbix_server/batman_originators.sh
|
||||||
|
zabbix ALL= NOPASSWD: /opt/bin/zabbix_server/radvd_adv_count
|
Loading…
Reference in a new issue