PresenceDetection.cc 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. #include "Bluetooth/Device.h"
  2. #include "UniFi/Device.h"
  3. #include "Util/StaticDevice.h"
  4. #include "Util/INIh.h"
  5. #include <clipp.h>
  6. #include <Logging.h>
  7. #include <unistd.h>
  8. #include <sys/types.h>
  9. #include <sys/stat.h>
  10. #include <iostream>
  11. #include <string>
  12. #include <signal.h>
  13. #include <syslog.h>
  14. #include <vector>
  15. int main(int argc, char** argv)
  16. {
  17. try
  18. {
  19. Logging::OpenLog();
  20. Logging::SetLogMask(Logging::Severity::Debug);
  21. bool daemon = false;
  22. clipp::group cli {
  23. clipp::option("-d", "--daemon").set(daemon).doc("Run the process as Daemon")
  24. };
  25. if (!clipp::parse(argc, argv, cli))
  26. {
  27. std::cout << clipp::make_man_page(cli, argv[0]) << std::endl;
  28. return 1;
  29. }
  30. PresenceDetection::Util::INIReader iniReader("PresenceDetection.ini");
  31. if (iniReader.ParseError() != 0)
  32. {
  33. std::cerr << "Can't read PresenceDetection.ini" << std::endl;
  34. return 1;
  35. }
  36. if (daemon)
  37. {
  38. Logging::Log(Logging::Severity::Info, "Starting PresenceDetection Daemon");
  39. pid_t pid, sid;
  40. pid = fork();
  41. if (pid < 0)
  42. exit(EXIT_FAILURE);
  43. if (pid > 0)
  44. exit(EXIT_SUCCESS);
  45. umask(0);
  46. sid = setsid();
  47. if (sid < 0)
  48. exit(EXIT_FAILURE);
  49. if ((chdir("/")) < 0)
  50. exit(EXIT_FAILURE);
  51. close(STDIN_FILENO);
  52. close(STDOUT_FILENO);
  53. close(STDERR_FILENO);
  54. }
  55. else
  56. {
  57. Logging::Log(Logging::Severity::Info, "Starting PresenceDetection");
  58. }
  59. std::string target = iniReader.Get("PresenceDetection", "Target", "");
  60. bool unifi = iniReader.GetBoolean("PresenceDetection", "UniFi", false);
  61. bool bluetooth = iniReader.GetBoolean("PresenceDetection", "Bluetooth", false);
  62. std::vector<PresenceDetection::Util::StaticDevice> staticDevices;
  63. auto sections = iniReader.Sections();
  64. for (auto section : sections)
  65. {
  66. if (section != "PresenceDetection" &&
  67. section != "UniFi" &&
  68. section != "Bluetooth")
  69. {
  70. std::string WifiMac = iniReader.Get(section, "WifiMac", "");
  71. std::string BluetoothMac = iniReader.Get(section, "BluetoothMac", "");
  72. if (WifiMac.empty() && BluetoothMac.empty())
  73. {
  74. std::stringstream ss;
  75. ss << section << ": No Wifi or Bluetooth Mac address defined" << std::endl;
  76. throw std::runtime_error(ss.str());
  77. }
  78. auto staticDevice = PresenceDetection::Util::StaticDevice(WifiMac, BluetoothMac);
  79. std::string OnlineURL = iniReader.Get(section, "OnlineURL", "");
  80. if (!OnlineURL.empty())
  81. staticDevice.SetOnlineURL(OnlineURL);
  82. std::string WifiOnlineURL = iniReader.Get(section, "WifiOnlineURL", "");
  83. if (!WifiOnlineURL.empty())
  84. staticDevice.SetWifiOnlineURL(WifiOnlineURL);
  85. std::string BluetoothOnlineURL = iniReader.Get(section, "BluetoothOnlineURL", "");
  86. if (!BluetoothOnlineURL.empty())
  87. staticDevice.SetBluetoothOnlineURL(BluetoothOnlineURL);
  88. std::string OfflineURL = iniReader.Get(section, "OfflineURL", "");
  89. if (!OfflineURL.empty())
  90. staticDevice.SetOfflineURL(OfflineURL);
  91. std::string WifiOfflineURL = iniReader.Get(section, "WifiOfflineURL", "");
  92. if (!WifiOfflineURL.empty())
  93. staticDevice.SetWifiOfflineURL(WifiOfflineURL);
  94. std::string BluetoothOfflineURL = iniReader.Get(section, "BluetoothOfflineURL", "");
  95. if (!BluetoothOfflineURL.empty())
  96. staticDevice.SetBluetoothOfflineURL(BluetoothOfflineURL);
  97. staticDevices.push_back(staticDevice);
  98. }
  99. }
  100. std::shared_ptr<PresenceDetection::UniFi::Device> pUniFiDevice;
  101. if (unifi)
  102. {
  103. std::string hostname = iniReader.Get("UniFi", "Hostname", "");
  104. if (hostname.empty())
  105. throw std::runtime_error("UniFi Hostname directive missing in ini file.");
  106. int port = iniReader.GetInteger("UniFi", "Port", 8443);
  107. std::string username = iniReader.Get("UniFi", "Username", "");
  108. if (username.empty())
  109. throw std::runtime_error("UniFi Username directive missing in ini file.");
  110. std::string password = iniReader.Get("UniFi", "Password", "");
  111. if (password.empty())
  112. throw std::runtime_error("UniFi Password directive missing in ini file.");
  113. std::string cookiefile = iniReader.Get("UniFi", "CookieFile", "");
  114. if (cookiefile.empty())
  115. throw std::runtime_error("UniFi CookieFile directive missing in ini file.");
  116. int timeout = iniReader.GetInteger("UniFi", "Timeout", 150);
  117. std::string inventoryURL = iniReader.Get("UniFi", "Inventory", "");
  118. pUniFiDevice = std::make_shared<PresenceDetection::UniFi::Device>(hostname, port, username, password, cookiefile, timeout, inventoryURL, target, staticDevices);
  119. }
  120. std::shared_ptr<PresenceDetection::Bluetooth::Device> pBluetoothDevice;
  121. if (bluetooth)
  122. {
  123. int timeout = iniReader.GetInteger("Bluetooth", "Timeout", 150);
  124. std::string inventoryURL = iniReader.Get("Bluetooth", "Inventory", "");
  125. pBluetoothDevice = std::make_shared<PresenceDetection::Bluetooth::Device>(timeout, inventoryURL, target, staticDevices);
  126. }
  127. sigset_t wset;
  128. sigemptyset(&wset);
  129. sigaddset(&wset,SIGHUP);
  130. sigaddset(&wset,SIGINT);
  131. sigaddset(&wset,SIGTERM);
  132. int sig;
  133. sigwait(&wset,&sig);
  134. Logging::Log(Logging::Severity::Info, "Stopping PresenceDetection...");
  135. if (pUniFiDevice)
  136. pUniFiDevice->Stop();
  137. if (pBluetoothDevice)
  138. pBluetoothDevice->Stop();
  139. if (pUniFiDevice)
  140. pUniFiDevice->Wait();
  141. if (pBluetoothDevice)
  142. pBluetoothDevice->Wait();
  143. Logging::CloseLog();
  144. }
  145. catch (const std::exception& e)
  146. {
  147. std::stringstream ss;
  148. ss << "ERROR: " << e.what() << std::endl;
  149. std::cerr << ss.str() << std::endl;
  150. Logging::Log(Logging::Severity::Error, ss.str());
  151. Logging::CloseLog();
  152. return -1;
  153. }
  154. return 0;
  155. }