GCC Code Coverage Report


Directory: cvmfs/
File: cvmfs/swissknife_lease.cc
Date: 2026-10-04 02:40:33
Exec Total Coverage
Lines: 0 80 0.0%
Branches: 0 49 0.0%

Line Branch Exec Source
1 /**
2 * This file is part of the CernVM File System.
3 */
4
5 #include "swissknife_lease.h"
6
7 #include <vector>
8
9 #include "gateway_util.h"
10 #include "swissknife_lease_curl.h"
11 #include "swissknife_lease_json.h"
12 #include "util/logging.h"
13 #include "util/posix.h"
14 #include "util/string.h"
15
16 namespace {
17
18 ✗ bool CheckParams(const swissknife::CommandLease::Parameters &p) {
19 ✗ if (p.action != "acquire" && p.action != "drop") {
20 ✗ return false;
21 }
22
23 ✗ return true;
24 }
25
26 } // namespace
27
28 namespace swissknife {
29
30 enum LeaseError {
31 kLeaseSuccess,
32 kLeaseBusy,
33 kLeaseFailure,
34 kLeaseParamError,
35 kLeaseKeyParseError,
36 kLeaseCurlInitError,
37 kLeaseFileOpenError,
38 kLeaseCurlReqError,
39 };
40
41 ✗ CommandLease::~CommandLease() { }
42
43 ✗ ParameterList CommandLease::GetParams() const {
44 ✗ ParameterList r;
45 ✗ r.push_back(Parameter::Mandatory('u', "repo service url"));
46 ✗ r.push_back(Parameter::Mandatory('a', "action (acquire or drop)"));
47 ✗ r.push_back(Parameter::Mandatory('k', "key file"));
48 ✗ r.push_back(Parameter::Mandatory('p', "lease path"));
49 ✗ return r;
50 }
51
52 ✗ int CommandLease::Main(const ArgumentList &args) {
53 ✗ Parameters params;
54
55 ✗ params.repo_service_url = *(args.find('u')->second);
56 ✗ params.action = *(args.find('a')->second);
57 ✗ params.key_file = *(args.find('k')->second);
58
59 ✗ params.lease_path = *(args.find('p')->second);
60 ✗ std::vector<std::string> tokens = SplitString(params.lease_path, '/');
61 ✗ const std::string lease_fqdn = tokens.front();
62
63 ✗ if (!CheckParams(params)) {
64 ✗ return kLeaseParamError;
65 }
66
67 // Initialize curl
68 ✗ if (curl_global_init(CURL_GLOBAL_ALL)) {
69 ✗ return kLeaseCurlInitError;
70 }
71
72 ✗ std::string key_id;
73 ✗ std::string secret;
74 ✗ if (!gateway::ReadKeys(params.key_file, &key_id, &secret)) {
75 ✗ LogCvmfs(kLogCvmfs, kLogStderr, "Error reading key file %s.",
76 params.key_file.c_str());
77 ✗ return kLeaseKeyParseError;
78 }
79
80 ✗ LeaseError ret = kLeaseSuccess;
81 ✗ if (params.action == "acquire") {
82 ✗ CurlBuffer buffer;
83 ✗ if (MakeAcquireRequest(key_id, secret, params.lease_path,
84 params.repo_service_url, &buffer)) {
85 ✗ std::string session_token;
86 ✗ int max_api_version = 0;
87 ✗ const LeaseReply rep = ParseAcquireReply(buffer, &session_token,
88 &max_api_version);
89 ✗ switch (rep) {
90 ✗ case kLeaseReplySuccess: {
91 ✗ const std::string token_file_name = "/var/spool/cvmfs/" + lease_fqdn
92 ✗ + "/session_token";
93
94 ✗ if (!SafeWriteToFile(session_token, token_file_name, 0600)
95 ✗ || !SafeWriteToFile(
96 ✗ gateway::MakeSessionTokenApiVersionRecord(max_api_version,
97 session_token),
98 ✗ gateway::SessionTokenApiVersionPath(token_file_name),
99 0600)) {
100 ✗ const int write_errno = errno;
101 ✗ unlink(
102 ✗ gateway::SessionTokenApiVersionPath(token_file_name).c_str());
103 ✗ LogCvmfs(kLogCvmfs, kLogStderr, "Error opening file: %s",
104 std::strerror(write_errno));
105 ✗ ret = kLeaseFileOpenError;
106 }
107 ✗ } break;
108 ✗ case kLeaseReplyBusy:
109 ✗ return kLeaseBusy;
110 break;
111 ✗ case kLeaseReplyFailure:
112 default:
113 ✗ return kLeaseFailure;
114 }
115 ✗ } else {
116 ✗ ret = kLeaseCurlReqError;
117 }
118 ✗ } else if (params.action == "drop") {
119 // Try to read session token from repository scratch directory
120 ✗ std::string session_token;
121 ✗ const std::string token_file_name = "/var/spool/cvmfs/" + lease_fqdn
122 ✗ + "/session_token";
123 ✗ FILE *token_file = std::fopen(token_file_name.c_str(), "r");
124 ✗ if (token_file) {
125 ✗ GetLineFile(token_file, &session_token);
126 LogCvmfs(kLogCvmfs, kLogDebug, "Read session token from file: %s",
127 session_token.c_str());
128
129 ✗ CurlBuffer buffer;
130 ✗ if (MakeEndRequest("DELETE", key_id, secret, session_token,
131 params.repo_service_url, "", &buffer)) {
132 ✗ if (kLeaseReplySuccess == ParseDropReply(buffer)) {
133 ✗ std::fclose(token_file);
134 ✗ if (unlink(token_file_name.c_str())) {
135 ✗ LogCvmfs(kLogCvmfs, kLogStderr,
136 "Warning - Could not delete session token file.");
137 }
138 ✗ unlink(gateway::SessionTokenApiVersionPath(token_file_name).c_str());
139 ✗ return kLeaseSuccess;
140 } else {
141 ✗ LogCvmfs(kLogCvmfs, kLogStderr, "Could not drop active lease");
142 ✗ ret = kLeaseFailure;
143 }
144 } else {
145 ✗ LogCvmfs(kLogCvmfs, kLogStderr, "Error making DELETE request");
146 ✗ ret = kLeaseCurlReqError;
147 }
148
149 ✗ std::fclose(token_file);
150 ✗ } else {
151 ✗ LogCvmfs(kLogCvmfs, kLogStderr, "Error reading session token from file");
152 ✗ ret = kLeaseFileOpenError;
153 }
154 }
155
156 ✗ return ret;
157 }
158
159 } // namespace swissknife
160