I managed (finally!) to restore my system from backups after the
possible compromise last week. I also repartitioned to make better use
of a new disk, and now have lots more room. In the process, I found
myself wishing for a better way to visualize disk and partition sizes.
A modest search of the internet did not turn up what I had in mind. I
put together a prototype using awk and gnuplot (see below). I suppose
perl and tk would be better choices, and I can see several ways to
extend it. However, it sure seems like reinventing the wheel. Can
anyone point me to an existing tool along these lines?
- Jim Van Zandt
#!/bin/sh
#
# part - display disk partition usage
#
# Jim Van Zandt <[EMAIL PROTECTED]>
awk '
BEGIN {
i=1;
while (getline<"/proc/partitions" >0){
print "# /proc/partitions: ",$0;
if ($1 ~ /[0-9]/ && $(NF-1) > 1 && $NF ~ /[0-9]/){
# "extended" partition shows as 1 block
dev="/dev/" $4;
device[i]=dev;
drive=dev;
sub(/[0-9]*$/,"",drive);
if (drive != prevdrive){
prevdrive=drive;
numdrives++;
}
blocks[dev]=$3;
cum=cum+$3;
i=i+1;
}
}
while (getline<"/proc/swaps" > 0){
if ($1 ~ /^\/dev/){
dev=$1;
mountpoint[dev]="swap";
used[dev]=$4;
}
}
n=i-1;
pad=cum/15/(numdrives-1);
printf("# numdrives=%d pad=%f\n",numdrives,pad);
while ("df" | getline >0){
print "# df: ",$0
if ($1 ~ /^\/dev\//){
dev=$1;
kbytes[dev]=$2;
used[dev]=$3;
mountpoint[dev]=$6;
}
}
print "unset label";
print "unset key";
print "set border 0";
print "set noxtics";
print "set noytics";
print "set nox2tics";
print "set noy2tics";
print "set xrange [0:5]";
print "set style data lines";
xmidlab=1.5; xrightlab=2; xleft=3; xright=4;
labelheight=cum/n+2;
for (pass=1; pass<=2; pass++){
lo=0; ly=0; ry=0;
if (pass==2) print "plot \"-\"";
for (i=1; i<=n; i++){
dev=device[i];
ly+=labelheight;
if (pass==1){
if (dev in mountpoint){
dir=mountpoint[dev];
} else {
dir="";
}
label=sprintf("%-10s %5d %-10s",
dev, blocks[dev]/1024, dir);
printf("set label \"%s\" at %d,%f right\n",
label, xrightlab,ly);
} else if (pass==2){
drive=dev;
sub(/[0-9]*$/,"",drive);
if (drive != prevdrive){
prevdrive=drive;
lo+=pad;
}
if (dev in mountpoint){
ry+=labelheight;
dir=mountpoint[dev];
use=used[dev];
kb=kbytes[dev];
} else {
dir="";
use=0;
kb=0;
}
printf("# %-12s %8d %8d %8d %-10s %s\n",
dev, blocks[dev], kb, use, dir, os[dev]);
hi=lo+blocks[dev];
printf("%d %d\n%d %d\n%d %d\n%d %d\n%d %d\n\n",
xleft,lo, xleft,hi, xright,hi, xright,lo, xleft,lo);
printf("%d %d\n%d %d\n", xleft,(lo+hi)/2, xrightlab,ly);
if (dev in mountpoint){
printf("\n\n");
} else {
printf("%f %d\n%f %d\n\n", xrightlab,ly, xmidlab, ly);
}
lo=hi;
}
}
}
print "e";
}' | gnuplot -persist
**********************************************************
To unsubscribe from this list, send mail to
[EMAIL PROTECTED] with the following text in the
*body* (*not* the subject line) of the letter:
unsubscribe gnhlug
**********************************************************