aboutsummaryrefslogtreecommitdiff
path: root/src/zen/cmds/status_cmd.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2024-04-18 12:44:26 +0200
committerGitHub Enterprise <[email protected]>2024-04-18 12:44:26 +0200
commit6d634ab59c05adf1ba028d95b16031a7f8e8db2a (patch)
tree87e8215fed65506f98f6838b2af08c4ffd5819f0 /src/zen/cmds/status_cmd.cpp
parentzen startup hardening (#49) (diff)
downloadarchived-zen-6d634ab59c05adf1ba028d95b16031a7f8e8db2a.tar.xz
archived-zen-6d634ab59c05adf1ba028d95b16031a7f8e8db2a.zip
improved lock file handling (#50)
- Feature: `zen down` - --`data-dir` to specify a data directory to deduce which zen instance to bring down - Feature: `zen attach` - --`data-dir` to specify a data directory to deduce which zen instance to attach to222 - Feature: `zen status` - --`port` filter running zen instances based on port - --`data-dir` filter running zen instances based on information in the data directory - Improvement: Trying to load a compact binary object from an empty file no longer causes access violation
Diffstat (limited to 'src/zen/cmds/status_cmd.cpp')
-rw-r--r--src/zen/cmds/status_cmd.cpp40
1 files changed, 36 insertions, 4 deletions
diff --git a/src/zen/cmds/status_cmd.cpp b/src/zen/cmds/status_cmd.cpp
index cc936835a..16754e747 100644
--- a/src/zen/cmds/status_cmd.cpp
+++ b/src/zen/cmds/status_cmd.cpp
@@ -2,6 +2,7 @@
#include "status_cmd.h"
+#include <zencore/compactbinary.h>
#include <zencore/fmtutils.h>
#include <zencore/logging.h>
#include <zencore/string.h>
@@ -12,6 +13,8 @@ namespace zen {
StatusCommand::StatusCommand()
{
+ m_Options.add_option("", "p", "port", "Host port", cxxopts::value(m_Port)->default_value("0"), "<hostport>");
+ m_Options.add_option("", "", "data-dir", "Path to data directory to inspect for running server", cxxopts::value(m_DataDir), "<file>");
}
StatusCommand::~StatusCommand() = default;
@@ -19,7 +22,30 @@ StatusCommand::~StatusCommand() = default;
int
StatusCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv)
{
- ZEN_UNUSED(GlobalOptions, argc, argv);
+ ZEN_UNUSED(GlobalOptions);
+
+ if (!ParseOptions(argc, argv))
+ {
+ return 0;
+ }
+
+ uint16_t EffectivePort = 0;
+ if (!m_DataDir.empty())
+ {
+ if (!std::filesystem::is_regular_file(m_DataDir / ".lock"))
+ {
+ ZEN_CONSOLE("lock file does not exist in directory '{}'", m_DataDir);
+ return 1;
+ }
+ LockFileInfo Info = ReadLockFilePayload(LoadCompactBinaryObject(IoBufferBuilder::MakeFromFile(m_DataDir / ".lock")));
+ std::string Reason;
+ if (!ValidateLockFileInfo(Info, Reason))
+ {
+ ZEN_CONSOLE("lock file in directory '{}' is not valid. Reason: '{}'", m_DataDir, Reason);
+ return 1;
+ }
+ EffectivePort = Info.EffectiveListenPort;
+ }
ZenServerState State;
if (!State.InitializeReadOnly())
@@ -31,9 +57,15 @@ StatusCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv)
ZEN_CONSOLE("{:>5} {:>6} {:>24}", "port", "pid", "session");
State.Snapshot([&](const ZenServerState::ZenServerEntry& Entry) {
- StringBuilder<25> SessionStringBuilder;
- Entry.GetSessionId().ToString(SessionStringBuilder);
- ZEN_CONSOLE("{:>5} {:>6} {:>24}", Entry.EffectiveListenPort.load(), Entry.Pid.load(), SessionStringBuilder);
+ bool MatchesAnyPort = (m_Port == 0) && (EffectivePort == 0);
+ bool MatchesEffectivePort = (EffectivePort != 0) && (Entry.EffectiveListenPort.load() == EffectivePort);
+ bool MatchesDesiredPort = (m_Port != 0) && (Entry.DesiredListenPort.load() == m_Port);
+ if (MatchesAnyPort || MatchesEffectivePort || MatchesDesiredPort)
+ {
+ StringBuilder<25> SessionStringBuilder;
+ Entry.GetSessionId().ToString(SessionStringBuilder);
+ ZEN_CONSOLE("{:>5} {:>6} {:>24}", Entry.EffectiveListenPort.load(), Entry.Pid.load(), SessionStringBuilder);
+ }
});
return 0;