diff --git a/Makefile b/Makefile index fc542f6..7fa5e5e 100644 --- a/Makefile +++ b/Makefile @@ -1,2 +1,2 @@ all: - g++ -lrt -std=c++17 src/main.cpp src/usermanager.cpp -o ncsambawatcher \ No newline at end of file + g++ -lrt -std=c++17 src/main.cpp src/usermanager.cpp src/guarder.cpp -o ncsambawatcher \ No newline at end of file diff --git a/src/guarder.cpp b/src/guarder.cpp new file mode 100644 index 0000000..78fb53b --- /dev/null +++ b/src/guarder.cpp @@ -0,0 +1 @@ +#include "guarder.h" \ No newline at end of file diff --git a/src/guarder.h b/src/guarder.h new file mode 100644 index 0000000..00774dd --- /dev/null +++ b/src/guarder.h @@ -0,0 +1,50 @@ +#ifndef _GUARDER_H +#define _GUARDER_H + +#include +#include +#include + +class guarder{ +private: + const int shmid; + + void setFlag(bool value) + { + bool *flag = static_cast(shmat(shmid, nullptr, 0)); + *flag = value; + shmdt(flag); + } + +public: + guarder() : shmid(shmget(IPC_PRIVATE, sizeof(bool), 0666 | IPC_CREAT)) + { + setFlagOff(); + } + + void setFlagOff() + { + setFlag(false); + } + + void setFlagOn() + { + setFlag(true); + } + + bool isFlagOn() + { + bool *flag = static_cast(shmat(shmid, nullptr, 0)); + bool ret = *flag; + shmdt(flag); + return ret; + } + + ~guarder() + { + shmctl(shmid, IPC_RMID, nullptr); + } + +}; + +#endif // _GUARDER_H \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 706016f..a0584fe 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,71 +1,64 @@ #include #include #include -#include #include #include #include -#include -#include #include -#include #include #include -#include #include "locations.h" #include "usermanager.h" +#include "guarder.h" #define MAXNAMESIZE 255 #define SCAN_DONE_SIG SIGRTMIN -#define SCAN_CMD_USR "docker exec -ti --user www-data nextcloud /var/www/html/occ files:scan --path=" +#define SCAN_CMD_USR "docker exec --user www-data nextcloud /var/www/html/occ files:scan --path=" -void initRunningFlag(int shmid) +int p1[2]; +guarder guard; +userManager manager; + +void flushManagerToPipe() { - bool *init = static_cast(shmat(shmid, nullptr, 0)); - *init = false; - shmdt(init); + if (!guard.isFlagOn()) + { + std::vector users = manager.getFlaggedUsers(); + + for (std::vector::iterator it = users.begin(); it != users.end(); ++it) + { + int size = it->size(); + write(p1[1], &size, sizeof(int)); + write(p1[1], it->data(), size * sizeof(char)); + } + + manager.unflagAllUsers(); + } } -bool readRunningFlag(int shmid) +void handler(int sig) { - bool *init = static_cast(shmat(shmid, nullptr, 0)); - *init = false; - shmdt(init); - return *init; + if (sig == SCAN_DONE_SIG) + { + flushManagerToPipe(); + } } -void setRunningFlag(int shmid, bool data) -{ - bool *init = static_cast(shmat(shmid, nullptr, 0)); - *init = data; - shmdt(init); -} - -void handler(int sig) {} - int main() { openlog("ncsambawatcher", LOG_PID | LOG_CONS, LOG_USER); - - int p1[2]; pipe(p1); - sigset_t ss; - sigfillset(&ss); - sigdelset(&ss, SCAN_DONE_SIG); - - int shmid = shmget(IPC_PRIVATE, sizeof(bool), 0666 | IPC_CREAT); - initRunningFlag(shmid); pid_t parent = getpid(); pid_t child = fork(); if (child > 0) // parent { + signal(SCAN_DONE_SIG, handler); close(p1[0]); // read FILE *logpipe = popen(LOGFILE, "r"); std::array buffer; - userManager manager; while (fgets(buffer.data(), buffer.size(), logpipe) != nullptr) { @@ -74,20 +67,14 @@ int main() if (line.find('|') == std::string::npos) continue; - std::vector x = splitLogFile(line, '|'); std::string user(x.at(USER_LOG_LOCATION)); manager.addUser(user); manager.setUserFlagged(user); - std::vector users = manager.getFlaggedUsers(); + perror(""); - for (std::vector::iterator it = users.begin(); it != users.end(); ++it) - { - int size = it->size(); - write(p1[1], &size, sizeof(int)); - write(p1[1], it->data(), size * sizeof(char)); - } + flushManagerToPipe(); } fclose(logpipe); @@ -108,20 +95,22 @@ int main() read(p1[0], buffer, size * sizeof(char)); std::string name(buffer); + guard.setFlagOn(); system((std::string(SCAN_CMD_USR) + name).data()); + guard.setFlagOff(); + + kill(parent, SCAN_DONE_SIG); if (buffer != nullptr) { delete[] buffer; buffer = nullptr; } - } close(p1[0]); // read } - shmctl(shmid, IPC_RMID, nullptr); closelog(); return EXIT_SUCCESS;