mirror of
https://github.com/binary-kitchen/doorlockd
synced 2024-10-31 22:47:05 +01:00
Separated Logic
This commit is contained in:
parent
0d7f56e647
commit
c723002599
104
logic.cpp
104
logic.cpp
@ -1,9 +1,4 @@
|
|||||||
#include <sys/stat.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <fcntl.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
@ -18,7 +13,6 @@
|
|||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
const string Logic::_lockPagePrefix = LOCKPAGE_PREFIX;
|
const string Logic::_lockPagePrefix = LOCKPAGE_PREFIX;
|
||||||
const string Logic::_fifoLocation = FIFO_LOCATION;
|
|
||||||
|
|
||||||
const string Logic::_ldapServer = LDAP_SERVER;
|
const string Logic::_ldapServer = LDAP_SERVER;
|
||||||
const string Logic::_bindDN = BINDDN;
|
const string Logic::_bindDN = BINDDN;
|
||||||
@ -36,54 +30,14 @@ Logic::Logic() :
|
|||||||
_epaper(Epaper::get())
|
_epaper(Epaper::get())
|
||||||
{
|
{
|
||||||
srand(time(NULL));
|
srand(time(NULL));
|
||||||
|
createNewToken(false);
|
||||||
_logger(LogLevel::debug, "Creating Fifo file");
|
|
||||||
if (access(_fifoLocation.c_str(), F_OK) == 0)
|
|
||||||
{
|
|
||||||
_logger(LogLevel::warning, "Fifo file aready existing, trying to delete");
|
|
||||||
if (unlink(_fifoLocation.c_str()) != 0)
|
|
||||||
{
|
|
||||||
throw("Unable to delete Fifo file");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
umask(0);
|
|
||||||
|
|
||||||
if (mkfifo(_fifoLocation.c_str(), 0770) != 0)
|
|
||||||
{
|
|
||||||
throw("Unable to create Fifo");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
_fifoHandle = open(_fifoLocation.c_str(), O_RDWR | O_NONBLOCK);
|
|
||||||
if (_fifoHandle == -1)
|
|
||||||
{
|
|
||||||
throw("Unable to open Fifo");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fchown(_fifoHandle, 0, 1001) != 0)
|
|
||||||
{
|
|
||||||
throw("Fifo chown failed");
|
|
||||||
}
|
|
||||||
|
|
||||||
_createNewToken(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Logic::~Logic()
|
Logic::~Logic()
|
||||||
{
|
{
|
||||||
if (_fifoHandle != -1)
|
|
||||||
{
|
|
||||||
close(_fifoHandle);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_logger(LogLevel::debug, "Removing Fifo file");
|
int Logic::parseRequest(const string &str)
|
||||||
if (unlink(_fifoLocation.c_str()) != 0)
|
|
||||||
{
|
|
||||||
throw("Unable to delete Fifo file");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int Logic::_parseRequest(const string &str)
|
|
||||||
{
|
{
|
||||||
_logger("Parsing request...");
|
_logger("Parsing request...");
|
||||||
Json::Reader reader;
|
Json::Reader reader;
|
||||||
@ -162,7 +116,7 @@ void Logic::_lock()
|
|||||||
}
|
}
|
||||||
_door.lock();
|
_door.lock();
|
||||||
_state = LOCKED;
|
_state = LOCKED;
|
||||||
_createNewToken(false);
|
createNewToken(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Logic::_unlock()
|
void Logic::_unlock()
|
||||||
@ -174,55 +128,7 @@ void Logic::_unlock()
|
|||||||
}
|
}
|
||||||
_door.unlock();
|
_door.unlock();
|
||||||
_state = UNLOCKED;
|
_state = UNLOCKED;
|
||||||
_createNewToken(false);
|
createNewToken(false);
|
||||||
}
|
|
||||||
|
|
||||||
void Logic::run()
|
|
||||||
{
|
|
||||||
struct timeval tv;
|
|
||||||
fd_set set;
|
|
||||||
|
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
FD_ZERO(&set);
|
|
||||||
FD_SET(_fifoHandle, &set);
|
|
||||||
tv.tv_sec = _tokenTimeout;
|
|
||||||
tv.tv_usec = 0;
|
|
||||||
|
|
||||||
int i = select(_fifoHandle+1, &set, nullptr, nullptr, &tv);
|
|
||||||
if (i == 0)
|
|
||||||
{
|
|
||||||
_createNewToken(true);
|
|
||||||
continue;
|
|
||||||
} else if (i == -1) {
|
|
||||||
throw "Fifo select() failed";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!FD_ISSET(_fifoHandle, &set))
|
|
||||||
{
|
|
||||||
_logger(LogLevel::warning, "select(): Not my fd");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
string payload;
|
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
constexpr int BUFSIZE = 2;
|
|
||||||
char tmp[BUFSIZE];
|
|
||||||
i = read(_fifoHandle, tmp, BUFSIZE);
|
|
||||||
if (i > 0) {
|
|
||||||
payload += string(tmp, i);
|
|
||||||
} else {
|
|
||||||
if (errno == EWOULDBLOCK)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
throw "read() fifo failed";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int rc = _parseRequest(payload);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Logic::_checkIP(const string &ip)
|
bool Logic::_checkIP(const string &ip)
|
||||||
@ -292,7 +198,7 @@ out2:
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Logic::_createNewToken(const bool stillValid)
|
void Logic::createNewToken(const bool stillValid)
|
||||||
{
|
{
|
||||||
_prevToken = _curToken;
|
_prevToken = _curToken;
|
||||||
_prevValid = stillValid;
|
_prevValid = stillValid;
|
||||||
|
7
logic.h
7
logic.h
@ -17,12 +17,12 @@ public:
|
|||||||
static Logic &get();
|
static Logic &get();
|
||||||
~Logic();
|
~Logic();
|
||||||
|
|
||||||
void run();
|
int parseRequest(const std::string &str);
|
||||||
|
void createNewToken(const bool stillValid);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
Logic();
|
Logic();
|
||||||
int _parseRequest(const std::string &str);
|
|
||||||
|
|
||||||
void _lock();
|
void _lock();
|
||||||
void _unlock();
|
void _unlock();
|
||||||
@ -31,7 +31,6 @@ private:
|
|||||||
bool _checkLDAP(const std::string &user, const std::string &password);
|
bool _checkLDAP(const std::string &user, const std::string &password);
|
||||||
bool _checkIP(const std::string &ip);
|
bool _checkIP(const std::string &ip);
|
||||||
|
|
||||||
void _createNewToken(const bool stillValid);
|
|
||||||
|
|
||||||
const Logger &_logger;
|
const Logger &_logger;
|
||||||
Door &_door;
|
Door &_door;
|
||||||
@ -50,8 +49,6 @@ private:
|
|||||||
const static std::string _ldapServer;
|
const static std::string _ldapServer;
|
||||||
const static std::string _allowedIpPrefix;
|
const static std::string _allowedIpPrefix;
|
||||||
|
|
||||||
int _fifoHandle = {-1};
|
|
||||||
|
|
||||||
static constexpr int _tokenTimeout = TOKEN_TIMEOUT;
|
static constexpr int _tokenTimeout = TOKEN_TIMEOUT;
|
||||||
|
|
||||||
enum {LOCKED, UNLOCKED} _state = { LOCKED };
|
enum {LOCKED, UNLOCKED} _state = { LOCKED };
|
||||||
|
104
main.cpp
104
main.cpp
@ -2,8 +2,12 @@
|
|||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/types.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
#include "logic.h"
|
#include "logic.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
@ -12,19 +16,115 @@ const static Logger &l = Logger::get();
|
|||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
|
int retval = -1;
|
||||||
|
|
||||||
l(LogLevel::notice, "Starting doorlockd");
|
l(LogLevel::notice, "Starting doorlockd");
|
||||||
|
|
||||||
|
int fifoHandle = -1;
|
||||||
|
|
||||||
|
l(LogLevel::debug, "Creating Fifo file");
|
||||||
|
if (access(FIFO_LOCATION, F_OK) == 0)
|
||||||
|
{
|
||||||
|
l(LogLevel::warning, "Fifo file aready existing, trying to delete");
|
||||||
|
if (unlink(FIFO_LOCATION) != 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Unable to delete Fifo file");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
umask(0);
|
||||||
|
|
||||||
|
if (mkfifo(FIFO_LOCATION, 0770) != 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Unable to create Fifo");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
fifoHandle = open(FIFO_LOCATION, O_RDWR | O_NONBLOCK);
|
||||||
|
if (fifoHandle == -1)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Unable to open Fifo");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fchown(fifoHandle, 0, 1001) != 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Fifo chown failed");
|
||||||
|
goto out1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Logic &logic = Logic::get();
|
Logic &logic = Logic::get();
|
||||||
logic.run();
|
struct timeval tv;
|
||||||
|
fd_set set;
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
FD_ZERO(&set);
|
||||||
|
FD_SET(fifoHandle, &set);
|
||||||
|
tv.tv_sec = TOKEN_TIMEOUT;
|
||||||
|
tv.tv_usec = 0;
|
||||||
|
|
||||||
|
int i = select(fifoHandle+1, &set, nullptr, nullptr, &tv);
|
||||||
|
if (i == 0)
|
||||||
|
{
|
||||||
|
logic.createNewToken(true);
|
||||||
|
continue;
|
||||||
|
} else if (i == -1) {
|
||||||
|
throw "Fifo select() failed";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!FD_ISSET(fifoHandle, &set))
|
||||||
|
{
|
||||||
|
l(LogLevel::warning, "select(): Not my fd");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
string payload;
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
constexpr int BUFSIZE = 2;
|
||||||
|
char tmp[BUFSIZE];
|
||||||
|
i = read(fifoHandle, tmp, BUFSIZE);
|
||||||
|
if (i > 0) {
|
||||||
|
payload += string(tmp, i);
|
||||||
|
} else {
|
||||||
|
if (errno == EWOULDBLOCK)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
throw "read() fifo failed";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int rc = logic.parseRequest(payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
retval = 0;
|
||||||
}
|
}
|
||||||
catch (const char* const &ex) {
|
catch (const char* const &ex) {
|
||||||
ostringstream str;
|
ostringstream str;
|
||||||
str << "FATAL ERROR: " << ex;
|
str << "FATAL ERROR: " << ex;
|
||||||
l(str, LogLevel::error);
|
l(str, LogLevel::error);
|
||||||
|
retval = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out1:
|
||||||
|
if (fifoHandle != -1)
|
||||||
|
{
|
||||||
|
close(fifoHandle);
|
||||||
|
}
|
||||||
|
|
||||||
|
l(LogLevel::debug, "Removing Fifo file");
|
||||||
|
if (unlink(FIFO_LOCATION) != 0)
|
||||||
|
{
|
||||||
|
throw("Unable to delete Fifo file");
|
||||||
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
Door::get().lock();
|
Door::get().lock();
|
||||||
l(LogLevel::notice, "Doorlockd stopped");
|
l(LogLevel::notice, "Doorlockd stopped");
|
||||||
return 0;
|
return retval;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user