~ubuntu-branches/ubuntu/quantal/awstats/quantal

« back to all changes in this revision

Viewing changes to wwwroot/cgi-bin/plugins/timezone.pm

  • Committer: Bazaar Package Importer
  • Author(s): Jonas Smedegaard, Sergey B Kirpichev, Jonas Smedegaard
  • Date: 2011-03-12 19:44:25 UTC
  • mfrom: (1.2.8 upstream)
  • Revision ID: james.westby@ubuntu.com-20110312194425-hn7bo427pgqw2smz
Tags: 7.0~dfsg-1
* New upstream release.
  Closes: bug#613447.

[ Sergey B Kirpichev ]
* Unfuzz patches.
* Update patch 1008.
* Drop obsolete patches.
* Fix +x bit on *.js in docs/examples
* Avoid asterisks in debian/NEWS entries, to please lintian.
* Fix recode bulgarian tooltips file as utf-8.
  Closes: bug#610632.
* Forward patches 0007 and 1015 upstream.
* Allow DM (Debian Maintainer) uploads.

[ Jonas Smedegaard ]
* Update copyright file:
  + Rewrite using Subversion rev.173 of draft DEP5 format.
  + Add some previously missed authors and licenses.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
#!/usr/bin/perl
2
2
#-----------------------------------------------------------------------------
3
 
# TimeZone AWStats plugin
4
 
# Allow AWStats to correct a bad timezone for user of IIS that use strange
5
 
# log format.
6
 
#-----------------------------------------------------------------------------
7
 
# Perl Required Modules: None
8
 
#-----------------------------------------------------------------------------
9
 
# $Revision: 1.10 $ - $Author: eldy $ - $Date: 2004/07/11 10:44:41 $
10
 
 
11
 
 
12
 
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
13
 
# !!!!! This plugin reduces AWStats speed by 40% !!!!!
14
 
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
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
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
15
21
# <-----
16
22
# ENTER HERE THE USE COMMAND FOR ALL REQUIRED PERL MODULES
17
 
#use Time::Local 'timelocal_nocheck';
18
23
# ----->
19
24
use strict;no strict "refs";
20
25
 
33
38
# <-----
34
39
# IF YOUR PLUGIN NEED GLOBAL VARIABLES, THEY MUST BE DECLARED HERE.
35
40
use vars qw/
36
 
$PluginTimeZoneSeconds
 
41
$PluginTimeZoneZone
 
42
$PluginTimeZoneCache
37
43
/;
38
44
# ----->
39
45
 
40
46
 
41
 
 
42
47
#-----------------------------------------------------------------------------
43
48
# PLUGIN FUNCTION: Init_pluginname
44
49
#-----------------------------------------------------------------------------
47
52
 
48
53
        # <-----
49
54
        # ENTER HERE CODE TO DO INIT PLUGIN ACTIONS
50
 
        if (! $InitParams || int($InitParams) == 0) { return "Error: Disable plugin if TimeZone is 0 (Plugin useless)"; }       # We do not need this plugin if TZ=0
51
 
        $PluginTimeZoneSeconds=(int($InitParams)*3600);
 
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 = {};
52
65
        # ----->
53
66
 
54
67
        my $checkversion=&Check_Plugin_Version($PluginNeedAWStatsVersion);
 
68
 
55
69
        return ($checkversion?$checkversion:"$PluginHooksFunctions");
56
70
}
57
71
 
58
72
 
59
 
 
60
73
#-----------------------------------------------------------------------------
61
74
# PLUGIN FUNCTION: ChangeTime_pluginname
62
75
# UNIQUE: YES (Only one plugin using this function can be loaded)
63
76
#-----------------------------------------------------------------------------
64
77
sub ChangeTime_timezone {
65
 
        my $dateparts=shift;
66
 
        my ($nsec,$nmin,$nhour,$nmday,$nmon,$nyear,$nwday) = localtime(Time::Local::timelocal(int(@$dateparts[5]), int(@$dateparts[4]), int(@$dateparts[3]), int(@$dateparts[0]), int(@$dateparts[1])-1, int(@$dateparts[2])-1900) + $PluginTimeZoneSeconds);
67
 
        return ($nmday, $nmon+1, $nyear+1900, $nhour, $nmin, $nsec);
 
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;
68
138
}
69
139
 
70
140
 
73
143
# UNIQUE: YES (Only one plugin using this function can be loaded)
74
144
#-----------------------------------------------------------------------------
75
145
sub GetTimeZoneTitle_timezone {
76
 
        return ($PluginTimeZoneSeconds/3600);
 
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;
77
311
}
78
312
 
79
313