39
39
surl = dtr->get_source()->TransferLocations()[0].fullstr();
42
logger_->msg(Arc::ERROR, "DTR %s: No locations defined for %s", dtr_id, dtr->get_source()->str());
42
logger_->msg(Arc::ERROR, "No locations defined for %s", dtr->get_source()->str());
46
46
if (dtr->get_destination()->TransferLocations().empty()) {
47
logger_->msg(Arc::ERROR, "DTR %s: No locations defined for %s", dtr_id, dtr->get_destination()->str());
47
logger_->msg(Arc::ERROR, "No locations defined for %s", dtr->get_destination()->str());
50
50
std::string durl = dtr->get_destination()->TransferLocations()[0].fullstr();
66
66
// connect to service and make a new transfer request
67
logger_->msg(Arc::VERBOSE, "DTR %s: Connecting to Delivery service at %s",
68
dtr_id, endpoint.str());
67
logger_->msg(Arc::VERBOSE, "Connecting to Delivery service at %s", endpoint.str());
69
68
client = new Arc::ClientSOAP(cfg, endpoint, timeout);
91
90
// delegate credentials
92
91
Arc::XMLNode op = request.Child(0);
93
92
if (!SetupDelegation(op, dtr->get_usercfg())) {
94
logger_->msg(Arc::ERROR, "DTR %s: Failed to set up credential delegation with %s",
95
dtr_id, endpoint.str());
93
logger_->msg(Arc::ERROR, "Failed to set up credential delegation with %s", endpoint.str());
100
98
request.GetXML(xml, true);
101
logger_->msg(Arc::DEBUG, "DTR %s: Request:\n%s", dtr_id, xml);
99
logger_->msg(Arc::DEBUG, "Request:\n%s", xml);
103
101
Arc::PayloadSOAP *response = NULL;
104
102
Arc::MCC_Status status = client->process(&request, &response);
107
logger_->msg(Arc::ERROR, "DTR %s: Could not connect to service %s: %s",
108
dtr_id, endpoint.str(), (std::string)status);
105
logger_->msg(Arc::ERROR, "Could not connect to service %s: %s",
106
endpoint.str(), (std::string)status);
115
logger_->msg(Arc::ERROR, "DTR %s: No SOAP response from Delivery service %s",
116
dtr_id, endpoint.str());
113
logger_->msg(Arc::ERROR, "No SOAP response from Delivery service %s", endpoint.str());
120
117
response->GetXML(xml, true);
121
logger_->msg(Arc::DEBUG, "DTR %s: Response:\n%s", dtr_id, xml);
118
logger_->msg(Arc::DEBUG, "Response:\n%s", xml);
123
120
if (response->IsFault()) {
124
121
Arc::SOAPFault& fault = *response->Fault();
127
124
if (fault.Reason(n).empty()) break;
128
125
err += ": " + fault.Reason(n);
130
logger_->msg(Arc::ERROR, "DTR %s: Failed to start transfer request: %s", dtr_id, err);
127
logger_->msg(Arc::ERROR, "Failed to start transfer request: %s", err);
135
132
Arc::XMLNode resultnode = (*response)["DataDeliveryStartResponse"]["DataDeliveryStartResult"]["Result"][0];
136
133
if (!resultnode || !resultnode["ResultCode"]) {
137
logger_->msg(Arc::ERROR, "DTR %s: Bad format in XML response from service at %s: %s",
138
dtr_id, endpoint.str(), xml);
134
logger_->msg(Arc::ERROR, "Bad format in XML response from service at %s: %s",
135
endpoint.str(), xml);
143
140
std::string resultcode = (std::string)(resultnode["ResultCode"]);
144
141
if (resultcode != "OK") {
145
logger_->msg(Arc::ERROR, "DTR %s: Could not make new transfer request: %s: %s",
146
dtr_id, resultcode, (std::string)(resultnode[0]["ErrorDescription"]));
142
logger_->msg(Arc::ERROR, "Could not make new transfer request: %s: %s",
143
resultcode, (std::string)(resultnode[0]["ErrorDescription"]));
150
logger_->msg(Arc::INFO, "DTR %s: Started remote Delivery at %s",
151
dtr_id, endpoint.str());
147
logger_->msg(Arc::INFO, "Started remote Delivery at %s", endpoint.str());
176
172
request.GetXML(xml, true);
177
logger_->msg(Arc::DEBUG, "DTR %s: Request:\n%s", dtr_id, xml);
173
logger_->msg(Arc::DEBUG, "Request:\n%s", xml);
179
175
Arc::PayloadSOAP *response = NULL;
181
177
Arc::MCC_Status status = client->process(&request, &response);
184
logger_->msg(Arc::ERROR, "DTR %s: Failed to send cancel request: %s", dtr_id, (std::string)status);
180
logger_->msg(Arc::ERROR, "Failed to send cancel request: %s", (std::string)status);
191
logger_->msg(Arc::ERROR, "DTR %s: Failed to cancel: No SOAP response", dtr_id);
187
logger_->msg(Arc::ERROR, "Failed to cancel: No SOAP response");
195
191
response->GetXML(xml, true);
196
logger_->msg(Arc::DEBUG, "DTR %s: Response:\n%s", dtr_id, xml);
192
logger_->msg(Arc::DEBUG, "Response:\n%s", xml);
198
194
if (response->IsFault()) {
199
195
Arc::SOAPFault& fault = *response->Fault();
202
198
if (fault.Reason(n).empty()) break;
203
199
err += ": " + fault.Reason(n);
205
logger_->msg(Arc::ERROR, "DTR %s: Failed to cancel transfer request: %s", dtr_id, err);
201
logger_->msg(Arc::ERROR, "Failed to cancel transfer request: %s", err);
210
206
Arc::XMLNode resultnode = (*response)["DataDeliveryCancelResponse"]["DataDeliveryCancelResult"]["Result"][0];
211
207
if (!resultnode || !resultnode["ResultCode"]) {
212
logger_->msg(Arc::ERROR, "DTR %s: Bad format in XML response: %s", dtr_id, xml);
208
logger_->msg(Arc::ERROR, "Bad format in XML response: %s", xml);
217
213
if ((std::string)resultnode["ResultCode"] != "OK") {
218
214
Arc::XMLNode errnode = resultnode["ErrorDescription"];
219
logger_->msg(Arc::ERROR, "DTR %s: Failed to cancel: %s", dtr_id, (std::string)errnode);
215
logger_->msg(Arc::ERROR, "Failed to cancel: %s", (std::string)errnode);
241
237
request.GetXML(xml, true);
242
logger_->msg(Arc::DEBUG, "DTR %s: Request:\n%s", dtr_id, xml);
238
logger_->msg(Arc::DEBUG, "Request:\n%s", xml);
244
240
Arc::PayloadSOAP *response = NULL;
246
242
Arc::MCC_Status status = client->process(&request, &response);
249
logger_->msg(Arc::ERROR, "DTR %s: %s", dtr_id, (std::string)status);
245
logger_->msg(Arc::ERROR, "%s", (std::string)status);
250
246
status_.commstatus = CommFailed;
259
255
HandleQueryFault("No SOAP response from delivery service");
262
logger_->msg(Arc::ERROR, "DTR %s: No SOAP response from delivery service", dtr_id);
258
logger_->msg(Arc::ERROR, "No SOAP response from delivery service");
263
259
status_.commstatus = CommFailed;
268
264
response->GetXML(xml, true);
269
logger_->msg(Arc::DEBUG, "DTR %s: Response:\n%s", dtr_id, xml);
265
logger_->msg(Arc::DEBUG, "Response:\n%s", xml);
271
267
if (response->IsFault()) {
272
268
Arc::SOAPFault& fault = *response->Fault();
280
276
HandleQueryFault("Failed to query state: " + err);
283
logger_->msg(Arc::ERROR, "DTR %s: Failed to query state: %s", dtr_id, err);
279
logger_->msg(Arc::ERROR, "Failed to query state: %s", err);
284
280
status_.commstatus = CommFailed;
285
281
strncpy(status_.error_desc, "SOAP error in connection with delivery service", sizeof(status_.error_desc));
290
286
Arc::XMLNode resultnode = (*response)["DataDeliveryQueryResponse"]["DataDeliveryQueryResult"]["Result"][0];
291
287
if (!resultnode || !resultnode["ResultCode"]) {
292
logger_->msg(Arc::ERROR, "DTR %s: Bad format in XML response: %s", dtr_id, xml);
288
logger_->msg(Arc::ERROR, "Bad format in XML response: %s", xml);
294
290
status_.commstatus = CommFailed;
314
310
dtr->get_usercfg().ApplyToConfig(cfg);
317
dtr->get_logger()->msg(Arc::VERBOSE, "DTR %s: Connecting to Delivery service at %s",
318
dtr->get_short_id(), dtr->get_delivery_endpoint().str());
313
dtr->get_logger()->msg(Arc::VERBOSE, "Connecting to Delivery service at %s",
314
dtr->get_delivery_endpoint().str());
319
315
Arc::ClientSOAP client(cfg, dtr->get_delivery_endpoint(), dtr->get_usercfg().Timeout());
327
323
request.GetXML(xml, true);
328
dtr->get_logger()->msg(Arc::DEBUG, "DTR %s: Request:\n%s", dtr->get_short_id(), xml);
324
dtr->get_logger()->msg(Arc::DEBUG, "Request:\n%s", xml);
330
326
Arc::PayloadSOAP *response = NULL;
331
327
Arc::MCC_Status status = client.process(&request, &response);
334
dtr->get_logger()->msg(Arc::ERROR, "DTR %s: Could not connect to service %s: %s",
335
dtr->get_short_id(), dtr->get_delivery_endpoint().str(), (std::string)status);
330
dtr->get_logger()->msg(Arc::ERROR, "Could not connect to service %s: %s",
331
dtr->get_delivery_endpoint().str(), (std::string)status);
342
dtr->get_logger()->msg(Arc::ERROR, "DTR %s: No SOAP response from Delivery service %s",
343
dtr->get_short_id(), dtr->get_delivery_endpoint().str());
338
dtr->get_logger()->msg(Arc::ERROR, "No SOAP response from Delivery service %s",
339
dtr->get_delivery_endpoint().str());
347
343
response->GetXML(xml, true);
348
dtr->get_logger()->msg(Arc::DEBUG, "DTR %s: Response:\n%s", dtr->get_short_id(), xml);
344
dtr->get_logger()->msg(Arc::DEBUG, "Response:\n%s", xml);
350
346
if (response->IsFault()) {
351
347
Arc::SOAPFault& fault = *response->Fault();
354
350
if (fault.Reason(n).empty()) break;
355
351
err += ": " + fault.Reason(n);
357
dtr->get_logger()->msg(Arc::ERROR, "DTR %s: SOAP fault from delivery service at %s: %s",
358
dtr->get_short_id(), dtr->get_delivery_endpoint().str(), err);
353
dtr->get_logger()->msg(Arc::ERROR, "SOAP fault from delivery service at %s: %s",
354
dtr->get_delivery_endpoint().str(), err);
363
359
Arc::XMLNode resultnode = (*response)["DataDeliveryPingResponse"]["DataDeliveryPingResult"]["Result"][0];
364
360
if (!resultnode || !resultnode["ResultCode"]) {
365
dtr->get_logger()->msg(Arc::ERROR, "DTR %s: Bad format in XML response from delivery service at %s: %s",
366
dtr->get_short_id(), dtr->get_delivery_endpoint().str(), xml);
361
dtr->get_logger()->msg(Arc::ERROR, "Bad format in XML response from delivery service at %s: %s",
362
dtr->get_delivery_endpoint().str(), xml);
371
367
std::string resultcode = (std::string)(resultnode["ResultCode"]);
372
368
if (resultcode != "OK") {
373
dtr->get_logger()->msg(Arc::ERROR, "DTR %s: Error pinging delivery service at %s: %s: %s",
374
dtr->get_short_id(), dtr->get_delivery_endpoint().str(),
369
dtr->get_logger()->msg(Arc::ERROR, "Error pinging delivery service at %s: %s: %s",
370
dtr->get_delivery_endpoint().str(),
375
371
resultcode, (std::string)(resultnode[0]["ErrorDescription"]));
459
455
std::string log = (std::string)node["Log"];
460
456
if (!log.empty()) {
461
457
if (log.size() > 2000) log = log.substr(log.find('\n', log.size()-2000));
462
logger_->msg(Arc::INFO, "DTR %s: DataDelivery log tail:\n%s", dtr_id, log);
458
logger_->msg(Arc::INFO, "DataDelivery log tail:\n%s", log);
469
465
bool DataDeliveryRemoteComm::SetupDelegation(Arc::XMLNode& op, const Arc::UserConfig& usercfg) {
470
466
const std::string& cert = (!usercfg.ProxyPath().empty() ? usercfg.ProxyPath() : usercfg.CertificatePath());
471
467
const std::string& key = (!usercfg.ProxyPath().empty() ? usercfg.ProxyPath() : usercfg.KeyPath());
468
const std::string& credentials = usercfg.CredentialString();
473
if (key.empty() || cert.empty()) {
474
logger_->msg(Arc::VERBOSE, "DTR %s: Failed locating credentials", dtr_id);
470
if (credentials.empty() && (key.empty() || cert.empty())) {
471
logger_->msg(Arc::VERBOSE, "Failed locating credentials");
478
475
if(!client->Load()) {
479
logger_->msg(Arc::VERBOSE, "DTR %s: Failed to initiate client connection", dtr_id);
476
logger_->msg(Arc::VERBOSE, "Failed to initiate client connection");
483
480
Arc::MCC* entry = client->GetEntry();
485
logger_->msg(Arc::VERBOSE, "DTR %s: Client connection has no entry point", dtr_id);
482
logger_->msg(Arc::VERBOSE, "Client connection has no entry point");
489
Arc::DelegationProviderSOAP deleg(cert, key);
490
logger_->msg(Arc::VERBOSE, "DTR %s: Initiating delegation procedure", dtr_id);
491
if (!deleg.DelegateCredentialsInit(*entry, &(client->GetContext()))) {
492
logger_->msg(Arc::VERBOSE, "DTR %s: Failed to initiate delegation credentials", dtr_id);
486
Arc::DelegationProviderSOAP * deleg = NULL;
487
// Use in-memory credentials if set in UserConfig
488
if (!credentials.empty()) deleg = new Arc::DelegationProviderSOAP(credentials);
489
else deleg = new Arc::DelegationProviderSOAP(cert, key);
490
logger_->msg(Arc::VERBOSE, "Initiating delegation procedure");
491
if (!deleg->DelegateCredentialsInit(*entry, &(client->GetContext()))) {
492
logger_->msg(Arc::VERBOSE, "Failed to initiate delegation credentials");
495
deleg.DelegatedToken(op);
496
deleg->DelegatedToken(op);
499
501
void DataDeliveryRemoteComm::HandleQueryFault(const std::string& err) {
500
502
// Just return without changing status
501
logger_->msg(Arc::WARNING, "DTR %s: %s", dtr_id, err);
503
logger_->msg(Arc::WARNING, err);
502
504
status_.timestamp = time(NULL);
503
505
// A reconnect may be needed after losing connection