#!/usr/bin/perl

use strict;
use warnings;
use perunServicesInit;
use perunServicesUtils;
use File::Basename;

local $::SERVICE_NAME = basename($0);
local $::PROTOCOL_VERSION = "3.0.0";
my $SCRIPT_VERSION = "3.0.1";

perunServicesInit::init;
my $data = perunServicesInit::getHashedHierarchicalData;
my $DIRECTORY = perunServicesInit::getDirectory;


our $A_SSHKEYS;                       *A_SSHKEYS =                          \'urn:perun:user:attribute-def:def:sshPublicKey';
our $A_MEMBER_STATUS;                 *A_MEMBER_STATUS =                    \'urn:perun:member:attribute-def:core:status';
our $A_RESOURCE_SSHKEYS_TARGET_USER;  *A_RESOURCE_SSHKEYS_TARGET_USER =     \'urn:perun:resource:attribute-def:def:sshkeysTargetUser';

my $sshkeysDirectory = "$DIRECTORY/$::SERVICE_NAME";
mkdir $sshkeysDirectory or die "$sshkeysDirectory directory can't be created: $!";

my $fileStructureWithData;
foreach my $resourceId ($data->getResourceIds()) {
	my $fileName = $data->getResourceAttributeValue(resource => $resourceId, attrName => $A_RESOURCE_SSHKEYS_TARGET_USER);
	foreach my $memberId ($data->getMemberIdsForResource( resource => $resourceId )) {
		my $memberStatus = $data->getMemberAttributeValue(member => $memberId, attrName => $A_MEMBER_STATUS);
		my $sshKeys = $data->getUserAttributeValue( member => $memberId, attrName => $A_SSHKEYS );

		#if member is not valid, skip him
		next if $memberStatus ne 'VALID';
		next unless defined $sshKeys;

		@{$fileStructureWithData->{$fileName}}{@{$sshKeys}} = (1) x @{$sshKeys};
	}

}

#generate file for all keys in data structure
foreach my $file (keys %{$fileStructureWithData}) {
	my $serviceFileName = "$sshkeysDirectory/$file";
	open SERVICE_FILE,">$serviceFileName" or die "Cannot open $serviceFileName: $! \n";

	print SERVICE_FILE join "\n", sort keys %{$fileStructureWithData->{$file}};

	close SERVICE_FILE or die "Cannot close $serviceFileName: $! \n";
}

perunServicesInit::finalize;
