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