1 # Copyright (c) 2010-2012 Zmanda, Inc. All Rights Reserved.
3 # This program is free software; you can redistribute it and/or modify it
4 # under the terms of the GNU General Public License version 2 as published
5 # by the Free Software Foundation.
7 # This program is distributed in the hope that it will be useful, but
8 # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
9 # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 # You should have received a copy of the GNU General Public License along
13 # with this program; if not, write to the Free Software Foundation, Inc.,
14 # 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 # Contact information: Zmanda Inc., 465 S Mathlida Ave, Suite 300
17 # Sunnyvale, CA 94085, USA, or: http://www.zmanda.com
20 package Amanda::Report::xml;
25 use base qw/Exporter/;
27 use Amanda::Constants;
29 our @EXPORT_OK = qw/make_amreport_xml/;
38 my ( $report, $org, $config_name ) = @_;
44 make_xml_elt( "org", $org ),
45 make_xml_elt( "config", $config_name ),
46 make_xml_elt( "date", time() ),
47 make_programs_xml( $report->{data}{programs} ),
49 make_dle_xml( $_->[0], $_->[1],
50 $report->get_dle_info( $_->[0], $_->[1] ) )
54 { version => $Amanda::Constants::VERSION }
58 ## xml printing functions
62 return "\n" . ( $indent x $depth );
67 my ( $tag, $val, $attribs ) = @_;
73 if ( defined $attribs ) {
76 ' ', map { $_ . '="' . $attribs->{$_} . '"' }
81 if ( ref $val eq "CODE" ) {
82 $text .= ">" . xml_nl() . $val->() . xml_nl() . "</$tag>";
84 $text .= ( defined $val ) ? ">$val</$tag>" : " />";
93 my ( $list, $item, @items ) = @_;
97 return join( xml_nl(), map { make_xml_elt( $item, $_ ); } @items );
102 ## Amanda::Report data elements
112 make_xml_elt("insize", $dumper->{orig_kb} * 1024),
113 make_xml_elt("outsize", $dumper->{kb} * 1024),
114 make_xml_elt("time", $dumper->{sec})
117 { "result" => $dumper->{status} }
129 make_xml_elt( "date", $chunker->{date} ),
130 make_xml_elt( "level", $chunker->{level} ),
131 make_xml_elt( "time", $chunker->{sec} ),
132 make_xml_elt( "bytes", $chunker->{kb} * 1024 ),
133 make_xml_elt( "bps", $chunker->{kps} * 1024 ),
136 { "result" => $chunker->{status} }
148 make_xml_elt( "date", $taper->{date} ),
149 make_xml_elt( "level", $taper->{level} ),
150 make_xml_elt( "time", $taper->{sec} ),
151 make_xml_elt( "bytes", $taper->{kb} * 1024 ),
152 make_xml_elt( "bps", $taper->{kps} * 1024 ),
153 map { make_part_xml($_) } @{ $taper->{parts} }
156 { result => $taper->{status} }
166 return join xml_nl(), map {
167 ($_ eq "dumper") ? make_dumper_xml($try->{$_})
168 : ($_ eq "chunker") ? make_chunker_xml($try->{$_})
169 : ($_ eq "taper") ? make_taper_xml($try->{$_})
176 sub make_estimate_xml
179 return (defined $estimate)
185 make_xml_elt("level", $estimate->{level}),
186 make_xml_elt("time", $estimate->{sec}),
187 make_xml_elt("nbytes", $estimate->{nkb} * 1024),
188 make_xml_elt("cbytes", $estimate->{ckb} * 1024),
189 make_xml_elt("bps", $estimate->{kps} * 1024)
202 return join( xml_nl(),
203 make_xml_elt( "label", $part->{label} ),
204 make_xml_elt( "date", $part->{date} ),
205 make_xml_elt( "file", $part->{file} ),
206 make_xml_elt( "time", $part->{sec} ),
207 make_xml_elt( "bytes", $part->{kb} * 1024 ),
208 make_xml_elt( "bps", $part->{kps} * 1024 ),
209 make_xml_elt( "partnum", $part->{partnum} )
217 my ($dle, $timestamp) = @_;
222 return join( xml_nl(),
223 make_xml_elt("date", $timestamp),
224 map { make_try_xml($_) } @{$dle->{'dumps'}->{$timestamp}});
231 my ( $hostname, $disk, $dle ) = @_;
235 return join( xml_nl(),
236 make_xml_elt( "hostname", $hostname ),
237 make_xml_elt( "disk", $disk ),
238 ( defined $dle->{estimate} && %{ $dle->{estimate} } > 0 )?
239 make_estimate_xml( $dle->{estimate} )
241 ( keys %{$dle->{'dumps'}} > 0 ) ?
242 map { make_dump_xml($dle, $_) } keys %{$dle->{'dumps'}}
244 exists $dle->{parts} ?
245 map { make_part_xml($_) } @{ $dle->{parts} }
254 my ( $program_name, $program, $content ) = @_;
261 ( exists $program->{notes} )
262 ? make_list_xml( "notes", "note", @{ $program->{notes} } )
264 ( exists $program->{stranges} )
265 ? make_list_xml( "stranges", "strange",
266 @{ $program->{stranges} } )
268 ( exists $program->{errors} )
269 ? make_list_xml( "errors", "error", @{ $program->{errors} } )
279 return make_program_xml(
282 return join( xml_nl(),
283 make_xml_elt( "time", $planner->{time} ),
284 make_xml_elt( "start", $planner->{start} ),
285 make_xml_elt( "start_time", $planner->{start_time} ) );
293 return make_program_xml(
296 return join( xml_nl(),
297 make_xml_elt( "time", $driver->{time} ),
298 make_xml_elt( "start", $driver->{start} ) );
303 sub make_dumper_program_xml
306 return make_program_xml( "dumper", $dumper, sub { return ""; } );
309 sub make_chunker_program_xml
312 return make_program_xml( "chunker", $chunker, sub { return ""; } );
317 my ( $tape_name, $tape ) = @_;
323 make_xml_elt( "name", $tape_name ),
324 make_xml_elt( "date", $tape->{date} ),
325 defined $tape->{files}
326 ? make_xml_elt( "files", $tape->{files} )
329 ? make_xml_elt( "bytes", $tape->{kb} * 1024 )
336 sub make_tapelist_xml
344 map { make_tape_xml( $_, $tapelist->{$_} ) } keys %$tapelist
350 sub make_taper_program_xml
353 return make_program_xml(
357 defined $taper->{tapes}
358 ? make_tapelist_xml( $taper->{tapes} )
365 # Note: make_program_xml is a super-type for the individual programs,
366 # make_programs_xml is the element container for the programs
368 sub make_programs_xml
375 return join( xml_nl(),
376 exists $programs->{planner}
377 ? make_planner_xml( $programs->{planner} )
379 exists $programs->{driver}
380 ? make_driver_xml( $programs->{driver} )
382 exists $programs->{dumper}
383 ? make_dumper_program_xml( $programs->{dumper} )
385 exists $programs->{chunker}
386 ? make_chunker_program_xml( $programs->{chunker} )
388 exists $programs->{taper}
389 ? make_taper_program_xml( $programs->{taper} )
400 Amanda::Report::xml - output Amanda::Report objects in xml format
405 my $report = Amanda::Report->new($logfile);
406 print $report->output_xml();
410 Stub documentation for Amanda::Report::xml,
420 Mention other useful documentation such as the documentation of
421 related modules or operating system documentation (such as man pages
422 in UNIX), or any relevant external documentation such as RFCs or
425 If you have a mailing list set up for your module, mention it here.
427 If you have a web site set up for your module, mention it here.
431 Paul C Mantz, E<lt>pcmantz@zmanda.comE<gt>
435 None reported... yet.