check_cache.pl
上传用户:liugui
上传日期:2007-01-04
资源大小:822k
文件大小:3k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. #!/usr/local/bin/perl
  2. # check_cache.pl 
  3. #
  4. # Squid-1.0 version by martin hamilton <m.t.hamilton@lut.ac.uk>
  5. # Squid-1.1 version by Bertold Kolics <bertold@tohotom.vein.hu>
  6. #
  7. # Check the Squid-1.1.x cache directory for stale objects - i.e. those
  8. # which exist on disk but aren't listed in cached's log file.
  9. # $Id: check_cache.pl,v 1.4 1997/02/03 23:42:21 wessels Exp $
  10. require "getopts.pl";
  11. &Getopts("c:drt:vh");
  12. # -c : the full path to squid.conf
  13. # -d : turn on debugging
  14. # -r : actually remove stale files
  15. # -t tmpdir : temporary directory
  16. # -v  : list stale files
  17. # -h  : print the help
  18. if ($opt_h) {
  19. print "Usage: check_cache.pl -drvh -c squid.confn";
  20. print "t-c the full path to squid.confn";
  21. print "t-d turn on debuggingn";
  22. print "t-r actually remove stale filesn";
  23. print "t-t temporary directoryn";
  24. print "t-v list stale filesn";
  25. print "t-h print the helpn";
  26. exit;
  27. }
  28. $squidconf = $opt_c || "/usr/local/squid/etc/squid.conf";
  29. open (squidconf) || die "$squidconf: $!n";
  30. $no_cachedir = 0;
  31. $swaplog = '';
  32. $level1dirno = 16;
  33. $level2dirno = 256;
  34. while (<squidconf>) {
  35. chop;
  36. if (/^cache_dirs+(.*)/) {
  37. push (@cachedir, $1);
  38. } elsif (/cache_swap_logs+(.*)/) {
  39. $swaplog = $1;
  40. } elsif (/swap_level1_dirs/) {
  41. $level1dirno = $1;
  42. } elsif (/swap_level21_dirs/) {
  43. $level2dirno = $1;
  44. }
  45. }
  46. close (squidconf);
  47. push (@cachedir, '/usr/local/squid/cache') unless ($#cachedir > $[-1);
  48. $swaplog = $cachedir[0] . '/log' unless ($swaplog);
  49. $no_cachedir = $#cachedir + 1;
  50. print "$no_cachedir CACHE DIRS: ", join(' ', @cachedir), "n" if ($opt_d);
  51. print "SWAP LOG: $swaplogn" if ($opt_d);
  52. $tmpdir = $opt_t || $ENV{TMPDIR} || "/var/tmp";
  53. chdir($tmpdir);
  54. # snarf file numbers from Squid log & sort em
  55. system("cut -f1 -d' ' $swaplog |tr [a-z] [A-Z] >pl$$");
  56. system("sort -T $tmpdir pl$$ >spl$$; rm pl$$");
  57. # get list of files in cache & sort em
  58. for ($i = 0 ; $i < $no_cachedir; $i++) {
  59. chdir($cachedir[i]);
  60. system("find ./ -print -type f > $tmpdir/fp$$");
  61. chdir($tmpdir);
  62. # this cut prints only the lines with 4 fields so unnecessary lines
  63. # are supressed
  64. system("cut -d'/' -f4 -s fp$$ >> cd$$ ; rm fp$$")
  65. }
  66. system("sort -T $tmpdir cd$$ >scd$$; rm cd$$");
  67. # get list of objects on disk (scd$$) but not in the log (spl$$)
  68. system("comm -13 spl$$ scd$$ >comm$$; rm spl$$ scd$$");
  69. chdir($tmpdir);
  70. # iterate through it
  71. open(IN, "comm$$") || die "Can't open temporary file $tmpdir/comm$$: $!";
  72. unlink("comm$$");
  73. while(<IN>) {
  74. chop;
  75. $filename = $_;
  76. # calculate the full path of the current filename
  77. $fileno = hex($filename);
  78. $dirno = $fileno % $no_cachedir;
  79. $a = $fileno / $no_cachedir;
  80. $level1 = sprintf("%02X", $a % $level1dirno);
  81. $level2 = sprintf("%02X", $a / $level1dirno % $level2dirno);
  82. $filename = "$cachedir[dirno]/$level1/$level2/$filename";
  83. next if -d "$filename"; # don't want directories
  84. print "$filenamen" if $opt_v; # print filename if asked
  85. # skip if cached file appeared since script started running
  86. if (-M $filename < 0) {
  87. print STDERR "skipping $filenamen" if $opt_d;
  88. next;
  89. }
  90. print "Orphan: $filenamen";
  91. unlink($filename) if $opt_r; # only remove if asked!
  92. }
  93. close(IN);