1 # Copyright (c) 2010 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 ( $hostname, $disk, $dle ) = @_;
221 return join( xml_nl(),
222 make_xml_elt( "hostname", $hostname ),
223 make_xml_elt( "disk", $disk ),
224 ( defined $dle->{estimate} && %{ $dle->{estimate} } > 0 )
225 ? make_estimate_xml( $dle->{estimate} )
227 exists $dle->{tries} ? map { make_try_xml($_) }
228 @{ $dle->{tries} } : (),
229 exists $dle->{parts} ? map { make_part_xml($_) }
230 @{ $dle->{parts} } : () );
237 my ( $program_name, $program, $content ) = @_;
244 ( exists $program->{notes} )
245 ? make_list_xml( "notes", "note", @{ $program->{notes} } )
247 ( exists $program->{stranges} )
248 ? make_list_xml( "stranges", "strange",
249 @{ $program->{stranges} } )
251 ( exists $program->{errors} )
252 ? make_list_xml( "errors", "error", @{ $program->{errors} } )
262 return make_program_xml(
265 return join( xml_nl(),
266 make_xml_elt( "time", $planner->{time} ),
267 make_xml_elt( "start", $planner->{start} ),
268 make_xml_elt( "start_time", $planner->{start_time} ) );
276 return make_program_xml(
279 return join( xml_nl(),
280 make_xml_elt( "time", $driver->{time} ),
281 make_xml_elt( "start", $driver->{start} ) );
286 sub make_dumper_program_xml
289 return make_program_xml( "dumper", $dumper, sub { return ""; } );
292 sub make_chunker_program_xml
295 return make_program_xml( "chunker", $chunker, sub { return ""; } );
300 my ( $tape_name, $tape ) = @_;
306 make_xml_elt( "name", $tape_name ),
307 make_xml_elt( "date", $tape->{date} ),
308 defined $tape->{files}
309 ? make_xml_elt( "files", $tape->{files} )
312 ? make_xml_elt( "bytes", $tape->{kb} * 1024 )
319 sub make_tapelist_xml
327 map { make_tape_xml( $_, $tapelist->{$_} ) } keys %$tapelist
333 sub make_taper_program_xml
336 return make_program_xml(
340 defined $taper->{tapes}
341 ? make_tapelist_xml( $taper->{tapes} )
348 # Note: make_program_xml is a super-type for the individual programs,
349 # make_programs_xml is the element container for the programs
351 sub make_programs_xml
358 return join( xml_nl(),
359 exists $programs->{planner}
360 ? make_planner_xml( $programs->{planner} )
362 exists $programs->{driver}
363 ? make_driver_xml( $programs->{driver} )
365 exists $programs->{dumper}
366 ? make_dumper_program_xml( $programs->{dumper} )
368 exists $programs->{chunker}
369 ? make_chunker_program_xml( $programs->{chunker} )
371 exists $programs->{taper}
372 ? make_taper_program_xml( $programs->{taper} )
383 Amanda::Report::xml - output Amanda::Report objects in xml format
388 my $report = Amanda::Report->new($logfile);
389 print $report->output_xml();
393 Stub documentation for Amanda::Report::xml,
403 Mention other useful documentation such as the documentation of
404 related modules or operating system documentation (such as man pages
405 in UNIX), or any relevant external documentation such as RFCs or
408 If you have a mailing list set up for your module, mention it here.
410 If you have a web site set up for your module, mention it here.
414 Paul C Mantz, E<lt>pcmantz@zmanda.comE<gt>
418 None reported... yet.