annotate Plugin/GoogleUpdater.cpp @ 54:509334672b6b default tip

updated copyright, as Orthanc Team now replaces Osimis
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 30 May 2024 22:48:01 +0200
parents 21499c134785
children
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
54
509334672b6b updated copyright, as Orthanc Team now replaces Osimis
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 42
diff changeset
3 * Copyright (C) 2019-2023 Osimis S.A., Belgium
509334672b6b updated copyright, as Orthanc Team now replaces Osimis
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 42
diff changeset
4 * Copyright (C) 2024-2024 Orthanc Team SRL, Belgium
509334672b6b updated copyright, as Orthanc Team now replaces Osimis
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 42
diff changeset
5 * Copyright (C) 2021-2024 Sebastien Jodogne, ICTEAM UCLouvain, Belgium
0
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
6 *
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
7 * This program is free software: you can redistribute it and/or
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
8 * modify it under the terms of the GNU General Public License as
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
9 * published by the Free Software Foundation, either version 3 of the
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
10 * License, or (at your option) any later version.
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
11 *
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
12 * In addition, as a special exception, the copyright holders of this
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
13 * program give permission to link the code of its release with the
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
14 * OpenSSL project's "OpenSSL" library (or with modified versions of it
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
15 * that use the same license as the "OpenSSL" library), and distribute
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
16 * the linked executables. You must obey the GNU General Public License
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
17 * 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
18 * modify file(s) with this exception, you may extend this exception to
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
19 * 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
20 * 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
21 * version. If you delete this exception statement from all source files
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
22 * in the program, then also delete it here.
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
23 *
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
24 * 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
25 * WITHOUT ANY WARRANTY; without even the implied warranty of
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
27 * General Public License for more details.
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
28 *
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
29 * You should have received a copy of the GNU General Public License
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
30 * along with this program. If not, see <http://www.gnu.org/licenses/>.
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
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 "GoogleUpdater.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 "GoogleConfiguration.h"
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
37
40
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 26
diff changeset
38 #include <Logging.h>
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 26
diff changeset
39
0
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
40 #include <google/cloud/storage/internal/curl_handle_factory.h>
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
41 #include <google/cloud/storage/oauth2/google_credentials.h>
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
42
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 namespace
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
45 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
46 class CurlBuilder : public google::cloud::storage::internal::CurlRequestBuilder
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
47 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
48 private:
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
49 class HandleFactory : public google::cloud::storage::internal::DefaultCurlHandleFactory
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
50 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
51 public:
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
52 google::cloud::storage::internal::CurlPtr CreateHandle() override
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
53 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
54 google::cloud::storage::internal::CurlPtr handle
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
55 (google::cloud::storage::internal::DefaultCurlHandleFactory::CreateHandle());
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
56
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
57 const GoogleConfiguration& configuration = GoogleConfiguration::GetInstance();
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
58
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
59 long timeout = static_cast<long>(configuration.GetTimeoutSeconds());
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
60
16
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
61 if (!configuration.GetCaInfo().empty() &&
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
62 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
63 {
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
64 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError,
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
65 "Cannot set the trusted Certificate Authorities");
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
66 }
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 bool ok;
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
69
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
70 if (configuration.IsHttpsVerifyPeers())
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 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
73 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
74 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
75 }
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
76 else
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 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
79 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
80 }
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
81
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
82 if (!ok)
0
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 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError,
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
85 "Cannot initialize a libcurl handle");
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
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
88 return handle;
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
89 }
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 google::cloud::storage::internal::CurlMulti CreateMultiHandle() override
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 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented);
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
94 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
95 };
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
96
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
97 public:
17
2514880d4f0b cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 16
diff changeset
98 CurlBuilder(const std::string& base_url,
2514880d4f0b cppcheck
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 16
diff changeset
99 const std::shared_ptr<google::cloud::storage::internal::CurlHandleFactory>& factory) :
0
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
100 CurlRequestBuilder(base_url, std::make_shared<HandleFactory>())
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 }
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
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 static boost::posix_time::ptime GetNow()
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 return boost::posix_time::second_clock::local_time();
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
111 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
112
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 void GoogleUpdater::Worker(const State* state,
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
115 const GoogleAccount* account,
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
116 long refreshIntervalSeconds)
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
117 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
118 std::shared_ptr<google::cloud::storage::oauth2::Credentials> credentials;
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
119
16
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
120 try
0
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
121 {
16
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
122 switch (account->GetType())
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
123 {
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
124 case GoogleAccount::Type_ServiceAccount:
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
125 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
126 <CurlBuilder>>(account->GetServiceAccount());
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
127 break;
0
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
128
16
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
129 case GoogleAccount::Type_AuthorizedUser:
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
130 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
131 <CurlBuilder>>(account->GetAuthorizedUser());
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
132 break;
0
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
133
16
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
134 default:
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
135 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented);
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
136 }
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
137 }
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
138 catch (Orthanc::OrthancException& e)
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
139 {
25292488ff8f using option HttpsVerifyPeers from Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 0
diff changeset
140 credentials.reset();
0
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
141 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
142
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
143 if (credentials.get() == NULL)
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 LOG(ERROR) << "Cannot initialize the token updater for Google Cloud Platform account: "
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
146 << account->GetName();
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
147 return;
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
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
150 const std::string dicomWebPluginRoot = GoogleConfiguration::GetInstance().GetDicomWebPluginRoot();
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
151 const std::string baseGoogleUrl = GoogleConfiguration::GetInstance().GetBaseGoogleUrl();
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
152
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
153 std::string lastToken;
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
154 std::unique_ptr<boost::posix_time::ptime> lastUpdate;
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
155
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
156 while (*state == State_Running)
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
157 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
158 if (lastUpdate.get() == NULL ||
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
159 (GetNow() - *lastUpdate).total_seconds() >= refreshIntervalSeconds)
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
160 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
161 google::cloud::StatusOr<std::string> token = credentials->AuthorizationHeader();
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
162 if (!token)
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
163 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
164 LOG(WARNING) << "Cannot generate Google Cloud Platform token for account: " << account->GetName();
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
165 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
166 else if (*token != lastToken &&
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
167 account->UpdateServerDefinition(dicomWebPluginRoot, baseGoogleUrl, *token))
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
168 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
169 lastToken = *token;
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
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
172 lastUpdate.reset(new boost::posix_time::ptime(GetNow()));
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 boost::this_thread::sleep(boost::posix_time::milliseconds(100));
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
176 }
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
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 GoogleUpdater::~GoogleUpdater()
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
181 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
182 if (state_ == State_Running)
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 LOG(ERROR) << "GoogleUpdater::Stop() should have been manually called";
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
185 Stop();
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
186 }
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
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 void GoogleUpdater::Start()
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 if (state_ != State_Setup)
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
193 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
194 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
195 }
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 state_ = State_Running;
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 const GoogleConfiguration& configuration = GoogleConfiguration::GetInstance();
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_.resize(configuration.GetAccountsCount());
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
202
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
203 for (size_t i = 0; i < workers_.size(); i++)
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 workers_[i] = new boost::thread(Worker, &state_, &configuration.GetAccount(i),
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
206 configuration.GetRefreshIntervalSeconds());
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
207 }
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
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 void GoogleUpdater::Stop()
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 if (state_ == State_Running)
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 state_ = State_Done;
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 for (size_t i = 0; i < workers_.size(); i++)
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 if (workers_[i] != NULL)
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 if (workers_[i]->joinable())
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
222 {
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
223 workers_[i]->join();
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 delete workers_[i];
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 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
229
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
230 workers_.clear();
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
231 }
520cba9a0d42 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
232 }