Subversion Repositories HomeAutomation

Rev

Rev 1196 | Blame | Compare with Previous | Last modification | View Log | SVN | RSS feed

  1. /***************************************************************************
  2.  *   Copyright (C) November 26, 2008, 3:00 PM by Mattias Runge             *
  3.  *   mattias@runge.se                                                      *
  4.  *   main.cpp                                                              *
  5.  *                                                                         *
  6.  *   This program is free software; you can redistribute it and/or modify  *
  7.  *   it under the terms of the GNU General Public License as published by  *
  8.  *   the Free Software Foundation; either version 2 of the License, or     *
  9.  *   (at your option) any later version.                                   *
  10.  *                                                                         *
  11.  *   This program is distributed in the hope that it will be useful,       *
  12.  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
  13.  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
  14.  *   GNU General Public License for more details.                          *
  15.  *                                                                         *
  16.  *   You should have received a copy of the GNU General Public License     *
  17.  *   along with this program; if not, write to the                         *
  18.  *   Free Software Foundation, Inc.,                                       *
  19.  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
  20.  ***************************************************************************/
  21.  
  22. using namespace std;
  23.  
  24. #include <stdlib.h>
  25. #include <iostream>
  26. #include <signal.h>
  27.  
  28. #include "version.h"
  29. #include "Tools/tools.h"
  30. #include "Logger/logger.h"
  31. #include "Settings/settings.h"
  32. #include "Socket/server.h"
  33. #include "CanNet/cannetmanager.h"
  34. #include "Socket/asyncsocket.h"
  35. #include "VM/virtualmachine.h"
  36. #include "CanNet/candebug.h"
  37.  
  38. bool cleanUpRunning = false;
  39. int cleanUp();
  40. void handler(int status);
  41.  
  42. int main(int argc, char** argv)
  43. {
  44.     signal(SIGTERM, handler);
  45.     signal(SIGINT, handler);
  46.     signal(SIGQUIT, handler);
  47.     signal(SIGABRT, handler);
  48.     signal(SIGPIPE, handler);
  49.  
  50.     Logger &log = Logger::getInstance();
  51.  
  52.     log.addToSyslog("Atom " + ftos(VERSION) + " starting...\n");
  53.     log.add("Written by Mattias Runge 2008-2009\n\n");
  54.  
  55.     if (file_exists("/etc/atom.conf"))
  56.     {
  57.         if (!Settings::read("/etc/atom.conf"))
  58.         {
  59.             return cleanUp();
  60.         }
  61.     }
  62.     else
  63.     {
  64.         if (!Settings::read("atom.conf"))
  65.         {
  66.             return cleanUp();
  67.         }
  68.     }
  69.  
  70.     string logfile = Settings::get("Logfile");
  71.     if (logfile != "")
  72.     {
  73.         if (!log.open(logfile))
  74.         {
  75.             log.addToSyslog("Could not open logfile, " + logfile + "\n");
  76.         }
  77.         else
  78.         {
  79.             log.add("Logging to " + logfile + "\n");
  80.         }
  81.     }
  82.     else
  83.     {
  84.         log.add("Logfile is not defined, logging will be done to syslog and console only\n");
  85.     }
  86.  
  87.     VirtualMachine &vm = VirtualMachine::getInstance();
  88.     vm.start();
  89.  
  90.     string canDebugPort = Settings::get("CanDebugPort");
  91.     if (canDebugPort != "")
  92.     {
  93.         CanDebug &canDebug = CanDebug::getInstance();
  94.         canDebug.setSettings(stoi(canDebugPort), "CanDebug");
  95.         canDebug.start();
  96.     }
  97.     else
  98.     {
  99.         log.add("CanDebugPort is not defined, can not start CanDebug socket\n");
  100.     }
  101.  
  102.     CanNetManager &canMan = CanNetManager::getInstance();
  103.     canMan.start();
  104.  
  105.     if (Settings::get("DaemonMode") == "yes")
  106.     {
  107.         log.add("Entering daemon mode...\n");
  108.         if (daemon(0, 0) == -1)
  109.         {
  110.             log.addToSyslog("Could not enter daemon mode. Exiting...\n");
  111.             return cleanUp();
  112.         }
  113.     }
  114.  
  115.     vm.join();
  116.  
  117.     return cleanUp();
  118. }
  119.  
  120. int cleanUp()
  121. {
  122.     Logger &log = Logger::getInstance();
  123.  
  124.     if (!cleanUpRunning)
  125.     {
  126.         cleanUpRunning = true;
  127.  
  128.         log.add("\n");
  129.         log.addToSyslog("Thank you for using Atom. Goodbye!\n");
  130.  
  131.         CanDebug::deleteInstance();
  132.         VirtualMachine::deleteInstance();
  133.         CanNetManager::deleteInstance();
  134.         Logger::deleteInstance();
  135.     }
  136.     else
  137.     {
  138.         log.addToSyslog("Something has gone wrong clean up is already running!\n");
  139.         return EXIT_FAILURE;
  140.     }
  141.  
  142.     return EXIT_SUCCESS;
  143. }
  144.  
  145. void handler(int status)
  146. {
  147.     string signalName = "Unknown";
  148.  
  149.     switch (status)
  150.     {
  151.     case SIGTERM:
  152.     signalName = "Terminate";
  153.     break;
  154.  
  155.     case SIGINT:
  156.     signalName = "Interupt";
  157.     break;
  158.  
  159.     case SIGQUIT:
  160.     signalName = "Quit";
  161.     break;
  162.  
  163.     case SIGABRT:
  164.     signalName = "Abort";
  165.     break;
  166.  
  167.     case SIGIO:
  168.     signalName = "I/O";
  169.     break;
  170.  
  171.     case SIGPIPE:
  172.     signalName = "Pipe";
  173.     break;
  174.     }
  175.  
  176.     Logger &log = Logger::getInstance();
  177.     log.addToSyslog("Received signal " + signalName + "(" + itos(status) + ")\n");
  178.  
  179.     if (status == SIGPIPE)
  180.     {
  181.         return;
  182.     }
  183.  
  184.     exit(cleanUp());
  185. }
  186.