Mercurial > hg > orthanc
annotate OrthancServer/main.cpp @ 196:6d0225a26fd8
mail
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 16 Nov 2012 08:23:05 +0100 |
parents | 8e673a65564d |
children | bee20e978835 |
rev | line source |
---|---|
0 | 1 /** |
62 | 2 * Orthanc - A Lightweight, RESTful DICOM Store |
0 | 3 * Copyright (C) 2012 Medical Physics Department, CHU of Liege, |
4 * Belgium | |
5 * | |
6 * This program is free software: you can redistribute it and/or | |
7 * modify it under the terms of the GNU General Public License as | |
8 * published by the Free Software Foundation, either version 3 of the | |
9 * License, or (at your option) any later version. | |
136 | 10 * |
11 * In addition, as a special exception, the copyright holders of this | |
12 * program give permission to link the code of its release with the | |
13 * OpenSSL project's "OpenSSL" library (or with modified versions of it | |
14 * that use the same license as the "OpenSSL" library), and distribute | |
15 * the linked executables. You must obey the GNU General Public License | |
16 * in all respects for all of the code used other than "OpenSSL". If you | |
17 * modify file(s) with this exception, you may extend this exception to | |
18 * your version of the file(s), but you are not obligated to do so. If | |
19 * you do not wish to do so, delete this exception statement from your | |
20 * version. If you delete this exception statement from all source files | |
21 * in the program, then also delete it here. | |
0 | 22 * |
23 * This program is distributed in the hope that it will be useful, but | |
24 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
26 * General Public License for more details. | |
27 * | |
28 * You should have received a copy of the GNU General Public License | |
29 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
30 **/ | |
31 | |
32 | |
62 | 33 #include "OrthancRestApi.h" |
0 | 34 |
175
662af781a227
sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
158
diff
changeset
|
35 #include <fstream> |
102
7593b57dc1bf
switch to google log
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
36 #include <glog/logging.h> |
112 | 37 #include <boost/algorithm/string/predicate.hpp> |
0 | 38 |
39 #include "../Core/HttpServer/EmbeddedResourceHttpHandler.h" | |
40 #include "../Core/HttpServer/FilesystemHttpHandler.h" | |
41 #include "../Core/HttpServer/MongooseServer.h" | |
42 #include "DicomProtocol/DicomServer.h" | |
62 | 43 #include "OrthancInitialization.h" |
0 | 44 |
45 | |
62 | 46 using namespace Orthanc; |
0 | 47 |
48 | |
49 class MyDicomStore : public IStoreRequestHandler | |
50 { | |
51 private: | |
52 ServerIndex& index_; | |
53 FileStorage storage_; | |
54 | |
55 public: | |
56 MyDicomStore(ServerIndex& index, | |
57 const std::string& path) : | |
58 index_(index), | |
59 storage_(path) | |
60 { | |
61 } | |
62 | |
63 virtual void Handle(const std::vector<uint8_t>& dicomFile, | |
64 const DicomMap& dicomSummary, | |
65 const Json::Value& dicomJson, | |
34
96e57b863dd9
option to disallow remote access
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
27
diff
changeset
|
66 const std::string& remoteAet) |
0 | 67 { |
68 if (dicomFile.size() > 0) | |
69 { | |
187
8e673a65564d
refactoring of storing new instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
178
diff
changeset
|
70 index_.Store(storage_, |
0 | 71 reinterpret_cast<const char*>(&dicomFile[0]), dicomFile.size(), |
34
96e57b863dd9
option to disallow remote access
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
27
diff
changeset
|
72 dicomSummary, dicomJson, remoteAet); |
0 | 73 } |
74 } | |
75 }; | |
76 | |
77 | |
78 class MyDicomStoreFactory : public IStoreRequestHandlerFactory | |
79 { | |
80 private: | |
81 ServerIndex& index_; | |
82 std::string path_; | |
83 | |
84 public: | |
85 MyDicomStoreFactory(ServerIndex& index, | |
86 const std::string& path) : | |
87 index_(index), | |
88 path_(path) | |
89 { | |
90 } | |
91 | |
92 virtual IStoreRequestHandler* ConstructStoreRequestHandler() | |
93 { | |
94 return new MyDicomStore(index_, path_); | |
95 } | |
96 | |
97 void Done() | |
98 { | |
99 //index_.db().Execute("DELETE FROM Studies"); | |
100 } | |
101 }; | |
102 | |
103 | |
133 | 104 void PrintHelp(char* path) |
105 { | |
106 std::cout | |
107 << "Usage: " << path << " [OPTION]... [CONFIGURATION]" << std::endl | |
175
662af781a227
sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
158
diff
changeset
|
108 << "Orthanc, lightweight, RESTful DICOM server for healthcare and medical research." << std::endl |
133 | 109 << std::endl |
175
662af781a227
sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
158
diff
changeset
|
110 << "If no configuration file is given on the command line, a set of default " << std::endl |
662af781a227
sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
158
diff
changeset
|
111 << "parameters is used. Please refer to the Orthanc homepage for the full " << std::endl |
662af781a227
sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
158
diff
changeset
|
112 << "instructions about how to use Orthanc " << std::endl |
133 | 113 << "<https://code.google.com/p/orthanc/wiki/OrthancCookbook>." << std::endl |
114 << std::endl | |
115 << "Command-line options:" << std::endl | |
116 << " --help\t\tdisplay this help and exit" << std::endl | |
117 << " --logdir=[dir]\tdirectory where to store the log files" << std::endl | |
118 << "\t\t\t(if not used, the logs are dumped to stderr)" << std::endl | |
175
662af781a227
sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
158
diff
changeset
|
119 << " --config=[file]\tcreate a sample configuration file and exit" << std::endl |
662af781a227
sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
158
diff
changeset
|
120 << " --trace\t\thighest verbosity in logs (for debug)" << std::endl |
662af781a227
sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
158
diff
changeset
|
121 << " --verbose\t\tbe verbose in logs" << std::endl |
662af781a227
sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
158
diff
changeset
|
122 << " --version\t\toutput version information and exit" << std::endl |
133 | 123 << std::endl |
124 << "Exit status:" << std::endl | |
125 << " 0 if OK," << std::endl | |
126 << " -1 if error (have a look at the logs)." << std::endl | |
127 << std::endl; | |
128 } | |
0 | 129 |
130 | |
133 | 131 void PrintVersion(char* path) |
132 { | |
133 std::cout | |
134 << path << " " << ORTHANC_VERSION << std::endl | |
135 << "Copyright (C) 2012 Medical Physics Department, CHU of Liege (Belgium) " << std::endl | |
136 << "Licensing GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>, with OpenSSL exception." << std::endl | |
137 << "This is free software: you are free to change and redistribute it." << std::endl | |
138 << "There is NO WARRANTY, to the extent permitted by law." << std::endl | |
139 << std::endl | |
140 << "Written by Sebastien Jodogne <s.jodogne@gmail.com>" << std::endl; | |
141 } | |
142 | |
0 | 143 |
144 int main(int argc, char* argv[]) | |
145 { | |
102
7593b57dc1bf
switch to google log
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
146 // Initialize Google's logging library. |
7593b57dc1bf
switch to google log
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
147 FLAGS_logtostderr = true; |
137
0e97abc7b950
fix of a bug in older versions of sqlite
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
136
diff
changeset
|
148 FLAGS_minloglevel = 1; |
0e97abc7b950
fix of a bug in older versions of sqlite
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
136
diff
changeset
|
149 FLAGS_v = 0; |
133 | 150 |
112 | 151 for (int i = 1; i < argc; i++) |
152 { | |
133 | 153 if (std::string(argv[i]) == "--help") |
154 { | |
155 PrintHelp(argv[0]); | |
156 return 0; | |
157 } | |
158 | |
159 if (std::string(argv[i]) == "--version") | |
160 { | |
161 PrintVersion(argv[0]); | |
162 return 0; | |
163 } | |
164 | |
137
0e97abc7b950
fix of a bug in older versions of sqlite
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
136
diff
changeset
|
165 if (std::string(argv[i]) == "--verbose") |
0e97abc7b950
fix of a bug in older versions of sqlite
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
136
diff
changeset
|
166 { |
0e97abc7b950
fix of a bug in older versions of sqlite
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
136
diff
changeset
|
167 FLAGS_minloglevel = 0; |
0e97abc7b950
fix of a bug in older versions of sqlite
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
136
diff
changeset
|
168 } |
0e97abc7b950
fix of a bug in older versions of sqlite
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
136
diff
changeset
|
169 |
0e97abc7b950
fix of a bug in older versions of sqlite
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
136
diff
changeset
|
170 if (std::string(argv[i]) == "--trace") |
0e97abc7b950
fix of a bug in older versions of sqlite
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
136
diff
changeset
|
171 { |
0e97abc7b950
fix of a bug in older versions of sqlite
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
136
diff
changeset
|
172 FLAGS_minloglevel = 0; |
0e97abc7b950
fix of a bug in older versions of sqlite
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
136
diff
changeset
|
173 FLAGS_v = 1; |
0e97abc7b950
fix of a bug in older versions of sqlite
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
136
diff
changeset
|
174 } |
0e97abc7b950
fix of a bug in older versions of sqlite
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
136
diff
changeset
|
175 |
112 | 176 if (boost::starts_with(argv[i], "--logdir=")) |
177 { | |
178 FLAGS_logtostderr = false; | |
179 FLAGS_log_dir = std::string(argv[i]).substr(9); | |
180 } | |
175
662af781a227
sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
158
diff
changeset
|
181 |
662af781a227
sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
158
diff
changeset
|
182 if (boost::starts_with(argv[i], "--config=")) |
662af781a227
sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
158
diff
changeset
|
183 { |
662af781a227
sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
158
diff
changeset
|
184 std::string configurationSample; |
662af781a227
sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
158
diff
changeset
|
185 GetFileResource(configurationSample, EmbeddedResources::CONFIGURATION_SAMPLE); |
662af781a227
sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
158
diff
changeset
|
186 |
662af781a227
sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
158
diff
changeset
|
187 std::string target = std::string(argv[i]).substr(9); |
662af781a227
sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
158
diff
changeset
|
188 std::ofstream f(target.c_str()); |
662af781a227
sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
158
diff
changeset
|
189 f << configurationSample; |
662af781a227
sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
158
diff
changeset
|
190 f.close(); |
662af781a227
sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
158
diff
changeset
|
191 return 0; |
662af781a227
sample config file from command line
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
158
diff
changeset
|
192 } |
112 | 193 } |
194 | |
102
7593b57dc1bf
switch to google log
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
195 google::InitGoogleLogging("Orthanc"); |
7593b57dc1bf
switch to google log
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
62
diff
changeset
|
196 |
112 | 197 |
0 | 198 try |
199 { | |
112 | 200 bool isInitialized = false; |
26 | 201 if (argc >= 2) |
202 { | |
112 | 203 for (int i = 1; i < argc; i++) |
204 { | |
205 // Use the first argument that does not start with a "-" as | |
206 // the configuration file | |
207 if (argv[i][0] != '-') | |
208 { | |
209 OrthancInitialize(argv[i]); | |
210 isInitialized = true; | |
211 } | |
212 } | |
26 | 213 } |
112 | 214 |
215 if (!isInitialized) | |
26 | 216 { |
62 | 217 OrthancInitialize(); |
26 | 218 } |
219 | |
62 | 220 std::string storageDirectory = GetGlobalStringParameter("StorageDirectory", "OrthancStorage"); |
12 | 221 ServerIndex index(storageDirectory); |
222 MyDicomStoreFactory storeScp(index, storageDirectory); | |
0 | 223 |
224 { | |
225 // DICOM server | |
226 DicomServer dicomServer; | |
55 | 227 dicomServer.SetCalledApplicationEntityTitleCheck(GetGlobalBoolParameter("DicomCheckCalledAet", false)); |
0 | 228 dicomServer.SetStoreRequestHandlerFactory(storeScp); |
128 | 229 dicomServer.SetPortNumber(GetGlobalIntegerParameter("DicomPort", 4242)); |
62 | 230 dicomServer.SetApplicationEntityTitle(GetGlobalStringParameter("DicomAet", "ORTHANC")); |
0 | 231 |
232 // HTTP server | |
233 MongooseServer httpServer; | |
158 | 234 httpServer.SetPortNumber(GetGlobalIntegerParameter("HttpPort", 8042)); |
34
96e57b863dd9
option to disallow remote access
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
27
diff
changeset
|
235 httpServer.SetRemoteAccessAllowed(GetGlobalBoolParameter("RemoteAccessAllowed", false)); |
0 | 236 |
25
dd1489098265
basic http authentication
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
23
diff
changeset
|
237 httpServer.SetAuthenticationEnabled(GetGlobalBoolParameter("AuthenticationEnabled", false)); |
dd1489098265
basic http authentication
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
23
diff
changeset
|
238 SetupRegisteredUsers(httpServer); |
dd1489098265
basic http authentication
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
23
diff
changeset
|
239 |
23 | 240 if (GetGlobalBoolParameter("SslEnabled", false)) |
241 { | |
242 std::string certificate = GetGlobalStringParameter("SslCertificate", "certificate.pem"); | |
243 httpServer.SetSslEnabled(true); | |
244 httpServer.SetSslCertificate(certificate.c_str()); | |
245 } | |
246 else | |
247 { | |
248 httpServer.SetSslEnabled(false); | |
249 } | |
250 | |
178 | 251 LOG(WARNING) << "DICOM server listening on port: " << dicomServer.GetPortNumber(); |
252 LOG(WARNING) << "HTTP server listening on port: " << httpServer.GetPortNumber(); | |
125 | 253 |
62 | 254 #if ORTHANC_STANDALONE == 1 |
255 httpServer.RegisterHandler(new EmbeddedResourceHttpHandler("/app", EmbeddedResources::ORTHANC_EXPLORER)); | |
0 | 256 #else |
62 | 257 httpServer.RegisterHandler(new FilesystemHttpHandler("/app", ORTHANC_PATH "/OrthancExplorer")); |
0 | 258 #endif |
259 | |
62 | 260 httpServer.RegisterHandler(new OrthancRestApi(index, storageDirectory)); |
0 | 261 |
262 // GO !!! | |
263 httpServer.Start(); | |
264 dicomServer.Start(); | |
265 | |
137
0e97abc7b950
fix of a bug in older versions of sqlite
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
136
diff
changeset
|
266 LOG(WARNING) << "Orthanc has started"; |
0 | 267 Toolbox::ServerBarrier(); |
268 | |
269 // Stop | |
137
0e97abc7b950
fix of a bug in older versions of sqlite
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
136
diff
changeset
|
270 LOG(WARNING) << "Orthanc is stopping"; |
0 | 271 } |
272 | |
273 storeScp.Done(); | |
274 } | |
62 | 275 catch (OrthancException& e) |
0 | 276 { |
108 | 277 LOG(ERROR) << "EXCEPTION [" << e.What() << "]"; |
133 | 278 return -1; |
0 | 279 } |
280 | |
62 | 281 OrthancFinalize(); |
27 | 282 |
0 | 283 return 0; |
284 } |