build in library mode - in progress
This commit is contained in:
@@ -7,6 +7,7 @@
|
|||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
extern ProcList * processes;
|
extern ProcList * processes;
|
||||||
@@ -17,8 +18,11 @@ extern Process * unknownip;
|
|||||||
|
|
||||||
static std::shared_ptr<std::thread> monitor_thread_ptr;
|
static std::shared_ptr<std::thread> monitor_thread_ptr;
|
||||||
static std::atomic_bool monitor_thread_run_flag(false);
|
static std::atomic_bool monitor_thread_run_flag(false);
|
||||||
|
|
||||||
static NethogsMonitor::Callback monitor_udpate_callback;
|
static NethogsMonitor::Callback monitor_udpate_callback;
|
||||||
static NethogsMonitorData monitor_data;
|
|
||||||
|
typedef std::map<int, NethogsAppUpdate> NethogsAppUpdateMap;
|
||||||
|
static NethogsAppUpdateMap monitor_update_data;
|
||||||
|
|
||||||
bool NethogsMonitor::_trace = false;
|
bool NethogsMonitor::_trace = false;
|
||||||
bool NethogsMonitor::_promisc = false;
|
bool NethogsMonitor::_promisc = false;
|
||||||
@@ -106,7 +110,7 @@ void NethogsMonitor::threadProc()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if ( packets_read && needrefresh )
|
if (needrefresh)
|
||||||
{
|
{
|
||||||
needrefresh = false;
|
needrefresh = false;
|
||||||
handleUpdate();
|
handleUpdate();
|
||||||
@@ -148,7 +152,13 @@ void NethogsMonitor::handleUpdate()
|
|||||||
if (DEBUG)
|
if (DEBUG)
|
||||||
std::cout << "PROC: Deleting process\n";
|
std::cout << "PROC: Deleting process\n";
|
||||||
|
|
||||||
monitor_data.apps_info.erase(curproc->getVal()->name);
|
if( monitor_udpate_callback )
|
||||||
|
{
|
||||||
|
NethogsAppUpdate &data = monitor_update_data[curproc->getVal()->pid];
|
||||||
|
data.action = NethogsAppUpdate::Remove;
|
||||||
|
monitor_udpate_callback(data);
|
||||||
|
monitor_update_data.erase(curproc->getVal()->pid);
|
||||||
|
}
|
||||||
|
|
||||||
ProcList * todelete = curproc;
|
ProcList * todelete = curproc;
|
||||||
Process * p_todelete = curproc->getVal();
|
Process * p_todelete = curproc->getVal();
|
||||||
@@ -156,7 +166,8 @@ void NethogsMonitor::handleUpdate()
|
|||||||
{
|
{
|
||||||
previousproc->next = curproc->next;
|
previousproc->next = curproc->next;
|
||||||
curproc = curproc->next;
|
curproc = curproc->next;
|
||||||
} else {
|
} else
|
||||||
|
{
|
||||||
processes = curproc->getNext();
|
processes = curproc->getNext();
|
||||||
curproc = processes;
|
curproc = processes;
|
||||||
}
|
}
|
||||||
@@ -167,36 +178,59 @@ void NethogsMonitor::handleUpdate()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
NethogsMonitorData::Line& line = monitor_data.apps_info[curproc->getVal()->name];
|
int const pid = curproc->getVal()->pid;
|
||||||
if( line.app_name.empty() )
|
u_int32_t sent_bytes;
|
||||||
{
|
u_int32_t recv_bytes;
|
||||||
line.app_name = curproc->getVal()->name;
|
float sent_kbs;
|
||||||
}
|
float recv_kbs;
|
||||||
if( line.device_name != curproc->getVal()->devicename )
|
getkbps (curproc->getVal(), &sent_kbs, &recv_kbs);
|
||||||
{
|
gettotal (curproc->getVal(), &recv_bytes, &sent_bytes);
|
||||||
line.device_name = curproc->getVal()->devicename;
|
|
||||||
}
|
|
||||||
line.pid = curproc->getVal()->pid;
|
|
||||||
line.uid = curproc->getVal()->getUid();
|
|
||||||
|
|
||||||
getkbps (curproc->getVal(), &line.sent_kbs, &line.recv_kbs);
|
if( monitor_udpate_callback )
|
||||||
gettotal (curproc->getVal(), &line.recv_bytes, &line.sent_bytes);
|
{
|
||||||
|
//notify update
|
||||||
|
NethogsAppUpdate &data = monitor_update_data[pid];
|
||||||
|
bool data_change = false;
|
||||||
|
|
||||||
|
#define NHM_UPDATE_ONE_FIELD(TO,FROM) if((TO)!=(FROM)) { TO = FROM; data_change = true; }
|
||||||
|
NHM_UPDATE_ONE_FIELD( data.pid, pid )
|
||||||
|
NHM_UPDATE_ONE_FIELD( data.uid, curproc->getVal()->getUid() )
|
||||||
|
NHM_UPDATE_ONE_FIELD( data.app_name, curproc->getVal()->name )
|
||||||
|
NHM_UPDATE_ONE_FIELD( data.device_name, curproc->getVal()->devicename )
|
||||||
|
NHM_UPDATE_ONE_FIELD( data.sent_bytes, sent_bytes )
|
||||||
|
NHM_UPDATE_ONE_FIELD( data.recv_bytes, recv_bytes )
|
||||||
|
NHM_UPDATE_ONE_FIELD( data.sent_kbs, sent_kbs )
|
||||||
|
NHM_UPDATE_ONE_FIELD( data.recv_kbs, recv_kbs )
|
||||||
|
#undef NHM_UPDATE_ONE_FIELD
|
||||||
|
|
||||||
|
if( data_change )
|
||||||
|
{
|
||||||
|
data.action = NethogsAppUpdate::Set;
|
||||||
|
monitor_udpate_callback(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//next
|
||||||
previousproc = curproc;
|
previousproc = curproc;
|
||||||
curproc = curproc->next;
|
curproc = curproc->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
monitor_udpate_callback(monitor_data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void NethogsMonitor::start(NethogsMonitor::Callback const& cb)
|
void NethogsMonitor::registerUpdateCallback(Callback const& cb)
|
||||||
|
{
|
||||||
|
if( !monitor_thread_run_flag )
|
||||||
|
{
|
||||||
|
monitor_udpate_callback = cb;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void NethogsMonitor::start()
|
||||||
{
|
{
|
||||||
bool expected = false;
|
bool expected = false;
|
||||||
if( monitor_thread_run_flag.compare_exchange_strong(expected, true) )
|
if( monitor_thread_run_flag.compare_exchange_strong(expected, true) )
|
||||||
{
|
{
|
||||||
monitor_udpate_callback = cb;
|
monitor_thread_ptr = std::make_shared<std::thread>(&NethogsMonitor::threadProc);
|
||||||
monitor_thread_ptr = std::make_shared<std::thread>(&threadProc);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
32
libnethogs.h
32
libnethogs.h
@@ -1,38 +1,44 @@
|
|||||||
#ifndef NETHOGSMINITOR_H
|
#ifndef NETHOGSMINITOR_H
|
||||||
#define NETHOGSMINITOR_H
|
#define NETHOGSMINITOR_H
|
||||||
|
|
||||||
#include <functional>
|
#include <string>
|
||||||
#include <map>
|
|
||||||
|
|
||||||
#define NETHOGS_DSO_VISIBLE __attribute__ ((visibility ("default")))
|
#define NETHOGS_DSO_VISIBLE __attribute__ ((visibility ("default")))
|
||||||
#define NETHOGS_DSO_HIDDEN __attribute__ ((visibility ("hidden")))
|
#define NETHOGS_DSO_HIDDEN __attribute__ ((visibility ("hidden")))
|
||||||
|
|
||||||
class NETHOGS_DSO_VISIBLE NethogsMonitorData
|
class NETHOGS_DSO_VISIBLE NethogsAppUpdate
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
class Line
|
enum Action {Set, Remove};
|
||||||
|
NethogsAppUpdate()
|
||||||
|
: action(Set), pid(0), uid(0), sent_kbs(0), recv_kbs(0)
|
||||||
{
|
{
|
||||||
public:
|
}
|
||||||
|
Action action;
|
||||||
|
int pid;
|
||||||
|
u_int32_t uid;
|
||||||
std::string app_name;
|
std::string app_name;
|
||||||
std::string device_name;
|
std::string device_name;
|
||||||
int uid;
|
|
||||||
int pid;
|
|
||||||
u_int32_t sent_bytes;
|
u_int32_t sent_bytes;
|
||||||
u_int32_t recv_bytes;
|
u_int32_t recv_bytes;
|
||||||
float sent_kbs;
|
float sent_kbs;
|
||||||
float recv_kbs;
|
float recv_kbs;
|
||||||
};
|
|
||||||
typedef std::map<std::string, Line> TAppMap;
|
|
||||||
TAppMap apps_info;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class NETHOGS_DSO_VISIBLE NethogsMonitor
|
class NETHOGS_DSO_VISIBLE NethogsMonitor
|
||||||
{
|
{
|
||||||
NethogsMonitor();
|
NethogsMonitor();
|
||||||
public:
|
public:
|
||||||
typedef std::function<void(NethogsMonitorData const&)> Callback;
|
typedef void(*Callback)(NethogsAppUpdate const&);
|
||||||
|
|
||||||
static void start(Callback const& cb);
|
//register async callback to receive updates
|
||||||
|
//have to be called before start
|
||||||
|
static void registerUpdateCallback(Callback const& cb);
|
||||||
|
|
||||||
|
//start the monitor
|
||||||
|
static void start();
|
||||||
|
|
||||||
|
//stop the monitor
|
||||||
static void stop();
|
static void stop();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
Reference in New Issue
Block a user