Subversion Repositories HomeAutomation

Rev

Rev 1124 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed

Rev 1124 Rev 1196
Line 32... Line 32...
32
#include "Socket/server.h"
32
#include "Socket/server.h"
33
#include "CanNet/cannetmanager.h"
33
#include "CanNet/cannetmanager.h"
34
#include "Socket/asyncsocket.h"
34
#include "Socket/asyncsocket.h"
35
#include "VM/virtualmachine.h"
35
#include "VM/virtualmachine.h"
36
#include "CanNet/candebug.h"
36
#include "CanNet/candebug.h"
-
 
37
 
-
 
38
#include "boost/thread.hpp"
37
 
39
 
38
bool cleanUpRunning = false;
40
bool cleanUpRunning = false;
39
int cleanUp();
41
int cleanUp();
40
void handler(int status);
42
void handler(int status);
41
 
43
 
Line 66... Line 68...
66
            return cleanUp();
68
            return cleanUp();
67
        }
69
        }
68
    }
70
    }
69
 
71
 
70
    string logfile = Settings::get("Logfile");
72
    string logfile = Settings::get("Logfile");
71
    if (logfile != "")
73
    if (logfile != "")
72
    {
74
    {
73
        if (!log.open(logfile))
75
        if (!log.open(logfile))
74
        {
76
        {
75
            log.addToSyslog("Could not open logfile, " + logfile + "\n");
77
            log.addToSyslog("Could not open logfile, " + logfile + "\n");
76
        }
78
        }
77
        else
79
        else
78
        {
80
        {
79
            log.add("Logging to " + logfile + "\n");
81
            log.add("Logging to " + logfile + "\n");
80
        }
82
        }
81
    }
83
    }
82
    else
84
    else
83
    {
85
    {
84
        log.add("Logfile is not defined, logging will be done to syslog and console only\n");
86
        log.add("Logfile is not defined, logging will be done to syslog and console only\n");
85
    }
87
    }
86
 
88
 
87
    VirtualMachine &vm = VirtualMachine::getInstance();
89
    VirtualMachine &vm = VirtualMachine::getInstance();
88
    vm.start();
90
    vm.start();
89
 
91
 
90
    string canDebugPort = Settings::get("CanDebugPort");
92
    string canDebugPort = Settings::get("CanDebugPort");
91
    if (canDebugPort != "")
93
    if (canDebugPort != "")
92
    {
94
    {
93
        CanDebug &canDebug = CanDebug::getInstance();
95
        CanDebug &canDebug = CanDebug::getInstance();
94
        canDebug.setSettings(stoi(canDebugPort), "CanDebug");
96
        canDebug.setSettings(stoi(canDebugPort), "CanDebug");
95
        canDebug.start();
97
        canDebug.start();
96
    }
98
    }
97
    else
99
    else
98
    {
100
    {
99
        log.add("CanDebugPort is not defined, can not start CanDebug socket\n");
101
        log.add("CanDebugPort is not defined, can not start CanDebug socket\n");
100
    }
102
    }
101
 
103
 
102
    CanNetManager &canMan = CanNetManager::getInstance();
104
    CanNetManager &canMan = CanNetManager::getInstance();
103
    canMan.start();
105
    canMan.start();
104
 
106
 
105
    if (Settings::get("DaemonMode") == "yes")
107
    if (Settings::get("DaemonMode") == "yes")
106
    {
108
    {
107
        log.add("Entering daemon mode...\n");
109
        log.add("Entering daemon mode...\n");
108
        if (daemon(0, 0) == -1)
110
        if (daemon(0, 0) == -1)
109
        {
111
        {
110
            log.addToSyslog("Could not enter daemon mode. Exiting...\n");
112
            log.addToSyslog("Could not enter daemon mode. Exiting...\n");
111
            return cleanUp();
113
            return cleanUp();
Line 114... Line 116...
114
 
116
 
115
    vm.join();
117
    vm.join();
116
 
118
 
117
    return cleanUp();
119
    return cleanUp();
118
}
120
}
119
 
121
 
120
int cleanUp()
122
int cleanUp()
121
{
123
{
122
    Logger &log = Logger::getInstance();
124
    Logger &log = Logger::getInstance();
123
 
125
 
124
    if (!cleanUpRunning)
126
    if (!cleanUpRunning)
125
    {
127
    {
126
        cleanUpRunning = true;
128
        cleanUpRunning = true;
127
   
129
 
128
        log.add("\n");
130
        log.add("\n");
129
        log.addToSyslog("Thank you for using Atom. Goodbye!\n");
131
        log.addToSyslog("Thank you for using Atom. Goodbye!\n");
130
 
132
 
131
        CanDebug::deleteInstance();
133
        CanDebug::deleteInstance();
132
        VirtualMachine::deleteInstance();
134
        VirtualMachine::deleteInstance();
Line 135... Line 137...
135
    }
137
    }
136
    else
138
    else
137
    {
139
    {
138
        log.addToSyslog("Something has gone wrong clean up is already running!\n");
140
        log.addToSyslog("Something has gone wrong clean up is already running!\n");
139
        return EXIT_FAILURE;
141
        return EXIT_FAILURE;
140
    }
142
    }
141
 
143
 
142
    return EXIT_SUCCESS;
144
    return EXIT_SUCCESS;
143
}
145
}
144
 
146
 
145
void handler(int status)
147
void handler(int status)
146
{
148
{
147
    string signalName = "Unknown";
149
    string signalName = "Unknown";
148
   
150
 
149
    switch (status)
151
    switch (status)
150
    {
152
    {
151
    case SIGTERM:
153
    case SIGTERM:
152
    signalName = "Terminate";
154
    signalName = "Terminate";
153
    break;
155
    break;
154
   
156
 
155
    case SIGINT:
157
    case SIGINT:
156
    signalName = "Interupt";
158
    signalName = "Interupt";
157
    break;
159
    break;
158
   
160
 
159
    case SIGQUIT:
161
    case SIGQUIT:
160
    signalName = "Quit";
162
    signalName = "Quit";
161
    break;
163
    break;
162
   
164
 
163
    case SIGABRT:
165
    case SIGABRT:
164
    signalName = "Abort";
166
    signalName = "Abort";
165
    break;
167
    break;
166
   
168
 
167
    case SIGIO:
169
    case SIGIO:
168
    signalName = "I/O";
170
    signalName = "I/O";
169
    break;
171
    break;
170
   
172
 
171
    case SIGPIPE:
173
    case SIGPIPE:
172
    signalName = "Pipe";
174
    signalName = "Pipe";
173
    break;
175
    break;
174
    }
176
    }
175
 
177
 
176
    Logger &log = Logger::getInstance();
178
    Logger &log = Logger::getInstance();
177
    log.addToSyslog("Received signal " + signalName + "(" + itos(status) + ")\n");
179
    log.addToSyslog("Received signal " + signalName + "(" + itos(status) + ")\n");
178
   
180
 
179
    if (status == SIGPIPE)
181
    if (status == SIGPIPE)
180
    {
182
    {
181
        return;
183
        return;
182
    }
184
    }
183
   
185
 
184
    exit(cleanUp());
186
    exit(cleanUp());
185
}
187
}