annotate Plugin/GoogleUpdater.cpp @ 30:f1ebec09b120

sync
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 30 Jun 2020 07:44:54 +0200
parents d9e1b60a9aa6
children 16cf7c2eb806
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1 /**
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2 * Google Cloud Platform credentials for DICOMweb and Orthanc
26
d9e1b60a9aa6 upgrade to year 2020
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 17
diff changeset
3 * Copyright (C) 2019-2020 Osimis S.A., Belgium
0
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4 *
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
5 * This program is free software: you can redistribute it and/or
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
6 * modify it under the terms of the GNU General Public License as
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
7 * published by the Free Software Foundation, either version 3 of the
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
8 * License, or (at your option) any later version.
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
9 *
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
10 * In addition, as a special exception, the copyright holders of this
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
11 * program give permission to link the code of its release with the
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
12 * OpenSSL project's "OpenSSL" library (or with modified versions of it
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
13 * that use the same license as the "OpenSSL" library), and distribute
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
14 * the linked executables. You must obey the GNU General Public License
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
15 * in all respects for all of the code used other than "OpenSSL". If you
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
16 * modify file(s) with this exception, you may extend this exception to
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
17 * your version of the file(s), but you are not obligated to do so. If
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
18 * you do not wish to do so, delete this exception statement from your
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
19 * version. If you delete this exception statement from all source files
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
20 * in the program, then also delete it here.
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
21 *
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
22 * This program is distributed in the hope that it will be useful, but
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
23 * WITHOUT ANY WARRANTY; without even the implied warranty of
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
25 * General Public License for more details.
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
26 *
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
27 * You should have received a copy of the GNU General Public License
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
28 * along with this program. If not, see <http://www.gnu.org/licenses/>.
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
29 **/
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
30
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
31
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
32 #include "GoogleUpdater.h"
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
33
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
34 #include "GoogleConfiguration.h"
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
35
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
36 #include <google/cloud/storage/internal/curl_handle_factory.h>
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
37 #include <google/cloud/storage/oauth2/google_credentials.h>
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
38
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
39
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
40 namespace
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
41 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
42 class CurlBuilder : public google::cloud::storage::internal::CurlRequestBuilder
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
43 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
44 private:
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
45 class HandleFactory : public google::cloud::storage::internal::DefaultCurlHandleFactory
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
46 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
47 public:
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
48 google::cloud::storage::internal::CurlPtr CreateHandle() override
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
49 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
50 google::cloud::storage::internal::CurlPtr handle
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
51 (google::cloud::storage::internal::DefaultCurlHandleFactory::CreateHandle());
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
52
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
53 const GoogleConfiguration& configuration = GoogleConfiguration::GetInstance();
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
54
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
55 long timeout = static_cast<long>(configuration.GetTimeoutSeconds());
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
56
16
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
57 if (!configuration.GetCaInfo().empty() &&
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
58 curl_easy_setopt(handle.get(), CURLOPT_CAINFO, configuration.GetCaInfo().c_str()) != CURLE_OK)
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
59 {
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
60 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError,
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
61 "Cannot set the trusted Certificate Authorities");
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
62 }
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
63
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
64 bool ok;
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
65
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
66 if (configuration.IsHttpsVerifyPeers())
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
67 {
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
68 ok = (curl_easy_setopt(handle.get(), CURLOPT_SSL_VERIFYHOST, 2) == CURLE_OK &&
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
69 curl_easy_setopt(handle.get(), CURLOPT_SSL_VERIFYPEER, 1) == CURLE_OK &&
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
70 curl_easy_setopt(handle.get(), CURLOPT_TIMEOUT, timeout) == CURLE_OK);
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
71 }
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
72 else
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
73 {
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
74 ok = (curl_easy_setopt(handle.get(), CURLOPT_SSL_VERIFYHOST, 0) == CURLE_OK &&
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
75 curl_easy_setopt(handle.get(), CURLOPT_SSL_VERIFYPEER, 0) == CURLE_OK);
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
76 }
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
77
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
78 if (!ok)
0
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
79 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
80 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError,
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
81 "Cannot initialize a libcurl handle");
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
82 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
83
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
84 return handle;
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
85 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
86
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
87 google::cloud::storage::internal::CurlMulti CreateMultiHandle() override
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
88 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
89 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented);
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
90 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
91 };
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
92
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
93 public:
17
2514880d4f0b cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 16
diff changeset
94 CurlBuilder(const std::string& base_url,
2514880d4f0b cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 16
diff changeset
95 const std::shared_ptr<google::cloud::storage::internal::CurlHandleFactory>& factory) :
0
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
96 CurlRequestBuilder(base_url, std::make_shared<HandleFactory>())
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
97 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
98 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
99 };
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
100 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
101
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
102
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
103
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
104 static boost::posix_time::ptime GetNow()
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
105 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
106 return boost::posix_time::second_clock::local_time();
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
107 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
108
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
109
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
110 void GoogleUpdater::Worker(const State* state,
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
111 const GoogleAccount* account,
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
112 long refreshIntervalSeconds)
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
113 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
114 std::shared_ptr<google::cloud::storage::oauth2::Credentials> credentials;
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
115
16
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
116 try
0
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
117 {
16
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
118 switch (account->GetType())
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
119 {
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
120 case GoogleAccount::Type_ServiceAccount:
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
121 credentials = std::make_shared<google::cloud::storage::oauth2::ServiceAccountCredentials
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
122 <CurlBuilder>>(account->GetServiceAccount());
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
123 break;
0
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
124
16
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
125 case GoogleAccount::Type_AuthorizedUser:
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
126 credentials = std::make_shared<google::cloud::storage::oauth2::AuthorizedUserCredentials
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
127 <CurlBuilder>>(account->GetAuthorizedUser());
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
128 break;
0
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
129
16
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
130 default:
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
131 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented);
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
132 }
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
133 }
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
134 catch (Orthanc::OrthancException& e)
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
135 {
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
136 credentials.reset();
0
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
137 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
138
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
139 if (credentials.get() == NULL)
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
140 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
141 LOG(ERROR) << "Cannot initialize the token updater for Google Cloud Platform account: "
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
142 << account->GetName();
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
143 return;
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
144 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
145
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
146 const std::string dicomWebPluginRoot = GoogleConfiguration::GetInstance().GetDicomWebPluginRoot();
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
147 const std::string baseGoogleUrl = GoogleConfiguration::GetInstance().GetBaseGoogleUrl();
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
148
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
149 std::string lastToken;
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
150 std::unique_ptr<boost::posix_time::ptime> lastUpdate;
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
151
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
152 while (*state == State_Running)
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
153 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
154 if (lastUpdate.get() == NULL ||
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
155 (GetNow() - *lastUpdate).total_seconds() >= refreshIntervalSeconds)
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
156 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
157 google::cloud::StatusOr<std::string> token = credentials->AuthorizationHeader();
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
158 if (!token)
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
159 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
160 LOG(WARNING) << "Cannot generate Google Cloud Platform token for account: " << account->GetName();
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
161 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
162 else if (*token != lastToken &&
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
163 account->UpdateServerDefinition(dicomWebPluginRoot, baseGoogleUrl, *token))
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
164 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
165 lastToken = *token;
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
166 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
167
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
168 lastUpdate.reset(new boost::posix_time::ptime(GetNow()));
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
169 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
170
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
171 boost::this_thread::sleep(boost::posix_time::milliseconds(100));
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
172 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
173 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
174
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
175
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
176 GoogleUpdater::~GoogleUpdater()
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
177 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
178 if (state_ == State_Running)
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
179 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
180 LOG(ERROR) << "GoogleUpdater::Stop() should have been manually called";
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
181 Stop();
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
182 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
183 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
184
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
185
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
186 void GoogleUpdater::Start()
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
187 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
188 if (state_ != State_Setup)
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
189 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
190 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
191 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
192
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
193 state_ = State_Running;
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
194
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
195 const GoogleConfiguration& configuration = GoogleConfiguration::GetInstance();
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
196
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
197 workers_.resize(configuration.GetAccountsCount());
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
198
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
199 for (size_t i = 0; i < workers_.size(); i++)
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
200 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
201 workers_[i] = new boost::thread(Worker, &state_, &configuration.GetAccount(i),
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
202 configuration.GetRefreshIntervalSeconds());
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
203 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
204 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
205
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
206
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
207 void GoogleUpdater::Stop()
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
208 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
209 if (state_ == State_Running)
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
210 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
211 state_ = State_Done;
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
212
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
213 for (size_t i = 0; i < workers_.size(); i++)
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
214 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
215 if (workers_[i] != NULL)
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
216 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
217 if (workers_[i]->joinable())
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
218 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
219 workers_[i]->join();
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
220 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
221
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
222 delete workers_[i];
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
223 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
224 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
225
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
226 workers_.clear();
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
227 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
228 }