150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#!/bin/sh 250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#$Id$ 350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o# Create Adobe-PostScript file that graphically displays the output of 450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o# dumpe2fs(8). Use "dumpe2fs | dconf" to create a PostScript file on stdout. 550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o# Developed and tested for Linux 1.0. 650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o# Copyright (c) 1994 750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o# Ulrich Windl 850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o# ALte Regensburger Strasse 11a 950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o# D-93149 Nittenau, Germany 1050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o# <Ulrich.Windl@rz.uni-regensburg.de> 1150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oSELF=`basename $0` 1250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oAWKFILE=/tmp/${SELF}.awk 1350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oTEMPFILE=/tmp/${SELF}.tmp 1450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oecho ' 1550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oBEGIN { 1650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o print "B" 1750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o} 1850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o/^Inode count:/ { 1950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o ic=$3; next 2050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o} 2150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o/^Block count:/ { 2250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o bc=$3; next 2350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o} 2450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o/^First block:/ { 2550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o fb=$3; next 2650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o} 2750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o/^Block size:/ { 2850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o bs=$3; next 2950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o} 3050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o/^Blocks per group:/ { 3150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o bpg=$4 3250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o printf("BC %d\n", bpg) 3350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o printf("GC %d\n", (bc + bpg - 1) / bpg) 3450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o next 3550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o} 3650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o/^Inodes per group:/ { 3750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o ipg=$4; next 3850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o} 3950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o/^Last write time:/ { 4050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o lwtime=$0; gsub("Last write time:[ ]+", "", lwtime) 4150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o printf("T %s\n", lwtime) 4250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o next 4350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o} 4450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o/^Group [0-9]+:/ { 4550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o group=$2; gsub(":", "", group) 4650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o block="" 4750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o group_start=group*bpg+fb 4850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o group_end=group_start+bpg 4950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o printf("G %d : %d - %d\n", group, group_start, group_end) 5050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o next 5150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o} 5250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o/^[ ]+Free blocks: / { 5350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o for ( i=3; i < NF; ++i ) { 5450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o block=$i; gsub(",", "", block) 5550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o if ( index(block, "-") == 0 ) block=block "-" block 5650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o pos=index(block, "-") 5750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o printf("FB %d-%d\n", 5850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o substr(block, 0, pos) - group_start, 5950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o substr(block, pos + 1) - group_start) 6050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o } 6150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o if ( block == "" ) printf("Group %d is full\n", group) 6250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o print "----" 6350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o next 6450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o} 6550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oEND { 6650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o printf("E %s\n", lwtime) 6750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}' >$AWKFILE 6850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oawk -f $AWKFILE $* >$TEMPFILE 6950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oecho ' 7050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oBEGIN { 7150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o printf("%%!PS-Adobe\n") 7250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o printf("%%%%BoundingBox: 0 0 1 1\n") 7350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o printf("/rect {/y2 exch def /x2 exch def /y1 exch def /x1 exch def\n") 7450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o printf(" newpath x1 y1 moveto x2 y1 lineto x2 y2 lineto\n") 7550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o printf(" x1 y2 lineto closepath} def\n") 7650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o printf("/fb {rect gsave 1.0 setgray fill grestore} def\n") 7750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o printf("/dg {rect gsave gsave 0.0 setgray fill grestore\n") 7850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o printf(" 0.5 setgray stroke grestore} def\n") 7950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o printf("/textxy {moveto show} bind def\n") 8050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o printf("0.0001 setlinewidth\n") 8150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o} 8250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o$1 == "GC" && NF == 2 { 8350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o number_of_groups=$2 8450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o printf("/Times-Roman findfont %g scalefont setfont\n", 8550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o 1.0 / number_of_groups) 8650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o next 8750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o} 8850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o$1 == "BC" && NF == 2 { 8950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o blocks_per_group=$2; next 9050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o} 9150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o$1 == "T" && NF > 1 { 9250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o printf("(%s) %g %g textxy\n", 9350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o substr($0, 2), 0, 1.02) 9450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o next 9550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o} 9650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o$1 == "G" && NF == 6 && $3 == ":" && $5 == "-" { 9750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o group_index=$2 9850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o gs=$4 9950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o ge=$6 10050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o height=1.0 / number_of_groups 10150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o vstart=group_index * height 10250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o printf("%% group %d of %d:\n0 %g 1 %g dg\n", 10350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o group_index, number_of_groups, vstart, vstart + height) 10450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o printf("(Group %s) 1.02 %g textxy\n", group_index, vstart) 10550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o next 10650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o} 10750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o$1 == "FB" && NF == 2 { 10850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o pos = index($2, "-") 10950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o printf("%% hole %s\n%g %g %g %g fb\n", 11050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o $2, substr($2, 0, pos) / blocks_per_group, vstart, 11150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o (substr($2, pos + 1) + 1) / blocks_per_group, vstart + height) 11250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o next 11350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o} 11450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oEND { 11550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o printf("%%%%EOF\n") 11650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o} 11750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o' >$AWKFILE 11850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oawk -f $AWKFILE $TEMPFILE 119