-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathaccess_log-date
executable file
·101 lines (81 loc) · 2.81 KB
/
access_log-date
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#!/usr/bin/env perl
#=====================================================================
# access_log-date
# File ID: 943dcc86-5d33-11df-9006-90e6ba3022ac
# Leser første og siste datoen i access_log og skifter navn på den til
# formatet NAVN.ååååmmddTttmmssZ-ååååmmddTttmmssZ.access_log
#
# ©opyleft 2004 Øyvind A. Holm <[email protected]>
# Lisens: GNU General Public License versjon 2 eller senere ♥
#=====================================================================
use strict;
use warnings;
use Time::Local;
use Getopt::Std;
our ($opt_h, $opt_n, $opt_s) =
( 0, "", 0);
getopts('hn:s');
$| = 1;
my %Mnd = (
'Jan' => 0, 'Feb' => 1, 'Mar' => 2, 'Apr' => 3, 'May' => 4, 'Jun' => 5,
'Jul' => 6, 'Aug' => 7, 'Sep' => 8, 'Oct' => 9, 'Nov' => 10, 'Dec' => 11
);
$opt_h && usage(0);
my $Name = length($opt_n) ? "$opt_n." : "";
my $File;
for $File (@ARGV) {
if (-e $File) {
my $Head = `head -1 $File`; # Halv-FIXME. Men det funker.
my $Tail = `tail -1 $File`;
if (length("$Head$Tail")) {
my $Destfil = sprintf("%s%s-%s.access_log", $Name, access_date($Head), access_date($Tail));
if (-e $Destfil) {
warn("$Destfil finnes allerede, skifter ikke filnavn.\n");
} else {
printf("%s → %s%s\n", $File, $Destfil, $opt_s ? " (simulerer)" : "");
unless ($opt_s) {
rename($File, $Destfil) || warn("rename($File, $Destfil): $!\n")
}
}
} else {
warn("$File: Fila er tom, skifter ikke navn på den.\n");
}
} else {
warn("$File: Finnes ikke.\n");
}
}
sub access_date {
my $Linje = shift;
my $Retval = "";
if ($Linje =~ m#^\S+\s+\S+\s+\S+\s+\[(\d\d)/(...)/(\d\d\d\d):(\d\d):(\d\d):(\d\d) ([+\-]\d\d)(\d\d)#) {
my ($Day, $Mon, $Year, $Hour, $Min, $Sec, $zone_hour, $zone_min) =
( $1, $2, $3, $4, $5, $6, $7, $8);
my $num_mnd = $Mnd{$Mon};
my $Secs = timegm($Sec, $Min, $Hour, $Day, $num_mnd, $Year);
$Secs -= ($zone_hour*3600 + $zone_min*60);
my ($u_sec, $u_min, $u_hour, $u_mday, $u_mon, $u_year, $u_wday, $u_yday) = gmtime($Secs);
$u_year += 1900; # Urgh
$Retval = sprintf("%04u%02u%02uT%02u%02u%02uZ", $u_year, $u_mon+1, $u_mday, $u_hour, $u_min, $u_sec);
} else {
die("Ukjent linjeformat: \"$Linje\", avbryter.\n");
}
return($Retval);
}
sub usage {
my $Retval = shift;
print(<<END);
Syntax: $0 [valg] fil [flere filer [...]]
Leser første og siste datoen i en access_log laget av Apache og skifter
filnavnet til [NAVN.]ååååmmddTttmmssZ-ååååmmddTttmmssZ.access_log
Valg:
-h Hjelpings.
-n NAVN Bruk NAVN som prefiks til filnavnet.
-s Simulering, ikke skift navn på fila.
Det er selvfølgelig UTC som brukes. Trenger head(1) og tail(1).
Krota sammen av Øyvind A. Holm <sunny\@sunbase.org>
Lisens: GNU General Public License versjon eller senere ♥
END
exit($Retval);
}
__END__
# End of file access_log-date