`til-kron` works
[sunny256-utils.git] / split_access_log
blob222fb4e2808c94a4c784ca140d0fbdc2a12989d6
1 #!/usr/bin/env perl
3 #=====================================================================
4 # split_access_log
5 # File ID: 56261aa0-5d44-11df-9a99-90e6ba3022ac
6 # Splitter opp access_log fra httpd(8) på dato. Legger delene som
7 # $Dir/åååå/[NAVN.]åååå-mm-ddZ[.EXT] .
9 # ©opyleft 2001–2004 Øyvind A. Holm <sunny@sunbase.org>
10 # Lisens: GNU General Public License versjon 2 eller nyere ♥
11 #=====================================================================
13 use strict;
14 use warnings;
15 use Time::Local;
16 use Getopt::Std;
18 our ($opt_d, $opt_e, $opt_h, $opt_n, $opt_z) =
19 ( "", "UNDEF-E", 0, "", 0);
20 getopts('d:e:hn:z');
22 $| = 1;
24 my %Mnd = (
25 'Jan' => 0, 'Feb' => 1, 'Mar' => 2,
26 'Apr' => 3, 'May' => 4, 'Jun' => 5,
27 'Jul' => 6, 'Aug' => 7, 'Sep' => 8,
28 'Oct' => 9, 'Nov' => 10, 'Dec' => 11
31 my ( $Dir, $Ext, $Fnavn, $Last, $compress_file) =
32 ("out", ".access_log", "", "", $opt_z);
34 my $Name = length($opt_n) ? "$opt_n." : "";
36 ($opt_e eq "UNDEF-E") ||
37 ($Ext = sprintf("%s%s",
38 length($opt_e) ? "." : "",
39 $opt_e));
41 $opt_h && usage(0);
43 length($opt_d) && ($Dir = $opt_d);
44 -d $Dir || mkdir($Dir, 0777) || die("mkdir(\"$Dir\"): $!");
46 while (<>) {
47 if (m#^
48 \S+.*? \x20
49 \[(\d\d)/(...)/(\d{4}):(\d\d):(\d\d):(\d\d)
50 \x20
51 ([+\-]\d\d)(\d\d)
53 ) {
54 my ($Day, $Mon, $Year, $Hour, $Min, $Sec) =
55 ( $1, $2, $3, $4, $5, $6);
56 my ($zone_hour, $zone_min) =
57 ( $7, $8);
58 my $num_mnd = $Mnd{$Mon};
59 defined($num_mnd) || goto UNKNOWN_LINE_FORMAT;
60 my $Secs = timegm($Sec, $Min, $Hour, $Day, $num_mnd, $Year);
61 $Secs -= ($zone_hour*3600 + $zone_min*60);
62 my ($u_sec, $u_min, $u_hour,
63 $u_mday, $u_mon, $u_year,
64 $u_wday, $u_yday) = gmtime($Secs);
65 $u_year += 1900; # Urgh
66 $u_mon += 1; # Dobbelturgh
67 $Fnavn = sprintf("%s/%04u/%s%04u-%02u-%02uZ%s",
68 $Dir, $u_year, $Name, $u_year, $u_mon, $u_mday,
69 $Ext);
70 if ($Fnavn ne $Last) {
71 if ($compress_file && -e $Last) {
72 close(ToFP);
73 unless (-e "$Last.gz") {
74 print(STDERR "Kjører \"/bin/gzip -N $Last &\"\n");
75 system("/bin/gzip -N $Last &");
76 } else {
77 warn("$Last.gz: Fila eksisterer allerede, " .
78 "pakker ikke $Last . Må ordnes manuelt.\n");
81 -d "$Dir/$u_year" || mkdir("$Dir/$u_year", 0777) ||
82 die("$0: mkdir(\"$Dir/$u_year\"): $!. R.I.P. & sånn.");
83 if (-e $Fnavn) {
84 warn("$Fnavn: Fila finnes fra før, skriver til " .
85 "\"$Fnavn.DUP\".\n");
86 my $op_pref = (-e "$Fnavn.DUP") ? ">>" : ">";
87 if (open(ToFP, "$op_pref$Fnavn.DUP")) {
88 seek(ToFP, 0, 2) ||
89 die("$Fnavn.DUP: seek() til slutten: $!");
90 } else {
91 die("$Fnavn.DUP: Åpning for skriving: $!");
93 } else {
94 print(STDERR "Ny fil: \"$Fnavn\"\n");
95 if (open(ToFP, ">$Fnavn")) {
96 seek(ToFP, 0, 2) ||
97 die("$Fnavn: seek() til slutten: $!");
98 } else {
99 die("$Fnavn: Åpning for skriving: $!");
103 print(ToFP $_) ||
104 die("Feil under skriving til $Fnavn(.DUP): $!");
105 } else {
106 UNKNOWN_LINE_FORMAT:
107 my $err_name = length($Fnavn) ? "$Fnavn.ERR" : "$Dir/undef.ERR";
108 warn("Linje $.: Ukjent format, skriver til \"$err_name\".\n");
109 my $op_pref = (-e "$err_name") ? ">>" : ">";
110 if (open(ErrFP, "$op_pref$err_name")) {
111 seek(ErrFP, 0, 2) ||
112 die("$err_name: seek() til slutten: $!");
113 } else {
114 die("$err_name: Åpning for skriving: $!");
116 print(ErrFP $_) || die("Feil under skriving til $err_name: $!");
117 close(ErrFP);
119 $Last = $Fnavn;
122 sub usage {
123 my $Retval = shift;
125 print(<<END);
127 Syntax: $0 [valg] [fil [flere filer [...]]]
129 Programmet leser access_log laget av Apache fra stdin eller filnavn på
130 kommandolinja og splitter dem i deler på formatet
131 DIR/åååå/[NAVN.]åååå-mm-ddZ.access_log .
133 Valg:
135 -d DIR Plassér filene i DIR . Standard: "$Dir".
136 -e EXT Bruk EXT som extension. (Automatisk punktum i begynnelsen.)
137 Standard: "$Ext".
138 -h Hjælp mæ.
139 -n NAVN Bruk NAVN som valgfritt prefiks i filnavnet. Automatisk punktum
140 på slutten. Standard: "$Name".
141 -z Pakk filene etterhvert som de er ferdigsplitta.
143 Den splitter selvfølgelig opp filene på grunnlag av GMT. Folkeaksjonen
144 Mot Sommertid slår til igjen. Ikke det med sol, utepils og miniskjørt
145 her og der, men den klokkefløttinga er uendelig plagsom og lager i
146 tillegg unøyaktighet i loggene.
148 Krota sammen av Øyvind A. Holm <sunny\@sunbase.org>.
149 Lisens: GNU General Public License versjon 2 eller nyere ♥
152 exit($Retval);
153 } # usage()
155 __END__
157 =pod
159 =head1 LICENCE
161 This program is free software; you can redistribute it and/or modify it
162 under the terms of the GNU General Public License as published by the
163 Free Software Foundation; either version 2 of the License, or (at your
164 option) any later version.
166 This program is distributed in the hope that it will be useful, but
167 WITHOUT ANY WARRANTY; without even the implied warranty of
168 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
169 See the GNU General Public License for more details.
171 You should have received a copy of the GNU General Public License along
172 with this program; if not, write to the Free Software Foundation, Inc.,
173 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
175 =cut
177 # vim: set ts=4 sw=4 sts=4 et fo+=w2 fo-=n fenc=utf8 :
178 # End of file split_access_log