| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- #include <iostream>
- #include <string>
- #include <signal.h>
- #include <syslog.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include "Util/clipp.h"
- #include "Util/INIh.h"
- #include "UniFi/Device.h"
- #include "Bluetooth/Device.h"
- int main(int argc, char** argv)
- {
- try
- {
- setlogmask(LOG_UPTO(LOG_INFO));
- openlog("PresenceDetection", LOG_CONS | LOG_NDELAY | LOG_PERROR | LOG_PID, LOG_USER);
- bool daemon = false;
- PresenceDetection::Util::group cli {
- PresenceDetection::Util::option("-d", "--daemon").set(daemon).doc("Run the process as Daemon")
- };
- if (!PresenceDetection::Util::parse(argc, argv, cli))
- {
- std::cout << PresenceDetection::Util::make_man_page(cli, argv[0]) << std::endl;
- return 1;
- }
- PresenceDetection::Util::INIReader iniReader("PresenceDetection.ini");
- if (iniReader.ParseError() != 0)
- {
- std::cerr << "Can't read PresenceDetection.ini" << std::endl;
- return 1;
- }
- if (daemon)
- {
- syslog(LOG_INFO, "Starting Daemon");
- pid_t pid, sid;
- pid = fork();
- if (pid < 0)
- exit(EXIT_FAILURE);
- if (pid > 0)
- exit(EXIT_SUCCESS);
- umask(0);
- sid = setsid();
- if (sid < 0)
- exit(EXIT_FAILURE);
- if ((chdir("/")) < 0)
- exit(EXIT_FAILURE);
- close(STDIN_FILENO);
- close(STDOUT_FILENO);
- close(STDERR_FILENO);
- }
- std::string target = iniReader.Get("PresenceDetection", "Target", "");
- if (target.empty())
- throw std::runtime_error("Target directive missing in ini file.");
- bool unifi = iniReader.GetBoolean("PresenceDetection", "UniFi", false);
- bool bluetooth = iniReader.GetBoolean("PresenceDetection", "Bluetooth", false);
- std::shared_ptr<PresenceDetection::UniFi::Device> pUniFiDevice;
- if (unifi)
- {
- std::string hostname = iniReader.Get("UniFi", "Hostname", "");
- if (hostname.empty())
- throw std::runtime_error("UniFi Hostname directive missing in ini file.");
- std::string username = iniReader.Get("UniFi", "Username", "");
- if (username.empty())
- throw std::runtime_error("UniFi Username directive missing in ini file.");
- std::string password = iniReader.Get("UniFi", "Password", "");
- if (password.empty())
- throw std::runtime_error("UniFi Password directive missing in ini file.");
- std::string cookiefile = iniReader.Get("UniFi", "CookieFile", "");
- if (cookiefile.empty())
- throw std::runtime_error("UniFi CookieFile directive missing in ini file.");
- std::string inventoryURL = iniReader.Get("UniFi", "Inventory", "");
- if (inventoryURL.empty())
- throw std::runtime_error("UniFi Inventory directive missing in ini file.");
- pUniFiDevice = std::make_shared<PresenceDetection::UniFi::Device>(hostname, username, password, cookiefile, inventoryURL, target);
- }
- std::shared_ptr<PresenceDetection::Bluetooth::Device> pBluetoothDevice;
- if (bluetooth)
- {
- std::string inventoryURL = iniReader.Get("Bluetooth", "Inventory", "");
- if (inventoryURL.empty())
- throw std::runtime_error("Bluetooth Inventory directive missing in ini file.");
- pBluetoothDevice = std::make_shared<PresenceDetection::Bluetooth::Device>(inventoryURL, target);
- }
- sigset_t wset;
- sigemptyset(&wset);
- sigaddset(&wset,SIGHUP);
- sigaddset(&wset,SIGINT);
- sigaddset(&wset,SIGTERM);
- int sig;
- sigwait(&wset,&sig);
- syslog(LOG_INFO, "Stopping...");
- if (pUniFiDevice)
- pUniFiDevice->Stop();
- if (pBluetoothDevice)
- pBluetoothDevice->Stop();
- if (pUniFiDevice)
- pUniFiDevice->Wait();
- if (pBluetoothDevice)
- pBluetoothDevice->Wait();
- closelog();
- }
- catch (const std::exception& e)
- {
- std::stringstream ss;
- ss << "ERROR: " << e.what() << std::endl;
- std::cerr << ss.str() << std::endl;
- syslog(LOG_ERR, "%s", ss.str().c_str());
- closelog();
- return -1;
- }
- return 0;
- }
|