Skip to content

Commit 989a440

Browse files
committed
rotating log files; shutdown on SIGTERM; filter users by active only
1 parent c5999b7 commit 989a440

File tree

6 files changed

+42
-19
lines changed

6 files changed

+42
-19
lines changed

include/gitlabapi.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ namespace gitlab {
2020
UserID id;
2121
std::string username;
2222
std::string name;
23+
std::string state;
2324

2425
std::vector<Group> groups;
2526
};

src/authorized_keys.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ int main(int argc, char* argv[]) {
2020
if (static_cast<Error>(userresp.getErrcode()) != Error::Ok)
2121
return userresp.getErrcode();
2222

23+
if (std::string("active") != userresp.getUser().getState().cStr())
24+
return -3;
25+
2326
// Get the ssh public keys from user by ID via RPC to the daemon
2427
auto keyreq = daemon->getSSHKeysRequest();
2528
keyreq.setId(userresp.getUser().getId());

src/gitlabapi.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ Error GitLab::fetchUserByUsername(std::string username, User& user) const {
4545
user.id = userJson["id"].Get<decltype(user.id)>();
4646
user.username = userJson["username"].GetString();
4747
user.name = userJson["name"].GetString();
48+
user.state = userJson["state"].GetString();
4849
return Error::Ok;
4950
}
5051

@@ -59,6 +60,7 @@ Error GitLab::fetchUserByID(UserID id, User& user) const {
5960
user.id = userJson["id"].Get<decltype(user.id)>();
6061
user.username = userJson["username"].GetString();
6162
user.name = userJson["name"].GetString();
63+
user.state = userJson["state"].GetString();
6264
return Error::Ok;
6365
}
6466

src/gitlabnssd.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
#include <lrucache.hpp>
1010

11-
#include <spdlog/sinks/basic_file_sink.h>
11+
#include <spdlog/sinks/rotating_file_sink.h>
1212
#include <spdlog/sinks/stdout_color_sinks.h>
1313
#include <spdlog/spdlog.h>
1414

@@ -33,12 +33,14 @@ static void initLogger() {
3333
#if DEBUG
3434
auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
3535
#endif
36-
auto basic_sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>("/var/log/gitlabnss.log");
36+
// auto filesink = std::make_shared<spdlog::sinks::basic_file_sink_mt>("/var/log/gitlabnss.log");
37+
auto filesink =
38+
std::make_shared<spdlog::sinks::rotating_file_sink_mt>("/var/log/gitlabnss.log", 5 * 1024 * 1024, 3);
3739
std::vector<spdlog::sink_ptr> sinks{
3840
#if DEBUG
3941
console_sink,
4042
#endif
41-
basic_sink
43+
filesink
4244
};
4345
auto logger = std::make_shared<spdlog::logger>("", sinks.begin(), sinks.end());
4446
logger->set_level(spdlog::level::trace);
@@ -111,6 +113,7 @@ class GitLabDaemonImpl final : public GitLabDaemon::Server {
111113
output.setId(user.id);
112114
output.setName(user.name);
113115
output.setUsername(user.username);
116+
output.setState(user.state);
114117
auto groups = output.initGroups(user.groups.size());
115118
for (auto i = 0; i < user.groups.size(); ++i) {
116119
if (decltype(groupMap)::iterator it; (it = groupMap.find(user.groups[i].id)) != groupMap.end()) {
@@ -143,6 +146,7 @@ class GitLabDaemonImpl final : public GitLabDaemon::Server {
143146
output.setId(user.id);
144147
output.setName(user.name);
145148
output.setUsername(user.username);
149+
output.setState(user.state);
146150
auto groups = output.initGroups(user.groups.size());
147151
for (auto i = 0; i < user.groups.size(); ++i) {
148152
if (decltype(groupMap)::iterator it; (it = groupMap.find(user.groups[i].id)) != groupMap.end()) {
@@ -243,8 +247,9 @@ int main(int argc, char* argv[]) {
243247
if (chmod(socketPath.c_str(), static_cast<mode_t>(config.general.socketPerms)) != 0)
244248
spdlog::warn("Failed to change permissions with errno {}", errno);
245249

246-
spdlog::info("Instantiating SIGINT handler");
250+
spdlog::info("Instantiating SIGINT and SIGTERM handlers");
247251
std::signal(SIGINT, +[](int signal) { fulfiller->fulfill(); });
252+
std::signal(SIGTERM, +[](int signal) { fulfiller->fulfill(); });
248253

249254
// Run until SIGINT is signaled; accept connections and handle requests.
250255
spdlog::info("Listening...");

src/nss_interface.cpp

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#include <error.hpp>
33
#include <rpcclient.hpp>
44

5-
#include <spdlog/sinks/basic_file_sink.h>
5+
#include <spdlog/sinks/rotating_file_sink.h>
66
#include <spdlog/sinks/stdout_color_sinks.h>
77
#include <spdlog/spdlog.h>
88

@@ -23,12 +23,14 @@ static auto initLogger() {
2323
#if DEBUG
2424
auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
2525
#endif
26-
auto basic_sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>("/var/log/gitlabnss-client.log");
26+
// auto filesink = std::make_shared<spdlog::sinks::basic_file_sink_mt>("/var/log/gitlabnss-client.log");
27+
auto filesink =
28+
std::make_shared<spdlog::sinks::rotating_file_sink_mt>("/var/log/gitlabnss.log", 5 * 1024 * 1024, 3);
2729
std::vector<spdlog::sink_ptr> sinks{
2830
#if DEBUG
2931
console_sink,
3032
#endif
31-
basic_sink
33+
filesink
3234
};
3335
auto logger = std::make_shared<spdlog::logger>("", sinks.begin(), sinks.end());
3436
logger->set_level(spdlog::level::trace);
@@ -92,15 +94,18 @@ nss_status _nss_gitlab_getpwuid_r(uid_t uid, passwd* pwd, char* buf, size_t bufl
9294
auto promise = request.send().wait(waitScope);
9395

9496
auto user = promise.getUser();
95-
switch (static_cast<Error>(promise.getErrcode())) {
96-
case Error::Ok:
97+
auto err = static_cast<Error>(promise.getErrcode());
98+
if (err == Error::Ok && std::string("active") == user.getState().cStr()) {
9799
populatePasswd(*pwd, user, {buf, buflen});
98100
SPDLOG_LOGGER_DEBUG(logger, "Found!");
99101
return nss_status::NSS_STATUS_SUCCESS;
100-
case Error::NotFound:
102+
} else if (err == Error::Ok) {
103+
SPDLOG_LOGGER_DEBUG(logger, "User is not active (status: {})", user.getState().cStr());
104+
return nss_status::NSS_STATUS_NOTFOUND;
105+
} else if (err == Error::NotFound) {
101106
SPDLOG_LOGGER_DEBUG(logger, "Not Found");
102107
return nss_status::NSS_STATUS_NOTFOUND;
103-
default:
108+
} else {
104109
SPDLOG_LOGGER_ERROR(logger, "Other Error");
105110
SPDLOG_LOGGER_ERROR(logger, "Error {}", promise.getErrcode());
106111
return nss_status::NSS_STATUS_UNAVAIL;
@@ -121,15 +126,18 @@ nss_status _nss_gitlab_getpwnam_r(const char* name, passwd* pwd, char* buf, size
121126
auto promise = request.send().wait(waitScope);
122127

123128
auto user = promise.getUser();
124-
switch (static_cast<Error>(promise.getErrcode())) {
125-
case Error::Ok:
129+
auto err = static_cast<Error>(promise.getErrcode());
130+
if (err == Error::Ok && std::string("active") == user.getState().cStr()) {
126131
populatePasswd(*pwd, user, {buf, buflen});
127132
SPDLOG_LOGGER_DEBUG(logger, "Found!");
128133
return nss_status::NSS_STATUS_SUCCESS;
129-
case Error::NotFound:
134+
} else if (err == Error::Ok) {
135+
SPDLOG_LOGGER_DEBUG(logger, "User is not active (status: {})", user.getState().cStr());
136+
return nss_status::NSS_STATUS_NOTFOUND;
137+
} else if (err == Error::NotFound) {
130138
SPDLOG_LOGGER_DEBUG(logger, "Not Found");
131139
return nss_status::NSS_STATUS_NOTFOUND;
132-
default:
140+
} else {
133141
SPDLOG_LOGGER_ERROR(logger, "Other Error");
134142
SPDLOG_LOGGER_ERROR(logger, "Error {}", promise.getErrcode());
135143
return nss_status::NSS_STATUS_UNAVAIL;
@@ -241,8 +249,8 @@ nss_status _nss_gitlab_initgroups_dyn(
241249
auto promise = request.send().wait(waitScope);
242250

243251
auto user = promise.getUser();
244-
switch (static_cast<Error>(promise.getErrcode())) {
245-
case Error::Ok:
252+
auto err = static_cast<Error>(promise.getErrcode());
253+
if (err == Error::Ok && std::string("active") == user.getState().cStr()) {
246254
if (limit < 0 || limit > user.getGroups().size())
247255
limit = user.getGroups().size();
248256
// Check if groups is large enough, otherwise extend it
@@ -261,10 +269,13 @@ nss_status _nss_gitlab_initgroups_dyn(
261269
}
262270
SPDLOG_LOGGER_DEBUG(logger, "Found!");
263271
return nss_status::NSS_STATUS_SUCCESS;
264-
case Error::NotFound:
272+
} else if (err == Error::Ok) {
273+
SPDLOG_LOGGER_DEBUG(logger, "User is not active (status: {})", user.getState().cStr());
274+
return nss_status::NSS_STATUS_NOTFOUND;
275+
} else if (err == Error::NotFound) {
265276
SPDLOG_LOGGER_DEBUG(logger, "Not Found");
266277
return nss_status::NSS_STATUS_NOTFOUND;
267-
default:
278+
} else {
268279
SPDLOG_LOGGER_ERROR(logger, "Other Error");
269280
SPDLOG_LOGGER_ERROR(logger, "Error {}", promise.getErrcode());
270281
return nss_status::NSS_STATUS_UNAVAIL;

src/protocol/messages.capnp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ struct User {
1818
name @2 :Text;
1919
# Sorted such that primary group is first
2020
groups @3 :List(Group);
21+
state @4 :Text;
2122
}
2223

2324
interface GitLabDaemon {

0 commit comments

Comments
 (0)