Skip to content

Commit

Permalink
bnet: added functionality for network logging
Browse files Browse the repository at this point in the history
- output plantuml sequence diagram
- add backtrace at the end of each message
  • Loading branch information
franku committed Jul 4, 2019
1 parent 94f2013 commit 5744bea
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 22 deletions.
50 changes: 31 additions & 19 deletions core/src/lib/bsock_network_dump.cc
Expand Up @@ -39,6 +39,7 @@ class BareosSocketNetworkDumpPrivate {
friend class BareosSocketNetworkDump;

static std::string filename_;
static bool plantuml_mode_;
std::size_t max_data_dump_bytes_ = 64;
FILE* fp_ = nullptr;
std::unique_ptr<BareosResource> dummy_resource_;
Expand All @@ -51,10 +52,12 @@ class BareosSocketNetworkDumpPrivate {
int destination_rcode_for_dummy_resource,
const QualifiedResourceNameTypeConverter& conv);
std::string CreateDataString(int signal, const char* ptr, int nbytes) const;
std::string CreateFormatStringForNetworkMessage(int signal) const;
void DumpStacktrace() const;
};

std::string BareosSocketNetworkDumpPrivate::filename_;
bool BareosSocketNetworkDumpPrivate::plantuml_mode_ = false;

void BareosSocketNetworkDumpPrivate::OpenFile()
{
Expand Down Expand Up @@ -109,19 +112,23 @@ std::string BareosSocketNetworkDumpPrivate::CreateDataString(int signal,

void BareosSocketNetworkDumpPrivate::DumpStacktrace() const
{
BStringList trace(Backtrace(6), '\n');
for (std::string s : trace) {
BStringList trace_lines(Backtrace(6), '\n');

for (std::string s : trace_lines) {
char buffer[1024];
std::string p(s.c_str(), s.size() < max_data_dump_bytes_
? s.size()
: max_data_dump_bytes_);
p += "\\n";
int amount = snprintf(buffer, sizeof(buffer) / sizeof(buffer[0]),
"%28s %s\n", "", p.c_str());
std::cout << buffer;
const char* fmt = plantuml_mode_ ? "%6s %s\\n" : "%6s %s\n";
int amount = snprintf(buffer, sizeof(buffer) / sizeof(buffer[0]), fmt, "",
p.c_str());
fwrite(buffer, 1, amount, fp_);
fflush(fp_);
}
if (plantuml_mode_) {
fwrite("\n", 1, 1, fp_);
fflush(fp_);
}
}

std::unique_ptr<BareosSocketNetworkDump> BareosSocketNetworkDump::Create(
Expand All @@ -143,19 +150,21 @@ std::unique_ptr<BareosSocketNetworkDump> BareosSocketNetworkDump::Create(
int destination_rcode_for_dummy_resource,
const QualifiedResourceNameTypeConverter& conv)
{
std::unique_ptr<BareosSocketNetworkDump> p;
if (BareosSocketNetworkDumpPrivate::filename_.empty()) {
std::unique_ptr<BareosSocketNetworkDump> p;
return p;
} else {
p = std::move(std::make_unique<BareosSocketNetworkDump>(
own_resource, destination_rcode_for_dummy_resource, conv));
std::unique_ptr<BareosSocketNetworkDump> p(
std::make_unique<BareosSocketNetworkDump>(
own_resource, destination_rcode_for_dummy_resource, conv));
return p;
}
}

BareosSocketNetworkDump::BareosSocketNetworkDump()
: impl_(std::make_unique<BareosSocketNetworkDumpPrivate>())
{
// standard constructor just creates private data object
}

BareosSocketNetworkDump::BareosSocketNetworkDump(
Expand Down Expand Up @@ -188,15 +197,19 @@ bool BareosSocketNetworkDump::SetFilename(const char* filename)
return true;
}

static std::string CreateFormatStringForNetworkMessage(int signal)
std::string BareosSocketNetworkDumpPrivate::CreateFormatStringForNetworkMessage(
int signal) const
{
std::string s;
if (signal > 998) { // if text too long, signal set to 999
return "%12s -> %-12s: (>%3d) %s\n";
s = "%12s -> %-12s: (>%3d) %s";
} else if (signal < 0) { // bnet signal
return "%12s -> %-12s: (%4d) %s\n";
s = "%12s -> %-12s: (%4d) %s";
} else {
return "%12s -> %-12s: (%4d) %s\n";
s = "%12s -> %-12s: (%4d) %s";
}
s += plantuml_mode_ ? "\\n" : "\n";
return s;
}

void BareosSocketNetworkDump::DumpMessageToFile(const char* ptr,
Expand All @@ -205,7 +218,6 @@ void BareosSocketNetworkDump::DumpMessageToFile(const char* ptr,
if (!impl_->fp_) { return; }

int signal = ntohl(*((int32_t*)&ptr[0]));

if (signal > 999) { signal = 999; }

const char* own_rcode_str =
Expand All @@ -216,11 +228,11 @@ void BareosSocketNetworkDump::DumpMessageToFile(const char* ptr,
: "???";

char buffer[1024];
int amount = snprintf(buffer, sizeof(buffer) / sizeof(buffer[0]),
CreateFormatStringForNetworkMessage(signal).c_str(),
own_rcode_str, connected_rcode_str, signal,
impl_->CreateDataString(signal, ptr, nbytes).c_str());
std::cout << buffer;
int amount =
snprintf(buffer, sizeof(buffer) / sizeof(buffer[0]),
impl_->CreateFormatStringForNetworkMessage(signal).c_str(),
own_rcode_str, connected_rcode_str, signal,
impl_->CreateDataString(signal, ptr, nbytes).c_str());
fwrite(buffer, 1, amount, impl_->fp_);
fflush(impl_->fp_);

Expand Down
5 changes: 2 additions & 3 deletions core/src/lib/bsock_network_dump.h
Expand Up @@ -40,14 +40,13 @@ class BareosSocketNetworkDump {
const BareosResource* own_resource,
int destination_rcode_for_dummy_resource,
const QualifiedResourceNameTypeConverter& conv);
void DumpMessageToFile(const char* ptr, int nbytes) const;

BareosSocketNetworkDump(const BareosResource* own_resource,
const BareosResource* distant_resource);
BareosSocketNetworkDump(const BareosResource* own_resource,
int destination_rcode_for_dummy_resource,
const QualifiedResourceNameTypeConverter& conv);

void DumpMessageToFile(const char* ptr, int nbytes) const;

BareosSocketNetworkDump(const BareosSocketNetworkDump& other) = delete;
BareosSocketNetworkDump(const BareosSocketNetworkDump&& other) = delete;
BareosSocketNetworkDump& operator=(const BareosSocketNetworkDump& rhs) =
Expand Down

0 comments on commit 5744bea

Please sign in to comment.