]> git.stg.codes - ssmd.git/blob - src/main.cpp
Show new params in settings dump.
[ssmd.git] / src / main.cpp
1 #include <unistd.h> // daemon
2
3 #include <cerrno> // errno
4 #include <cstring> // strerror
5 #include <csignal>
6 #include <iostream>
7 #include <exception>
8
9 #include "snmp_pp/snmp_pp.h"
10
11 #include "syncer.h"
12 #include "version.h"
13 #include "settings.h"
14 #include "pidfile.h"
15 #include "logger.h"
16
17 SSMD::Logger logger;
18 static bool running = true;
19 static bool reload = false;
20
21 void setSignalHandlers();
22
23 int main(int argc, char * argv[])
24 {
25     SSMD::SettingsParser sParser;
26
27     // Set filter for logging
28     DefaultLog::log()->set_filter(ERROR_LOG, 7);
29     DefaultLog::log()->set_filter(WARNING_LOG, 7);
30     DefaultLog::log()->set_filter(EVENT_LOG, 0);
31     DefaultLog::log()->set_filter(INFO_LOG, 0);
32     DefaultLog::log()->set_filter(DEBUG_LOG, 0);
33
34     try {
35         sParser.init(argc, argv);
36     }
37     catch (const std::exception & ex) {
38         logger << ex.what() << std::endl;
39         return -1;
40     }
41
42     if (sParser.settings().isHelp()) {
43         sParser.printHelp();
44         return 0;
45     }
46
47     if (sParser.settings().isVersion()) {
48         std::cout << "SNMP Switch Management Daemon " << SSMD::version << " (revision: " << SSMD::revision << ")" << std::endl;
49         return 0;
50     }
51
52     if (sParser.settings().isDebug()) {
53         std::cout << "Settings dump:\n"
54                   << "\t- help: " << (sParser.settings().isHelp() ? "yes" : "no") << "\n"
55                   << "\t- version: " << (sParser.settings().isVersion() ? "yes" : "no") << "\n"
56                   << "\t- debug: " << (sParser.settings().isDebug() ? "yes" : "no") << "\n"
57                   << "\t- daemon: " << (sParser.settings().isDaemon() ? "yes" : "no") << "\n"
58                   << "\t- config file: " << sParser.settings().configFile() << "\n"
59                   << "\t- log file: " << sParser.settings().logFile() << "\n"
60                   << "\t- PID file: " << sParser.settings().PIDFile() << "\n"
61                   << "\t- switch sync interval: " << sParser.settings().switchSyncInterval() << "\n"
62                   << "\t- info sync interval: " << sParser.settings().infoSyncInterval() << "\n"
63                   << "\t- switch's upload profile id: " << sParser.settings().upProfileId() << "\n"
64                   << "\t- switch's download profile id: " << sParser.settings().downProfileId() << "\n"
65                   << "\t- max ACL's per PDU: " << sParser.settings().maxACLPerPDU() << "\n"
66                   << "\t- data URL: " << sParser.settings().dataURL() << "\n"
67                   << "\t- scripts base dir: " << sParser.settings().scriptBase() << "\n"
68                   << "\t- dump scripts: " << (sParser.settings().dumpScripts() ? "yes" : "no") << std::endl;
69     }
70
71     if (sParser.settings().isDaemon()) {
72         if (daemon(0, sParser.settings().isDebug())) {
73             logger << "Failed to daemonize: " << strerror(errno) << std::endl;
74             return -1;
75         }
76     }
77     logger.setLogFile(sParser.settings().logFile());
78
79     try {
80         int status = 0;
81         Snmp snmp(status);
82
83         if (status) {
84             logger << "Failed to initialize SNMP" << std::endl;
85             return -1;
86         }
87
88         SSMD::PIDFile pf(sParser.settings().PIDFile());
89         SSMD::Syncer syncer(sParser, snmp);
90
91         logger << "Starting ssmd main thread..." << std::endl;
92
93         setSignalHandlers();
94
95         // Start main thread
96         syncer.run(running, reload);
97
98         logger << "Main thread stopped." << std::endl;
99     }
100     catch (std::exception & ex) {
101         logger << "Exception: " << ex.what() << std::endl;
102         return -1;
103     }
104
105     return 0;
106 }
107
108 void catchTERM(int)
109 {
110     running = false;
111
112     struct sigaction newsa, oldsa;
113     sigset_t sigmask;
114
115     sigemptyset(&sigmask);
116     sigaddset(&sigmask, SIGTERM);
117     newsa.sa_handler = SIG_IGN;
118     newsa.sa_mask = sigmask;
119     newsa.sa_flags = 0;
120     sigaction(SIGTERM, &newsa, &oldsa);
121
122     sigemptyset(&sigmask);
123     sigaddset(&sigmask, SIGINT);
124     newsa.sa_handler = SIG_IGN;
125     newsa.sa_mask = sigmask;
126     newsa.sa_flags = 0;
127     sigaction(SIGINT, &newsa, &oldsa);
128 }
129
130 void catchHUP(int)
131 {
132     reload = true;
133 }
134
135 void setSignalHandlers()
136 {
137     struct sigaction newsa, oldsa;
138     sigset_t sigmask;
139
140     sigemptyset(&sigmask);
141     sigaddset(&sigmask, SIGTERM);
142     newsa.sa_handler = catchTERM;
143     newsa.sa_mask = sigmask;
144     newsa.sa_flags = 0;
145     sigaction(SIGTERM, &newsa, &oldsa);
146
147     sigemptyset(&sigmask);
148     sigaddset(&sigmask, SIGINT);
149     newsa.sa_handler = catchTERM;
150     newsa.sa_mask = sigmask;
151     newsa.sa_flags = 0;
152     sigaction(SIGINT, &newsa, &oldsa);
153
154     sigemptyset(&sigmask);
155     sigaddset(&sigmask, SIGPIPE);
156     newsa.sa_handler = SIG_IGN;
157     newsa.sa_mask = sigmask;
158     newsa.sa_flags = 0;
159     sigaction(SIGPIPE, &newsa, &oldsa);
160
161     sigemptyset(&sigmask);
162     sigaddset(&sigmask, SIGHUP);
163     newsa.sa_handler = catchHUP;
164     newsa.sa_mask = sigmask;
165     newsa.sa_flags = 0;
166     sigaction(SIGHUP, &newsa, &oldsa);
167 }