GCC Code Coverage Report


Directory: cvmfs/
File: cvmfs/swissknife_lease.cc
Date: 2026-04-26 02:35:59
Exec Total Coverage
Lines: 0 72 0.0%
Branches: 0 41 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 const LeaseReply rep = ParseAcquireReply(buffer, &session_token);
87 switch (rep) {
88 case kLeaseReplySuccess: {
89 const std::string token_file_name = "/var/spool/cvmfs/" + lease_fqdn
90 + "/session_token";
91
92 if (!SafeWriteToFile(session_token, token_file_name, 0600)) {
93 LogCvmfs(kLogCvmfs, kLogStderr, "Error opening file: %s",
94 std::strerror(errno));
95 ret = kLeaseFileOpenError;
96 }
97 } break;
98 case kLeaseReplyBusy:
99 return kLeaseBusy;
100 break;
101 case kLeaseReplyFailure:
102 default:
103 return kLeaseFailure;
104 }
105 } else {
106 ret = kLeaseCurlReqError;
107 }
108 } else if (params.action == "drop") {
109 // Try to read session token from repository scratch directory
110 std::string session_token;
111 const std::string token_file_name = "/var/spool/cvmfs/" + lease_fqdn
112 + "/session_token";
113 FILE *token_file = std::fopen(token_file_name.c_str(), "r");
114 if (token_file) {
115 GetLineFile(token_file, &session_token);
116 LogCvmfs(kLogCvmfs, kLogDebug, "Read session token from file: %s",
117 session_token.c_str());
118
119 CurlBuffer buffer;
120 if (MakeEndRequest("DELETE", key_id, secret, session_token,
121 params.repo_service_url, "", &buffer)) {
122 if (kLeaseReplySuccess == ParseDropReply(buffer)) {
123 std::fclose(token_file);
124 if (unlink(token_file_name.c_str())) {
125 LogCvmfs(kLogCvmfs, kLogStderr,
126 "Warning - Could not delete session token file.");
127 }
128 return kLeaseSuccess;
129 } else {
130 LogCvmfs(kLogCvmfs, kLogStderr, "Could not drop active lease");
131 ret = kLeaseFailure;
132 }
133 } else {
134 LogCvmfs(kLogCvmfs, kLogStderr, "Error making DELETE request");
135 ret = kLeaseCurlReqError;
136 }
137
138 std::fclose(token_file);
139 } else {
140 LogCvmfs(kLogCvmfs, kLogStderr, "Error reading session token from file");
141 ret = kLeaseFileOpenError;
142 }
143 }
144
145 return ret;
146 }
147
148 } // namespace swissknife
149