#/usr/local/bin/perl #We wanted to be able to provide a listing of new/recently changed items #in our Gopher server. The attached script is the tool I developed to #provide this. It generates a link file, so the listing is a directory, #not a flat file. The user-visible name is carried over. # #Usage: newitems /disk/path/name -#daysold server.domain.name #port # #The link file it generates is called .newlinks in the current directory. #If you place a file called .nonew in a directory, that directory is skipped. #If you place a file called .topnew in a directory, that directory will be #listed if any new files are found in that directory or its subdirectories. #This script depends on the gopherls tool which is a link to the gopherd #program, starting with version (approx) 1.0. You'll obviously be needing #Perl. # #This script seems to be working for me, but hasn't been tested exhaustively. # #Dennis ## newitems, boone, 09/30/92 # Generate a link file listing new items in the last n days # Copyright (C) 1992, Trustees of Michigan State University # # Modifications: # 09/30/92 Boone Initial coding # 10/01/92 Boone Added ability to exclude individual directories # End Modifications # Extract path part of pathname sub path { local($path) = @_; local($pathsep) = rindex($path, "/"); if ($pathsep < 0) { return ""; } else { $wanted = substr($path, 0, $pathsep+1); return $wanted; } } # Extract filename part of pathname sub base { local($path) = @_; local($pathsep) = rindex($path, "/"); if ($pathsep < 0) { return $path; } else { $wanted = substr($path, $pathsep+1); return $wanted; } } # Determine whether this item is part of a subtree which wants to be # announced as a single new entry if any file in it has changed. # Example: /news/newspapers/state_news contains a file called .topnew, # indicating that any file in the state news subtree will cause the # /news/newspapers/state_news entry to be listed once in the new items # list. sub skip { local(@args) = @_; foreach $i (@topnew) { if (index($args[0], $i) == 0) { $toplist{$i} = $args[0]; return 1; } else { } } return 0; } # Write a link file entry sub writelink { local($line, $path) = @_; local(@fields) = split(/\t/, $line); local($name) = substr($fields[0], 1); local($type) = substr($fields[0], 0, 1); print LF "Name=$name\nType=$type\nPath=$path\nHost=$host\nPort=$port\n\n"; } # The real code $[ = 0; if ($#ARGV < 3) { print STDERR "Usage: newitems path days host port\n"; exit(1); } open(LF, ">.newlinks") || die "Unable to create .newlinks\n"; chdir($ARGV[0]); chop($here = `pwd`); $days = $ARGV[1]; $host = $ARGV[2]; $port = $ARGV[3]; @topnew = `find . -name .topnew -print`; foreach $i (@topnew) { $i = &path($i); } open(NF, "find . -mtime $days -type f -print | grep -v .cap |") || die "Unable to spawn find\n"; while () { next if /\.cap/; next if /\.ts/; next if /\.bin/; chop; $path = &path($_); $base = &base($_); next if ($base =~ /^\./); chdir($path) || die "chdir($path) died: $!\n"; if (! -f ".nonew") { @lines = `/admin/bin/gopherls .`; foreach $i (@lines) { chop($i); chop($i); @fields = split(/\t/, $i); $thisname = substr($fields[1], 2); if ($thisname eq $base) { if (! &skip($_)) { &writelink($i, $_); } } undef(@fields); } undef(@lines); } chdir($here) || die "chdir($here) died: $!\n"; } foreach $i (keys %toplist) { chop($i); $base = &base($i); chdir($i) || die "chdir($path) died: $!\n"; chdir("..") || die "chdir(..) died: $!\n"; @lines = `/usr/local/etc/gopherls .`; foreach $j (@lines) { chop($j); chop($j); @fields = split(/\t/, $j); $thisname = substr($fields[1], 2); if ($thisname eq $base) { &writelink($j, $i); } undef(@fields); } undef(@lines); chdir($here) || die "chdir($here) died: $!\n"; } close(NF); close(LF); -- == If you choose not to decide, you still have made a choice. ==