]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blob - config/updxlrator/lscache
Started core37.
[people/pmueller/ipfire-2.x.git] / config / updxlrator / lscache
1 #!/usr/bin/perl
2 #
3 # This code is distributed under the terms of the GPL
4 #
5 # (c) 2006-2008 marco.s - http://update-accelerator.advproxy.net
6 #
7 # $Id: lscache,v 1.0 2007/09/11 00:00:00 marco.s Exp $
8 #
9
10 use strict;
11 use Getopt::Std;
12
13 my $swroot='/var/ipfire';
14 my $apphome="$swroot/updatexlrator";
15 my $repository='/var/updatecache';
16 my $updatefile='';
17 my $sourceurl='';
18 my $filesize=0;
19 my $totalfilesize=0;
20 my $cachedtraffic=0;
21 my @updatelist=();
22 my @sources=();
23 my @requests=();
24 my @filelist=();
25 my $objectdir='';
26 my @tmp;
27 my $counts=0;
28 my $filedate;
29 my $lastaccess;
30 my $vendorid;
31 my @vendors=();
32 my $numfiles=0;
33 my $cachehits=0;
34 my $efficiency='0.0';
35 my %vendorstats=();
36 my $maxlength_filesize=0;
37 my $maxlength_request=0;
38 my $maxlength_vendorid=0;
39
40
41 getopts('adfs');
42
43 foreach (<$repository/*>)
44 {
45 if (-d $_)
46 {
47 unless ((/^$repository\/download$/) || (/^$repository\/lost\+found$/)) { push(@sources,$_); }
48 }
49 }
50
51 foreach (@sources)
52 {
53 $vendorid=substr($_,rindex($_,'/')+1,length($_));
54 push(@vendors,$vendorid);
55 @updatelist=<$_/*>;
56 foreach $objectdir (@updatelist)
57 {
58 if (-e "$objectdir/source.url")
59 {
60 open (FILE,"$objectdir/source.url");
61 $sourceurl=<FILE>;
62 close FILE;
63 chomp($sourceurl);
64 $updatefile = substr($sourceurl,rindex($sourceurl,'/')+1,length($sourceurl));
65 #
66 # Get filesize and calculate max length for output
67 #
68 $filesize = (-s "$objectdir/$updatefile");
69 if (length($filesize) > $maxlength_filesize) { $maxlength_filesize = length($filesize); }
70 #
71 # Total file size
72 #
73 $totalfilesize += $filesize;
74 #
75 # File size for this source
76 #
77 $vendorstats{$vendorid . "_filesize"} += $filesize;
78 #
79 # Number of requests from cache for this source
80 #
81 open (FILE,"$objectdir/access.log");
82 @requests=<FILE>;
83 close FILE;
84 chomp(@requests);
85 $counts = @requests;
86 $counts--;
87 $vendorstats{$vendorid . "_requests"} += $counts;
88 $cachehits += $counts;
89 #
90 # Calculate cache hits max length for output
91 #
92 if (length($cachehits) > $maxlength_request) { $maxlength_request = length($cachehits); }
93 #
94 # Get last cache access date
95 #
96 my ($SECdt,$MINdt,$HOURdt,$DAYdt,$MONTHdt,$YEARdt) = localtime($requests[-1]);
97 $DAYdt = sprintf ("%.02d",$DAYdt);
98 $MONTHdt = sprintf ("%.02d",$MONTHdt+1);
99 $YEARdt = sprintf ("%.04d",$YEARdt+1900);
100 if (($counts) && ($requests[-1] =~ /^\d+/) && ($requests[-1] >= 1))
101 {
102 $lastaccess = $YEARdt."-".$MONTHdt."-".$DAYdt;
103 } else {
104 $lastaccess = ' ';
105 }
106 #
107 # Get file modification time
108 #
109 ($SECdt,$MINdt,$HOURdt,$DAYdt,$MONTHdt,$YEARdt) = localtime(&getmtime("$objectdir/$updatefile"));
110 $DAYdt = sprintf ("%.02d",$DAYdt);
111 $MONTHdt = sprintf ("%.02d",$MONTHdt+1);
112 $YEARdt = sprintf ("%.04d",$YEARdt+1900);
113 $filedate = $YEARdt."-".$MONTHdt."-".$DAYdt;
114 #
115 # Total number of files in cache
116 #
117 $numfiles++;
118 #
119 # Number of files for this source
120 #
121 $vendorstats{$vendorid . "_files"}++;
122 #
123 # Count cache status occurences
124 #
125 open (FILE,"$objectdir/status");
126 $_=<FILE>;
127 close FILE;
128 chomp;
129 $vendorstats{$vendorid . "_" . $_}++;
130 #
131 # Calculate cached traffic for this source
132 #
133 $vendorstats{$vendorid . "_cachehits"} += $counts * $filesize;
134 #
135 # Calculate total cached traffic
136 #
137 $cachedtraffic += $counts * $filesize;
138 #
139 # Calculate vendor ID max length for output
140 #
141 if (length($vendorid) > $maxlength_vendorid) { $maxlength_vendorid = length($vendorid); }
142 #
143 # Add record to filelist
144 #
145 push (@filelist,"$filesize;$filedate;$counts;$lastaccess;$vendorid;$objectdir;$updatefile");
146 }
147 }
148 }
149
150 @filelist || die "No matching files found in cache\n";
151
152 #
153 # Process statistics for output
154 #
155
156 if ($Getopt::Std::opt_s)
157 {
158 foreach (@vendors)
159 {
160 print "$_\n";
161 printf "%5d %s", $vendorstats{$_ . "_files"}, "files in cache\n";
162 printf "%5d %s", $vendorstats{$_ . "_requests"}, "files from cache\n";
163 printf "%5d %s", $vendorstats{$_ . "_1"}, "files 'Ok'\n";
164 printf "%5d %s", $vendorstats{$_ . "_3"}, "files 'No source'\n";
165 printf "%5d %s", $vendorstats{$_ . "_2"}, "files 'Outdated'\n";
166 printf "%5d %s", $vendorstats{$_ . "_0"}, "files 'Unknown'\n";
167 unless ($vendorstats{$_ . "_filesize"}) { $vendorstats{$_ . "_filesize"} = '0'; }
168 1 while $vendorstats{$_ . "_filesize"} =~ s/^(-?\d+)(\d{3})/$1.$2/;
169 printf "%15s %s", $vendorstats{$_ . "_filesize"}, "bytes in cache\n";
170 unless ($vendorstats{$_ . "_cachehits"}) { $vendorstats{$_ . "_cachehits"} = '0'; }
171 1 while $vendorstats{$_ . "_cachehits"} =~ s/^(-?\d+)(\d{3})/$1.$2/;
172 printf "%15s %s", $vendorstats{$_ . "_cachehits"}, "bytes from cache\n\n";
173 }
174
175 if ($numfiles) { $efficiency = sprintf("%.1f", $cachehits / $numfiles); }
176 1 while $totalfilesize =~ s/^(-?\d+)(\d{3})/$1.$2/;
177 1 while $cachedtraffic =~ s/^(-?\d+)(\d{3})/$1.$2/;
178 print "\nTotal files in cache: $numfiles\n";
179 print "Total cache size: $totalfilesize bytes\n";
180 print "Delivered from cache: $cachedtraffic bytes\n";
181 print "Cache efficiency index: $efficiency\n";
182
183 exit;
184 }
185
186 #
187 # Process filelist for output
188 #
189
190 foreach (@filelist)
191 {
192 @tmp = split(';');
193 printf "%$maxlength_filesize\d %s ",$tmp[0],$tmp[1];
194 if ($Getopt::Std::opt_a) { printf "%$maxlength_request\d %s ",$tmp[2],$tmp[3]; }
195 if ($Getopt::Std::opt_d) { printf "%-$maxlength_vendorid\s ",$tmp[4]; }
196 if ($Getopt::Std::opt_f) { print "$tmp[5]/"; }
197 print "$tmp[6]\n";
198 }
199
200
201 # -------------------------------------------------------------------
202
203 sub getmtime
204 {
205 my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat($_[0]);
206
207 return $mtime;
208 }
209
210 # -------------------------------------------------------------------
211
212 sub VERSION_MESSAGE
213 {
214 $Getopt::Std::STANDARD_HELP_VERSION=1;
215 print <<EOM
216 lscache (Update Accelerator coreutils) 1.00
217 Copyright (c) 2006-2008 marco.s - http://update-accelerator.advproxy.net
218 EOM
219 ;
220 }
221
222 # -------------------------------------------------------------------
223
224 sub HELP_MESSAGE
225 {
226 print <<EOM
227
228 Usage: lscache [-adf | -s]
229
230 Shows details about the Update Accelerator cache content
231
232 File listing:
233 -a list number of cache hits and last access date
234 -d list download source
235 -f list full cache path
236
237 Statistics:
238 -s show statistics by source
239
240 --help display this help
241 --version output version information
242 EOM
243 ;
244 }
245
246 # -------------------------------------------------------------------