#!/usr/bin/perl

#
# agent for reading kiwi's config.xml file
#

use lib "/usr/lib/YaST2/agents_non_y2";
use ycp;
use strict;
use XML::LibXML;
use Data::Dumper;

while (<STDIN>)
{
    my ($command, $path, $argument) = ycp::ParseCommand ($_);

    y2debug ("command: $command, path: $path");

    if ($command eq "Read" && $argument)
    {
	my %retmap	= ();
	my $configFile = $argument;

	my $systemTree;
	my $systemXML   = new XML::LibXML;
	$systemTree = $systemXML->parse_file ( $configFile );

	my $repositNodeList = $systemTree -> getElementsByTagName ("repository");
	my $optionsNodeList = $systemTree -> getElementsByTagName ("preferences");
	my $usrdataNodeList = $systemTree -> getElementsByTagName ("users");
	my $packageNodeList = $systemTree -> getElementsByTagName ("packages");
	my $imgnameNodeList = $systemTree -> getElementsByTagName ("image");

	my $key		= "packages";
	$retmap{$key}	= {};
	for (my $i=1;$i<= $packageNodeList->size();$i++) {
	    my $node = $packageNodeList -> get_node($i);
	    my $type = $node -> getAttribute ("type");
	    y2milestone ("package list type: $type");
	    $retmap{$key}{$type}	= {};
	    foreach my $tag ("package", "opensusePattern", "ignore") {
		my @sw_list		= ();
		foreach my $element ($node -> getElementsByTagName ($tag)) {
		    my %sw_item	= ();
		    my $name	= $element -> getAttribute ("name");
		    my $arch	= $element -> getAttribute ("arch");
		    $sw_item{"name"}	= $name if $name;
		    $sw_item{"arch"}	= $arch if $arch;
		    push @sw_list, \%sw_item if %sw_item;
		}
		$retmap{$key}{$type}{$tag}	= \@sw_list if @sw_list;
	    }
	    # this is xen-specific #TODO other specific parts?
	    foreach my $tag ("memory", "disk") {
		my $attr	= $node -> getAttribute ($tag);
		$retmap{$key}{$type}{$tag}	= $attr if defined $attr;
	    }
	}
	my $prefs	= $optionsNodeList -> get_node(1);
	foreach my $tag ("packagemanager", "version", "rpm-check-signatures", "rpm-force",
	    "size") {
	    my $element	= $prefs -> getElementsByTagName ($tag);
	    $retmap{$tag} = $element-> get_node(1)->textContent () if ($element);
	}
	# now get the 'type' attributes
	# example: <type primary="true" boot="isoboot/suse-10.3" flags="compressed">iso</type>
	#	   <type boot="vmxboot/suse-10.3" filesystem="ext3">vmx</type>
	my @ntag  = $prefs -> getElementsByTagName ("type") -> get_nodelist();
	foreach my $element (@ntag) {
	    my $primary = $element -> getAttribute ("primary");
	    my $boot 	= $element -> getAttribute ("boot");
	    my $flags	= $element -> getAttribute ("flags");
	    my $type	= $element -> textContent ();
	    my %typemap	= ();
	    foreach my $attr ("primary", "boot", "flags", "filesystem") {
		my $val	= $element -> getAttribute ($attr);
		$typemap{$attr}	= $val if defined $val;
	    }
	    $retmap{"type"}{$type}	= \%typemap;
	}

	my $sizeelement	= $prefs -> getElementsByTagName ("size");
	if (defined $sizeelement) {
	    $retmap{"sizeunit"}	= $sizeelement-> get_node(1) ->getAttribute("unit");
	}

	my $descr	= $systemTree -> getElementsByTagName ("description")->get_node (1);
	my $descr_type	= $descr -> getAttribute ("type");
	$retmap{"image_type"}	= $descr_type if $descr_type;
	foreach my $tag ("author", "contact", "specification") {
	    my $element	= $descr -> getElementsByTagName ($tag);
	    $retmap{$tag} = $element-> get_node(1)->textContent () if ($element);
	}

	$retmap{"users"}	= {};
	foreach my $usernode ($usrdataNodeList -> get_nodelist()) {
	    my $group = $usernode -> getAttribute("group");
	    my @ntag  = $usernode -> getElementsByTagName ("user") -> get_nodelist();
	    foreach my $element (@ntag) {
		my $name = $element -> getAttribute ("name");
		my $pwd  = $element -> getAttribute ("pwd");
		my $home = $element -> getAttribute ("home");
		if (defined $name) {
		    $retmap{"users"}{$name}{group} = $group if (defined $group);
		    $retmap{"users"}{$name}{home}  = $home if (defined $home);
		    $retmap{"users"}{$name}{pwd}   = $pwd if (defined $pwd); 
		}
	    }
	}

	$key			= "drivers";
	my $driversNodeList	= $systemTree -> getElementsByTagName ($key);
	$retmap{$key}	= {};
	for (my $i=1;$i<= $driversNodeList->size();$i++) {
	    my $node = $driversNodeList -> get_node($i);
	    my $type = $node -> getAttribute ("type");
	    y2milestone ("driver list type: $type");
	    $retmap{$key}{$type}	= {};
	    foreach my $tag ("file") {
		my @list		= ();
		foreach my $element ($node -> getElementsByTagName ($tag)) {
		    my %item	= ();
		    my $name	= $element -> getAttribute ("name");
		    $item{"name"}	= $name if $name;
		    push @list, \%item if %item;
		}
		$retmap{$key}{$type}{$tag}	= \@list if @list;
	    }
	}
	$key			= "repository";
	$retmap{$key}	= {};
	for (my $i=1;$i<= $repositNodeList->size();$i++) {
	    my $node = $repositNodeList -> get_node($i);
	    my $type = $node -> getAttribute ("type");
	    y2milestone ("repo type: $type");
	    my $status = $node -> getAttribute ("status");
	    $retmap{$key}{$type}	= {};
	    $retmap{$key}{$type}{"status"}	= $status if $status;
	    foreach my $tag ("source") {
		# maybe it doesn't have sense to have list of sources in one repo...
		my @list		= ();
		foreach my $element ($node -> getElementsByTagName ($tag)) {
		    my %item	= ();
		    my $path	= $element -> getAttribute ("path");
		    $item{"path"}	= $path if $path;
		    push @list, \%item if %item;
		}
		$retmap{$key}{$type}{$tag}	= \@list if @list;
	    }
	}
	ycp::Return (\%retmap, 1);
    }
    elsif ($command eq "result")
    {
	exit;
    }
    else
    {
	y2error ("wrong command ($command), only Read is accepted");
	ycp::Return("wrong command, only Read is accepted");
    }
}

# end
