/* * show_istat.c - Part of AFD, an automatic file distribution program. * Copyright (c) 2003 - 2022 Holger Kiehl * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "afddefs.h" DESCR__S_M1 /* ** NAME ** show_istat - shows all input statistic information of the AFD ** ** SYNOPSIS ** show_istat [options] [DIR_1 DIR_2 .... DIR_n] ** -w Working directory of the AFD. ** -f Path and name of the statistics file. ** -o Output file name. ** -d [] Show information of all days [or day ** minus x]. ** -D Show total summary on a per day basis. ** -h [] Show information of all hours [or hour ** minus x]. ** -H Show total summary of last 24 hours. ** -m [] Show information of all minutes [or ** minute minus x]. ** -mr Show the last x minutes. ** -M [] Show total summary of last hour. ** -t[u] Put in a timestamp when the output is valid. ** -y [] Show information of all years [or year ** minus x]. ** -t[u] put in a time stamp for time the output ** is valid. With the u the time is shown ** in unix time. ** -C Output in CSV format. ** -N Show directory name not alias. ** -n Show alias and directory name. ** -T Numeric total only. ** --version Show version. ** ** DESCRIPTION ** This program shows all input statistic information of the number ** of files and bytes received, the number of files and bytes queued ** and the number of files and bytes in the directory for each ** directory and a total for all directories, depending on the options ** that where used when calling 'show_istat'. ** ** RETURN VALUES ** SUCCESS on normal exit and INCORRECT when an error has occurred. ** ** AUTHOR ** H.Kiehl ** ** HISTORY ** 01.03.2003 H.Kiehl Created ** 23.07.2006 H.Kiehl Added -T option. ** 27.04.2018 S.Schuetz Added option to format output in CSV format. ** 05.11.2018 H.Kiehl Added -n option. ** */ DESCR__E_M1 #include /* fprintf(), stderr */ #include /* strcpy(), strerror() */ #include /* time() */ #include /* isdigit() */ #include /* struct tm */ #include #include #include /* getcwd(), close(), STDERR_FILENO */ #include /* getenv(), free(), malloc(), exit()*/ #ifdef HAVE_MMAP # include /* mmap(), munmap() */ #endif #include #include #include "statdefs.h" #include "version.h" #ifdef HAVE_MMAP # ifndef MAP_FILE /* Required for BSD */ # define MAP_FILE 0 /* All others do not need it */ # endif #endif /* Global variables. */ int fra_fd, fra_id, max_alias_name_length = MAX_DIR_ALIAS_LENGTH, no_of_dirs, sys_log_fd = STDERR_FILENO; /* Used by get_afd_path() */ #ifdef HAVE_MMAP off_t fra_size; #endif char *p_work_dir, **arglist; /* Holds list of dirs from command line when given. */ const char *sys_log_name = SYSTEM_LOG_FIFO; struct fileretrieve_status *fra = NULL; /* Local global variables. */ static int display_format = NORMAL_OUTPUT, show_alias = YES; static char prev_name[MAX_PATH_LENGTH]; static FILE *output_fp = NULL; static struct afdistat *afd_istat; /* Function prototypes. */ static void display_data(int, char *, int, char, int, double, double); /*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ main() $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*/ int main(int argc, char *argv[]) { register int i; int current_year, options = 0, show_min_range = 0, show_min = -1, show_min_summary = -1, show_hour = -1, show_hour_summary = -1, show_day = -1, show_day_summary = -1, show_year = -1, show_time_stamp = 0, show_old_year = NO, dir_counter = -1, year; time_t now; char *double_single_line = NULL, output_file_name[MAX_PATH_LENGTH], *space_line = NULL, statistic_file_name[MAX_FILENAME_LENGTH], statistic_file[MAX_PATH_LENGTH + FIFO_DIR_LENGTH + MAX_FILENAME_LENGTH + 1 + MAX_INT_LENGTH], work_dir[MAX_PATH_LENGTH]; struct tm *p_ts; #ifdef HAVE_STATX struct statx stat_buf; #else struct stat stat_buf; #endif CHECK_FOR_VERSION(argc, argv); /* Evaluate arguments */ (void)strcpy(statistic_file_name, ISTATISTIC_FILE); if (get_afd_path(&argc, argv, work_dir) < 0) { exit(INCORRECT); } eval_input_ss(argc, argv, statistic_file_name, output_file_name, &show_day, &show_day_summary, &show_hour, &show_hour_summary, &show_min_range, &show_min, &show_min_summary, &show_year, &dir_counter, &show_time_stamp, &display_format, &show_alias, YES, &options); /* Initialize variables */ prev_name[0] = '\0'; p_work_dir = work_dir; if ((show_alias == NO) || (show_alias == BOTH)) { get_max_name_length(); } if (((space_line = malloc(max_alias_name_length + 1)) == NULL) || ((double_single_line = malloc(max_alias_name_length + 1)) == NULL)) { (void)fprintf(stderr, "Failed malloc() %d bytes : %s (%s %d)\n", max_alias_name_length + 1, strerror(errno), __FILE__, __LINE__); exit(INCORRECT); } if (output_file_name[0] == '\0') { output_fp = stdout; } else { if ((output_fp = fopen(output_file_name, "w")) == NULL) { (void)fprintf(stderr, "Failed to fopen() `%s' : %s (%s %d)\n", output_file_name, strerror(errno), __FILE__, __LINE__); exit(INCORRECT); } } now = time(NULL); if ((p_ts = localtime(&now)) == NULL) { (void)fprintf(stderr, "ERROR : Failed to get localtime() : %s (%s %d)\n", strerror(errno), __FILE__, __LINE__); exit(INCORRECT); } current_year = p_ts->tm_year + 1900; if (my_strcmp(statistic_file_name, ISTATISTIC_FILE) == 0) { if (show_day > 0) { now -= (86400 * show_day); } else if (show_hour > 0) { now -= (3600 * show_hour); } else if (show_min > 0) { now -= (60 * show_min); } else if (show_year > 0) { now -= (31536000 * show_year); } p_ts = gmtime(&now); year = p_ts->tm_year + 1900; if (year < current_year) { show_old_year = YES; if (show_day > 0) { show_day = p_ts->tm_yday; } } (void)sprintf(statistic_file, "%s%s%s.%d", #ifdef STAT_IN_FIFODIR work_dir, FIFO_DIR, statistic_file_name, year); #else work_dir, LOG_DIR, statistic_file_name, year); #endif } else { char *ptr; (void)strcpy(statistic_file, statistic_file_name); ptr = statistic_file_name + strlen(statistic_file_name) - 1; i = 0; while ((isdigit((int)(*ptr))) && (i < MAX_INT_LENGTH)) { ptr--; i++; } if (*ptr == '.') { ptr++; year = atoi(ptr); if (year < current_year) { show_old_year = YES; if (show_day > 0) { show_day = p_ts->tm_yday; } } } else { /* We cannot know from what year this file is, so set to zero. */ year = 0; } } #ifdef HAVE_STATX if (statx(0, statistic_file, AT_STATX_SYNC_AS_STAT, STATX_SIZE, &stat_buf) != 0) #else if (stat(statistic_file, &stat_buf) != 0) #endif { (void)fprintf(stderr, "ERROR : Failed to access %s : %s (%s %d)\n", statistic_file, strerror(errno), __FILE__, __LINE__); exit(INCORRECT); } #ifdef HAVE_STATX if (stat_buf.stx_size > 0) #else if (stat_buf.st_size > 0) #endif { register int j; int no_of_stat_entries, position, *show_index = NULL, stat_fd; double nfr = 0.0, nbr = 0.0, tmp_nfr = 0.0, tmp_nbr = 0.0, total_nfr = 0.0, total_nbr = 0.0; /* Open file */ if ((stat_fd = open(statistic_file, O_RDONLY)) < 0) { (void)fprintf(stderr, "ERROR : Failed to open() %s : %s (%s %d)\n", statistic_file, strerror(errno), __FILE__, __LINE__); exit(INCORRECT); } if (show_old_year == YES) { char *ptr; struct afd_year_istat *afd_istat; #ifdef HAVE_MMAP if ((ptr = mmap(NULL, # ifdef HAVE_STATX stat_buf.stx_size, PROT_READ, # else stat_buf.st_size, PROT_READ, # endif (MAP_FILE | MAP_SHARED), stat_fd, 0)) == (caddr_t) -1) { (void)fprintf(stderr, "ERROR : Could not mmap() file %s : %s (%s %d)\n", statistic_file, strerror(errno), __FILE__, __LINE__); (void)close(stat_fd); exit(INCORRECT); } #else # ifdef HAVE_STATX if ((ptr = malloc(stat_buf.stx_size)) == NULL) # else if ((ptr = malloc(stat_buf.st_size)) == NULL) # endif { (void)fprintf(stderr, "ERROR : Failed to allocate memory : %s (%s %d)\n", strerror(errno), __FILE__, __LINE__); (void)close(stat_fd); exit(INCORRECT); } # ifdef HAVE_STATX if (read(stat_fd, ptr, stat_buf.stx_size) != stat_buf.stx_size) # else if (read(stat_fd, ptr, stat_buf.st_size) != stat_buf.st_size) # endif { (void)fprintf(stderr, "ERROR : Failed to read() %s : %s (%s %d)\n", statistic_file, strerror(errno), __FILE__, __LINE__); free(ptr); (void)close(stat_fd); exit(INCORRECT); } #endif /* HAVE_MMAP */ afd_istat = (struct afd_year_istat *)(ptr + AFD_WORD_OFFSET); #ifdef HAVE_STATX no_of_stat_entries = (stat_buf.stx_size - AFD_WORD_OFFSET) / sizeof(struct afd_year_istat); #else no_of_stat_entries = (stat_buf.st_size - AFD_WORD_OFFSET) / sizeof(struct afd_year_istat); #endif if ((show_index = malloc(no_of_stat_entries * sizeof(int))) == NULL) { (void)fprintf(stderr, "ERROR : Failed to allocate memory : %s (%s %d)\n", strerror(errno), __FILE__, __LINE__); exit(INCORRECT); } if (options & ONLY_SHOW_REMOTE_DIRS) { if (fra == NULL) { (void)fra_attach_passive(); } for (i = 0; i < no_of_stat_entries; i++) { show_index[i] = YES; for (j = 0; j < no_of_dirs; j++) { if (strcmp(afd_istat[i].dir_alias, fra[j].dir_alias) == 0) { if (fra[j].host_alias[0] == '\0') { show_index[i] = NO; } break; } } } } else { for (i = 0; i < no_of_stat_entries; i++) { show_index[i] = YES; } } if (show_year != -1) { /* * Show total for all directories. */ tmp_nfr = tmp_nbr = 0.0; if ((display_format == NORMAL_OUTPUT) && (show_time_stamp > 0)) { time_t first_time, last_time; struct tm *p_ts; if ((p_ts = localtime(&now)) == NULL) { (void)fprintf(stderr, "ERROR : Failed to get localtime() : %s (%s %d)\n", strerror(errno), __FILE__, __LINE__); exit(INCORRECT); } p_ts->tm_year = year - 1900; p_ts->tm_mon = 0; p_ts->tm_mday = 1; p_ts->tm_hour = 0; p_ts->tm_min = 0; p_ts->tm_sec = 0; first_time = mktime(p_ts); p_ts->tm_year = year + 1 - 1900; last_time = mktime(p_ts); if (show_time_stamp == 1) { char first_time_str[25], last_time_str[25]; (void)strftime(first_time_str, 25, "%c", localtime(&first_time)); (void)strftime(last_time_str, 25, "%c", localtime(&last_time)); (void)fprintf(output_fp, " [time span %s -> %s]\n", first_time_str, last_time_str); } else { (void)fprintf(output_fp, #if SIZEOF_TIME_T == 4 " [time span %ld -> %ld]\n", #else " [time span %lld -> %lld]\n", #endif (pri_time_t)first_time, (pri_time_t)last_time); } } if (display_format == NORMAL_OUTPUT) { (void)memset(space_line, ' ', max_alias_name_length / 2); space_line[max_alias_name_length / 2] = '\0'; (void)memset(double_single_line, '=', max_alias_name_length / 2); double_single_line[max_alias_name_length / 2] = '\0'; (void)fprintf(output_fp, "%s ===================================\n", space_line); (void)fprintf(output_fp, "%s> AFD INPUT STATISTICS SUMMARY %d <%s\n", double_single_line, year, double_single_line); (void)fprintf(output_fp, "%s ===================================\n", space_line); } else if (display_format == CSV_FORMAT) { if (show_alias == BOTH) { (void)fprintf(output_fp, "alias;name;val1;current;val2;files;size\n"); } else { (void)fprintf(output_fp, "%s;val1;current;val2;files;size\n", (show_alias == YES) ? "alias" : "name"); } } if (dir_counter > 0) { for (i = 0; i < dir_counter; i++) { if ((position = locate_dir_year(afd_istat, arglist[i], no_of_stat_entries)) < 0) { (void)fprintf(output_fp, "No directory %s found in statistic database.\n", arglist[i]); } else { if (show_index[position] == YES) { nfr = nbr = 0.0; for (j = 0; j < DAYS_PER_YEAR; j++) { nfr += (double)afd_istat[position].year[j].nfr; nbr += afd_istat[position].year[j].nbr; } display_data(position, afd_istat[position].dir_alias, -1, ' ', -1, nfr, nbr); tmp_nfr += nfr; tmp_nbr += nbr; } } } } else { if (show_day_summary == 0) { for (j = 0; j < DAYS_PER_YEAR; j++) { nfr = nbr = 0.0; for (i = 0; i < no_of_stat_entries; i++) { if (show_index[i] == YES) { nfr += (double)afd_istat[i].year[j].nfr; nbr += afd_istat[i].year[j].nbr; } } display_data(SHOW_SPACE, NULL, -1, ' ', j, nfr, nbr); tmp_nfr += nfr; tmp_nbr += nbr; } } else { /* Make a summary of everything */ for (i = 0; i < no_of_stat_entries; i++) { if (show_index[i] == YES) { nfr = nbr = 0.0; for (j = 0; j < DAYS_PER_YEAR; j++) { nfr += (double)afd_istat[i].year[j].nfr; nbr += afd_istat[i].year[j].nbr; } display_data(i, afd_istat[i].dir_alias, -1, ' ', -1, nfr, nbr); tmp_nfr += nfr; tmp_nbr += nbr; } } } } if (display_format == CSV_FORMAT) { display_data(SHOW_SMALL_TOTAL, NULL, -1, ' ', -1, tmp_nfr, tmp_nbr); } else if (display_format == NUMERIC_TOTAL_ONLY) { (void)fprintf(output_fp, "%.0f %.0f\n", tmp_nfr, tmp_nbr); } else { (void)memset(double_single_line, '-', max_alias_name_length); double_single_line[max_alias_name_length] = '\0'; (void)fprintf(output_fp, "%s---------------------------------\n", double_single_line); display_data(SHOW_SMALL_TOTAL, NULL, -1, ' ', -1, tmp_nfr, tmp_nbr); (void)memset(double_single_line, '=', max_alias_name_length); (void)fprintf(output_fp, "%s=================================\n", double_single_line); } } else { /* * Show data for one or all days for this year. */ if (show_day > -1) { tmp_nfr = tmp_nbr = 0.0; if (display_format == NORMAL_OUTPUT) { (void)memset(space_line, ' ', max_alias_name_length / 2); space_line[max_alias_name_length / 2] = '\0'; (void)memset(double_single_line, '=', max_alias_name_length / 2); double_single_line[max_alias_name_length / 2] = '\0'; (void)fprintf(output_fp, "%s ========================\n", space_line); (void)fprintf(output_fp, "%s===> AFD INPUT STATISTICS DAY <%s===\n", double_single_line, double_single_line); (void)fprintf(output_fp, "%s ========================\n", space_line); } else if (display_format == CSV_FORMAT) { if (show_alias == BOTH) { (void)fprintf(output_fp, "alias;name;val1;current;val2;files;size\n"); } else { (void)fprintf(output_fp, "%s;val1;current;val2;files;size\n", (show_alias == YES) ? "alias" : "name"); } } if (dir_counter < 0) { for (i = 0; i < no_of_stat_entries; i++) { if (show_index[i] == YES) { nfr = nbr = 0.0; if (show_day == 0) /* Show all days */ { display_data(i, afd_istat[i].dir_alias, -1, ' ', 0, afd_istat[i].year[0].nfr, afd_istat[i].year[0].nbr); for (j = 1; j < DAYS_PER_YEAR; j++) { display_data(SHOW_SPACE, NULL, -1, ' ', j, afd_istat[i].year[j].nfr, afd_istat[i].year[j].nbr); nfr += (double)afd_istat[i].year[j].nfr; nbr += afd_istat[i].year[j].nbr; } } else /* Show a specific day */ { nfr += (double)afd_istat[i].year[show_day].nfr; nbr += afd_istat[i].year[show_day].nbr; display_data(i, afd_istat[i].dir_alias, -1, ' ', -1, afd_istat[i].year[show_day].nfr, afd_istat[i].year[show_day].nbr); } tmp_nfr += nfr; tmp_nbr += nbr; } } } /* if (dir_counter < 0) */ else /* Show some specific directory */ { for (i = 0; i < dir_counter; i++) { if ((position = locate_dir_year(afd_istat, arglist[i], no_of_stat_entries)) < 0) { (void)fprintf(stdout, "No directory %s found in statistic database.\n", arglist[i]); } else { if (show_index[position] == YES) { nfr = nbr = 0.0; if (show_day == 0) /* Show all days */ { display_data(position, afd_istat[position].dir_alias, -1, ' ', 0, afd_istat[position].year[0].nfr, afd_istat[position].year[0].nbr); for (j = 1; j < DAYS_PER_YEAR; j++) { display_data(SHOW_SPACE, NULL, -1, ' ', j, afd_istat[position].year[j].nfr, afd_istat[position].year[j].nbr); nfr += (double)afd_istat[position].year[j].nfr; nbr += afd_istat[position].year[j].nbr; } } else /* Show a specific interval */ { nfr += (double)afd_istat[position].year[show_day].nfr; nbr += afd_istat[position].year[show_day].nbr; display_data(position, afd_istat[position].dir_alias, -1, ' ', -1, afd_istat[position].year[show_day].nfr, afd_istat[position].year[show_day].nbr); } tmp_nfr += nfr; tmp_nbr += nbr; } } } } if ((show_year > -1) || (show_day_summary > -1)) { if (display_format == CSV_FORMAT) { display_data(SHOW_SMALL_TOTAL, NULL, -1, ' ', -1, tmp_nfr, tmp_nbr); } else if (display_format == NUMERIC_TOTAL_ONLY) { (void)fprintf(output_fp, "%.0f %.0f\n", tmp_nfr, tmp_nbr); } else { display_data(SHOW_SMALL_TOTAL, NULL, -1, ' ', -1, tmp_nfr, tmp_nbr); } } else { total_nfr += tmp_nfr; total_nbr += tmp_nbr; } if (display_format == NORMAL_OUTPUT) { (void)memset(double_single_line, '=', max_alias_name_length); double_single_line[max_alias_name_length] = '\0'; (void)fprintf(output_fp, "%s=================================\n", double_single_line); } } /* if (show_day > -1) */ /* * Show total summary on a per day basis for this year. */ if (show_day_summary > -1) { if ((display_format == NORMAL_OUTPUT) && (show_time_stamp > 0)) { struct tm *p_ts; time_t first_time, last_time; if ((p_ts = localtime(&now)) == NULL) { (void)fprintf(stderr, "ERROR : Failed to get localtime() : %s (%s %d)\n", strerror(errno), __FILE__, __LINE__); exit(INCORRECT); } p_ts->tm_year = year - 1900; p_ts->tm_mon = 0; p_ts->tm_mday = 1; p_ts->tm_hour = 0; p_ts->tm_min = 0; p_ts->tm_sec = 0; first_time = mktime(p_ts); p_ts->tm_year = year + 1 - 1900; last_time = mktime(p_ts); if (show_time_stamp == 1) { char first_time_str[25], last_time_str[25]; (void)strftime(first_time_str, 25, "%c", localtime(&first_time)); (void)strftime(last_time_str, 25, "%c", localtime(&last_time)); (void)fprintf(output_fp, " [time span %s -> %s]\n", first_time_str, last_time_str); } else { (void)fprintf(output_fp, #if SIZEOF_TIME_T == 4 " [time span %ld -> %ld]\n", #else " [time span %lld -> %lld]\n", #endif (pri_time_t)first_time, (pri_time_t)last_time); } } tmp_nfr = tmp_nbr = 0.0; if (display_format == NORMAL_OUTPUT) { (void)memset(space_line, ' ', max_alias_name_length / 2); space_line[max_alias_name_length / 2] = '\0'; (void)memset(double_single_line, '=', max_alias_name_length / 2); double_single_line[max_alias_name_length / 2] = '\0'; (void)fprintf(output_fp, "%s ================================\n", space_line); (void)fprintf(output_fp, "%s> AFD INPUT STATISTICS DAY SUMMARY <%s\n", double_single_line, double_single_line); (void)fprintf(output_fp, "%s ================================\n", space_line); } else if (display_format == CSV_FORMAT) { if (show_alias == BOTH) { (void)fprintf(output_fp, "alias;name;val1;current;val2;files;size\n"); } else { (void)fprintf(output_fp, "%s;val1;current;val2;files;size\n", (show_alias == YES) ? "alias" : "name"); } } for (j = 0; j < DAYS_PER_YEAR; j++) { nfr = nbr = 0.0; for (i = 0; i < no_of_stat_entries; i++) { if (show_index[i] == YES) { nfr += (double)afd_istat[i].year[j].nfr; nbr += afd_istat[i].year[j].nbr; } } display_data(SHOW_SPACE, NULL, -1, ' ', j, nfr, nbr); tmp_nfr += nfr; tmp_nbr += nbr; } if ((show_year > -1) || (show_day > -1)) { if (display_format == CSV_FORMAT) { display_data(SHOW_SMALL_TOTAL, NULL, -1, ' ', -1, tmp_nfr, tmp_nbr); } else if (display_format == NUMERIC_TOTAL_ONLY) { (void)fprintf(output_fp, "%.0f %.0f\n", tmp_nfr, tmp_nbr); } else { display_data(SHOW_SMALL_TOTAL, NULL, -1, ' ', -1, tmp_nfr, tmp_nbr); } } else { total_nfr += tmp_nfr; total_nbr += tmp_nbr; } if (display_format == NORMAL_OUTPUT) { (void)memset(double_single_line, '=', max_alias_name_length); double_single_line[max_alias_name_length] = '\0'; (void)fprintf(output_fp, "%s=================================\n", double_single_line); } } /* if (show_day_summary > -1) */ if (display_format == CSV_FORMAT) { display_data(SHOW_BIG_TOTAL, NULL, -1, ' ', -1, total_nfr, total_nbr); } else if (display_format == NUMERIC_TOTAL_ONLY) { (void)fprintf(output_fp, "%.0f %.0f\n", total_nfr, total_nbr); } else { display_data(SHOW_BIG_TOTAL, NULL, -1, ' ', -1, total_nfr, total_nbr); } } #ifdef HAVE_MMAP # ifdef HAVE_STATX if (munmap(ptr, stat_buf.stx_size) < 0) # else if (munmap(ptr, stat_buf.st_size) < 0) # endif { (void)fprintf(stderr, "ERROR : Could not munmap() file %s : %s (%s %d)\n", statistic_file, strerror(errno), __FILE__, __LINE__); exit(INCORRECT); } #else free(ptr); #endif /* HAVE_MMAP */ } else /* Show data of current year */ { char *ptr; #ifdef HAVE_MMAP if ((ptr = mmap(NULL, # ifdef HAVE_STATX stat_buf.stx_size, PROT_READ, # else stat_buf.st_size, PROT_READ, # endif (MAP_FILE | MAP_SHARED), stat_fd, 0)) == (caddr_t) -1) { (void)fprintf(stderr, "ERROR : Could not mmap() file %s : %s (%s %d)\n", statistic_file, strerror(errno), __FILE__, __LINE__); (void)close(stat_fd); exit(INCORRECT); } #else # ifdef HAVE_STATX if ((ptr = malloc(stat_buf.stx_size)) == NULL) # else if ((ptr = malloc(stat_buf.st_size)) == NULL) # endif { (void)fprintf(stderr, "ERROR : Failed to allocate memory : %s (%s %d)\n", strerror(errno), __FILE__, __LINE__); (void)close(stat_fd); exit(INCORRECT); } # ifdef HAVE_STATX if (read(stat_fd, ptr, stat_buf.stx_size) != stat_buf.stx_size) # else if (read(stat_fd, ptr, stat_buf.st_size) != stat_buf.st_size) # endif { (void)fprintf(stderr, "ERROR : Failed to read() %s : %s (%s %d)\n", statistic_file, strerror(errno), __FILE__, __LINE__); free(ptr); (void)close(stat_fd); exit(INCORRECT); } #endif /* HAVE_MMAP */ afd_istat = (struct afdistat *)(ptr + AFD_WORD_OFFSET); #ifdef HAVE_STATX no_of_stat_entries = (stat_buf.stx_size - AFD_WORD_OFFSET) / sizeof(struct afdistat); #else no_of_stat_entries = (stat_buf.st_size - AFD_WORD_OFFSET) / sizeof(struct afdistat); #endif if ((show_index = malloc(no_of_stat_entries * sizeof(int))) == NULL) { (void)fprintf(stderr, "ERROR : Failed to allocate memory : %s (%s %d)\n", strerror(errno), __FILE__, __LINE__); exit(INCORRECT); } if (options & ONLY_SHOW_REMOTE_DIRS) { if (fra == NULL) { (void)fra_attach_passive(); } for (i = 0; i < no_of_stat_entries; i++) { show_index[i] = YES; for (j = 0; j < no_of_dirs; j++) { if (strcmp(afd_istat[i].dir_alias, fra[j].dir_alias) == 0) { if (fra[j].host_alias[0] == '\0') { show_index[i] = NO; } break; } } } } else { for (i = 0; i < no_of_stat_entries; i++) { show_index[i] = YES; } } if (show_min_range) { int left, sec_ints = (show_min_range * 60) / STAT_RESCAN_TIME; if ((display_format == NORMAL_OUTPUT) && (show_time_stamp > 0)) { time_t first_time, last_time; struct tm *p_ts; if ((p_ts = localtime(&now)) == NULL) { (void)fprintf(stderr, "ERROR : Failed to get localtime() : %s (%s %d)\n", strerror(errno), __FILE__, __LINE__); exit(INCORRECT); } p_ts->tm_year = year - 1900; p_ts->tm_mon = 0; p_ts->tm_mday = 1; p_ts->tm_hour = afd_istat[0].hour_counter; p_ts->tm_min = (afd_istat[0].sec_counter * STAT_RESCAN_TIME) / 60; p_ts->tm_sec = (afd_istat[0].sec_counter * STAT_RESCAN_TIME) % 60; last_time = mktime(p_ts) + (86400 * afd_istat[0].day_counter); first_time = last_time - (sec_ints * STAT_RESCAN_TIME); if (show_time_stamp == 1) { char first_time_str[25], last_time_str[25]; (void)strftime(first_time_str, 25, "%c", localtime(&first_time)); (void)strftime(last_time_str, 25, "%c", localtime(&last_time)); (void)fprintf(output_fp, " [time span %s -> %s]\n", first_time_str, last_time_str); } else { (void)fprintf(output_fp, #if SIZEOF_TIME_T == 4 " [time span %ld -> %ld]\n", #else " [time span %lld -> %lld]\n", #endif (pri_time_t)first_time, (pri_time_t)last_time); } } tmp_nfr = tmp_nbr = 0.0; if (display_format == NORMAL_OUTPUT) { (void)memset(space_line, ' ', max_alias_name_length / 2); space_line[max_alias_name_length / 2] = '\0'; (void)memset(double_single_line, '=', max_alias_name_length / 2); double_single_line[max_alias_name_length / 2] = '\0'; (void)fprintf(output_fp, "%s ========================================\n", space_line); (void)fprintf(output_fp, "%s> AFD INPUT STATISTICS LAST %2d MINUTE(S) <%s\n", double_single_line, show_min_range, double_single_line); (void)fprintf(output_fp, "%s ========================================\n", space_line); } else if (display_format == CSV_FORMAT) { if (show_alias == BOTH) { (void)fprintf(output_fp, "alias;name;val1;current;val2;files;size\n"); } else { (void)fprintf(output_fp, "%s;val1;current;val2;files;size\n", (show_alias == YES) ? "alias" : "name"); } } if (dir_counter < 0) { for (i = 0; i < no_of_stat_entries; i++) { if (show_index[i] == YES) { nfr = nbr = 0.0; left = afd_istat[i].sec_counter - sec_ints; if (left < 0) { for (j = (SECS_PER_HOUR + left); j < SECS_PER_HOUR; j++) { nfr += (double)afd_istat[i].hour[j].nfr; nbr += afd_istat[i].hour[j].nbr; } for (j = 0; j < (sec_ints + left); j++) { nfr += (double)afd_istat[i].hour[j].nfr; nbr += afd_istat[i].hour[j].nbr; } } else { for (j = left; j < afd_istat[i].sec_counter; j++) { nfr += (double)afd_istat[i].hour[j].nfr; nbr += afd_istat[i].hour[j].nbr; } } display_data(i, afd_istat[i].dir_alias, -1, ' ', -1, nfr, nbr); tmp_nfr += nfr; tmp_nbr += nbr; } } } else { for (i = 0; i < dir_counter; i++) { if ((position = locate_dir(afd_istat, arglist[i], no_of_stat_entries)) < 0) { (void)fprintf(stdout, "No dir alias %s found in statistic database.\n", arglist[i]); } else { if (show_index[position] == YES) { nfr = nbr = 0.0; left = afd_istat[position].sec_counter - sec_ints; if (left < 0) { for (j = (SECS_PER_HOUR + left); j < SECS_PER_HOUR; j++) { nfr += (double)afd_istat[position].hour[j].nfr; nbr += afd_istat[position].hour[j].nbr; } for (j = 0; j < (sec_ints + left); j++) { nfr += (double)afd_istat[position].hour[j].nfr; nbr += afd_istat[position].hour[j].nbr; } } else { for (j = left; j < afd_istat[position].sec_counter; j++) { nfr += (double)afd_istat[position].hour[j].nfr; nbr += afd_istat[position].hour[j].nbr; } } display_data(position, afd_istat[position].dir_alias, -1, ' ', -1, nfr, nbr); tmp_nfr += nfr; tmp_nbr += nbr; } } } } if (display_format == CSV_FORMAT) { display_data(SHOW_SMALL_TOTAL, NULL, -1, ' ', -1, tmp_nfr, tmp_nbr); } else if (display_format == NUMERIC_TOTAL_ONLY) { (void)fprintf(output_fp, "%.0f %.0f\n", tmp_nfr, tmp_nbr); } else { (void)memset(double_single_line, '-', max_alias_name_length); double_single_line[max_alias_name_length] = '\0'; (void)fprintf(output_fp, "%s---------------------------------\n", double_single_line); display_data(SHOW_SMALL_TOTAL, NULL, -1, ' ', -1, tmp_nfr, tmp_nbr); (void)memset(double_single_line, '=', max_alias_name_length); (void)fprintf(output_fp, "%s=================================\n", double_single_line); } #ifdef HAVE_MMAP # ifdef HAVE_STATX if (munmap(ptr, stat_buf.stx_size) < 0) # else if (munmap(ptr, stat_buf.st_size) < 0) # endif { (void)fprintf(stderr, "ERROR : Could not munmap() file %s : %s (%s %d)\n", statistic_file, strerror(errno), __FILE__, __LINE__); exit(INCORRECT); } #else free(ptr); #endif /* HAVE_MMAP */ if (close(stat_fd) == -1) { (void)fprintf(stderr, "WARNING : Could not close() file %s : %s (%s %d)\n", statistic_file, strerror(errno), __FILE__, __LINE__); } exit(SUCCESS); } if ((show_day == -1) && (show_year == -1) && (show_hour == -1) && (show_min == -1) && (show_hour_summary == -1) && (show_day_summary == -1) && (show_min_summary == -1)) { /* * Show total for all directories. */ tmp_nfr = tmp_nbr = 0.0; if (display_format == NORMAL_OUTPUT) { (void)memset(space_line, ' ', max_alias_name_length / 2); space_line[max_alias_name_length / 2] = '\0'; (void)memset(double_single_line, '=', max_alias_name_length / 2); double_single_line[max_alias_name_length / 2] = '\0'; (void)fprintf(output_fp, "%s ============================\n", space_line); (void)fprintf(output_fp, "%s=> AFD INPUT STATISTICS SUMMARY <%s=\n", double_single_line, double_single_line); (void)fprintf(output_fp, "%s ============================\n", space_line); } else if (display_format == CSV_FORMAT) { if (show_alias == BOTH) { (void)fprintf(output_fp, "alias;name;val1;current;val2;files;size\n"); } else { (void)fprintf(output_fp, "%s;val1;current;val2;files;size\n", (show_alias == YES) ? "alias" : "name"); } } if (dir_counter > 0) { for (i = 0; i < dir_counter; i++) { if ((position = locate_dir(afd_istat, arglist[i], no_of_stat_entries)) < 0) { (void)fprintf(stdout, "No dir alias %s found in statistic database.\n", arglist[i]); } else { if (show_index[position] == YES) { nfr = nbr = 0.0; for (j = 0; j < afd_istat[position].sec_counter; j++) { nfr += (double)afd_istat[position].hour[j].nfr; nbr += afd_istat[position].hour[j].nbr; } for (j = 0; j < afd_istat[position].hour_counter; j++) { nfr += (double)afd_istat[position].day[j].nfr; nbr += afd_istat[position].day[j].nbr; } for (j = 0; j < afd_istat[position].day_counter; j++) { nfr += (double)afd_istat[position].year[j].nfr; nbr += afd_istat[position].year[j].nbr; } tmp_nfr += nfr; tmp_nbr += nbr; display_data(position, afd_istat[position].dir_alias, -1, ' ', -1, nfr, nbr); } } } } else { /* Make a summary of everything */ for (i = 0; i < no_of_stat_entries; i++) { if (show_index[i] == YES) { nfr = nbr = 0.0; for (j = 0; j < afd_istat[i].sec_counter; j++) { nfr += (double)afd_istat[i].hour[j].nfr; nbr += afd_istat[i].hour[j].nbr; } for (j = 0; j < afd_istat[i].hour_counter; j++) { nfr += (double)afd_istat[i].day[j].nfr; nbr += afd_istat[i].day[j].nbr; } for (j = 0; j < afd_istat[i].day_counter; j++) { nfr += (double)afd_istat[i].year[j].nfr; nbr += afd_istat[i].year[j].nbr; } tmp_nfr += nfr; tmp_nbr += nbr; display_data(i, afd_istat[i].dir_alias, -1, ' ', -1, nfr, nbr); } } } if (display_format == CSV_FORMAT) { display_data(SHOW_SMALL_TOTAL, NULL, -1, ' ', -1, tmp_nfr, tmp_nbr); } else if (display_format == NUMERIC_TOTAL_ONLY) { (void)fprintf(output_fp, "%.0f %.0f\n", tmp_nfr, tmp_nbr); } else { (void)memset(double_single_line, '-', max_alias_name_length); double_single_line[max_alias_name_length] = '\0'; (void)fprintf(output_fp, "%s---------------------------------\n", double_single_line); display_data(SHOW_SMALL_TOTAL, NULL, -1, ' ', -1, tmp_nfr, tmp_nbr); (void)memset(double_single_line, '=', max_alias_name_length); (void)fprintf(output_fp, "%s=================================\n", double_single_line); } } else { /* * Show data for one or all days for this year. */ if (show_day > -1) { tmp_nfr = tmp_nbr = 0.0; if (display_format == NORMAL_OUTPUT) { (void)memset(space_line, ' ', max_alias_name_length / 2); space_line[max_alias_name_length / 2] = '\0'; (void)memset(double_single_line, '=', max_alias_name_length / 2); double_single_line[max_alias_name_length / 2] = '\0'; (void)fprintf(output_fp, "%s ========================\n", space_line); (void)fprintf(output_fp, "%s===> AFD INPUT STATISTICS DAY <%s==\n", double_single_line, double_single_line); (void)fprintf(output_fp, "%s ========================\n", space_line); } else if (display_format == CSV_FORMAT) { if (show_alias == BOTH) { (void)fprintf(output_fp, "alias;name;val1;current;val2;files;size\n"); } else { (void)fprintf(output_fp, "%s;val1;current;val2;files;size\n", (show_alias == YES) ? "alias" : "name"); } } if (dir_counter < 0) { for (i = 0; i < no_of_stat_entries; i++) { if (show_index[i] == YES) { nfr = nbr = 0.0; if (show_day == 0) /* Show all days */ { if (afd_istat[i].day_counter == 0) { display_data(i, afd_istat[i].dir_alias, -1, ' ', 0, 0.0, 0.0); } else { display_data(i, afd_istat[i].dir_alias, -1, ' ', 0, afd_istat[i].year[0].nfr, afd_istat[i].year[0].nbr); for (j = 1; j < afd_istat[i].day_counter; j++) { display_data(SHOW_SPACE, NULL, -1, ' ', j, afd_istat[i].year[j].nfr, afd_istat[i].year[j].nbr); nfr += (double)afd_istat[i].year[j].nfr; nbr += afd_istat[i].year[j].nbr; } } } else /* Show a specific day */ { if (show_day < DAYS_PER_YEAR) { if (afd_istat[i].day_counter < show_day) { j = DAYS_PER_YEAR - (show_day - afd_istat[i].day_counter); } else { j = afd_istat[i].day_counter - show_day; } nfr += (double)afd_istat[i].year[j].nfr; nbr += afd_istat[i].year[j].nbr; display_data(i, afd_istat[i].dir_alias, -1, ' ', -1, afd_istat[i].year[j].nfr, afd_istat[i].year[j].nbr); } else { display_data(i, afd_istat[i].dir_alias, -1, ' ', -1, 0.0, 0.0); } } tmp_nfr += nfr; tmp_nbr += nbr; } } } /* if (dir_counter < 0) */ else /* Show some specific directory */ { for (i = 0; i < dir_counter; i++) { if ((position = locate_dir(afd_istat, arglist[i], no_of_stat_entries)) < 0) { (void)fprintf(stdout, "No dir alias %s found in statistic database.\n", arglist[i]); } else { if (show_index[position] == YES) { nfr = nbr = 0.0; if (show_day == 0) /* Show all days */ { display_data(position, afd_istat[position].dir_alias, -1, ' ', 0, afd_istat[position].year[0].nfr, afd_istat[position].year[0].nbr); for (j = 1; j < afd_istat[position].day_counter; j++) { display_data(SHOW_SPACE, NULL, -1, ' ', j, afd_istat[position].year[j].nfr, afd_istat[position].year[j].nbr); nfr += (double)afd_istat[position].year[j].nfr; nbr += afd_istat[position].year[j].nbr; } } else /* Show a specific interval */ { if (show_day < DAYS_PER_YEAR) { if (afd_istat[position].day_counter < show_day) { j = DAYS_PER_YEAR - (show_day - afd_istat[position].day_counter); } else { j = afd_istat[position].day_counter - show_day; } nfr += (double)afd_istat[position].year[j].nfr; nbr += afd_istat[position].year[j].nbr; display_data(position, afd_istat[position].dir_alias, -1, ' ', -1, afd_istat[position].year[j].nfr, afd_istat[position].year[j].nbr); } else { display_data(position, afd_istat[position].dir_alias, -1, ' ', -1, 0.0, 0.0); } } tmp_nfr += nfr; tmp_nbr += nbr; } } } } if ((show_year > -1) || (show_hour > -1) || (show_day_summary > -1) || (show_hour_summary > -1)) { if (display_format == CSV_FORMAT) { display_data(SHOW_SMALL_TOTAL, NULL, -1, ' ', -1, tmp_nfr, tmp_nbr); } else if (display_format == NUMERIC_TOTAL_ONLY) { (void)fprintf(output_fp, "%.0f %.0f\n", tmp_nfr, tmp_nbr); } else { display_data(SHOW_SMALL_TOTAL, NULL, -1, ' ', -1, tmp_nfr, tmp_nbr); } } else { total_nfr += tmp_nfr; total_nbr += tmp_nbr; } if (display_format == NORMAL_OUTPUT) { (void)memset(double_single_line, '=', max_alias_name_length); double_single_line[max_alias_name_length] = '\0'; (void)fprintf(output_fp, "%s=================================\n", double_single_line); } } /* if (show_day > -1) */ /* * Show total summary on a per day basis for this year. */ if (show_day_summary > -1) { struct tm *p_ts; if ((p_ts = localtime(&now)) == NULL) { (void)fprintf(stderr, "ERROR : Failed to get localtime() : %s (%s %d)\n", strerror(errno), __FILE__, __LINE__); exit(INCORRECT); } tmp_nfr = tmp_nbr = 0.0; if (display_format == NORMAL_OUTPUT) { (void)memset(space_line, ' ', max_alias_name_length / 2); space_line[max_alias_name_length / 2] = '\0'; (void)memset(double_single_line, '=', max_alias_name_length / 2); double_single_line[max_alias_name_length / 2] = '\0'; (void)fprintf(output_fp, "%s ================================\n", space_line); (void)fprintf(output_fp, "%s> AFD INPUT STATISTICS DAY SUMMARY <%s\n", double_single_line, double_single_line); (void)fprintf(output_fp, "%s ================================\n", space_line); } else if (display_format == CSV_FORMAT) { if (show_alias == BOTH) { (void)fprintf(output_fp, "alias;name;val1;current;val2;files;size\n"); } else { (void)fprintf(output_fp, "%s;val1;current;val2;files;size\n", (show_alias == YES) ? "alias" : "name"); } } for (j = 0; j < p_ts->tm_yday; j++) { nfr = nbr = 0.0; for (i = 0; i < no_of_stat_entries; i++) { if (show_index[i] == YES) { nfr += (double)afd_istat[i].year[j].nfr; nbr += afd_istat[i].year[j].nbr; } } display_data(SHOW_SPACE, NULL, -1, ' ', j, nfr, nbr); tmp_nfr += nfr; tmp_nbr += nbr; } if ((show_year > -1) || (show_day > -1) || (show_hour > -1) || (show_hour_summary > -1)) { if (display_format == CSV_FORMAT) { display_data(SHOW_SMALL_TOTAL, NULL, -1, ' ', -1, tmp_nfr, tmp_nbr); } else if (display_format == NUMERIC_TOTAL_ONLY) { (void)fprintf(output_fp, "%.0f %.0f\n", tmp_nfr, tmp_nbr); } else { display_data(SHOW_SMALL_TOTAL, NULL, -1, ' ', -1, tmp_nfr, tmp_nbr); } } else { total_nfr += tmp_nfr; total_nbr += tmp_nbr; } if (display_format == NORMAL_OUTPUT) { (void)memset(double_single_line, '=', max_alias_name_length); double_single_line[max_alias_name_length] = '\0'; (void)fprintf(output_fp, "%s=================================\n", double_single_line); } } /* if (show_day_summary > -1) */ /* * Show data for one or all hours for this day. */ if (show_hour > -1) { double sec_nfr, sec_nbr; tmp_nfr = tmp_nbr = 0.0; if (display_format == NORMAL_OUTPUT) { (void)memset(space_line, ' ', max_alias_name_length / 2); space_line[max_alias_name_length / 2] = '\0'; (void)memset(double_single_line, '=', max_alias_name_length / 2); double_single_line[max_alias_name_length / 2] = '\0'; (void)fprintf(output_fp, "%s =========================\n", space_line); (void)fprintf(output_fp, "%s===> AFD INPUT STATISTICS HOUR <%s==\n", double_single_line, double_single_line); (void)fprintf(output_fp, "%s =========================\n", space_line); } else if (display_format == CSV_FORMAT) { if (show_alias == BOTH) { (void)fprintf(output_fp, "alias;name;val1;current;val2;files;size\n"); } else { (void)fprintf(output_fp, "%s;val1;current;val2;files;size\n", (show_alias == YES) ? "alias" : "name"); } } if (dir_counter < 0) { for (i = 0; i < no_of_stat_entries; i++) { if (show_index[i] == YES) { nfr = nbr = 0.0; if (show_hour == 0) /* Show all hours of the day */ { sec_nfr = sec_nbr = 0.0; for (j = 0; j < afd_istat[i].sec_counter; j++) { sec_nfr += (double)afd_istat[i].hour[j].nfr; sec_nbr += afd_istat[i].hour[j].nbr; } if (afd_istat[i].hour_counter == 0) { display_data(i, afd_istat[i].dir_alias, -1, '*', 0, sec_nfr, sec_nbr); } else { display_data(i, afd_istat[i].dir_alias, -1, ' ', 0, afd_istat[i].day[0].nfr, afd_istat[i].day[0].nbr); for (j = 1; j < afd_istat[i].hour_counter; j++) { display_data(SHOW_SPACE, NULL, -1, ' ', j, afd_istat[i].day[j].nfr, afd_istat[i].day[j].nbr); nfr += (double)afd_istat[i].day[j].nfr; nbr += afd_istat[i].day[j].nbr; } display_data(SHOW_SPACE, NULL, -1, '*', j, sec_nfr, sec_nbr); } nfr += sec_nfr; nbr += sec_nbr; for (j = (afd_istat[i].hour_counter + 1); j < HOURS_PER_DAY; j++) { display_data(SHOW_SPACE, NULL, -1, ' ', j, afd_istat[i].day[j].nfr, afd_istat[i].day[j].nbr); nfr += (double)afd_istat[i].day[j].nfr; nbr += afd_istat[i].day[j].nbr; } } else /* Show a specific hour */ { if (show_hour < HOURS_PER_DAY) { if (afd_istat[i].hour_counter < show_hour) { j = HOURS_PER_DAY - (show_hour - afd_istat[i].hour_counter); } else { j = afd_istat[i].hour_counter - show_hour; } nfr += (double)afd_istat[i].day[j].nfr; nbr += afd_istat[i].day[j].nbr; display_data(i, afd_istat[i].dir_alias, -1, ' ', -1, afd_istat[i].day[j].nfr, afd_istat[i].day[j].nbr); } else { display_data(i, afd_istat[i].dir_alias, -1, ' ', -1, 0.0, 0.0); } } tmp_nfr += nfr; tmp_nbr += nbr; } } } /* if (dir_counter < 0) */ else /* Show some specific directory */ { for (i = 0; i < dir_counter; i++) { if ((position = locate_dir(afd_istat, arglist[i], no_of_stat_entries)) < 0) { (void)fprintf(stdout, "No dir alias %s found in statistic database.\n", arglist[i]); } else { if (show_index[position] == YES) { nfr = nbr = 0.0; if (show_hour == 0) /* Show all hours of the day */ { sec_nfr = sec_nbr = 0.0; for (j = 0; j < afd_istat[position].sec_counter; j++) { sec_nfr += (double)afd_istat[position].hour[j].nfr; sec_nbr += afd_istat[position].hour[j].nbr; } if (afd_istat[i].hour_counter == 0) { display_data(position, afd_istat[position].dir_alias, -1, '*', 0, sec_nfr, sec_nbr); } else { display_data(position, afd_istat[position].dir_alias, -1, ' ', 0, afd_istat[position].day[0].nfr, afd_istat[position].day[0].nbr); for (j = 1; j < afd_istat[position].hour_counter; j++) { display_data(SHOW_SPACE, NULL, -1, ' ', j, afd_istat[position].day[j].nfr, afd_istat[position].day[j].nbr); nfr += (double)afd_istat[position].day[j].nfr; nbr += afd_istat[position].day[j].nbr; } display_data(SHOW_SPACE, NULL, -1, '*', j, sec_nfr, sec_nbr); } nfr += sec_nfr; nbr += sec_nbr; for (j = (afd_istat[position].hour_counter + 1); j < HOURS_PER_DAY; j++) { display_data(SHOW_SPACE, NULL, -1, ' ', j, afd_istat[position].day[j].nfr, afd_istat[position].day[j].nbr); nfr += (double)afd_istat[position].day[j].nfr; nbr += afd_istat[position].day[j].nbr; } } else /* Show a specific interval */ { if (show_hour < HOURS_PER_DAY) { if (afd_istat[position].hour_counter < show_hour) { j = HOURS_PER_DAY - (show_hour - afd_istat[position].hour_counter); } else { j = afd_istat[position].hour_counter - show_hour; } nfr += (double)afd_istat[position].day[j].nfr; nbr += afd_istat[position].day[j].nbr; display_data(position, afd_istat[position].dir_alias, -1, ' ', j, afd_istat[position].day[j].nfr, afd_istat[position].day[j].nbr); } else { display_data(position, afd_istat[position].dir_alias, -1, ' ', -1, 0.0, 0.0); } } tmp_nfr += nfr; tmp_nbr += nbr; } } } } if ((show_year > -1) || (show_day > -1) || (show_day_summary > -1) || (show_hour_summary > -1)) { if (display_format == CSV_FORMAT) { display_data(SHOW_SMALL_TOTAL, NULL, -1, ' ', -1, tmp_nfr, tmp_nbr); } else if (display_format == NUMERIC_TOTAL_ONLY) { (void)fprintf(output_fp, "%.0f %.0f\n", tmp_nfr, tmp_nbr); } else { display_data(SHOW_SMALL_TOTAL, NULL, -1, ' ', -1, tmp_nfr, tmp_nbr); } } else { total_nfr += tmp_nfr; total_nbr += tmp_nbr; } if (display_format == NORMAL_OUTPUT) { (void)memset(double_single_line, '=', max_alias_name_length); double_single_line[max_alias_name_length] = '\0'; (void)fprintf(output_fp, "%s=================================\n", double_single_line); } } /* if (show_hour > -1) */ /* * Show total summary on a per hour basis for the last 24 hours. */ if (show_hour_summary > -1) { tmp_nfr = tmp_nbr = 0.0; if (display_format == NORMAL_OUTPUT) { (void)memset(space_line, ' ', max_alias_name_length / 2); space_line[max_alias_name_length / 2] = '\0'; (void)memset(double_single_line, '=', max_alias_name_length / 2); double_single_line[max_alias_name_length / 2] = '\0'; (void)fprintf(output_fp, "%s =================================\n", space_line); (void)fprintf(output_fp, "%s> AFD INPUT STATISTICS HOUR SUMMARY <%s\n", double_single_line, double_single_line); (void)fprintf(output_fp, "%s =================================\n", space_line); } else if (display_format == CSV_FORMAT) { if (show_alias == BOTH) { (void)fprintf(output_fp, "alias;name;val1;current;val2;files;size\n"); } else { (void)fprintf(output_fp, "%s;val1;current;val2;files;size\n", (show_alias == YES) ? "alias" : "name"); } } for (j = 0; j < afd_istat[0].hour_counter; j++) { nfr = nbr = 0.0; for (i = 0; i < no_of_stat_entries; i++) { if (show_index[i] == YES) { nfr += (double)afd_istat[i].day[j].nfr; nbr += afd_istat[i].day[j].nbr; } } display_data(SHOW_SPACE, NULL, -1, ' ', j, nfr, nbr); tmp_nfr += nfr; tmp_nbr += nbr; } nfr = nbr = 0.0; for (i = 0; i < no_of_stat_entries; i++) { for (j = 0; j < afd_istat[i].sec_counter; j++) { if (show_index[i] == YES) { nfr += (double)afd_istat[i].hour[j].nfr; nbr += afd_istat[i].hour[j].nbr; } } } display_data(SHOW_SPACE, NULL, -1, '*', afd_istat[0].hour_counter, nfr, nbr); tmp_nfr += nfr; tmp_nbr += nbr; for (j = (afd_istat[0].hour_counter + 1); j < HOURS_PER_DAY; j++) { nfr = nbr = 0.0; for (i = 0; i < no_of_stat_entries; i++) { if(show_index[i] == YES) { nfr += (double)afd_istat[i].day[j].nfr; nbr += afd_istat[i].day[j].nbr; } } display_data(SHOW_SPACE, NULL, -1, ' ', j, nfr, nbr); tmp_nfr += nfr; tmp_nbr += nbr; } if ((show_year > -1) || (show_day > -1) || (show_day_summary > -1) || (show_hour > -1)) { if (display_format == CSV_FORMAT) { display_data(SHOW_SMALL_TOTAL, NULL, -1, ' ', -1, tmp_nfr, tmp_nbr); } else if (display_format == NUMERIC_TOTAL_ONLY) { (void)fprintf(output_fp, "%.0f %.0f\n", tmp_nfr, tmp_nbr); } else { display_data(SHOW_SMALL_TOTAL, NULL, -1, ' ', -1, tmp_nfr, tmp_nbr); } } else { total_nfr += tmp_nfr; total_nbr += tmp_nbr; } if (display_format == NORMAL_OUTPUT) { (void)memset(double_single_line, '=', max_alias_name_length); double_single_line[max_alias_name_length] = '\0'; (void)fprintf(output_fp, "%s=================================\n", double_single_line); } } /* if (show_hour_summary > -1) */ /* * Show data for one or all minutes for this hour. */ if (show_min > -1) { int tmp; tmp_nfr = tmp_nbr = 0.0; if (display_format == NORMAL_OUTPUT) { (void)memset(space_line, ' ', max_alias_name_length / 2); space_line[max_alias_name_length / 2] = '\0'; (void)memset(double_single_line, '=', max_alias_name_length / 2); double_single_line[max_alias_name_length / 2] = '\0'; (void)fprintf(output_fp, "%s ===========================\n", space_line); (void)fprintf(output_fp, "%s=> AFD INPUT STATISTICS MINUTE <%s\n", double_single_line, double_single_line); (void)fprintf(output_fp, "%s ===========================\n", space_line); } else if (display_format == CSV_FORMAT) { if (show_alias == BOTH) { (void)fprintf(output_fp, "alias;name;val1;current;val2;files;size\n"); } else { (void)fprintf(output_fp, "%s;val1;current;val2;files;size\n", (show_alias == YES) ? "alias" : "name"); } } if (dir_counter < 0) { for (i = 0; i < no_of_stat_entries; i++) { if (show_index[i] == YES) { nfr = nbr = 0.0; if (show_min == 0) /* Show all minutes of the hour */ { nfr += (double)afd_istat[i].hour[0].nfr; nbr += afd_istat[i].hour[0].nbr; display_data(i, afd_istat[i].dir_alias, 0, ' ', 0, afd_istat[i].hour[0].nfr, afd_istat[i].hour[0].nbr); for (j = 1; j < afd_istat[i].sec_counter; j++) { tmp = j * STAT_RESCAN_TIME; if ((tmp % 60) == 0) { tmp = tmp / 60; } else { tmp = -1; } display_data(SHOW_SPACE, NULL, tmp, ' ', j, afd_istat[i].hour[j].nfr, afd_istat[i].hour[j].nbr); nfr += (double)afd_istat[i].hour[j].nfr; nbr += afd_istat[i].hour[j].nbr; } tmp = afd_istat[0].sec_counter * STAT_RESCAN_TIME; if ((tmp % 60) == 0) { tmp = tmp / 60; } else { tmp = -1; } display_data(SHOW_SPACE, NULL, tmp, '*', afd_istat[i].sec_counter, 0.0, 0.0); for (j = (afd_istat[i].sec_counter + 1); j < SECS_PER_HOUR; j++) { tmp = j * STAT_RESCAN_TIME; if ((tmp % 60) == 0) { tmp = tmp / 60; } else { tmp = -1; } nfr += (double)afd_istat[i].hour[j].nfr; nbr += afd_istat[i].hour[j].nbr; display_data(SHOW_SPACE, NULL, tmp, ' ', j, afd_istat[i].hour[j].nfr, afd_istat[i].hour[j].nbr); } } else /* Show a specific minute */ { int sec = (show_min * 60) / STAT_RESCAN_TIME; if (afd_istat[i].sec_counter < sec) { j = SECS_PER_HOUR - (sec - afd_istat[i].sec_counter); } else { j = afd_istat[i].sec_counter - sec; } nfr += (double)afd_istat[i].hour[j].nfr; nbr += afd_istat[i].hour[j].nbr; display_data(i, afd_istat[i].dir_alias, -1, ' ', -1, afd_istat[i].hour[j].nfr, afd_istat[i].hour[j].nbr); } tmp_nfr += nfr; tmp_nbr += nbr; } } } /* if (dir_counter < 0) */ else /* Show some specific directory */ { for (i = 0; i < dir_counter; i++) { if ((position = locate_dir(afd_istat, arglist[i], no_of_stat_entries)) < 0) { (void)fprintf(stdout, "No dir alias %s found in statistic database.\n", arglist[i]); } else { if (show_index[position] == YES) { nfr = nbr = 0.0; if (show_min == 0) /* Show all minutes of the hour */ { if (afd_istat[position].sec_counter == 0) { display_data(position, afd_istat[position].dir_alias, 0, '*', 0, 0.0, 0.0); } else { display_data(position, afd_istat[position].dir_alias, 0, ' ', 0, afd_istat[position].hour[0].nfr, afd_istat[position].hour[0].nbr); for (j = 1; j < afd_istat[position].sec_counter; j++) { tmp = j * STAT_RESCAN_TIME; if ((tmp % 60) == 0) { tmp = tmp / 60; } else { tmp = -1; } nfr += (double)afd_istat[position].hour[j].nfr; nbr += afd_istat[position].hour[j].nbr; display_data(SHOW_SPACE, NULL, tmp, ' ', j, afd_istat[position].hour[j].nfr, afd_istat[position].hour[j].nbr); } tmp = afd_istat[position].sec_counter * STAT_RESCAN_TIME; if ((tmp % 60) == 0) { tmp = tmp / 60; } else { tmp = -1; } display_data(SHOW_SPACE, NULL, tmp, '*', afd_istat[position].sec_counter, 0.0, 0.0); } for (j = (afd_istat[position].sec_counter + 1); j < SECS_PER_HOUR; j++) { tmp = j * STAT_RESCAN_TIME; if ((tmp % 60) == 0) { tmp = tmp / 60; } else { tmp = -1; } nfr += (double)afd_istat[position].hour[j].nfr; nbr += afd_istat[position].hour[j].nbr; display_data(SHOW_SPACE, NULL, tmp, ' ', j, afd_istat[position].hour[j].nfr, afd_istat[position].hour[j].nbr); } } else /* Show a specific interval */ { if (show_min < 60) { int sec = (show_min * 60) / STAT_RESCAN_TIME; if (afd_istat[position].sec_counter < sec) { j = SECS_PER_HOUR - (sec - afd_istat[position].sec_counter); } else { j = afd_istat[position].sec_counter - sec; } nfr += (double)afd_istat[position].hour[j].nfr; nbr += afd_istat[position].hour[j].nbr; display_data(position, afd_istat[position].dir_alias, -1, ' ', -1, afd_istat[position].hour[j].nfr, afd_istat[position].hour[j].nbr); } else { display_data(position, afd_istat[position].dir_alias, -1, ' ', -1, 0.0, 0.0); } } tmp_nfr += nfr; tmp_nbr += nbr; } } } } if ((show_year > -1) || (show_day > -1) || (show_hour > -1) || (show_day_summary > -1) || (show_hour_summary > -1)) { if (display_format == CSV_FORMAT) { display_data(SHOW_SMALL_TOTAL, NULL, -1, ' ', -1, tmp_nfr, tmp_nbr); } else if (display_format == NUMERIC_TOTAL_ONLY) { (void)fprintf(output_fp, "%.0f %.0f\n", tmp_nfr, tmp_nbr); } else { display_data(SHOW_SMALL_TOTAL, NULL, -1, ' ', -1, tmp_nfr, tmp_nbr); } } else { total_nfr += tmp_nfr; total_nbr += tmp_nbr; } if (display_format == NORMAL_OUTPUT) { (void)memset(double_single_line, '=', max_alias_name_length); double_single_line[max_alias_name_length] = '\0'; (void)fprintf(output_fp, "%s=================================\n", double_single_line); } } /* if (show_min > -1) */ /* * Show summary on a per minute basis for the last hour. */ if (show_min_summary > -1) { tmp_nfr = tmp_nbr = 0.0; if (display_format == NORMAL_OUTPUT) { (void)memset(space_line, ' ', max_alias_name_length / 2); space_line[max_alias_name_length / 2] = '\0'; (void)memset(double_single_line, '=', max_alias_name_length / 2); double_single_line[max_alias_name_length / 2] = '\0'; (void)fprintf(output_fp, "%s ===================================\n", space_line); (void)fprintf(output_fp, "%s> AFD INPUT STATISTICS MINUTE SUMMARY <%s\n", double_single_line, double_single_line); (void)fprintf(output_fp, "%s ===================================\n", space_line); } else if (display_format == CSV_FORMAT) { if (show_alias == BOTH) { (void)fprintf(output_fp, "alias;name;val1;current;val2;files;size\n"); } else { (void)fprintf(output_fp, "%s;val1;current;val2;files;size\n", (show_alias == YES) ? "alias" : "name"); } } } if (show_min_summary == 0) { int tmp; for (j = 0; j < afd_istat[0].sec_counter; j++) { tmp = j * STAT_RESCAN_TIME; if ((tmp % 60) == 0) { tmp = tmp / 60; } else { tmp = -1; } nfr = nbr = 0.0; for (i = 0; i < no_of_stat_entries; i++) { if (show_index[i] == YES) { nfr += (double)afd_istat[i].hour[j].nfr; nbr += afd_istat[i].hour[j].nbr; } } display_data(SHOW_SPACE, NULL, tmp, ' ', j, nfr, nbr); tmp_nfr += nfr; tmp_nbr += nbr; } tmp = afd_istat[0].sec_counter * STAT_RESCAN_TIME; if ((tmp % 60) == 0) { tmp = tmp / 60; } else { tmp = -1; } display_data(SHOW_SPACE, NULL, tmp, '*', afd_istat[0].sec_counter, 0.0, 0.0); for (j = (afd_istat[0].sec_counter + 1); j < SECS_PER_HOUR; j++) { tmp = j * STAT_RESCAN_TIME; if ((tmp % 60) == 0) { tmp = tmp / 60; } else { tmp = -1; } nfr = nbr = 0.0; for (i = 0; i < no_of_stat_entries; i++) { if (show_index[i] == YES) { nfr += (double)afd_istat[i].hour[j].nfr; nbr += afd_istat[i].hour[j].nbr; } } display_data(SHOW_SPACE, NULL, tmp, ' ', j, nfr, nbr); tmp_nfr += nfr; tmp_nbr += nbr; } } else if (show_min_summary > 0) { int left, sec_ints = (show_min_summary * 60) / STAT_RESCAN_TIME, tmp; left = afd_istat[0].sec_counter - sec_ints; if (left < 0) { for (j = (SECS_PER_HOUR + left); j < SECS_PER_HOUR; j++) { tmp = j * STAT_RESCAN_TIME; if ((tmp % 60) == 0) { tmp = tmp / 60; } else { tmp = -1; } nfr = nbr = 0.0; for (i = 0; i < no_of_stat_entries; i++) { if (show_index[i] == YES) { nfr += (double)afd_istat[i].hour[j].nfr; nbr += afd_istat[i].hour[j].nbr; } } display_data(SHOW_SPACE, NULL, tmp, ' ', j, nfr, nbr); tmp_nfr += nfr; tmp_nbr += nbr; } for (j = 0; j < (sec_ints + left); j++) { tmp = j * STAT_RESCAN_TIME; if ((tmp % 60) == 0) { tmp = tmp / 60; } else { tmp = -1; } nfr = nbr = 0.0; for (i = 0; i < no_of_stat_entries; i++) { if (show_index[i] == YES) { nfr += (double)afd_istat[i].hour[j].nfr; nbr += afd_istat[i].hour[j].nbr; } } display_data(SHOW_SPACE, NULL, tmp, ' ', j, nfr, nbr); tmp_nfr += nfr; tmp_nbr += nbr; } } else { for (j = left; j < afd_istat[0].sec_counter; j++) { tmp = j * STAT_RESCAN_TIME; if ((tmp % 60) == 0) { tmp = tmp / 60; } else { tmp = -1; } nfr = nbr = 0.0; for (i = 0; i < no_of_stat_entries; i++) { if (show_index[i] == YES) { nfr += (double)afd_istat[i].hour[j].nfr; nbr += afd_istat[i].hour[j].nbr; } } display_data(SHOW_SPACE, NULL, tmp, ' ', j, nfr, nbr); tmp_nfr += nfr; tmp_nbr += nbr; } } } if (show_min_summary > -1) { if ((show_year > -1) || (show_day > -1) || (show_day_summary > -1) || (show_hour > -1)) { if (display_format == CSV_FORMAT) { display_data(SHOW_SMALL_TOTAL, NULL, -1, ' ', -1, tmp_nfr, tmp_nbr); } else if (display_format == NUMERIC_TOTAL_ONLY) { (void)fprintf(output_fp, "%.0f %.0f\n", tmp_nfr, tmp_nbr); } else { display_data(SHOW_SMALL_TOTAL, NULL, -1, ' ', -1, tmp_nfr, tmp_nbr); } } else { total_nfr += tmp_nfr; total_nbr += tmp_nbr; } if (display_format == NORMAL_OUTPUT) { (void)memset(double_single_line, '=', max_alias_name_length); double_single_line[max_alias_name_length] = '\0'; (void)fprintf(output_fp, "%s=================================\n", double_single_line); } } if (display_format == NUMERIC_TOTAL_ONLY) { (void)fprintf(output_fp, "%.0f %.0f\n", total_nfr, total_nbr); } else { display_data(SHOW_BIG_TOTAL, NULL, -1, ' ', -1, total_nfr, total_nbr); } } #ifdef HAVE_MMAP # ifdef HAVE_STATX if (munmap(ptr, stat_buf.stx_size) < 0) # else if (munmap(ptr, stat_buf.st_size) < 0) # endif { (void)fprintf(stderr, "ERROR : Could not munmap() file %s : %s (%s %d)\n", statistic_file, strerror(errno), __FILE__, __LINE__); exit(INCORRECT); } #else free(ptr); #endif /* HAVE_MMAP */ } if (close(stat_fd) == -1) { (void)fprintf(stderr, "WARNING : Could not close() file %s : %s (%s %d)\n", statistic_file, strerror(errno), __FILE__, __LINE__); } } else { (void)fprintf(stderr, "ERROR : No data in %s (%s %d)\n", statistic_file, __FILE__, __LINE__); exit(INCORRECT); } if (output_file_name[0] != '\0') { (void)fclose(output_fp); } free_get_dir_name(); exit(SUCCESS); } /*++++++++++++++++++++++++++++ display_data() +++++++++++++++++++++++++++*/ static void display_data(int position, char *dir_alias, int val1, char current, int val2, double nfr, double nbr) { char name[MAX_PATH_LENGTH]; if (position == SHOW_SMALL_TOTAL) { /* Total */ name[0] = 'T'; name[1] = 'o'; name[2] = 't'; name[3] = 'a'; name[4] = 'l'; if ((show_alias == BOTH) && (display_format == CSV_FORMAT)) { name[5] = ';'; name[6] = '\0'; } else { name[5] = '\0'; } } else if (position == SHOW_BIG_TOTAL) { /* TOTAL */ name[0] = 'T'; name[1] = 'O'; name[2] = 'T'; name[3] = 'A'; name[4] = 'L'; if ((show_alias == BOTH) && (display_format == CSV_FORMAT)) { name[5] = ';'; name[6] = '\0'; } else { name[5] = '\0'; } } else if (position == SHOW_SPACE) { /* Space */ name[0] = ' '; name[1] = '\0'; } else { if (show_alias == YES) { (void)strcpy(name, dir_alias); } else { size_t offset; if (show_alias == BOTH) { (void)strcpy(name, dir_alias); offset = strlen(name); name[offset] = ';'; offset++; } else { offset = 0; } get_dir_name(dir_alias, &name[offset]); } } if (display_format == NORMAL_OUTPUT) { char str1[3], str2[5]; if (val1 == -1) { str1[0] = ' '; str1[1] = '\0'; } else { str1[2] = '\0'; if (val1 < 10) { str1[0] = ' '; str1[1] = val1 + '0'; } else { str1[0] = (val1 / 10) + '0'; str1[1] = (val1 % 10) + '0'; } } if (val2 == -1) { str2[0] = ' '; str2[1] = '\0'; } else { str2[3] = ':'; str2[4] = '\0'; if (val2 < 10) { str2[0] = ' '; str2[1] = ' '; str2[2] = val2 + '0'; } else if (val2 < 100) { str2[0] = ' '; str2[1] = (val2 / 10) + '0'; str2[2] = (val2 % 10) + '0'; } else { str2[0] = (val2 / 100) + '0'; str2[1] = ((val2 / 10) % 10) + '0'; str2[2] = (val2 % 10) + '0'; } } if (nbr >= F_EXABYTE) { (void)fprintf(output_fp, "%-*s %2s %c%4s%12.0f %8.3f EB\n", max_alias_name_length, name, str1, current, str2, nfr, nbr / F_EXABYTE); } else if (nbr >= F_PETABYTE) { (void)fprintf(output_fp, "%-*s %2s %c%4s%12.0f %8.3f PB\n", max_alias_name_length, name, str1, current, str2, nfr, nbr / F_PETABYTE); } else if (nbr >= F_TERABYTE) { (void)fprintf(output_fp, "%-*s %2s %c%4s%12.0f %8.3f TB\n", max_alias_name_length, name, str1, current, str2, nfr, nbr / F_TERABYTE); } else if (nbr >= F_GIGABYTE) { (void)fprintf(output_fp, "%-*s %2s %c%4s%12.0f %8.3f GB\n", max_alias_name_length, name, str1, current, str2, nfr, nbr / F_GIGABYTE); } else if (nbr >= F_MEGABYTE) { (void)fprintf(output_fp, "%-*s %2s %c%4s%12.0f %8.3f MB\n", max_alias_name_length, name, str1, current, str2, nfr, nbr / F_MEGABYTE); } else if (nbr >= F_KILOBYTE) { (void)fprintf(output_fp, "%-*s %2s %c%4s%12.0f %8.3f KB\n", max_alias_name_length, name, str1, current, str2, nfr, nbr / F_KILOBYTE); } else { (void)fprintf(output_fp, "%-*s %2s %c%4s%12.0f %8.0f B\n", max_alias_name_length, name, str1, current, str2, nfr, nbr); } } else if (display_format == CSV_FORMAT) { if ((name[1] != '\0') && (name[0] != ' ')) { (void)strcpy(prev_name, name); } (void)fprintf(output_fp, "%s;%d;%d;%d;%.0f;%.0f\n", prev_name, val1, (current == '*') ? 1 : -1, val2, nfr, nbr); } return; }