1 # This file was automatically generated by SWIG (http://www.swig.org).
4 # Do not make changes to this file unless you know what you are doing--modify
5 # the SWIG interface file instead.
7 package Amanda::Logfile;
9 use base qw(DynaLoader);
10 require Amanda::Cmdline;
11 package Amanda::Logfilec;
12 bootstrap Amanda::Logfile;
13 package Amanda::Logfile;
16 # ---------- BASE METHODS -------------
18 package Amanda::Logfile;
21 my ($classname,$obj) = @_;
22 return bless $obj, $classname;
32 my ($self,$field) = @_;
33 my $member_func = "swig_${field}_get";
34 $self->$member_func();
38 my ($self,$field,$newval) = @_;
39 my $member_func = "swig_${field}_set";
40 $self->$member_func($newval);
49 # ------- FUNCTION WRAPPERS --------
51 package Amanda::Logfile;
53 *open_logfile = *Amanda::Logfilec::open_logfile;
54 *close_logfile = *Amanda::Logfilec::close_logfile;
55 *get_logline = *Amanda::Logfilec::get_logline;
56 *log_add = *Amanda::Logfilec::log_add;
57 *find_log = *Amanda::Logfilec::find_log;
58 *search_logfile = *Amanda::Logfilec::search_logfile;
59 *search_holding_disk = *Amanda::Logfilec::search_holding_disk;
60 *dumps_match = *Amanda::Logfilec::dumps_match;
61 *dumps_match_dumpspecs = *Amanda::Logfilec::dumps_match_dumpspecs;
62 *match_host = *Amanda::Logfilec::match_host;
63 *match_disk = *Amanda::Logfilec::match_disk;
64 *match_datestamp = *Amanda::Logfilec::match_datestamp;
65 *match_level = *Amanda::Logfilec::match_level;
67 ############# Class : Amanda::Logfile::find_result_t ##############
69 package Amanda::Logfile::find_result_t;
70 use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS);
71 @ISA = qw( Amanda::Logfile );
75 return unless $_[0]->isa('HASH');
76 my $self = tied(%{$_[0]});
77 return unless defined $self;
78 delete $ITERATORS{$self};
79 if (exists $OWNER{$self}) {
80 Amanda::Logfilec::delete_find_result_t($self);
85 *swig_timestamp_get = *Amanda::Logfilec::find_result_t_timestamp_get;
86 *swig_timestamp_set = *Amanda::Logfilec::find_result_t_timestamp_set;
87 *swig_hostname_get = *Amanda::Logfilec::find_result_t_hostname_get;
88 *swig_hostname_set = *Amanda::Logfilec::find_result_t_hostname_set;
89 *swig_diskname_get = *Amanda::Logfilec::find_result_t_diskname_get;
90 *swig_diskname_set = *Amanda::Logfilec::find_result_t_diskname_set;
91 *swig_level_get = *Amanda::Logfilec::find_result_t_level_get;
92 *swig_level_set = *Amanda::Logfilec::find_result_t_level_set;
93 *swig_label_get = *Amanda::Logfilec::find_result_t_label_get;
94 *swig_label_set = *Amanda::Logfilec::find_result_t_label_set;
95 *swig_filenum_get = *Amanda::Logfilec::find_result_t_filenum_get;
96 *swig_filenum_set = *Amanda::Logfilec::find_result_t_filenum_set;
97 *swig_status_get = *Amanda::Logfilec::find_result_t_status_get;
98 *swig_status_set = *Amanda::Logfilec::find_result_t_status_set;
99 *swig_dump_status_get = *Amanda::Logfilec::find_result_t_dump_status_get;
100 *swig_dump_status_set = *Amanda::Logfilec::find_result_t_dump_status_set;
101 *swig_message_get = *Amanda::Logfilec::find_result_t_message_get;
102 *swig_message_set = *Amanda::Logfilec::find_result_t_message_set;
103 *swig_partnum_get = *Amanda::Logfilec::find_result_t_partnum_get;
104 *swig_partnum_set = *Amanda::Logfilec::find_result_t_partnum_set;
105 *swig_totalparts_get = *Amanda::Logfilec::find_result_t_totalparts_get;
106 *swig_totalparts_set = *Amanda::Logfilec::find_result_t_totalparts_set;
107 *swig_sec_get = *Amanda::Logfilec::find_result_t_sec_get;
108 *swig_sec_set = *Amanda::Logfilec::find_result_t_sec_set;
109 *swig_kb_get = *Amanda::Logfilec::find_result_t_kb_get;
110 *swig_kb_set = *Amanda::Logfilec::find_result_t_kb_set;
111 *swig_orig_kb_get = *Amanda::Logfilec::find_result_t_orig_kb_get;
112 *swig_orig_kb_set = *Amanda::Logfilec::find_result_t_orig_kb_set;
115 my $self = Amanda::Logfilec::new_find_result_t(@_);
116 bless $self, $pkg if defined($self);
121 my $ptr = tied(%$self);
127 my $ptr = tied(%$self);
132 # ------- VARIABLE STUBS --------
134 package Amanda::Logfile;
136 *L_BOGUS = *Amanda::Logfilec::L_BOGUS;
137 *L_FATAL = *Amanda::Logfilec::L_FATAL;
138 *L_ERROR = *Amanda::Logfilec::L_ERROR;
139 *L_WARNING = *Amanda::Logfilec::L_WARNING;
140 *L_INFO = *Amanda::Logfilec::L_INFO;
141 *L_SUMMARY = *Amanda::Logfilec::L_SUMMARY;
142 *L_START = *Amanda::Logfilec::L_START;
143 *L_FINISH = *Amanda::Logfilec::L_FINISH;
144 *L_DISK = *Amanda::Logfilec::L_DISK;
145 *L_DONE = *Amanda::Logfilec::L_DONE;
146 *L_PART = *Amanda::Logfilec::L_PART;
147 *L_PARTPARTIAL = *Amanda::Logfilec::L_PARTPARTIAL;
148 *L_SUCCESS = *Amanda::Logfilec::L_SUCCESS;
149 *L_PARTIAL = *Amanda::Logfilec::L_PARTIAL;
150 *L_FAIL = *Amanda::Logfilec::L_FAIL;
151 *L_STRANGE = *Amanda::Logfilec::L_STRANGE;
152 *L_CHUNK = *Amanda::Logfilec::L_CHUNK;
153 *L_CHUNKSUCCESS = *Amanda::Logfilec::L_CHUNKSUCCESS;
154 *L_STATS = *Amanda::Logfilec::L_STATS;
155 *L_MARKER = *Amanda::Logfilec::L_MARKER;
156 *L_CONT = *Amanda::Logfilec::L_CONT;
157 *P_UNKNOWN = *Amanda::Logfilec::P_UNKNOWN;
158 *P_PLANNER = *Amanda::Logfilec::P_PLANNER;
159 *P_DRIVER = *Amanda::Logfilec::P_DRIVER;
160 *P_REPORTER = *Amanda::Logfilec::P_REPORTER;
161 *P_DUMPER = *Amanda::Logfilec::P_DUMPER;
162 *P_CHUNKER = *Amanda::Logfilec::P_CHUNKER;
163 *P_TAPER = *Amanda::Logfilec::P_TAPER;
164 *P_AMFLUSH = *Amanda::Logfilec::P_AMFLUSH;
165 *P_AMDUMP = *Amanda::Logfilec::P_AMDUMP;
166 *P_AMIDXTAPED = *Amanda::Logfilec::P_AMIDXTAPED;
167 *P_AMFETCHDUMP = *Amanda::Logfilec::P_AMFETCHDUMP;
168 *P_AMCHECKDUMP = *Amanda::Logfilec::P_AMCHECKDUMP;
169 *amanda_log_trace_log = *Amanda::Logfilec::amanda_log_trace_log;
177 Amanda::Logfile - manage Amanda trace logs
181 use Amanda::Logfile qw( :constants );
182 use Amanda::Config qw( :getconf config_dir_relative );
184 for my $logfile (Amanda::Logfile::find_log()) {
185 $logfile = config_dir_relative(getconf($CNF_LOGDIR)) . "/" . $logfile;
187 my $hdl = Amanda::Logfile::open_logfile($logfile);
188 while (my ($type, $prog, $str) = Amanda::Logfile::get_logline($hdl)) {
189 if ($type == $L_INFO) {
190 my $pname = Amanda::Logfile::program_t_to_string($prog);
191 print "Found info line from $pname: $str\n";
194 Amanda::Logfile::close_logfile($hdl);
196 my @dumps = Amanda::Logfile::search_logfile("TapeLabel-001", "19780615", $logfile, 1);
198 my @matching = Amanda::Logfile::dumps_match([@dumps], "myhost", "/usr", undef, undef, 0);
199 for my $dump (@matching) {
200 print "$dump->{'label'}:$dump->{'filenum'} = $dump->{'hostname'}:$dump->{'disk'}\n";
204 =head1 RAW LOGFILE ACCESS
206 This section corresponds to the C C<logfile> module.
208 Raw access to logfiles is accomplished by opening a logfile and
209 fetching log lines one by one via the C<get_logline> function.
211 A log line is represented by a list C<($type, $prog, $string)> where C<$type>
212 is one of the C<L_*> constants (available in export tag C<logtype_t>), C<$prog>
213 is one of the C<P_*> constants (available in export tag C<program_t>), and
214 C<$str> is the remainder of the line. Both sets of constants are also available
215 in the usual C<constants> export tag. Both families of constants can be
216 converted to symbolic names with C<logtype_t_to_string> and
217 C<program_t_to_string>, respectively.
221 Use these functions to read a logfile:
225 =item C<open_logfile($filename)>
227 Opens a logfile for reading, returning an opaque log file
228 handle. Returns C<undef> and sets C<$!> on failure.
230 =item C<close_logfile($handle)>
232 Closes a log file handle.
234 =item C<get_logline($handle)>
236 Returns a list as described above representing the next log line in
237 C<$handle>, or nothing at the end of the logfile.
241 To write a logfile, call C<log_add($logtype, $string)>. On the first
242 call, this function opens and locks C<$logdir/log>; subsequent calls
243 just append to this file. As such, this function is only appropriate
244 for situations where C<amlogroll> will be invoked later to rename
245 C<$logdir/log> to C<$logdir/log.$timestamp.$n>.
247 All of the functions in this section can be imported by name if
250 =head2 Amanda::Find::find_result_t objects
252 These objects contain information about dumps, as read from logfiles.
253 Instance variables are:
281 Note that the format for these variables are based on that found in
282 the logfiles. In particular, C<timestamp> is the timestamp for the run
283 in which the client dump took place, and not for the timestamp of the
286 =head1 HIGHER-LEVEL FUNCTIONS
288 Functions in this section extract information from logfiles.
294 Return a list of logfiles for active tapes. The tapelist must be loaded
295 before this function is called (see L<Amanda::Tapelist>). This function uses
296 the C API which indexes logfiles with tapes. If there is no corresponding
297 tape, the logfile will not be found.
299 =item C<find_all_logs([dir])>
301 Return a list of all logs the configuration. An optional directory argument
302 can be specified, if not present, C<find_all_logs> checks C<LOGDIR>.
304 =item C<find_latest_log([dir])>
306 Returns the most recent logfile in the list of logfiles returned by
307 C<find_all_logs>. The optional directory argument is passed to
310 =item C<search_logfile($label, $datestamp, $logfile, $add_missing_disks)>
312 Return all results in C<$logfile> matching C<$label> and
313 C<$datestamp>. If C<$add_missing_disks> is true, then any disks in
314 the logfile not present in the disklist are added to the disklist;
315 otherwise, such dumps are skipped.
317 =item C<search_holding_disk()>
319 Return results for all holding-disk files. Results are similar to those from
322 =item C<dumps_match([@results], $hostname, $diskname, $datestamp, $level, $ok)>
324 Return a filtered version of C<@results> containing only results that
325 match the given expressions. If C<$ok> is true, don't match partial
326 results. Note that C<$level> is given as a string, since it is a
329 =item C<dumps_match_dumpspecs([@results], [@dumpspecs], $ok)>
331 Return a filtered version of C<@results>, containing only results that match
332 one or more of the dumpspecs. C<$ok> is as for C<dumps_match>. Supplying no
333 dumpspecs will result in an empty return value. If multiple dumpspecs match
334 the same result, that result will be returned multiple times.
338 All of these functions can be imported by name.
342 The following functions are available to match strings against patterns using
343 the rules described in amanda(8):
345 match_host($pat, $str);
346 match_disk($pat, $str);
347 match_datestamp($pat, $str);
348 match_level($pat, $str);
350 =head1 DEBUG LOGGING HANDLER
352 This package provides C<$amanda_log_trace_log>, which sends C<die>
353 messages (and any C<g_error> or C<g_critical> calls from C) to the
354 trace log. Use it like this:
356 use Amanda::Logfile qw( $amanda_log_trace_log );
358 Amanda::Debug::add_amanda_log_handler($amanda_log_trace_log);
364 push @EXPORT_OK, qw(open_logfile get_logline close_logfile
367 push @EXPORT_OK, qw(logtype_t_to_string);
368 push @{$EXPORT_TAGS{"logtype_t"}}, qw(logtype_t_to_string);
370 my %_logtype_t_VALUES;
371 #Convert an enum value to a single string
372 sub logtype_t_to_string {
375 for my $k (keys %_logtype_t_VALUES) {
376 my $v = $_logtype_t_VALUES{$k};
378 #is this a matching flag?
379 if ($enumval == $v) {
384 #default, just return the number
388 push @EXPORT_OK, qw($L_BOGUS);
389 push @{$EXPORT_TAGS{"logtype_t"}}, qw($L_BOGUS);
391 $_logtype_t_VALUES{"L_BOGUS"} = $L_BOGUS;
393 push @EXPORT_OK, qw($L_FATAL);
394 push @{$EXPORT_TAGS{"logtype_t"}}, qw($L_FATAL);
396 $_logtype_t_VALUES{"L_FATAL"} = $L_FATAL;
398 push @EXPORT_OK, qw($L_ERROR);
399 push @{$EXPORT_TAGS{"logtype_t"}}, qw($L_ERROR);
401 $_logtype_t_VALUES{"L_ERROR"} = $L_ERROR;
403 push @EXPORT_OK, qw($L_WARNING);
404 push @{$EXPORT_TAGS{"logtype_t"}}, qw($L_WARNING);
406 $_logtype_t_VALUES{"L_WARNING"} = $L_WARNING;
408 push @EXPORT_OK, qw($L_INFO);
409 push @{$EXPORT_TAGS{"logtype_t"}}, qw($L_INFO);
411 $_logtype_t_VALUES{"L_INFO"} = $L_INFO;
413 push @EXPORT_OK, qw($L_SUMMARY);
414 push @{$EXPORT_TAGS{"logtype_t"}}, qw($L_SUMMARY);
416 $_logtype_t_VALUES{"L_SUMMARY"} = $L_SUMMARY;
418 push @EXPORT_OK, qw($L_START);
419 push @{$EXPORT_TAGS{"logtype_t"}}, qw($L_START);
421 $_logtype_t_VALUES{"L_START"} = $L_START;
423 push @EXPORT_OK, qw($L_FINISH);
424 push @{$EXPORT_TAGS{"logtype_t"}}, qw($L_FINISH);
426 $_logtype_t_VALUES{"L_FINISH"} = $L_FINISH;
428 push @EXPORT_OK, qw($L_DISK);
429 push @{$EXPORT_TAGS{"logtype_t"}}, qw($L_DISK);
431 $_logtype_t_VALUES{"L_DISK"} = $L_DISK;
433 push @EXPORT_OK, qw($L_DONE);
434 push @{$EXPORT_TAGS{"logtype_t"}}, qw($L_DONE);
436 $_logtype_t_VALUES{"L_DONE"} = $L_DONE;
438 push @EXPORT_OK, qw($L_PART);
439 push @{$EXPORT_TAGS{"logtype_t"}}, qw($L_PART);
441 $_logtype_t_VALUES{"L_PART"} = $L_PART;
443 push @EXPORT_OK, qw($L_PARTPARTIAL);
444 push @{$EXPORT_TAGS{"logtype_t"}}, qw($L_PARTPARTIAL);
446 $_logtype_t_VALUES{"L_PARTPARTIAL"} = $L_PARTPARTIAL;
448 push @EXPORT_OK, qw($L_SUCCESS);
449 push @{$EXPORT_TAGS{"logtype_t"}}, qw($L_SUCCESS);
451 $_logtype_t_VALUES{"L_SUCCESS"} = $L_SUCCESS;
453 push @EXPORT_OK, qw($L_PARTIAL);
454 push @{$EXPORT_TAGS{"logtype_t"}}, qw($L_PARTIAL);
456 $_logtype_t_VALUES{"L_PARTIAL"} = $L_PARTIAL;
458 push @EXPORT_OK, qw($L_FAIL);
459 push @{$EXPORT_TAGS{"logtype_t"}}, qw($L_FAIL);
461 $_logtype_t_VALUES{"L_FAIL"} = $L_FAIL;
463 push @EXPORT_OK, qw($L_STRANGE);
464 push @{$EXPORT_TAGS{"logtype_t"}}, qw($L_STRANGE);
466 $_logtype_t_VALUES{"L_STRANGE"} = $L_STRANGE;
468 push @EXPORT_OK, qw($L_CHUNK);
469 push @{$EXPORT_TAGS{"logtype_t"}}, qw($L_CHUNK);
471 $_logtype_t_VALUES{"L_CHUNK"} = $L_CHUNK;
473 push @EXPORT_OK, qw($L_CHUNKSUCCESS);
474 push @{$EXPORT_TAGS{"logtype_t"}}, qw($L_CHUNKSUCCESS);
476 $_logtype_t_VALUES{"L_CHUNKSUCCESS"} = $L_CHUNKSUCCESS;
478 push @EXPORT_OK, qw($L_STATS);
479 push @{$EXPORT_TAGS{"logtype_t"}}, qw($L_STATS);
481 $_logtype_t_VALUES{"L_STATS"} = $L_STATS;
483 push @EXPORT_OK, qw($L_MARKER);
484 push @{$EXPORT_TAGS{"logtype_t"}}, qw($L_MARKER);
486 $_logtype_t_VALUES{"L_MARKER"} = $L_MARKER;
488 push @EXPORT_OK, qw($L_CONT);
489 push @{$EXPORT_TAGS{"logtype_t"}}, qw($L_CONT);
491 $_logtype_t_VALUES{"L_CONT"} = $L_CONT;
493 #copy symbols in logtype_t to constants
494 push @{$EXPORT_TAGS{"constants"}}, @{$EXPORT_TAGS{"logtype_t"}};
496 push @EXPORT_OK, qw(program_t_to_string);
497 push @{$EXPORT_TAGS{"program_t"}}, qw(program_t_to_string);
499 my %_program_t_VALUES;
500 #Convert an enum value to a single string
501 sub program_t_to_string {
504 for my $k (keys %_program_t_VALUES) {
505 my $v = $_program_t_VALUES{$k};
507 #is this a matching flag?
508 if ($enumval == $v) {
513 #default, just return the number
517 push @EXPORT_OK, qw($P_UNKNOWN);
518 push @{$EXPORT_TAGS{"program_t"}}, qw($P_UNKNOWN);
520 $_program_t_VALUES{"P_UNKNOWN"} = $P_UNKNOWN;
522 push @EXPORT_OK, qw($P_PLANNER);
523 push @{$EXPORT_TAGS{"program_t"}}, qw($P_PLANNER);
525 $_program_t_VALUES{"P_PLANNER"} = $P_PLANNER;
527 push @EXPORT_OK, qw($P_DRIVER);
528 push @{$EXPORT_TAGS{"program_t"}}, qw($P_DRIVER);
530 $_program_t_VALUES{"P_DRIVER"} = $P_DRIVER;
532 push @EXPORT_OK, qw($P_REPORTER);
533 push @{$EXPORT_TAGS{"program_t"}}, qw($P_REPORTER);
535 $_program_t_VALUES{"P_REPORTER"} = $P_REPORTER;
537 push @EXPORT_OK, qw($P_DUMPER);
538 push @{$EXPORT_TAGS{"program_t"}}, qw($P_DUMPER);
540 $_program_t_VALUES{"P_DUMPER"} = $P_DUMPER;
542 push @EXPORT_OK, qw($P_CHUNKER);
543 push @{$EXPORT_TAGS{"program_t"}}, qw($P_CHUNKER);
545 $_program_t_VALUES{"P_CHUNKER"} = $P_CHUNKER;
547 push @EXPORT_OK, qw($P_TAPER);
548 push @{$EXPORT_TAGS{"program_t"}}, qw($P_TAPER);
550 $_program_t_VALUES{"P_TAPER"} = $P_TAPER;
552 push @EXPORT_OK, qw($P_AMFLUSH);
553 push @{$EXPORT_TAGS{"program_t"}}, qw($P_AMFLUSH);
555 $_program_t_VALUES{"P_AMFLUSH"} = $P_AMFLUSH;
557 push @EXPORT_OK, qw($P_AMDUMP);
558 push @{$EXPORT_TAGS{"program_t"}}, qw($P_AMDUMP);
560 $_program_t_VALUES{"P_AMDUMP"} = $P_AMDUMP;
562 push @EXPORT_OK, qw($P_AMIDXTAPED);
563 push @{$EXPORT_TAGS{"program_t"}}, qw($P_AMIDXTAPED);
565 $_program_t_VALUES{"P_AMIDXTAPED"} = $P_AMIDXTAPED;
567 push @EXPORT_OK, qw($P_AMFETCHDUMP);
568 push @{$EXPORT_TAGS{"program_t"}}, qw($P_AMFETCHDUMP);
570 $_program_t_VALUES{"P_AMFETCHDUMP"} = $P_AMFETCHDUMP;
572 push @EXPORT_OK, qw($P_AMCHECKDUMP);
573 push @{$EXPORT_TAGS{"program_t"}}, qw($P_AMCHECKDUMP);
575 $_program_t_VALUES{"P_AMCHECKDUMP"} = $P_AMCHECKDUMP;
577 #copy symbols in program_t to constants
578 push @{$EXPORT_TAGS{"constants"}}, @{$EXPORT_TAGS{"program_t"}};
580 push @EXPORT_OK, qw(find_log search_logfile dumps_match
581 match_host match_disk match_datestamp match_level);
583 push @EXPORT_OK, qw($amanda_log_trace_log);
585 push @EXPORT_OK, qw(find_all_logs find_latest_log);
590 my $logdir = shift @_ || config_dir_relative(getconf($CNF_LOGDIR));
592 opendir my $logdh, $logdir or die("can't read $logdir");
593 my @logfiles = sort grep { m{^log\.\d+\.\d+$} } readdir $logdh;
600 my $logdir = shift @_;
601 my @logs = find_all_logs($logdir || ());