diff --git a/agent/mibgroup/ucd-snmp/disk.c b/agent/mibgroup/ucd-snmp/disk.c index 7c756ff..ff22019 100644 --- a/agent/mibgroup/ucd-snmp/disk.c +++ b/agent/mibgroup/ucd-snmp/disk.c @@ -153,9 +153,10 @@ static void disk_free_config(void); static void disk_parse_config(const char *, char *); static void disk_parse_config_all(const char *, char *); #if HAVE_FSTAB_H || HAVE_GETMNTENT || HAVE_STATFS -static void find_and_add_allDisks(int minpercent); +static void refresh_disk_table(int addNewDisks, int minpercent); static void add_device(char *path, char *device, - int minspace, int minpercent, int override); + int minspace, int minpercent, int addNewDisks, + int override); static void modify_disk_parameters(int index, int minspace, int minpercent); static int disk_exists(char *path); @@ -167,6 +168,7 @@ struct diskpart { char path[STRMAX]; int minimumspace; int minpercent; + int alive; }; #define MAX_INT_32 0x7fffffff @@ -174,6 +176,7 @@ struct diskpart { unsigned int numdisks; int allDisksIncluded = 0; +int allDisksMinPercent = 0; unsigned int maxdisks = 0; struct diskpart *disks; @@ -238,6 +241,7 @@ init_disk(void) disk_free_config, "minpercent%"); allDisksIncluded = 0; + allDisksMinPercent = 0; } static void @@ -253,6 +257,7 @@ disk_free_config(void) disks[i].minpercent = -1; } allDisksIncluded = 0; + allDisksMinPercent = 0; } static void @@ -313,7 +318,7 @@ disk_parse_config(const char *token, char *cptr) * check if the disk already exists, if so then modify its * parameters. if it does not exist then add it */ - add_device(path, find_device(path), minspace, minpercent, 1); + add_device(path, find_device(path), minspace, minpercent, 1, 1); #endif /* HAVE_FSTAB_H || HAVE_GETMNTENT || HAVE_STATFS */ } @@ -372,7 +377,7 @@ disk_parse_config_all(const char *token, char *cptr) #if HAVE_FSTAB_H || HAVE_GETMNTENT || HAVE_STATFS static void -add_device(char *path, char *device, int minspace, int minpercent, int override) +add_device(char *path, char *device, int minspace, int minpercent, int addNewDisks, int override) { int index; @@ -402,10 +407,16 @@ add_device(char *path, char *device, int minspace, int minpercent, int override) } index = disk_exists(path); - if((index != -1) && (index < maxdisks) && (override==1)) { - modify_disk_parameters(index, minspace, minpercent); + if((index != -1) && (index < maxdisks)) { + /* the path is already in the table */ + disks[index].alive = 1; + /* -> update its device */ + strlcpy(disks[index].device, device, sizeof(disks[index].device)); + if (override == 1) { + modify_disk_parameters(index, minspace, minpercent); + } } - else if(index == -1){ + else if(index == -1 && addNewDisks){ /* add if and only if the device was found */ if(device[0] != 0) { /* The following buffers are cleared above, no need to add '\0' */ @@ -413,6 +424,7 @@ add_device(char *path, char *device, int minspace, int minpercent, int override) strlcpy(disks[numdisks].device, device, sizeof(disks[numdisks].device)); disks[numdisks].minimumspace = minspace; disks[numdisks].minpercent = minpercent; + disks[numdisks].alive = 1; numdisks++; } else { @@ -420,6 +432,7 @@ add_device(char *path, char *device, int minspace, int minpercent, int override) disks[numdisks].minpercent = -1; disks[numdisks].path[0] = 0; disks[numdisks].device[0] = 0; + disks[numdisks].alive = 0; } } } @@ -444,7 +457,7 @@ int disk_exists(char *path) } static void -find_and_add_allDisks(int minpercent) +refresh_disk_table(int addNewDisks, int minpercent) { #if HAVE_GETMNTENT #if HAVE_SYS_MNTTAB_H @@ -480,7 +493,7 @@ find_and_add_allDisks(int minpercent) return; } while (mntfp && NULL != (mntent = getmntent(mntfp))) { - add_device(mntent->mnt_dir, mntent->mnt_fsname, -1, minpercent, 0); + add_device(mntent->mnt_dir, mntent->mnt_fsname, -1, minpercent, addNewDisks, 0); dummy = 1; } if (mntfp) @@ -497,7 +510,7 @@ find_and_add_allDisks(int minpercent) return; } while ((i = getmntent(mntfp, &mnttab)) == 0) { - add_device(mnttab.mnt_mountp, mnttab.mnt_special, -1, minpercent, 0); + add_device(mnttab.mnt_mountp, mnttab.mnt_special, -1, minpercent, addNewDisks, 0); dummy = 1; } fclose(mntfp); @@ -514,13 +527,13 @@ find_and_add_allDisks(int minpercent) mntsize = getmntinfo(&mntbuf, MNT_NOWAIT); for (i = 0; i < mntsize; i++) { add_device(mntbuf[i].f_mntonname, mntbuf[i].f_mntfromname, -1, - minpercent, 0); + minpercent, addNewDisks 0); } } #elif HAVE_FSTAB_H setfsent(); /* open /etc/fstab */ while((fstab1 = getfsent()) != NULL) { - add_device(fstab1->fs_file, fstab1->fs_spec, -1, minpercent, 0); + add_device(fstab1->fs_file, fstab1->fs_spec, -1, minpercent, addNewDisks, 0); dummy = 1; } endfsent(); /* close /etc/fstab */ @@ -535,7 +548,7 @@ find_and_add_allDisks(int minpercent) * statfs we default to the root partition "/" */ if (statfs("/", &statf) == 0) { - add_device("/", statf.f_mntfromname, -1, minpercent, 0); + add_device("/", statf.f_mntfromname, -1, minpercent, addNewDisks, 0); } #endif else { @@ -694,6 +707,10 @@ fill_dsk_entry(int disknum, struct dsk_entry *entry) #endif #endif + if (disks[disknum].alive == 0){ + return -1; + } + entry->dskPercentInode = -1; #if defined(HAVE_STATVFS) || defined(HAVE_STATFS) @@ -825,6 +842,13 @@ var_extensible_disk(struct variable *vp, static char *errmsg; static char empty_str[1]; + int i; + for (i = 0; i < numdisks; i++){ + disks[i].alive = 0; + } + /* dynamically add new disks + update alive flag */ + refresh_disk_table(allDisksIncluded, allDisksMinPercent); + tryAgain: if (header_simple_table (vp, name, length, exact, var_len, write_method, numdisks))