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

代理服务器

开发平台:

Unix_Linux

  1. #!/usr/local/bin/perl
  2. # $Id: upgrade-1.0-store.pl,v 1.2 1996/10/11 19:56:06 wessels Exp $
  3. select(STDERR); $|=1;
  4. select(STDOUT); $|=1;
  5. $USAGE="Usage: $0 swaplog cachedir1 cachedir2 ...n";
  6. $dry_run = 0;
  7. $swaplog = shift || die $USAGE;
  8. (@cachedirs = @ARGV) || die $USAGE;
  9. $ncache_dirs = $#cachedirs + 1;
  10. $OLD_SWAP_DIRECTORIES = 100;
  11. $NEW_SWAP_DIRECTORIES_L1 = 16;
  12. $NEW_SWAP_DIRECTORIES_L2 = 256;
  13. $EEXIST = 17;  # check your /usr/include/errno.h
  14. print <<EOF;
  15. This script converts Squid 1.0 cache directories to the Squid 1.1
  16. format.  The first step is to create the new directory structure.
  17. The second step is to link the swapfiles from the old directories
  18. into the new directories.  After this script runs you must manually
  19. remove the old directories.
  20. Filesystem operations are slow, so this script may take a while.
  21. Your cache should NOT be running while this script runs.
  22. Are you ready to proceed?
  23. EOF
  24. $ans = <STDIN>;
  25. exit(1) unless ($ans =~ /^y$/ || $ans =~ /^yes$/);
  26. # make new directories
  27. foreach $c (@cachedirs) {
  28. $cn = "$c.new";
  29. &my_mkdir ($cn);
  30. foreach $d1 (0..($NEW_SWAP_DIRECTORIES_L1-1)) {
  31. $p1 = sprintf ("$cn/%02X", $d1);
  32. &my_mkdir ($p1);
  33. foreach $d2 (0..($NEW_SWAP_DIRECTORIES_L2-1)) {
  34. $p2 = sprintf ("$p1/%02X", $d2);
  35. &my_mkdir ($p2);
  36. }
  37. }
  38. }
  39. $newlog = "$swaplog.1.1";
  40. open (newlog, ">$newlog") || die "$newlog: $!n";
  41. select(newlog); $|=1; select(STDOUT);
  42. open (swaplog) || die "$swaplog: $!n";
  43. $count = 0;
  44. while (<swaplog>) {
  45. chop;
  46. ($file,$url,$expires,$timestamp,$size) = split;
  47. @F = split('/', $file);
  48. $oldfileno = pop @F;
  49. $oldpath = &old_fileno_to_path($oldfileno);
  50. unless (@S = stat($oldpath)) {
  51. print "$oldpath: $!n";
  52. next;
  53. }
  54. unless ($S[7] == $size) {
  55. print "$oldpath: Wrong Size.n";
  56. next;
  57. }
  58. $newpath = &new_fileno_to_path($oldfileno);
  59. next unless &my_link($oldpath,$newpath);
  60. printf newlog "%08x %08x %08x %08x %9d %sn",
  61. $oldfileno,
  62. $timestamp,
  63. $expires,
  64. $timestamp, # lastmod
  65. $size,
  66. $url;
  67. $count++;
  68. }
  69. print <<EOF;
  70. Done converting.
  71. $count files were linked to the new directories.
  72. At this point you need to manually run these commands:
  73. EOF
  74. foreach $c (@cachedirs) {
  75.     print "    /bin/mv $c $c.old; /bin/mv $c.new $cn";
  76. }
  77. print <<EOF;
  78.     /bin/mv $swaplog $swaplog.old; /bin/mv $newlog $swaplogn";
  79. And then start up Squid version 1.1.
  80. EOF
  81. exit(0);
  82. sub old_fileno_to_path {
  83. local($fn) = @_;
  84. sprintf ("%s/%02d/%d",
  85. $cachedirs[$fn % $ncache_dirs],
  86. ($fn / $ncache_dirs) % $OLD_SWAP_DIRECTORIES,
  87. $fn);
  88. }
  89. sub new_fileno_to_path {
  90. local($fn) = @_;
  91. sprintf ("%s.new/%02X/%02X/%08X",
  92. $cachedirs[$fn % $ncache_dirs],
  93. ($fn / $ncache_dirs) % $NEW_SWAP_DIRECTORIES_L1,
  94. ($fn / $ncache_dirs) / $NEW_SWAP_DIRECTORIES_L1 % $NEW_SWAP_DIRECTORIES_L2,
  95. $fn);
  96. }
  97. sub my_mkdir {
  98. local($p) = @_;
  99. print "Making $p...n";
  100. return if ($dry_run);
  101. unless (mkdir ($p, 0755)) {
  102. return 1 if ($! == $EEXIST);
  103. die "$p: $!n";
  104. }
  105. }
  106. sub my_link {
  107. local($f,$t) = @_;
  108. print "$f --> $tn";
  109. return 1 if ($dry_run);
  110. unlink($t);
  111. $rc = link ($f,$t);
  112. warn "$t: $!n" unless ($rc);
  113. $rc;
  114. }