Preliminary work to handle host names from multiple sources

This commit is contained in:
Simone Mainardi 2019-01-28 10:37:30 +01:00
parent f81ebcf16d
commit ab76439ec6
3 changed files with 25 additions and 16 deletions

View file

@ -35,7 +35,10 @@ class Host : public GenericHashEntry {
time_t last_stats_reset;
/* Host data: update Host::deleteHostData when adding new fields */
char *symbolic_name; /* write protected by mutex */
struct {
char *symbolic_name; /* write protected by mutex */
} names;
char *mdns_info;
char *ssdpLocation;
bool host_label_set;
@ -142,7 +145,7 @@ class Host : public GenericHashEntry {
inline u_int8_t* get_mac() { return(mac ? mac->get_mac() : NULL); }
inline Mac* getMac() { return(mac); }
virtual char * get_os(char * const buf, ssize_t buf_len) const;
inline char* get_name() { return(symbolic_name); }
inline char* get_name() { return(names.symbolic_name); }
#ifdef NTOPNG_PRO
inline TrafficShaper *get_ingress_shaper(ndpi_protocol ndpiProtocol) { return(get_shaper(ndpiProtocol, true)); }
inline TrafficShaper *get_egress_shaper(ndpi_protocol ndpiProtocol) { return(get_shaper(ndpiProtocol, false)); }

View file

@ -66,7 +66,7 @@ Host::~Host() {
#endif
if(symbolic_name) free(symbolic_name);
if(names.symbolic_name) free(names.symbolic_name);
if(ssdpLocation) free(ssdpLocation);
if(m) delete m;
if(flow_alert_counter) delete flow_alert_counter;
@ -156,8 +156,10 @@ void Host::initialize(Mac *_mac, u_int16_t _vlanId, bool init_all) {
good_low_flow_detected = false;
nextResolveAttempt = 0, mdns_info = NULL;
host_label_set = false;
num_uses = 0, symbolic_name = NULL, vlan_id = _vlanId % MAX_NUM_VLAN,
num_uses = 0, vlan_id = _vlanId % MAX_NUM_VLAN,
first_seen = last_seen = iface->getTimeLastPktRcvd();
memset(&names, 0, sizeof(names));
if((m = new(std::nothrow) Mutex()) == NULL)
ntop->getTrace()->traceEvent(TRACE_WARNING, "Internal error: NULL mutex. Are you running out of memory?");
@ -534,7 +536,7 @@ void Host::lua(lua_State* vm, AddressTree *ptree,
This has been disabled as in case of an attack, most hosts do not have a name and we will waste
a lot of time doing activities that are not necessary
*/
if((symbolic_name == NULL) || (strcmp(symbolic_name, ipaddr) == 0)) {
if((names.symbolic_name == NULL) || (strcmp(names.symbolic_name, ipaddr) == 0)) {
/* We resolve immediately the IP address by queueing on the top of address queue */
ntop->getRedis()->pushHostToResolve(ipaddr, false, true /* Fake to resolve it ASAP */);
@ -597,9 +599,9 @@ void Host::lua(lua_State* vm, AddressTree *ptree,
*/
void Host::setName(char *name) {
if(m) m->lock(__FILE__, __LINE__);
if((symbolic_name == NULL) || (symbolic_name && strcmp(symbolic_name, name))) {
if(symbolic_name) free(symbolic_name);
symbolic_name = strdup(name);
if((names.symbolic_name == NULL) || (names.symbolic_name && strcmp(names.symbolic_name, name))) {
if(names.symbolic_name) free(names.symbolic_name);
names.symbolic_name = strdup(name);
}
if(m) m->unlock(__FILE__, __LINE__);
@ -614,17 +616,17 @@ char* Host::get_name(char *buf, u_int buf_len, bool force_resolution_if_not_foun
if(nextResolveAttempt
&& ((num_resolve_attempts > 1) || (nextResolveAttempt > now) || (nextResolveAttempt == (time_t)-1))) {
return(symbolic_name);
return(names.symbolic_name);
} else
nextResolveAttempt = ntop->getPrefs()->is_dns_resolution_enabled() ? now + MIN_HOST_RESOLUTION_FREQUENCY : (time_t)-1;
num_resolve_attempts++;
addr = ip.print(buf, buf_len);
if((symbolic_name != NULL) && strcmp(symbolic_name, addr))
return(symbolic_name);
if((names.symbolic_name != NULL) && strcmp(names.symbolic_name, addr))
return(names.symbolic_name);
if(readDHCPCache() && symbolic_name) return(symbolic_name);
if(readDHCPCache() && names.symbolic_name) return(names.symbolic_name);
rc = ntop->getRedis()->getAddress(addr, redis_buf, sizeof(redis_buf),
force_resolution_if_not_found);
@ -634,7 +636,7 @@ char* Host::get_name(char *buf, u_int buf_len, bool force_resolution_if_not_foun
else
setName(addr);
return(symbolic_name);
return(names.symbolic_name);
}
/* ***************************************** */
@ -722,7 +724,7 @@ json_object* Host::getJSONObject(DetailsLevel details_level) {
json_object_object_add(my_object, "seen.last", json_object_new_int64(last_seen));
json_object_object_add(my_object, "last_stats_reset", json_object_new_int64(last_stats_reset));
json_object_object_add(my_object, "asn", json_object_new_int(asn));
if(symbolic_name) json_object_object_add(my_object, "symbolic_name", json_object_new_string(symbolic_name));
if(names.symbolic_name) json_object_object_add(my_object, "symbolic_name", json_object_new_string(names.symbolic_name));
if(asname) json_object_object_add(my_object, "asname", json_object_new_string(asname ? asname : (char*)""));
get_os(buf, sizeof(buf));
if(strlen(buf)) json_object_object_add(my_object, "os", json_object_new_string(buf));

View file

@ -195,8 +195,12 @@ bool LocalHost::deserialize(char *json_str, char *key) {
if(json_object_object_get_ex(o, "seen.last", &obj)) last_seen = json_object_get_int64(obj);
if(json_object_object_get_ex(o, "last_stats_reset", &obj)) last_stats_reset = json_object_get_int64(obj);
if(json_object_object_get_ex(o, "symbolic_name", &obj)) { if(symbolic_name) free(symbolic_name); symbolic_name = strdup(json_object_get_string(obj)); }
if(json_object_object_get_ex(o, "os", &obj)) { inlineSetOS(json_object_get_string(obj)); }
if(json_object_object_get_ex(o, "symbolic_name", &obj)) {
if(names.symbolic_name) free(names.symbolic_name);
names.symbolic_name = strdup(json_object_get_string(obj));
}
if(json_object_object_get_ex(o, "os", &obj))
inlineSetOS(json_object_get_string(obj));
/* We commented the line below to avoid strings too long */
#if 0