ly/Makefile: Sort variables
[sunny256-utils.git] / split_log
blob79e65ae70bf4574ba30d5e790787b77d32b8d907
1 #!/usr/bin/env perl
3 #=======================================================================
4 # split_log
5 # File ID: a24fa3b0-5d44-11df-b03a-90e6ba3022ac
6 # Splitter opp filer med filer som begynner med sekunder sia 1970 eller
7 # en dato på ISO 8601-format. Legger delene som
8 # $Dir/åååå/[NAVN.]åååå-mm-ddZ[.EXT] . Bruker bare verdier med 9 eller
9 # 10 siffer i epoch. Med andre ord funker det greit fra og med
10 # 1973-03-03 09:46:40 GMT til 2286-11-20 17:46:39 GMT.
12 # ©opyleft 2004 Øyvind A. Holm <sunny@sunbase.org>
13 # Lisens: GNU General Public License versjon 2 eller nyere ♥
14 #=======================================================================
16 use strict;
17 use warnings;
18 use Time::Local;
19 use Getopt::Std;
21 our ($opt_d, $opt_e, $opt_h, $opt_n, $opt_z) =
22 ( "", "", 0, "", 0);
23 getopts('d:e:hn:z');
25 $| = 1;
27 my ( $Dir, $Fnavn, $Last, $compress_file) =
28 ("out", "", "", $opt_z);
30 my $Name = length($opt_n) ? "$opt_n." : "";
31 my $Ext = length($opt_e) ? ".$opt_e" : "";
33 $opt_h && usage(0);
35 length($opt_d) && ($Dir = $opt_d);
36 -d $Dir || mkdir($Dir, 0777) || die("mkdir(\"$Dir\"): $!");
38 while (<>) {
39 if (m#^(\d{9,10})\b(.*)#) {
40 my ($Secs, $Rest) =
41 ( $1, $2);
42 my ($u_sec, $u_min, $u_hour, $u_mday, $u_mon, $u_year, $u_wday, $u_yday) = gmtime($Secs);
43 $u_year += 1900; # Urgh
44 $u_mon += 1; # Dobbelturgh
45 $Fnavn = sprintf("%s/%04u/%s%04u-%02u-%02uZ%s", $Dir, $u_year, $Name, $u_year, $u_mon, $u_mday, $Ext);
46 print_line($u_year, $Fnavn, $_);
47 } elsif (m#^(\d\d\d\d)-?(\d\d)-?(\d\d).?(\d\d):?(\d\d):?(\d\d)(Z?)\b(.*)#) {
48 my ($Year, $Month, $Day, $Hour, $Min, $Sec, $Zulu) =
49 ( $1, $2, $3, $4, $5, $6, $7);
50 $Fnavn = sprintf("%s/%04u/%s%04u-%02u-%02u%s%s", $Dir, $Year, $Name, $Year, $Month, $Day, $Zulu, $Ext);
51 print_line($Year, $Fnavn, $_);
52 } else {
53 my $err_name = length($Fnavn) ? "$Fnavn.ERR" : "$Dir/undef.ERR";
54 warn("Linje $.: Ukjent format, skriver til \"$err_name\".\n");
55 my $op_pref = (-e "$err_name") ? ">>" : ">";
56 if (open(ErrFP, "$op_pref$err_name")) {
57 seek(ErrFP, 0, 2) || die("$err_name: seek() til slutten: $!");
58 } else {
59 die("$err_name: Åpning for skriving: $!");
61 print(ErrFP $_) || die("Feil under skriving til $err_name: $!");
62 close(ErrFP);
64 $Last = $Fnavn;
67 sub print_line {
68 my ($u_year, $Fnavn, $Line) = @_;
69 if ($Fnavn ne $Last) {
70 if ($compress_file && -e $Last) {
71 close(ToFP);
72 unless (-e "$Last.gz") {
73 print(STDERR "Kjører \"/bin/gzip -N $Last &\"\n");
74 system("/bin/gzip -N $Last &");
75 } else {
76 warn("$Last.gz: Fila eksisterer allerede, pakker ikke $Last . Må ordnes manuelt.\n");
79 -d "$Dir/$u_year" || mkdir("$Dir/$u_year", 0777) || die("$0: mkdir(\"$Dir/$u_year\"): $!. R.I.P. & sånn.");
80 if (-e $Fnavn) {
81 warn("$Fnavn: Fila finnes fra før, skriver til \"$Fnavn.DUP\".\n");
82 my $op_pref = (-e "$Fnavn.DUP") ? ">>" : ">";
83 if (open(ToFP, "$op_pref$Fnavn.DUP")) {
84 seek(ToFP, 0, 2) || die("$Fnavn.DUP: seek() til slutten: $!");
85 } else {
86 die("$Fnavn.DUP: Åpning for skriving: $!");
88 } else {
89 print(STDERR "Ny fil: \"$Fnavn\"\n");
90 if (open(ToFP, ">$Fnavn")) {
91 seek(ToFP, 0, 2) || die("$Fnavn: seek() til slutten: $!");
92 } else {
93 die("$Fnavn: Åpning for skriving: $!");
97 print(ToFP $_) || die("Feil under skriving til $Fnavn(.DUP): $!");
100 sub usage {
101 my $Retval = shift;
103 print(<<END);
105 Syntax: $0 [valg] [fil [flere filer [...]]]
107 Programmet leser filer som har linjer som begynner med antall sekunder
108 sia 1970-01-01 00:00:00 GMT fra stdin eller filnavn på kommandolinja og
109 splitter dem i deler på formatet "DIR/åååå/[NAVN.]åååå-mm-dd[Z][.EXT]" .
110 Bruker bare verdier med 9 eller 10 siffer. Med andre ord funker det
111 greit fra og med 1973-03-03 09:46:40 GMT til 2286-11-20 17:46:39 GMT.
113 Og ja, den fungerer med ISO 8601-format også, det vil si
114 "åååå-mm-ddTtt:mm:ssZ", "ååååmmddTttmmssZ", "åååå/mm/dd tt:mm:ss" eller
115 hva man skulle ønske.
117 Valg:
119 -d DIR Plassér filene i DIR . Standard: "$Dir".
120 -e EXT Bruk EXT som extension. (Automatisk punktum i begynnelsen.)
121 Standard: "$Ext".
122 -h Hjælp mæ.
123 -n NAVN Bruk NAVN som valgfritt prefiks i filnavnet. Automatisk punktum
124 på slutten. Standard: "$Name".
125 -z Pakk filene etterhvert som de er ferdigsplitta.
127 Den splitter selvfølgelig opp filene på grunnlag av GMT. Folkeaksjonen
128 Mot Sommertid slår til igjen. Ikke det med sol, utepils og miniskjørt
129 her og der, men den klokkefløttinga er uendelig plagsom og lager i
130 tillegg unøyaktighet i loggene.
132 Krota sammen av Øyvind A. Holm <sunny\@sunbase.org>.
133 Lisens: GNU General Public License ♥
136 exit($Retval);
137 } # usage()
139 __END__
141 =pod
143 =head1 LICENCE
145 This program is free software; you can redistribute it and/or modify it
146 under the terms of the GNU General Public License as published by the
147 Free Software Foundation; either version 2 of the License, or (at your
148 option) any later version.
150 This program is distributed in the hope that it will be useful, but
151 WITHOUT ANY WARRANTY; without even the implied warranty of
152 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
153 See the GNU General Public License for more details.
155 You should have received a copy of the GNU General Public License along
156 with this program; if not, write to the Free Software Foundation, Inc.,
157 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
159 =cut
161 # vim: set ts=4 sw=4 sts=4 et fo+=w fenc=utf8 :
162 # End of file split_log