110
116
} ipt_select_cbd;
112
118
// =================================================================================
119
int IsParameterEnabled(const char *pParam, int argc, char *argv[])
121
int iParameterEnabled = 0;
123
int iLookupLen = strlen(pParam);
130
char *pArgParam = argv[iIdx];
131
if(strncasecmp(pArgParam,pParam,iLookupLen) == 0)
133
iParameterEnabled = 1;
138
return iParameterEnabled;
141
// =================================================================================
113
142
double ConvertMBytesToNumber(double bytes, char cConvertToType)
115
144
switch(cConvertToType)
1214
1254
// ==========================================================================
1256
int CanShrinkDatabase(char *pDB)
1266
char szBuf[1024]="";
1267
sprintf(szBuf,"df %s",pDB);
1269
FILE *fp = popen(szBuf, "r");
1272
fprintf(stderr, "Can't open pipe for command [%s]\n", szBuf);
1276
char szDiscard[1024] = "";
1277
for(;feof(fp) == 0 && strstr(szDiscard,"Mounted on") == NULL;)
1279
fgets(szDiscard,1023,fp);
1284
char szFileSystem[300]="";
1286
char sz1KBlocks[50]="";
1288
char szAvailable[50]="";
1289
char szUsedPercent[300]="";
1290
char szMountedOn[300]="";
1292
fscanf(fp, "%s %s %s %s %s %s",
1301
double d1KBlocks=strtod(sz1KBlocks,&pEnd);
1302
double dUsed=strtod(szUsed,&pEnd);
1303
double dAvailable=strtod(szAvailable,&pEnd);
1305
double dBytesFree = (dAvailable * d1KBlocks);
1308
if(stat(pDB, &fBuf) < 0)
1310
printf("ERROR: %s\n", strerror(errno));
1315
if(dBytesFree >= fBuf.st_size)
1320
printf("Filesystem\t1K-blocks\tUsed\tAvailable\tUse%%\tMounted on\tFILESIZE\tBYTES FREE\n");
1321
printf("%s\t%.2f\t\t%.2f\t%.2f\t%s\t%s\t%i\t%.2f\n",
1338
struct statvfs fiData;
1339
struct statvfs *fpData;
1342
strcpy(fnPath, pDB);
1343
if((statvfs(fnPath,&fiData)) < 0 )
1345
printf("Failed to stat %s:\n", fnPath);
1350
printf("Disk %s: \n", fnPath);
1351
printf("\tblock size: %lu\n", fiData.f_bsize);
1352
printf("\ttotal no blocks: %u\n", fiData.f_blocks);
1353
printf("\tfree blocks: %u\n", fiData.f_bfree);
1364
void vacuumDB(char *pDB)
1369
int rc = sqlite3_open(pDB, &db);
1372
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
1379
//int bCanShrink = CanShrinkDatabase(pDB);
1381
//fprintf(stderr, "Records Deleted [%d] check to shrink database = [%d]...\n", iTotalRowsDelete,bCanShrink);
1386
rc = sqlite3_exec(db, "VACUUM;", stub_callback, 0, &zErrMsg);
1387
if( rc != SQLITE_OK )
1389
fprintf(stderr, "VACUUM SQL error: %s\n", zErrMsg);
1392
sqlite3_free(zErrMsg);
1396
fprintf(stderr, "Closing after shrink database...\n");
1216
1402
int deleteStatsFromSqlite(char *pDB, uint64_t startDate, uint64_t endDate)
1218
1404
int iTotalRowsDelete = 0;
1246
1435
if( rc != SQLITE_OK )
1248
1437
fprintf(stderr, "DELETE SQL error: %s\n", zErrMsg);
1249
1440
sqlite3_free(zErrMsg);
1252
1443
int iChangeCount = sqlite3_changes(db);
1253
1444
iTotalRowsDelete = iChangeCount;
1255
rc = sqlite3_exec(db, "VACUUM;", callback, 0, &zErrMsg);
1256
if( rc != SQLITE_OK )
1446
fprintf(stderr, "Closing database...\n");
1451
int bCanShrink = CanShrinkDatabase(pDB);
1453
fprintf(stderr, "Records Deleted [%d] check to shrink database = [%d]...\n", iTotalRowsDelete,bCanShrink);
1258
fprintf(stderr, "VACUUM SQL error: %s\n", zErrMsg);
1259
sqlite3_free(zErrMsg);
1264
1461
return iTotalRowsDelete;
1266
1463
// ==========================================================================
1268
int insertStatsIntoSqlite(char *pDateTimeStamp, sqlite3 *db, data_t tBandwidthUsage[], data_t tBandwidthUsageInitValue[])
1465
int insertStatsIntoSqlite( char *pDateTimeStamp, sqlite3 *db, data_t tBandwidthUsage[], data_t tBandwidthUsageInitValue[],
1466
int iForceDailyInsertOrUpdate)
1270
1468
int iTotalRowsInserted = 0;
1271
1469
int iMaxDay_index = GetDayIndex(start_date,end_date);
1365
1563
pBandwidthUsage->ip,
1366
1564
pDateTimeStamp);
1566
else if(iForceDailyInsertOrUpdate == 1)
1568
sprintf(szSQL,"INSERT INTO bandwidthusage (log_datetime,host,in_mb,out_mb,mac) SELECT '%s','%s',%f,%f,'' WHERE (SELECT COUNT(*) FROM bandwidthusage WHERE host='%s' AND date(log_datetime)=date('%s')) = 0;",
1570
pBandwidthUsage->ip,
1573
pBandwidthUsage->ip,
1369
fprintf(stderr, "Inserting SQL [%s]\n", szSQL);
1577
fprintf(stderr, "Trying to Insert SQL [%s]\n", szSQL);
1371
1581
int rc = sqlite3_exec(db, szSQL, callback, 0, &zErrMsg);
1372
1582
if( rc != SQLITE_OK )
1374
1584
fprintf(stderr, "SQL error: %s\n", zErrMsg);
1375
1588
sqlite3_free(zErrMsg);
1380
1593
int iChangeCount = sqlite3_changes(db);
1595
if(iChangeCount == 0 && iForceDailyInsertOrUpdate == 1)
1597
sprintf(szSQL,"UPDATE bandwidthusage SET in_mb=in_mb+%f, out_mb=out_mb+%f WHERE host='%s' AND date(log_datetime)=date('%s');",
1600
pBandwidthUsage->ip,
1603
fprintf(stderr, "Trying to Update SQL [%s]\n", szSQL);
1607
rc = sqlite3_exec(db, szSQL, callback, 0, &zErrMsg);
1608
if( rc != SQLITE_OK )
1610
fprintf(stderr, "SQL error: %s\n", zErrMsg);
1614
sqlite3_free(zErrMsg);
1619
iChangeCount = sqlite3_changes(db);
1381
1622
iTotalRowsInserted += iChangeCount;
1460
1701
char szNowStamp[40]="";
1461
1702
strftime (szNowStamp, 39, "%Y-%m-%d %H:%M:%S", tm_now);
1463
int iTotalRowsInserted = insertStatsIntoSqlite(szNowStamp, db, tBandwidthUsage, tBandwidthUsageInitValue);
1704
int bImportStatsDailyOnly = IsParameterEnabled(APP_FLAG_IMPORT_DAILY_ONLY, argc, argv);
1706
int iTotalRowsInserted = insertStatsIntoSqlite(szNowStamp, db, tBandwidthUsage, tBandwidthUsageInitValue,bImportStatsDailyOnly);
1464
1707
sqlite3_close(db);
1466
1709
fprintf(stderr, "*NOTE: Total rows inserted = %d\n", iTotalRowsInserted);
1632
1875
// ==========================================================================
1634
void ProcessSpecialDateParameter(char *pLogFileFilter)
1877
void ProcessSpecialDateParameter(char *pLogFileFilter, int bNeedSeparators)
1636
1879
time_t now = time ( NULL );
1637
1880
struct tm *tm_now = localtime ( &now );
1639
1882
if(strlen(pLogFileFilter) == 0)
1641
strftime (pLogFileFilter, 1023, "%Y%m%d", tm_now);
1886
strftime (pLogFileFilter, 1023, "%Y-%m-%d", tm_now);
1890
strftime (pLogFileFilter, 1023, "%Y%m%d", tm_now);
1643
1893
else if(strstr(pLogFileFilter,TODAYS_DATE_KEYWORD) != NULL)
1659
1909
tm_now = localtime ( &tNewDate );
1661
strftime (pLogFileFilter, 1023, "%Y%m%d", tm_now);
1914
strftime (pLogFileFilter, 1023, "%Y-%m-%d", tm_now);
1918
strftime (pLogFileFilter, 1023, "%Y%m%d", tm_now);
1663
1921
else if(strncasecmp(pLogFileFilter,MONTHLY_PERIOD_STARTDATE_KEYWORD,strlen(MONTHLY_PERIOD_STARTDATE_KEYWORD)) == 0)
1684
1942
tm_now = localtime ( &tNewDate );
1685
strftime (pLogFileFilter, 1023, "%Y%m%d", tm_now);
1946
strftime (pLogFileFilter, 1023, "%Y-%m-%d", tm_now);
1950
strftime (pLogFileFilter, 1023, "%Y%m%d", tm_now);
1688
1954
// ==========================================================================
1690
int IsParameterEnabled(char *pParam, int argc, char *argv[])
1956
int GetParameterIndex(const char *pParam, int argc, char *argv[])
1692
int iParameterEnabled = 0;
1958
int iParameterIndex = -1;
1694
1960
int iLookupLen = strlen(pParam);
1701
1967
char *pArgParam = argv[iIdx];
1702
1968
if(strncasecmp(pArgParam,pParam,iLookupLen) == 0)
1704
iParameterEnabled = 1;
1970
iParameterIndex = iIdx;
1709
return iParameterEnabled;
1975
return iParameterIndex;
1712
1978
int AutoSetupBandwidthMonitoring(data_t tBandwidthUsage[], const char *pIPTableName)
1714
1980
int iHostsDetected = 0;
1716
1981
char szCmd[1024] = "nvram get dhcpd_static";
1718
1983
fprintf(stderr, "Executing get static hosts command [%s]\n", szCmd);
1914
2178
data_t tBandwidthUsage[], data_t tBandwidthUsageInitValue[], int iGenerateType)
1916
2180
printf("Using filter date-range [%s] - [%s]\n",szLogFileStartFilter,szLogFileEndFilter);
1918
2183
// Step #1 generate daily stats from existing intra-day records for specified date range
1919
2184
mainSelectStatsByCriteria(szDatabase,szLogFileStartFilter,szLogFileEndFilter,tBandwidthUsage,tBandwidthUsageInitValue,iGenerateType);
2186
printf("About to delete records for date-range [%llu] - [%llu]\n",start_date,end_date);
1921
2189
// Step #2 delete old records for specified date range
1922
2190
int iDeleteRows = deleteStatsFromSqlite(szDatabase, start_date, end_date);
2192
printf("About to insert compressed records for date-range [%llu] - [%llu]\n",start_date,end_date);
1924
2195
// Step #3 insert new daily stats into database for specified date range
1925
2196
int iInsertedRows = importLogfileDataIntoSqlite(szDatabase, tBandwidthUsage, tBandwidthUsageInitValue);
1927
2198
fprintf(stderr, "Total old rows deleted: [%d]\n", iDeleteRows);
1928
2199
fprintf(stderr, "Total new rows added: [%d]\n", iInsertedRows);
1930
2202
return iInsertedRows;
1954
2226
printf(": \t 3 = console [based on sqlite db], 4 = html [based on sqlite db].\n");
1955
2227
printf(": \t 5 = console [based on sqlite db] and compresses intra-day record data into one record per day.\n");
1956
2228
printf(": \t 6 = Use this option to auto-discover static DHCP clients when running in the Tomato firmware.\n");
2229
printf(": \t 7 = console [based on sqlite db] shrink database by removing empty space.\n");
1957
2230
printf(": <start-date-filter>\t= the optional start date range of logfiles to parse:\n");
1958
2231
printf(": \t example: 20090425 and default is current date. You may also use the keyword today like this: today\n");
1959
2232
printf(": <end-date-filter> \t= the optional end date range of logfiles to parse:\n");
1960
2233
printf(": \t example: 20090426 and default is current date. You may also use the keyword today like this: today-30\n");
1961
printf(": \t *NOTE: for <generate-type> 3 and 4 you may specifc a date and time value using this format: 20090425 19:45\n");
2234
printf(": \t *NOTE: for <generate-type> 3 and 4 you may specify a date and time value using this format: 20090425 19:45\n");
1962
2235
printf(": <logfiles-path> \t= the optional path to search for the logfiles (default value is ./).\n");
1963
2236
printf(": <incoming-data-logfileprefix>\t= the optional log filename prefix used to describe incoming data logs (example: traffic_in_).\n");
1964
2237
printf(": <outgoing-data-logfileprefix>\t= the optional log filename prefix used to describe outgoing data logs (example: traffic_out_).\n");
1965
printf(": <flags=x> \t= the optional value containg special values depending on the <generate-type>, possible values:\n");
2238
printf(": <flags=x> \t= the optional value containing special values depending on the <generate-type>, possible values:\n");
1966
2239
printf(": \t For <generate-type> = 0 or 1 you may import logfile data into sqlite using:\n");
1967
2240
printf(": \t flags=import=BANDWIDTH\n");
1968
2241
printf(": \t where BANDWIDTH = the sqlite database filename to import into (the table must be named bandwidthusage)\n");
1972
2245
printf(": \t %s (will display ONLY the Hostname without references to the IP Address)\n",APP_FLAG_HOSTNAME_ONLY);
1973
2246
printf(": \t For <generate-type> = 2 you may want to keep your database smaller and import statistic summarized by date:\n");
1974
2247
printf(": \t %s (this will allow you to frequently update your database but only store 1 record per Client per day)\n",APP_FLAG_IMPORT_DAILY_ONLY);
2248
printf(": \t %s (this flag will delete record older then x days, example: %s=60 would delete records older than 60 days)\n",APP_FLAG_PURGE_OLD_RECORDS,APP_FLAG_PURGE_OLD_RECORDS);
1975
2249
printf("\n: \t Special notes: There are some assumed limitations in this tool namely:\n");
1976
2250
printf(": \t Maximum supported Clients (IP's) = %d, Maximum supported DateRange length = %d days\n",MAX_CLIENTCOUNT,MAX_RANGE);
1977
2251
printf(": \t These limits are hard coded but may be easily changed and a new binary produced.\n");
2015
2291
memset(&tBandwidthUsageInitValue[0],0,sizeof(data_t) * MAX_CLIENTCOUNT);
2017
2293
sprintf(szLogFileStartFilter,"today");
2018
ProcessSpecialDateParameter(szLogFileStartFilter);
2294
ProcessSpecialDateParameter(szLogFileStartFilter,0);
2019
2295
sprintf(szLogFileEndFilter,"today");
2020
ProcessSpecialDateParameter(szLogFileEndFilter);
2022
char *pDB = argv[2];
2023
iResult = compressDataIntoDailyStats(szLogFileStartFilter,szLogFileEndFilter,pDB,
2024
tBandwidthUsage, tBandwidthUsageInitValue, GENERATE_TYPE_SQLITE_DATACOMPRESS);
2296
ProcessSpecialDateParameter(szLogFileEndFilter,0);
2298
//printf("calling compressDataIntoDailyStats with date range [%s] - [%s]\n",szLogFileStartFilter,szLogFileEndFilter);
2301
//iResult = compressDataIntoDailyStats(szLogFileStartFilter,szLogFileEndFilter,pDB,
2302
// tBandwidthUsage, tBandwidthUsageInitValue, GENERATE_TYPE_SQLITE_DATACOMPRESS);
2305
int iPurgeDBIndex = GetParameterIndex(APP_FLAG_PURGE_OLD_RECORDS, argc, argv);
2306
if(iPurgeDBIndex >= 0)
2308
printf("detected PURGE flag\n");
2311
char *szSpecialFlags = argv[iPurgeDBIndex];
2312
char szSpecialFlagsValue[1024]="";
2314
strcpy(szSpecialFlagsValue,&szSpecialFlags[strlen(APP_FLAG_PURGE_OLD_RECORDS)]);
2315
if(strlen(szSpecialFlagsValue) > 0)
2317
int iRecordsThisOldAndOlder = atoi(szSpecialFlagsValue);
2318
if(iRecordsThisOldAndOlder > 0)
2320
sprintf(szLogFileStartFilter,"1970-01-01");
2322
sprintf(szLogFileEndFilter,"today-%d",iRecordsThisOldAndOlder);
2323
ProcessSpecialDateParameter(szLogFileEndFilter,1);
2325
uint64_t delete_start_date = getDateValue(szLogFileStartFilter);
2326
uint64_t delete_end_date = getDateValue(szLogFileEndFilter);
2328
printf("calling deleteStatsFromSqlite to PURGE old records with date range [%llu] - [%llu]\n",delete_start_date,delete_end_date);
2331
// Step #2 delete old records for specified date range
2332
int iDeleteRows = deleteStatsFromSqlite(pDB, delete_start_date, delete_end_date);
2334
fprintf(stderr, "Total old rows deleted: [%d]\n", iDeleteRows);
2028
2341
return iResult;
2030
else if(iGenerateType == GENERATE_TYPE_TESTLOG_PARSE ||
2031
iGenerateType == GENERATE_TYPE_LOGFILE_CONSOLE ||
2032
iGenerateType == GENERATE_TYPE_SQLITE_CONSOLE ||
2033
iGenerateType == GENERATE_TYPE_SQLITE_DATACOMPRESS)
2343
else if(iGenerateType == GENERATE_TYPE_TESTLOG_PARSE ||
2344
iGenerateType == GENERATE_TYPE_LOGFILE_CONSOLE ||
2345
iGenerateType == GENERATE_TYPE_SQLITE_CONSOLE ||
2346
iGenerateType == GENERATE_TYPE_SQLITE_DATACOMPRESS ||
2347
iGenerateType == GENERATE_TYPE_SHRINK_DATABASE)
2035
2349
printf("ipt-parse\nCopyright (C) 2009 Mark Vejvoda\n\n");
2052
2366
sprintf(szLogFileStartFilter,"%s",TODAYS_DATE_KEYWORD);
2053
ProcessSpecialDateParameter(szLogFileStartFilter);
2367
ProcessSpecialDateParameter(szLogFileStartFilter,0);
2055
2369
sprintf(szLogFileEndFilter,"%s",TODAYS_DATE_KEYWORD);
2056
ProcessSpecialDateParameter(szLogFileEndFilter);
2370
ProcessSpecialDateParameter(szLogFileEndFilter,0);
2372
else if(iGenerateType == GENERATE_TYPE_SHRINK_DATABASE)
2374
char szDatabase[1024]="./";
2377
sprintf(szDatabase,"%s",argv[2]);
2380
int iPurgeDBIndex = GetParameterIndex(APP_FLAG_PURGE_OLD_RECORDS, argc, argv);
2381
if(iPurgeDBIndex >= 0)
2383
printf("detected PURGE flag\n");
2386
char *szSpecialFlags = argv[iPurgeDBIndex];
2387
char szSpecialFlagsValue[1024]="";
2389
strcpy(szSpecialFlagsValue,&szSpecialFlags[strlen(APP_FLAG_PURGE_OLD_RECORDS)]);
2390
if(strlen(szSpecialFlagsValue) > 0)
2392
int iRecordsThisOldAndOlder = atoi(szSpecialFlagsValue);
2393
if(iRecordsThisOldAndOlder > 0)
2395
sprintf(szLogFileStartFilter,"1970-01-01");
2397
sprintf(szLogFileEndFilter,"today-%d",iRecordsThisOldAndOlder);
2398
ProcessSpecialDateParameter(szLogFileEndFilter,1);
2400
uint64_t delete_start_date = getDateValue(szLogFileStartFilter);
2401
uint64_t delete_end_date = getDateValue(szLogFileEndFilter);
2403
printf("calling deleteStatsFromSqlite to PURGE old records with date range [%llu] - [%llu]\n",delete_start_date,delete_end_date);
2406
// Step #2 delete old records for specified date range
2407
int iDeleteRows = deleteStatsFromSqlite(szDatabase, delete_start_date, delete_end_date);
2409
fprintf(stderr, "Total old rows deleted: [%d]\n", iDeleteRows);
2415
vacuumDB(szDatabase);
2062
2423
sprintf(szLogFileStartFilter,"%s",argv[2]);
2064
ProcessSpecialDateParameter(szLogFileStartFilter);
2425
ProcessSpecialDateParameter(szLogFileStartFilter,0);
2069
2430
sprintf(szLogFileEndFilter,"%s",argv[3]);
2071
ProcessSpecialDateParameter(szLogFileEndFilter);
2432
ProcessSpecialDateParameter(szLogFileEndFilter,0);
2073
2434
if(iGenerateType == GENERATE_TYPE_SQLITE_DATACOMPRESS)