GCC Code Coverage Report


Directory: cvmfs/
File: cvmfs/swissknife_lease.cc
Date: 2026-08-30 02:40:36
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