Imported Upstream version 3.1.0
[debian/amanda] / application-src / amlog-script.pl
1 #!@PERL@
2 # Copyright (c) 2008,2009 Zmanda, Inc.  All Rights Reserved.
3 #
4 # This program is free software; you can redistribute it and/or modify it
5 # under the terms of the GNU General Public License version 2 as published
6 # by the Free Software Foundation.
7 #
8 # This program is distributed in the hope that it will be useful, but
9 # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
10 # or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
11 # for more details.
12 #
13 # You should have received a copy of the GNU General Public License along
14 # with this program; if not, write to the Free Software Foundation, Inc.,
15 # 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 #
17 # Contact information: Zmanda Inc., 465 S. Mathilda Ave., Suite 300
18 # Sunnyvale, CA 94086, USA, or: http://www.zmanda.com
19
20 use lib '@amperldir@';
21 use strict;
22 use Getopt::Long;
23 use File::Basename;
24
25 package Amanda::Script::amlog_script;
26 use base qw(Amanda::Script);
27 use Amanda::Config qw( :getconf :init );
28 use Amanda::Debug qw( :logging );
29 use Amanda::Util qw( :constants );
30 use Amanda::Paths;
31 use Amanda::Constants;
32
33
34 sub new {
35     my $class = shift;
36     my ($execute_where, $config, $host, $disk, $device, $level, $index, $message, $collection, $record, $logfile, $text) = @_;
37     my $self = $class->SUPER::new($execute_where, $config);
38
39     $self->{execute_where} = $execute_where;
40     $self->{config}        = $config;
41     $self->{host}          = $host;
42     $self->{disk}          = $disk;
43     $self->{device}        = $device;
44     $self->{level}         = [ @{$level} ]; # Copy the array
45     $self->{index}         = $index;
46     $self->{message}       = $message;
47     $self->{collection}    = $collection;
48     $self->{record}        = $record;
49     $self->{logfile}       = $logfile;
50     $self->{text}          = $text;
51
52     return $self;
53 }
54
55 sub setup() {
56     my $self = shift;
57
58     if (!defined $self->{logfile}) {
59         $self->print_to_server_and_die("property LOGFILE not set",
60                                        $Amanda::Script_App::ERROR);
61     }
62
63     my $dirname = File::Basename::dirname($self->{logfile});
64     if (! -e $dirname) {
65         $self->print_to_server_and_die("Directory '$dirname' doesn't exist",
66                                        $Amanda::Script_App::ERROR);
67     }
68     if (! -d $dirname) {
69         $self->print_to_server_and_die(
70                                 "Directory '$dirname' is not a directory",i
71                                 $Amanda::Script_App::ERROR);
72     }
73 }
74
75 sub command_support {
76    my $self = shift;
77
78    print "CONFIG YES\n";
79    print "HOST YES\n";
80    print "DISK YES\n";
81    print "MESSAGE-LINE YES\n";
82    print "MESSAGE-XML NO\n";
83    print "EXECUTE-WHERE YES\n";
84 }
85
86 #define a execute_on_* function for every execute_on you want the script to do
87 #something
88 sub command_pre_dle_amcheck {
89    my $self = shift;
90
91    $self->setup();
92    $self->log_data("pre-dle-amcheck");
93 }
94
95 sub command_pre_host_amcheck {
96    my $self = shift;
97
98    $self->setup();
99    $self->log_data("pre-host-amcheck");
100 }
101
102 sub command_post_dle_amcheck {
103    my $self = shift;
104
105    $self->setup();
106    $self->log_data("post-dle-amcheck");
107 }
108
109 sub command_post_host_amcheck {
110    my $self = shift;
111
112    $self->setup();
113    $self->log_data("post-host-amcheck");
114 }
115
116 sub command_pre_dle_estimate {
117    my $self = shift;
118
119    $self->setup();
120    $self->log_data("pre-dle-estimate");
121 }
122
123 sub command_pre_host_estimate {
124    my $self = shift;
125
126    $self->setup();
127    $self->log_data("pre-host-estimate");
128 }
129
130 sub command_post_dle_estimate {
131    my $self = shift;
132
133    $self->setup();
134    $self->log_data("post-dle-estimate");
135 }
136
137 sub command_post_host_estimate {
138    my $self = shift;
139
140    $self->setup();
141    $self->log_data("post-host-estimate");
142 }
143
144 sub command_pre_dle_backup {
145    my $self = shift;
146
147    $self->setup();
148    $self->log_data("pre-dle-backup");
149 }
150
151 sub command_pre_host_backup {
152    my $self = shift;
153
154    $self->setup();
155    $self->log_data("pre-host-backup");
156 }
157
158 sub command_post_dle_backup {
159    my $self = shift;
160
161    $self->setup();
162    $self->log_data("post-dle-backup");
163 }
164
165 sub command_post_host_backup {
166    my $self = shift;
167
168    $self->setup();
169    $self->log_data("post-host-backup");
170 }
171
172 sub command_pre_recover {
173    my $self = shift;
174
175    $self->setup();
176    $self->log_data("pre-recover");
177 }
178
179 sub command_post_recover {
180    my $self = shift;
181
182    $self->setup();
183    $self->log_data("post-recover");
184 }
185
186 sub command_pre_level_recover {
187    my $self = shift;
188
189    $self->setup();
190    $self->log_data("pre-level-recover");
191 }
192
193 sub command_post_level_recover {
194    my $self = shift;
195
196    $self->setup();
197    $self->log_data("post-level-recover");
198 }
199
200 sub command_inter_level_recover {
201    my $self = shift;
202
203    $self->setup();
204    $self->log_data("inter-level-recover");
205 }
206
207 sub log_data {
208    my $self = shift;
209    my($function) = shift;
210    my $log;
211
212    open($log, ">>$self->{logfile}") ||
213         $self->print_to_server_and_die(
214                         "Can't open logfile '$self->{logfile}' for append: $!",
215                         $Amanda::Script_App::ERROR);
216    print $log "$self->{action} $self->{config} $function $self->{execute_where} $self->{host} $self->{disk} $self->{device} ", join (" ", @{$self->{level}}), " $self->{text}\n";
217    close $log;
218 }
219
220 package main;
221
222 sub usage {
223     print <<EOF;
224 Usage: amlog-script <command> --execute-where=<client|server> --config=<config> --host=<host> --disk=<disk> --device=<device> --level=<level> --index=<yes|no> --message=<text> --collection=<no> --record=<yes|no> --logfile=<filename>.
225 EOF
226     exit(1);
227 }
228
229 my $opt_execute_where;
230 my $opt_config;
231 my $opt_host;
232 my $opt_disk;
233 my $opt_device;
234 my @opt_level;
235 my $opt_index;
236 my $opt_message;
237 my $opt_collection;
238 my $opt_record;
239 my $opt_logfile;
240 my $opt_text;
241
242 Getopt::Long::Configure(qw{bundling});
243 GetOptions(
244     'execute-where=s' => \$opt_execute_where,
245     'config=s'        => \$opt_config,
246     'host=s'          => \$opt_host,
247     'disk=s'          => \$opt_disk,
248     'device=s'        => \$opt_device,
249     'level=s'         => \@opt_level,
250     'index=s'         => \$opt_index,
251     'message=s'       => \$opt_message,
252     'collection=s'    => \$opt_collection,
253     'record=s'        => \$opt_record,
254     'logfile=s'       => \$opt_logfile,
255     'text=s'          => \$opt_text
256 ) or usage();
257
258 my $script = Amanda::Script::amlog_script->new($opt_execute_where, $opt_config, $opt_host, $opt_disk, $opt_device, \@opt_level, $opt_index, $opt_message, $opt_collection, $opt_record, $opt_logfile, $opt_text);
259
260 $script->do($ARGV[0]);
261