Changesets can be listed by changeset number.
The Git repository is here.
- Revision:
- 297
- Log:
Updated to AWStats 7.0.
- Author:
- rool
- Date:
- Fri Mar 18 13:33:29 +0000 2011
- Size:
- 7253 Bytes
- Properties:
- Property svn:executable is set
1 | #!/usr/bin/perl |
2 | #----------------------------------------------------------------------------- |
3 | # TimeZone AWStats reloaded plugin |
4 | # |
5 | # Allow AWStats to convert GMT time stamps to local time zone |
6 | # taking into account daylight saving time. |
7 | # If the POSIX module is available, a target time zone name |
8 | # can be provided, otherwise the default system local time is used. |
9 | # For compatibility with the original version of this plugin, "-/+hours" |
10 | # is interpreted as a fixed difference to GMT. |
11 | # |
12 | # 2009 jacob@internet24.de |
13 | #----------------------------------------------------------------------------- |
14 | # Perl Required Modules: POSIX |
15 | #----------------------------------------------------------------------------- |
16 | |
17 | |
18 | # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
19 | # !!!!! This plugin reduces AWStats speed by about 10% !!!!! |
20 | # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
21 | # <----- |
22 | # ENTER HERE THE USE COMMAND FOR ALL REQUIRED PERL MODULES |
23 | # -----> |
24 | use strict;no strict "refs"; |
25 | |
26 | |
27 | |
28 | #----------------------------------------------------------------------------- |
29 | # PLUGIN VARIABLES |
30 | #----------------------------------------------------------------------------- |
31 | # <----- |
32 | # ENTER HERE THE MINIMUM AWSTATS VERSION REQUIRED BY YOUR PLUGIN |
33 | # AND THE NAME OF ALL FUNCTIONS THE PLUGIN MANAGE. |
34 | my $PluginNeedAWStatsVersion="5.1"; |
35 | my $PluginHooksFunctions="ChangeTime GetTimeZoneTitle"; |
36 | # -----> |
37 | |
38 | # <----- |
39 | # IF YOUR PLUGIN NEED GLOBAL VARIABLES, THEY MUST BE DECLARED HERE. |
40 | use vars qw/ |
41 | $PluginTimeZoneZone |
42 | $PluginTimeZoneCache |
43 | /; |
44 | # -----> |
45 | |
46 | |
47 | #----------------------------------------------------------------------------- |
48 | # PLUGIN FUNCTION: Init_pluginname |
49 | #----------------------------------------------------------------------------- |
50 | sub Init_timezone { |
51 | my $InitParams=shift; |
52 | |
53 | # <----- |
54 | # ENTER HERE CODE TO DO INIT PLUGIN ACTIONS |
55 | if ($InitParams) |
56 | { |
57 | if (!eval ('require "POSIX.pm"')) |
58 | { |
59 | return $@?"Error: $@":"Error: Need Perl module POSIX"; |
60 | } |
61 | } |
62 | |
63 | $PluginTimeZoneZone = "$InitParams"; |
64 | $PluginTimeZoneCache = {}; |
65 | # -----> |
66 | |
67 | my $checkversion=&Check_Plugin_Version($PluginNeedAWStatsVersion); |
68 | |
69 | return ($checkversion?$checkversion:"$PluginHooksFunctions"); |
70 | } |
71 | |
72 | |
73 | #----------------------------------------------------------------------------- |
74 | # PLUGIN FUNCTION: ChangeTime_pluginname |
75 | # UNIQUE: YES (Only one plugin using this function can be loaded) |
76 | #----------------------------------------------------------------------------- |
77 | sub ChangeTime_timezone { |
78 | my @d = @{$_[0]}; |
79 | my $e = $PluginTimeZoneCache->{$d[2]}; |
80 | my ($i); |
81 | |
82 | |
83 | unless ($e) { |
84 | $e = $PluginTimeZoneCache->{$d[2]} = [ |
85 | tz_find_zone_diff($PluginTimeZoneZone, $d[2]), |
86 | tz_find_month_length($PluginTimeZoneZone, $d[2]) |
87 | ] |
88 | } |
89 | |
90 | INTERVAL: foreach $i (@{@$e[0]}) { |
91 | foreach (1,0,3,4,5) { |
92 | next INTERVAL if $d[$_]>@$i[$_]; |
93 | last if $d[$_]<@$i[$_]; |
94 | } |
95 | |
96 | $d[5] += @$i[8]; |
97 | if ( $d[5]<0 ) { |
98 | $d[5] += 60, $d[4]--; |
99 | } elsif ( $d[5]>59 ) { |
100 | $d[5] -= 60, $d[4]++; |
101 | } |
102 | |
103 | $d[4] += @$i[7]; |
104 | if ( $d[4]<0 ) { |
105 | $d[4] += 60, $d[3]--; |
106 | } elsif ( $d[4]>59 ) { |
107 | $d[4] -= 60, $d[3]++; |
108 | } |
109 | |
110 | $d[3] += @$i[6]; |
111 | if ( $d[3]<0 ) { |
112 | $d[3] += 24, $d[0]--; |
113 | } elsif ( $d[3]>23 ) { |
114 | $d[3] -= 24, $d[0]++; |
115 | } else { |
116 | return @d; |
117 | } |
118 | |
119 | if ($d[0]<1) { |
120 | $d[1]--; |
121 | if ( $d[1]<1 ) { |
122 | $d[2]--, $d[1] = 12, $d[0] = 31; |
123 | } else { |
124 | $d[0] = $e->[1][$d[1]]; |
125 | } |
126 | } elsif ($d[0]>$e->[1][$d[1]]) { |
127 | $d[1]++, $d[0]=1; |
128 | if ( $d[1]>12 ) { |
129 | $d[2]++, $d[1] = 1; |
130 | } |
131 | } |
132 | |
133 | return @d; |
134 | } |
135 | |
136 | # This should never be reached |
137 | return @d; |
138 | } |
139 | |
140 | |
141 | #----------------------------------------------------------------------------- |
142 | # PLUGIN FUNCTION: GetTimeZoneTitle_pluginname |
143 | # UNIQUE: YES (Only one plugin using this function can be loaded) |
144 | #----------------------------------------------------------------------------- |
145 | sub GetTimeZoneTitle_timezone { |
146 | return $PluginTimeZoneZone; |
147 | } |
148 | |
149 | |
150 | #----------------------------------------------------------------------------- |
151 | # Tools |
152 | #----------------------------------------------------------------------------- |
153 | |
154 | # convenience wrappers |
155 | sub tz_mktime |
156 | { |
157 | return timegm($_[0], $_[1], $_[2], |
158 | $_[3], $_[4]-1, $_[5]-1900, 0, 0, -1); |
159 | } |
160 | sub tz_interval |
161 | { |
162 | my ($time, $shift) = @_; |
163 | |
164 | my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = |
165 | gmtime($time); |
166 | |
167 | return [ |
168 | $mday, |
169 | $mon+1, |
170 | 2147483647, # max(int32) |
171 | $hour, |
172 | $min, |
173 | $sec, |
174 | int($shift/3600), |
175 | int(($shift%3600)/60), |
176 | int(($shift%60)), |
177 | ] |
178 | } |
179 | |
180 | |
181 | # return largest $value between $left and $right |
182 | # whose tz_shift is equal to that of $left |
183 | sub tz_find_break |
184 | { |
185 | my ($left, $right) = @_; |
186 | |
187 | return undef if $left>$right; |
188 | |
189 | return $left if ($right-$left)<=1; |
190 | |
191 | my $middle = int(($right+$left)/2); |
192 | my ($leftshift, $rightshift, $middleshift) = |
193 | (tz_shift($left), tz_shift($right), tz_shift($middle)); |
194 | |
195 | if ($leftshift == $middleshift) { |
196 | return undef if $rightshift == $middleshift; |
197 | return tz_find_break($middle, $right); |
198 | } |
199 | elsif ($rightshift == $middleshift) { |
200 | return tz_find_break($left, $middle); |
201 | } |
202 | } |
203 | |
204 | |
205 | # compute difference beetween localtime and gmtime in seconds |
206 | # for unix time stamp $time |
207 | sub tz_shift |
208 | { |
209 | my ($time) = @_; |
210 | |
211 | my ($lsec,$lmin,$lhour,$lmday,$lmon,$lyear,$lwday,$lyday,$lisdst) = |
212 | localtime($time); |
213 | my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = |
214 | gmtime($time); |
215 | |
216 | my $day_change = $lyear-$year; |
217 | $day_change = $lmon-$mon unless $day_change; |
218 | $day_change = $lmday-$mday unless $day_change; |
219 | |
220 | my $hour_diff = $lhour-$hour; |
221 | my $min_diff = $lmin-$min; |
222 | my $sec_diff = $lsec-$sec; |
223 | |
224 | if ($day_change>0) { |
225 | $hour_diff +=24; |
226 | } |
227 | elsif($day_change<0) { |
228 | $hour_diff -=24; |
229 | } |
230 | |
231 | return (($hour_diff*60)+$min_diff)*60+$sec_diff; |
232 | } |
233 | |
234 | |
235 | # Compute time zone shift intervals for $year |
236 | # and time zone $zone |
237 | sub tz_find_zone_diff |
238 | { |
239 | my ($zone, $year) = @_; |
240 | |
241 | my $othertz = $PluginTimeZoneZone && |
242 | $PluginTimeZoneZone !~ m/^[+-]?\d+$/; |
243 | |
244 | my ($left, $middle, $right); |
245 | my ($leftshift, $middleshift, $rightshift); |
246 | |
247 | { |
248 | local $ENV{TZ} = $zone |
249 | if $othertz; |
250 | |
251 | $left = tz_mktime(0,0,0,1,1,$year); |
252 | $middle = tz_mktime(0,0,0,1,7,$year); |
253 | $right = tz_mktime(59,59,23,31,12,$year); |
254 | |
255 | if (!$PluginTimeZoneZone || $PluginTimeZoneZone !~ m/^[+-]?\d+$/) |
256 | { |
257 | $leftshift = tz_shift($left); |
258 | $middleshift = tz_shift($middle); |
259 | $rightshift = tz_shift($right) |
260 | } |
261 | else |
262 | { |
263 | $leftshift = $middleshift = $rightshift = |
264 | int($PluginTimeZoneZone)*3600; |
265 | } |
266 | |
267 | if ($leftshift != $rightshift || $rightshift != $middleshift) { |
268 | return |
269 | [ |
270 | tz_interval(tz_find_break($left, $middle), $leftshift), |
271 | tz_interval(tz_find_break($middle, $right), $middleshift), |
272 | tz_interval($right, $rightshift) |
273 | ] |
274 | } |
275 | |
276 | POSIX::tzset() if $othertz; |
277 | } |
278 | |
279 | POSIX::tzset() if $othertz; |
280 | |
281 | return [ tz_interval($right, $rightshift) ] |
282 | } |
283 | |
284 | |
285 | # Compute number of days in all months for $year |
286 | sub tz_find_month_length |
287 | { |
288 | my ($zone, $year) = @_; |
289 | |
290 | my $othertz = $PluginTimeZoneZone && |
291 | $PluginTimeZoneZone !~ m/^[+-]?\d+$/; |
292 | |
293 | my $months = [ undef, 31, 28, 31, 30, 31, 30, |
294 | 31, 31, 30, 31, 30, 31 ]; |
295 | |
296 | { |
297 | local $ENV{TZ} = $zone |
298 | if $othertz; |
299 | |
300 | # leap year? |
301 | $months->[2] = 29 if |
302 | (localtime(tz_mktime(0, 0, 12, 28, 2, $year)+86400))[4] |
303 | == 1; |
304 | |
305 | POSIX::tzset() if $othertz; |
306 | } |
307 | |
308 | POSIX::tzset() if $othertz; |
309 | |
310 | return $months; |
311 | } |
312 | |
313 | |
314 | 1; # Do not remove this line |