#!/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");
	    y2debug ("package list type: $type");
	    $retmap{$key}{$type}	= {};
	    my $patterntype = $node -> getAttribute ("patternType");
	    $retmap{$key}{$type}{"patternType"} = $patterntype if $patterntype;
	    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", "defaultdestination", "defaultroot", "locale",
	    "timezone", "keytable")
	{
	    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 $type	= $element -> textContent ();
	    my %typemap	= ();
	    foreach my $attr ("primary", "boot", "flags", "filesystem", "format") {
		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);
	}

	my $image	= $systemTree -> getElementsByTagName ("image")->get_node (1);
	my $image_name	= $image -> getAttribute ("name");
	if ($image_name) {
	    $retmap{"name"}	= $image_name;
	    y2milestone ("image name: $image_name");
	}

	my $scheme_ver	= $image -> getAttribute ("schemeversion");
	$retmap{"schemeversion"}	= $scheme_ver if $scheme_ver;

	my $inherit	= $image -> getAttribute ("inherit");
	$retmap{"inherit"}	= $inherit if $inherit;

	$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");
		my $realname = $element -> getAttribute ("realname");
		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); 
		    $retmap{"users"}{$name}{realname}   = $realname if (defined $realname); 
		}
	    }
	}

	$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");
	    y2debug ("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";
	my @repolist	= ();
	for (my $i=1;$i<= $repositNodeList->size();$i++) {
	    my $node = $repositNodeList -> get_node($i);
	    my %repo	= ();
	    foreach my $tag ("type", "status") {
		my $val	= $node -> getAttribute ($tag);
		$repo{$tag}	= $val if $val;
	    }
	    my @list		= (); # maybe list is not needed here...
	    foreach my $element ($node -> getElementsByTagName ("source")) {
		my %item	= ();
		my $path	= $element -> getAttribute ("path");
		$item{"path"}	= $path if $path;
		push @list, \%item if %item;
	    }
	    $repo{"source"}	= \@list if @list;
	    push @repolist, \%repo if %repo;
	}
	$retmap{$key}	= \@repolist if @repolist;
	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
