From: Steinar H. Gunderson Date: Thu, 18 Apr 2019 15:26:39 +0000 (+0200) Subject: Import nbtscanner 0.2.0. X-Git-Url: https://git.sesse.net/?p=nbtscanner;a=commitdiff_plain;h=2f9aa4043e1417be437a6a77490f7b41cba2ab0a Import nbtscanner 0.2.0. --- diff --git a/configfile.c b/configfile.c index 0faf1e5..f8350c0 100644 --- a/configfile.c +++ b/configfile.c @@ -36,6 +36,7 @@ int num_retries; int retry_time; int delay_time; +int ghost_lifetime; int verbosity; int scan_interval; @@ -64,6 +65,7 @@ void parse_configfile() num_retries = 3; retry_time = 5000; delay_time = 100; + ghost_lifetime = 1800; verbosity = 2; ranges = 0; @@ -146,6 +148,8 @@ void parse_keyword(char *keyword, char *value, int lineno) parse_int(value, &retry_time, lineno); } else if (strcasecmp(keyword, "delay_time") == 0) { parse_int(value, &delay_time, lineno); + } else if (strcasecmp(keyword, "ghost_lifetime") == 0) { + parse_int(value, &ghost_lifetime, lineno); } else if (strcasecmp(keyword, "verbosity") == 0) { parse_int(value, &verbosity, lineno); } else if (strcasecmp(keyword, "scan_interval") == 0) { diff --git a/configfile.h b/configfile.h index 759656f..7abab44 100644 --- a/configfile.h +++ b/configfile.h @@ -33,6 +33,7 @@ extern int num_retries; extern int retry_time; extern int delay_time; +extern int ghost_lifetime; extern int verbosity; extern int scan_interval; diff --git a/init.sql b/init.sql index fbe16ce..f0af74d 100644 --- a/init.sql +++ b/init.sql @@ -10,6 +10,9 @@ CREATE TABLE nbtscanner ( hostname CHAR(32), fileservername CHAR(32), groupname CHAR(32), + active ENUM('y','n'), + lastactive DATETIME, + messenger ENUM('y','n'), PRIMARY KEY ( ip ) diff --git a/mysql_interface.c b/mysql_interface.c index eac9ea2..fccd58c 100644 --- a/mysql_interface.c +++ b/mysql_interface.c @@ -54,7 +54,8 @@ void init_mysql(char *host, char *username, char *password) } } -void add_record_mysql(char *ip, char *hostname, char *fileservername, char *groupname) +void add_record_mysql(char *ip, char *hostname, char *fileservername, char *groupname, + char messenger) { char query[256]; char hname[256], fsname[256], gname[256]; @@ -64,8 +65,8 @@ void add_record_mysql(char *ip, char *hostname, char *fileservername, char *grou mysql_real_escape_string(mysql, gname, groupname, strlen(groupname)); snprintf(query, 256, - "REPLACE INTO nbtscanner.nbtscanner SET ip='%s', hostname='%s', fileservername='%s', groupname='%s';", - ip, hname, fsname, gname); + "REPLACE INTO nbtscanner.nbtscanner SET ip='%s', hostname='%s', fileservername='%s', groupname='%s', active='y', lastactive=now(), messenger='%c';", + ip, hname, fsname, gname, messenger); if (mysql_query(mysql, query) != 0) { if (verbosity >= 1) { @@ -79,7 +80,7 @@ void delete_record_mysql(char *ip) { char query[256]; snprintf(query, 256, - "DELETE FROM nbtscanner.nbtscanner WHERE ip='%s';", + "UPDATE nbtscanner.nbtscanner SET ACTIVE='n' WHERE ip='%s';", ip); if (mysql_query(mysql, query) != 0) { @@ -96,8 +97,12 @@ void print_all_records_mysql() unsigned long *lengths; unsigned int num_fields; int i; + char query[512]; - if (mysql_query(mysql, "SELECT ip,(CASE WHEN fileservername='-unknown-nbtscanner-' THEN hostname ELSE fileservername END),groupname,(fileservername <> '-unknown-nbtscanner-') FROM nbtscanner.nbtscanner;") != 0) { + snprintf(query, 512, "SELECT ip,(CASE WHEN fileservername='-unknown-nbtscanner-' THEN hostname ELSE fileservername END),groupname,(fileservername <> '-unknown-nbtscanner-') FROM nbtscanner.nbtscanner WHERE active='y' OR lastactive>DATE_SUB(NOW(), INTERVAL %d SECOND);", + ghost_lifetime); + + if (mysql_query(mysql, query) != 0) { if (verbosity >= 1) { fprintf(stderr, "mysql_query('SELECT ip'...) failed\n"); } diff --git a/mysql_interface.h b/mysql_interface.h index 26565dc..647bed4 100644 --- a/mysql_interface.h +++ b/mysql_interface.h @@ -26,7 +26,7 @@ #define _MYSQL_INTERFACE_H 1 void init_mysql(char *host, char *username, char *password); -void add_record_mysql(char *ip, char *hostname, char *fileservername, char *groupname); +void add_record_mysql(char *ip, char *hostname, char *fileservername, char *groupname, char messenger); void delete_record_mysql(char *ip); void print_all_records_mysql(); void finish_mysql(); diff --git a/nbtscanner.c b/nbtscanner.c index 223965c..ab45418 100644 --- a/nbtscanner.c +++ b/nbtscanner.c @@ -51,6 +51,7 @@ void interpret_node_status(char *p, struct in_addr in) { int numnames = CVAL(p,0); char hostname[32], fileservername[32], group[32]; + char messenger; /* * hopefully this will be enough to identify the host as unknown @@ -60,6 +61,7 @@ void interpret_node_status(char *p, struct in_addr in) strcpy(hostname, "-unknown-nbtscanner-"); strcpy(fileservername, "-unknown-nbtscanner-"); strcpy(group, "-unknown-nbtscanner-"); + messenger = 'n'; p += 1; while (numnames--) { @@ -100,14 +102,18 @@ void interpret_node_status(char *p, struct in_addr in) if ((p[0] & 0x80) == 0x80 && ((p[0] & 0x1f) == 0x04) && type == 0x00) { strcpy(group, qname); } + /* Messenger up (type 0x03) */ + if (type == 0x03) { + messenger = 'y'; + } p += 2; } if (use_mysql) { - add_record_mysql(inet_ntoa(in), hostname, fileservername, group); + add_record_mysql(inet_ntoa(in), hostname, fileservername, group, messenger); } else { - printf("%s,%s,%s,%s\n", inet_ntoa(in), hostname, fileservername, group); + printf("%s,%s,%s,%s,%c\n", inet_ntoa(in), hostname, fileservername, group, messenger); } } diff --git a/nbtscanner.conf b/nbtscanner.conf index 25ed502..4b4d7c0 100644 --- a/nbtscanner.conf +++ b/nbtscanner.conf @@ -18,6 +18,13 @@ retry_time=5000 # How long nbtscanner will delay between each sent packet, in ms. delay_time=2 +# +# How long a host may be inactive before it's purged from the database. +# Note that this value is in seconds, not milliseconds like the other +# time values in this file. +# +ghost_lifetime=60 + # How long there will be between the _start_ of each scan, in ms. # The default (half an hour, or 1800 seconds) should be OK. scan_interval=400000 @@ -53,7 +60,7 @@ verbosity=3 # all the IPs to standard output. This is highly recommended, but # needs some table setup before use. # -use_mysql=0 +use_mysql=1 # # Your MySQL server information. mysql_host is the IP address (or @@ -64,7 +71,7 @@ use_mysql=0 # mysql_host=localhost mysql_username=nbtscanner -mysql_password=tg01 +mysql_password=qugx8M!S # # Each IP address range is specified with a range= parameter. @@ -82,6 +89,7 @@ mysql_password=tg01 # #range=158.39.124.0/23 #range=213.236.192.0/24 -range=10.0.0.0/16 +range=10.0.7.80/28 #range=10.0.19.0/24 +range=213.236.192.0/24